mirror of
https://github.com/chenasraf/webview_cef.git
synced 2026-05-18 01:49:03 +00:00
143 lines
4.0 KiB
C++
143 lines
4.0 KiB
C++
#include "include/webview_cef/webview_cef_plugin_c_api.h"
|
|
|
|
#include <flutter/plugin_registrar_windows.h>
|
|
|
|
#include "webview_cef_plugin.h"
|
|
|
|
void WebviewCefPluginCApiRegisterWithRegistrar(
|
|
FlutterDesktopPluginRegistrarRef registrar) {
|
|
webview_cef::WebviewCefPlugin::RegisterWithRegistrar(registrar);
|
|
}
|
|
|
|
FLUTTER_PLUGIN_EXPORT void initCEFProcesses() {
|
|
webview_cef::initCEFProcesses();
|
|
}
|
|
|
|
bool IsKeyDown(WPARAM wparam) {
|
|
return (GetKeyState((int)wparam) & 0x8000) != 0;
|
|
}
|
|
|
|
int GetCefKeyboardModifiers(WPARAM wparam, LPARAM lparam) {
|
|
int modifiers = 0;
|
|
if (IsKeyDown(VK_SHIFT))
|
|
modifiers |= EVENTFLAG_SHIFT_DOWN;
|
|
if (IsKeyDown(VK_CONTROL))
|
|
modifiers |= EVENTFLAG_CONTROL_DOWN;
|
|
if (IsKeyDown(VK_MENU))
|
|
modifiers |= EVENTFLAG_ALT_DOWN;
|
|
|
|
// Low bit set from GetKeyState indicates "toggled".
|
|
if (::GetKeyState(VK_NUMLOCK) & 1)
|
|
modifiers |= EVENTFLAG_NUM_LOCK_ON;
|
|
if (::GetKeyState(VK_CAPITAL) & 1)
|
|
modifiers |= EVENTFLAG_CAPS_LOCK_ON;
|
|
|
|
switch (wparam) {
|
|
case VK_RETURN:
|
|
if ((lparam >> 16) & KF_EXTENDED)
|
|
modifiers |= EVENTFLAG_IS_KEY_PAD;
|
|
break;
|
|
case VK_INSERT:
|
|
case VK_DELETE:
|
|
case VK_HOME:
|
|
case VK_END:
|
|
case VK_PRIOR:
|
|
case VK_NEXT:
|
|
case VK_UP:
|
|
case VK_DOWN:
|
|
case VK_LEFT:
|
|
case VK_RIGHT:
|
|
if (!((lparam >> 16) & KF_EXTENDED))
|
|
modifiers |= EVENTFLAG_IS_KEY_PAD;
|
|
break;
|
|
case VK_NUMLOCK:
|
|
case VK_NUMPAD0:
|
|
case VK_NUMPAD1:
|
|
case VK_NUMPAD2:
|
|
case VK_NUMPAD3:
|
|
case VK_NUMPAD4:
|
|
case VK_NUMPAD5:
|
|
case VK_NUMPAD6:
|
|
case VK_NUMPAD7:
|
|
case VK_NUMPAD8:
|
|
case VK_NUMPAD9:
|
|
case VK_DIVIDE:
|
|
case VK_MULTIPLY:
|
|
case VK_SUBTRACT:
|
|
case VK_ADD:
|
|
case VK_DECIMAL:
|
|
case VK_CLEAR:
|
|
modifiers |= EVENTFLAG_IS_KEY_PAD;
|
|
break;
|
|
case VK_SHIFT:
|
|
if (IsKeyDown(VK_LSHIFT))
|
|
modifiers |= EVENTFLAG_IS_LEFT;
|
|
else if (IsKeyDown(VK_RSHIFT))
|
|
modifiers |= EVENTFLAG_IS_RIGHT;
|
|
break;
|
|
case VK_CONTROL:
|
|
if (IsKeyDown(VK_LCONTROL))
|
|
modifiers |= EVENTFLAG_IS_LEFT;
|
|
else if (IsKeyDown(VK_RCONTROL))
|
|
modifiers |= EVENTFLAG_IS_RIGHT;
|
|
break;
|
|
case VK_MENU:
|
|
if (IsKeyDown(VK_LMENU))
|
|
modifiers |= EVENTFLAG_IS_LEFT;
|
|
else if (IsKeyDown(VK_RMENU))
|
|
modifiers |= EVENTFLAG_IS_RIGHT;
|
|
break;
|
|
case VK_LWIN:
|
|
modifiers |= EVENTFLAG_IS_LEFT;
|
|
break;
|
|
case VK_RWIN:
|
|
modifiers |= EVENTFLAG_IS_RIGHT;
|
|
break;
|
|
}
|
|
return modifiers;
|
|
}
|
|
|
|
FLUTTER_PLUGIN_EXPORT void handleWndProcForCEF(unsigned int message, unsigned __int64 wParam, __int64 lParam)
|
|
{
|
|
if(message == WM_USER + 1){
|
|
webview_cef::WebviewCefPlugin::handleMessageProc(message, wParam, lParam);
|
|
return;
|
|
}
|
|
if (message != WM_SYSCHAR && message != WM_SYSKEYDOWN && message != WM_SYSKEYUP && message != WM_KEYDOWN && message != WM_KEYUP && message != WM_CHAR) return;
|
|
CefKeyEvent event;
|
|
event.windows_key_code = (int)wParam;
|
|
event.native_key_code = (int)lParam;
|
|
event.is_system_key = message == WM_SYSCHAR || message == WM_SYSKEYDOWN ||
|
|
message == WM_SYSKEYUP;
|
|
|
|
if (message == WM_KEYDOWN || message == WM_SYSKEYDOWN)
|
|
event.type = KEYEVENT_RAWKEYDOWN;
|
|
else if (message == WM_KEYUP || message == WM_SYSKEYUP)
|
|
event.type = KEYEVENT_KEYUP;
|
|
else
|
|
event.type = KEYEVENT_CHAR;
|
|
event.modifiers = GetCefKeyboardModifiers(wParam, lParam);
|
|
|
|
// mimic alt-gr check behaviour from
|
|
// src/ui/events/win/events_win_utils.cc: GetModifiersFromKeyState
|
|
if ((event.type == KEYEVENT_CHAR) && IsKeyDown(VK_RMENU)) {
|
|
// reverse AltGr detection taken from PlatformKeyMap::UsesAltGraph
|
|
// instead of checking all combination for ctrl-alt, just check current char
|
|
HKL current_layout = ::GetKeyboardLayout(0);
|
|
|
|
// https://docs.microsoft.com/en-gb/windows/win32/api/winuser/nf-winuser-vkkeyscanexw
|
|
// ... high-order byte contains the shift state,
|
|
// which can be a combination of the following flag bits.
|
|
// 1 Either SHIFT key is pressed.
|
|
// 2 Either CTRL key is pressed.
|
|
// 4 Either ALT key is pressed.
|
|
SHORT scan_res = ::VkKeyScanExW((WCHAR)wParam, current_layout);
|
|
constexpr auto ctrlAlt = (2 | 4);
|
|
if (((scan_res >> 8) & ctrlAlt) == ctrlAlt) { // ctrl-alt pressed
|
|
event.modifiers &= ~(EVENTFLAG_CONTROL_DOWN | EVENTFLAG_ALT_DOWN);
|
|
event.modifiers |= EVENTFLAG_ALTGR_DOWN;
|
|
}
|
|
}
|
|
webview_cef::sendKeyEvent(event);
|
|
}
|