blob: 7c4df0f038fc65f607feed63887d4e086221b66a [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FLUTTER_SHELL_PLATFORM_WINDOWS_KEY_EVENT_HANDLER_H_
#define FLUTTER_SHELL_PLATFORM_WINDOWS_KEY_EVENT_HANDLER_H_
#include <deque>
#include <memory>
#include <string>
#include "flutter/shell/platform/common/client_wrapper/include/flutter/basic_message_channel.h"
#include "flutter/shell/platform/common/client_wrapper/include/flutter/binary_messenger.h"
#include "flutter/shell/platform/windows/keyboard_hook_handler.h"
#include "flutter/shell/platform/windows/public/flutter_windows.h"
#include "rapidjson/document.h"
namespace flutter {
class FlutterWindowsView;
// Implements a KeyboardHookHandler
//
// Handles key events and forwards them to the Flutter engine.
class KeyEventHandler : public KeyboardHookHandler {
public:
using SendInputDelegate =
std::function<UINT(UINT cInputs, LPINPUT pInputs, int cbSize)>;
// the user32 SendInput function is not supported in UWP appcontainer and there
// is no WinRT equivalent hence we pass null for SendInputDelegate param. Since
// this handler is one of last resort, it is only applicable for platformview
// scenarios where the host view can handle input events in the event the
// Flutter view does not choose to handle them. Since platformview is currently
// not support for desktop, there is no functional gap caused by this currently.
#ifdef WINUWP
explicit KeyEventHandler(flutter::BinaryMessenger* messenger,
SendInputDelegate delegate = nullptr);
#else
explicit KeyEventHandler(flutter::BinaryMessenger* messenger,
SendInputDelegate delegate = SendInput);
#endif
virtual ~KeyEventHandler();
// |KeyboardHookHandler|
bool KeyboardHook(FlutterWindowsView* window,
int key,
int scancode,
int action,
char32_t character,
bool extended) override;
// |KeyboardHookHandler|
void TextHook(FlutterWindowsView* window,
const std::u16string& text) override;
// |KeyboardHookHandler|
void ComposeBeginHook() override;
// |KeyboardHookHandler|
void ComposeEndHook() override;
// |KeyboardHookHandler|
void ComposeChangeHook(const std::u16string& text, int cursor_pos) override;
private:
KEYBDINPUT* FindPendingEvent(uint64_t id);
void RemovePendingEvent(uint64_t id);
void AddPendingEvent(uint64_t id, int scancode, int action, bool extended);
void HandleResponse(bool handled,
uint64_t id,
int action,
bool extended,
int scancode,
int character);
// The Flutter system channel for key event messages.
std::unique_ptr<flutter::BasicMessageChannel<rapidjson::Document>> channel_;
// The queue of key events that have been sent to the framework but have not
// yet received a response.
std::deque<std::pair<uint64_t, KEYBDINPUT>> pending_events_;
// A function used to dispatch synthesized events. Used in testing to inject a
// test function to collect events. Defaults to the Windows function
// SendInput.
SendInputDelegate send_input_;
};
} // namespace flutter
#endif // FLUTTER_SHELL_PLATFORM_WINDOWS_KEY_EVENT_HANDLER_H_