From 0501e0039ba101c3ada6b9fe8e7cf458b9a050c9 Mon Sep 17 00:00:00 2001 From: Swift Kim Date: Fri, 4 Feb 2022 16:26:15 +0900 Subject: [PATCH 1/4] Improve key event handling for TV remote controls --- shell/platform/tizen/BUILD.gn | 2 + .../tizen/channels/key_event_channel.cc | 435 ++++++++++-------- .../tizen/channels/key_event_channel.h | 2 +- shell/platform/tizen/key_event_handler.cc | 57 ++- shell/platform/tizen/tizen_renderer.h | 2 + .../tizen/tizen_renderer_ecore_wl2.cc | 7 + .../platform/tizen/tizen_renderer_ecore_wl2.h | 2 + .../platform/tizen/tizen_renderer_evas_gl.cc | 15 +- shell/platform/tizen/tizen_renderer_evas_gl.h | 4 +- shell/platform/tizen/touch_event_handler.cc | 23 +- shell/platform/tizen/touch_event_handler.h | 1 - 11 files changed, 332 insertions(+), 218 deletions(-) diff --git a/shell/platform/tizen/BUILD.gn b/shell/platform/tizen/BUILD.gn index d32185962fe2b..e0e0d664d9877 100644 --- a/shell/platform/tizen/BUILD.gn +++ b/shell/platform/tizen/BUILD.gn @@ -53,6 +53,7 @@ config("rootstrap_include_dirs") { "$local_prefix/include/ecore-wayland-1", "$local_prefix/include/ecore-wl2-1", "$local_prefix/include/efl-1", + "$local_prefix/include/efl-extension", "$local_prefix/include/eina-1", "$local_prefix/include/eina-1/eina", "$local_prefix/include/emile-1", @@ -173,6 +174,7 @@ template("embedder") { "capi-system-system-settings", "capi-ui-efl-util", "dlog", + "efl-extension", "feedback", "tbm", "tdm-client", diff --git a/shell/platform/tizen/channels/key_event_channel.cc b/shell/platform/tizen/channels/key_event_channel.cc index e025cc58315e1..7d22b8de038b7 100644 --- a/shell/platform/tizen/channels/key_event_channel.cc +++ b/shell/platform/tizen/channels/key_event_channel.cc @@ -4,7 +4,9 @@ #include "key_event_channel.h" +#include #include +#include #include "flutter/shell/platform/common/json_message_codec.h" @@ -28,195 +30,246 @@ constexpr char kKeyDown[] = "keydown"; constexpr char kGtkToolkit[] = "gtk"; constexpr char kLinuxKeyMap[] = "linux"; -// Mapping from physical (xkb) to logical (GTK) key codes. -// The values are defined in: -// - flutter/keyboard_maps.dart (kLinuxToPhysicalKey, kGtkToLogicalKey) -const std::map kKeyCodeMap = { - {0x00000009, 65307}, // LogicalKeyboardKey.escape - {0x0000000a, 49}, // LogicalKeyboardKey.digit1 - {0x0000000b, 50}, // LogicalKeyboardKey.digit2 - {0x0000000c, 51}, // LogicalKeyboardKey.digit3 - {0x0000000d, 52}, // LogicalKeyboardKey.digit4 - {0x0000000e, 53}, // LogicalKeyboardKey.digit5 - {0x0000000f, 54}, // LogicalKeyboardKey.digit6 - {0x00000010, 55}, // LogicalKeyboardKey.digit7 - {0x00000011, 56}, // LogicalKeyboardKey.digit8 - {0x00000012, 57}, // LogicalKeyboardKey.digit9 - {0x00000013, 48}, // LogicalKeyboardKey.digit0 - {0x00000014, 45}, // LogicalKeyboardKey.minus - {0x00000015, 61}, // LogicalKeyboardKey.equal - {0x00000016, 65288}, // LogicalKeyboardKey.backspace - {0x00000017, 65289}, // LogicalKeyboardKey.tab - {0x00000018, 81}, // LogicalKeyboardKey.keyQ - {0x00000019, 87}, // LogicalKeyboardKey.keyW - {0x0000001a, 69}, // LogicalKeyboardKey.keyE - {0x0000001b, 82}, // LogicalKeyboardKey.keyR - {0x0000001c, 84}, // LogicalKeyboardKey.keyT - {0x0000001d, 89}, // LogicalKeyboardKey.keyY - {0x0000001e, 85}, // LogicalKeyboardKey.keyU - {0x0000001f, 73}, // LogicalKeyboardKey.keyI - {0x00000020, 79}, // LogicalKeyboardKey.keyO - {0x00000021, 80}, // LogicalKeyboardKey.keyP - {0x00000022, 91}, // LogicalKeyboardKey.bracketLeft - {0x00000023, 93}, // LogicalKeyboardKey.bracketRight - {0x00000024, 65293}, // LogicalKeyboardKey.enter - {0x00000025, 65507}, // LogicalKeyboardKey.controlLeft - {0x00000026, 65}, // LogicalKeyboardKey.keyA - {0x00000027, 83}, // LogicalKeyboardKey.keyS - {0x00000028, 68}, // LogicalKeyboardKey.keyD - {0x00000029, 70}, // LogicalKeyboardKey.keyF - {0x0000002a, 71}, // LogicalKeyboardKey.keyG - {0x0000002b, 72}, // LogicalKeyboardKey.keyH - {0x0000002c, 74}, // LogicalKeyboardKey.keyJ - {0x0000002d, 75}, // LogicalKeyboardKey.keyK - {0x0000002e, 76}, // LogicalKeyboardKey.keyL - {0x0000002f, 59}, // LogicalKeyboardKey.semicolon - {0x00000030, 39}, // LogicalKeyboardKey.quote - {0x00000031, 96}, // LogicalKeyboardKey.backquote - {0x00000032, 65505}, // LogicalKeyboardKey.shiftLeft - {0x00000033, 92}, // LogicalKeyboardKey.backslash - {0x00000034, 90}, // LogicalKeyboardKey.keyZ - {0x00000035, 88}, // LogicalKeyboardKey.keyX - {0x00000036, 67}, // LogicalKeyboardKey.keyC - {0x00000037, 86}, // LogicalKeyboardKey.keyV - {0x00000038, 66}, // LogicalKeyboardKey.keyB - {0x00000039, 78}, // LogicalKeyboardKey.keyN - {0x0000003a, 77}, // LogicalKeyboardKey.keyM - {0x0000003b, 44}, // LogicalKeyboardKey.comma - {0x0000003c, 46}, // LogicalKeyboardKey.period - {0x0000003d, 47}, // LogicalKeyboardKey.slash - {0x0000003e, 65506}, // LogicalKeyboardKey.shiftRight - {0x0000003f, 65450}, // LogicalKeyboardKey.numpadMultiply - {0x00000040, 65513}, // LogicalKeyboardKey.altLeft - {0x00000041, 32}, // LogicalKeyboardKey.space - {0x00000042, 65509}, // LogicalKeyboardKey.capsLock - {0x00000043, 65470}, // LogicalKeyboardKey.f1 - {0x00000044, 65471}, // LogicalKeyboardKey.f2 - {0x00000045, 65472}, // LogicalKeyboardKey.f3 - {0x00000046, 65473}, // LogicalKeyboardKey.f4 - {0x00000047, 65474}, // LogicalKeyboardKey.f5 - {0x00000048, 65475}, // LogicalKeyboardKey.f6 - {0x00000049, 65476}, // LogicalKeyboardKey.f7 - {0x0000004a, 65477}, // LogicalKeyboardKey.f8 - {0x0000004b, 65478}, // LogicalKeyboardKey.f9 - {0x0000004c, 65479}, // LogicalKeyboardKey.f10 - {0x0000004d, 65407}, // LogicalKeyboardKey.numLock - {0x0000004e, 65300}, // LogicalKeyboardKey.scrollLock - {0x0000004f, 65463}, // LogicalKeyboardKey.numpad7 - {0x00000050, 65464}, // LogicalKeyboardKey.numpad8 - {0x00000051, 65465}, // LogicalKeyboardKey.numpad9 - {0x00000052, 65453}, // LogicalKeyboardKey.numpadSubtract - {0x00000053, 65460}, // LogicalKeyboardKey.numpad4 - {0x00000054, 65461}, // LogicalKeyboardKey.numpad5 - {0x00000055, 65462}, // LogicalKeyboardKey.numpad6 - {0x00000056, 65451}, // LogicalKeyboardKey.numpadAdd - {0x00000057, 65457}, // LogicalKeyboardKey.numpad1 - {0x00000058, 65458}, // LogicalKeyboardKey.numpad2 - {0x00000059, 65459}, // LogicalKeyboardKey.numpad3 - {0x0000005a, 65456}, // LogicalKeyboardKey.numpad0 - {0x0000005b, 65454}, // LogicalKeyboardKey.numpadDecimal - {0x0000005f, 65480}, // LogicalKeyboardKey.f11 - {0x00000060, 65481}, // LogicalKeyboardKey.f12 - {0x00000065, 65406}, // LogicalKeyboardKey.kanaMode - {0x00000068, 65421}, // LogicalKeyboardKey.numpadEnter - {0x00000069, 65508}, // LogicalKeyboardKey.controlRight - {0x0000006a, 65455}, // LogicalKeyboardKey.numpadDivide - {0x0000006b, 64797}, // LogicalKeyboardKey.printScreen - {0x0000006c, 65514}, // LogicalKeyboardKey.altRight - {0x0000006e, 65360}, // LogicalKeyboardKey.home - {0x0000006f, 65362}, // LogicalKeyboardKey.arrowUp - {0x00000070, 65365}, // LogicalKeyboardKey.pageUp - {0x00000071, 65361}, // LogicalKeyboardKey.arrowLeft - {0x00000072, 65363}, // LogicalKeyboardKey.arrowRight - {0x00000073, 65367}, // LogicalKeyboardKey.end - {0x00000074, 65364}, // LogicalKeyboardKey.arrowDown - {0x00000075, 65366}, // LogicalKeyboardKey.pageDown - {0x00000076, 65379}, // LogicalKeyboardKey.insert - {0x00000077, 65535}, // LogicalKeyboardKey.delete - {0x00000079, 269025042}, // LogicalKeyboardKey.audioVolumeMute - {0x0000007a, 269025041}, // LogicalKeyboardKey.audioVolumeDown - {0x0000007b, 269025043}, // LogicalKeyboardKey.audioVolumeUp - {0x0000007c, 269025066}, // LogicalKeyboardKey.power - {0x0000007d, 65469}, // LogicalKeyboardKey.numpadEqual - {0x0000007f, 65299}, // LogicalKeyboardKey.pause - {0x00000084, 165}, // LogicalKeyboardKey.intlYen - {0x00000085, 65511}, // LogicalKeyboardKey.metaLeft - {0x00000086, 65512}, // LogicalKeyboardKey.metaRight - {0x00000087, 65383}, // LogicalKeyboardKey.contextMenu - {0x00000088, 269025064}, // LogicalKeyboardKey.browserStop - {0x0000008b, 65381}, // LogicalKeyboardKey.undo - {0x0000008c, 65376}, // LogicalKeyboardKey.select - {0x0000008d, 269025111}, // LogicalKeyboardKey.copy - {0x0000008e, 269025131}, // LogicalKeyboardKey.open - {0x0000008f, 269025133}, // LogicalKeyboardKey.paste - {0x00000090, 65384}, // LogicalKeyboardKey.find - {0x00000092, 65386}, // LogicalKeyboardKey.help - {0x00000096, 269025071}, // LogicalKeyboardKey.sleep - {0x00000097, 269025067}, // LogicalKeyboardKey.wakeUp - {0x0000009e, 269025070}, // LogicalKeyboardKey.launchInternetBrowser - {0x000000a3, 269025049}, // LogicalKeyboardKey.launchMail - {0x000000a4, 269025072}, // LogicalKeyboardKey.browserFavorites - {0x000000a6, 269025062}, // LogicalKeyboardKey.browserBack - {0x000000a7, 269025063}, // LogicalKeyboardKey.browserForward - {0x000000a9, 269025068}, // LogicalKeyboardKey.eject - {0x000000ab, 269025047}, // LogicalKeyboardKey.mediaTrackNext - {0x000000ad, 269025046}, // LogicalKeyboardKey.mediaTrackPrevious - {0x000000ae, 269025045}, // LogicalKeyboardKey.mediaStop - {0x000000af, 269025052}, // LogicalKeyboardKey.mediaRecord - {0x000000b0, 269025086}, // LogicalKeyboardKey.mediaRewind - {0x000000b1, 269025134}, // LogicalKeyboardKey.launchPhone - {0x000000b4, 269025048}, // LogicalKeyboardKey.browserHome - {0x000000b5, 269025065}, // LogicalKeyboardKey.browserRefresh - {0x000000bd, 269025128}, // LogicalKeyboardKey.newKey - {0x000000be, 65382}, // LogicalKeyboardKey.redo - {0x000000bf, 65482}, // LogicalKeyboardKey.f13 - {0x000000c0, 65483}, // LogicalKeyboardKey.f14 - {0x000000c1, 65484}, // LogicalKeyboardKey.f15 - {0x000000c2, 65485}, // LogicalKeyboardKey.f16 - {0x000000c3, 65486}, // LogicalKeyboardKey.f17 - {0x000000c4, 65487}, // LogicalKeyboardKey.f18 - {0x000000c5, 65488}, // LogicalKeyboardKey.f19 - {0x000000c6, 65489}, // LogicalKeyboardKey.f20 - {0x000000c7, 65490}, // LogicalKeyboardKey.f21 - {0x000000c8, 65491}, // LogicalKeyboardKey.f22 - {0x000000c9, 65492}, // LogicalKeyboardKey.f23 - {0x000000ca, 65493}, // LogicalKeyboardKey.f24 - {0x000000d1, 269025073}, // LogicalKeyboardKey.mediaPause - {0x000000d6, 269025110}, // LogicalKeyboardKey.close - {0x000000d7, 269025044}, // LogicalKeyboardKey.mediaPlay - {0x000000d8, 269025175}, // LogicalKeyboardKey.mediaFastForward - {0x000000da, 65377}, // LogicalKeyboardKey.print - {0x000000e1, 269025051}, // LogicalKeyboardKey.browserSearch - {0x000000e8, 269025027}, // LogicalKeyboardKey.brightnessDown - {0x000000e9, 269025026}, // LogicalKeyboardKey.brightnessUp - {0x000000ed, 269025030}, // LogicalKeyboardKey.kbdIllumDown - {0x000000ee, 269025029}, // LogicalKeyboardKey.kbdIllumUp - {0x000000ef, 269025147}, // LogicalKeyboardKey.mailSend - {0x000000f0, 269025138}, // LogicalKeyboardKey.mailReply - {0x000000f1, 269025168}, // LogicalKeyboardKey.mailForward - {0x000000f2, 269025143}, // LogicalKeyboardKey.save - {0x00000190, 269025170}, // LogicalKeyboardKey.launchAudioBrowser - {0x00000195, 269025056}, // LogicalKeyboardKey.launchCalendar - {0x000001aa, 269025163}, // LogicalKeyboardKey.zoomIn - {0x000001ab, 269025164}, // LogicalKeyboardKey.zoomOut - {0x000001b8, 269025148}, // LogicalKeyboardKey.spellCheck - {0x000001b9, 269025121}, // LogicalKeyboardKey.logOff - {0x0000024d, 269025069}, // LogicalKeyboardKey.launchScreenSaver +// Mapping from Tizen-specific key symbols to generalized (XKB) scan codes +// (mainly for TV remote control support). +// +// The values are originally defined in: +// - xkb-tizen-data/tizen_key_layout.txt.common +// - flutter/keyboard_maps.dart (kLinuxToPhysicalKey) +const std::map kSymbolToScanCode = { + {"XF86AudioRaiseVolume", 0x0000007b}, // audioVolumeUp + {"XF86AudioLowerVolume", 0x0000007a}, // audioVolumeDown + {"XF86Menu", 0x00000087}, // contextMenu + {"XF86PowerOff", 0x0000007c}, // power + {"XF86Home", 0x0000006e}, // home + {"XF86AudioPlay", 0x000000d7}, // mediaPlay + {"XF86AudioPause", 0x000000d1}, // mediaPause + {"XF86AudioStop", 0x000000ae}, // mediaStop + {"XF86AudioNext", 0x000000ab}, // mediaTrackNext + {"XF86AudioPrev", 0x000000ad}, // mediaTrackPrevious + {"XF86AudioRewind", 0x000000b0}, // mediaRewind + {"XF86AudioForward", 0x000000d8}, // mediaFastForward + {"XF86AudioPlayPause", 0x000000ac}, // mediaPlayPause + {"XF86AudioMute", 0x00000079}, // audioVolumeMute + {"XF86AudioRecord", 0x000000af}, // mediaRecord + {"XF86HomePage", 0x000000b4}, // browserHome + {"XF86WWW", 0x0000009e}, // launchInternetBrowser + {"XF86Mail", 0x000000a3}, // launchMail + {"XF86ScreenSaver", 0x0000024d}, // launchScreenSaver + {"XF86MonBrightnessDown", 0x000000e8}, // brightnessDown + {"XF86MonBrightnessUp", 0x000000e9}, // brightnessUp + {"XF86Call", 0x000000b1}, // launchPhone + {"XF86LowerChannel", 0x000001a3}, // channelDown + {"XF86RaiseChannel", 0x000001a2}, // channelUp + {"XF86SysMenu", 0x00000087}, // contextMenu + {"XF86Close", 0x000000d6}, // close + {"XF86Info", 0x0000016e}, // info + {"XF86Phone", 0x000000b1}, // launchPhone + {"XF86PlayBack", 0x000000ac}, // mediaPlayPause + {"XF86ChannelGuide", 0x00000172}, // programGuide }; -// The values are defined in: +// Mapping from physical scan codes to logical (GTK) key codes. +// +// The values are originally defined in: +// - flutter/keyboard_maps.dart (kLinuxToPhysicalKey) +// - flutter/keyboard_maps.dart (kGtkToLogicalKey) +const std::map kScanCodeToKeyCode = { + {0x00000009, 65307}, // escape + {0x0000000a, 49}, // digit1 + {0x0000000b, 50}, // digit2 + {0x0000000c, 51}, // digit3 + {0x0000000d, 52}, // digit4 + {0x0000000e, 53}, // digit5 + {0x0000000f, 54}, // digit6 + {0x00000010, 55}, // digit7 + {0x00000011, 56}, // digit8 + {0x00000012, 57}, // digit9 + {0x00000013, 48}, // digit0 + {0x00000014, 45}, // minus + {0x00000015, 61}, // equal + {0x00000016, 65288}, // backspace + {0x00000017, 65289}, // tab + {0x00000018, 81}, // keyQ + {0x00000019, 87}, // keyW + {0x0000001a, 69}, // keyE + {0x0000001b, 82}, // keyR + {0x0000001c, 84}, // keyT + {0x0000001d, 89}, // keyY + {0x0000001e, 85}, // keyU + {0x0000001f, 73}, // keyI + {0x00000020, 79}, // keyO + {0x00000021, 80}, // keyP + {0x00000022, 91}, // bracketLeft + {0x00000023, 93}, // bracketRight + {0x00000024, 65293}, // enter + {0x00000025, 65507}, // controlLeft + {0x00000026, 65}, // keyA + {0x00000027, 83}, // keyS + {0x00000028, 68}, // keyD + {0x00000029, 70}, // keyF + {0x0000002a, 71}, // keyG + {0x0000002b, 72}, // keyH + {0x0000002c, 74}, // keyJ + {0x0000002d, 75}, // keyK + {0x0000002e, 76}, // keyL + {0x0000002f, 59}, // semicolon + {0x00000030, 39}, // quote + {0x00000031, 96}, // backquote + {0x00000032, 65505}, // shiftLeft + {0x00000033, 92}, // backslash + {0x00000034, 90}, // keyZ + {0x00000035, 88}, // keyX + {0x00000036, 67}, // keyC + {0x00000037, 86}, // keyV + {0x00000038, 66}, // keyB + {0x00000039, 78}, // keyN + {0x0000003a, 77}, // keyM + {0x0000003b, 44}, // comma + {0x0000003c, 46}, // period + {0x0000003d, 47}, // slash + {0x0000003e, 65506}, // shiftRight + {0x0000003f, 65450}, // numpadMultiply + {0x00000040, 65513}, // altLeft + {0x00000041, 32}, // space + {0x00000042, 65509}, // capsLock + {0x00000043, 65470}, // f1 + {0x00000044, 65471}, // f2 + {0x00000045, 65472}, // f3 + {0x00000046, 65473}, // f4 + {0x00000047, 65474}, // f5 + {0x00000048, 65475}, // f6 + {0x00000049, 65476}, // f7 + {0x0000004a, 65477}, // f8 + {0x0000004b, 65478}, // f9 + {0x0000004c, 65479}, // f10 + {0x0000004d, 65407}, // numLock + {0x0000004e, 65300}, // scrollLock + {0x0000004f, 65463}, // numpad7 + {0x00000050, 65464}, // numpad8 + {0x00000051, 65465}, // numpad9 + {0x00000052, 65453}, // numpadSubtract + {0x00000053, 65460}, // numpad4 + {0x00000054, 65461}, // numpad5 + {0x00000055, 65462}, // numpad6 + {0x00000056, 65451}, // numpadAdd + {0x00000057, 65457}, // numpad1 + {0x00000058, 65458}, // numpad2 + {0x00000059, 65459}, // numpad3 + {0x0000005a, 65456}, // numpad0 + {0x0000005b, 65454}, // numpadDecimal + {0x0000005f, 65480}, // f11 + {0x00000060, 65481}, // f12 + {0x00000065, 65406}, // kanaMode + {0x00000068, 65421}, // numpadEnter + {0x00000069, 65508}, // controlRight + {0x0000006a, 65455}, // numpadDivide + {0x0000006b, 64797}, // printScreen + {0x0000006c, 65514}, // altRight + {0x0000006e, 65360}, // home + {0x0000006f, 65362}, // arrowUp + {0x00000070, 65365}, // pageUp + {0x00000071, 65361}, // arrowLeft + {0x00000072, 65363}, // arrowRight + {0x00000073, 65367}, // end + {0x00000074, 65364}, // arrowDown + {0x00000075, 65366}, // pageDown + {0x00000076, 65379}, // insert + {0x00000077, 65535}, // delete + {0x00000079, 269025042}, // audioVolumeMute + {0x0000007a, 269025041}, // audioVolumeDown + {0x0000007b, 269025043}, // audioVolumeUp + {0x0000007c, 269025066}, // power + {0x0000007d, 65469}, // numpadEqual + {0x0000007f, 65299}, // pause + {0x00000084, 165}, // intlYen + {0x00000085, 65511}, // metaLeft + {0x00000086, 65512}, // metaRight + {0x00000087, 65383}, // contextMenu + {0x00000088, 269025064}, // browserStop + {0x0000008b, 65381}, // undo + {0x0000008c, 65376}, // select + {0x0000008d, 269025111}, // copy + {0x0000008e, 269025131}, // open + {0x0000008f, 269025133}, // paste + {0x00000090, 65384}, // find + {0x00000092, 65386}, // help + {0x00000096, 269025071}, // sleep + {0x00000097, 269025067}, // wakeUp + {0x0000009e, 269025070}, // launchInternetBrowser + {0x000000a3, 269025049}, // launchMail + {0x000000a4, 269025072}, // browserFavorites + {0x000000a6, 269025062}, // browserBack + {0x000000a7, 269025063}, // browserForward + {0x000000a9, 269025068}, // eject + {0x000000ab, 269025047}, // mediaTrackNext + {0x000000ad, 269025046}, // mediaTrackPrevious + {0x000000ae, 269025045}, // mediaStop + {0x000000af, 269025052}, // mediaRecord + {0x000000b0, 269025086}, // mediaRewind + {0x000000b1, 269025134}, // launchPhone + {0x000000b4, 269025048}, // browserHome + {0x000000b5, 269025065}, // browserRefresh + {0x000000bd, 269025128}, // newKey + {0x000000be, 65382}, // redo + {0x000000bf, 65482}, // f13 + {0x000000c0, 65483}, // f14 + {0x000000c1, 65484}, // f15 + {0x000000c2, 65485}, // f16 + {0x000000c3, 65486}, // f17 + {0x000000c4, 65487}, // f18 + {0x000000c5, 65488}, // f19 + {0x000000c6, 65489}, // f20 + {0x000000c7, 65490}, // f21 + {0x000000c8, 65491}, // f22 + {0x000000c9, 65492}, // f23 + {0x000000ca, 65493}, // f24 + {0x000000d1, 269025073}, // mediaPause + {0x000000d6, 269025110}, // close + {0x000000d7, 269025044}, // mediaPlay + {0x000000d8, 269025175}, // mediaFastForward + {0x000000da, 65377}, // print + {0x000000e1, 269025051}, // browserSearch + {0x000000e8, 269025027}, // brightnessDown + {0x000000e9, 269025026}, // brightnessUp + {0x000000ed, 269025030}, // kbdIllumDown + {0x000000ee, 269025029}, // kbdIllumUp + {0x000000ef, 269025147}, // mailSend + {0x000000f0, 269025138}, // mailReply + {0x000000f1, 269025168}, // mailForward + {0x000000f2, 269025143}, // save + {0x00000190, 269025170}, // launchAudioBrowser + {0x00000195, 269025056}, // launchCalendar + {0x000001aa, 269025163}, // zoomIn + {0x000001ab, 269025164}, // zoomOut + {0x000001b8, 269025148}, // spellCheck + {0x000001b9, 269025121}, // logOff + {0x0000024d, 269025069}, // launchScreenSaver +}; + +// Mapping from Ecore modifiers to GTK modifiers. +// +// The values are originally defined in: // - efl/Ecore_Input.h // - flutter/raw_keyboard_linux.dart (GtkKeyHelper) const std::map kModifierMap = { {0x0001, 1 << 0}, // SHIFT (modifierShift) {0x0002, 1 << 2}, // CTRL (modifierControl) {0x0004, 1 << 3}, // ALT (modifierMod1) - {0x0008, 1 << 28}, // WIN (modifierMeta) + {0x0008, 1 << 26}, // WIN (modifierMeta) {0x0010, 0}, // SCROLL (undefined) {0x0020, 1 << 4}, // NUM (modifierMod2) {0x0040, 1 << 1}, // CAPS (modifierCapsLock) }; +uint32_t Utf8ToUtf32CodePoint(const char* utf8) { + std::wstring_convert, wchar_t> converter; + for (auto wchar : converter.from_bytes(utf8)) { + return std::uint_least32_t(wchar); + } + return 0; +} + } // namespace KeyEventChannel::KeyEventChannel(BinaryMessenger* messenger) @@ -230,25 +283,37 @@ KeyEventChannel::~KeyEventChannel() {} void KeyEventChannel::SendKeyEvent(Ecore_Event_Key* key, bool is_down, std::function callback) { - int gtk_keycode = 0; - if (kKeyCodeMap.count(key->keycode) > 0) { - gtk_keycode = kKeyCodeMap.at(key->keycode); + uint32_t scan_code = key->keycode; + auto iter = kSymbolToScanCode.find(key->key); + if (iter != kSymbolToScanCode.end()) { + scan_code = iter->second; } - int gtk_modifiers = 0; + + uint32_t key_code = 0; + if (kScanCodeToKeyCode.count(scan_code)) { + key_code = kScanCodeToKeyCode.at(scan_code); + } + + int modifiers = 0; for (auto element : kModifierMap) { if (element.first & key->modifiers) { - gtk_modifiers |= element.second; + modifiers |= element.second; } } + uint32_t unicode_scalar_values = 0; + if (key->compose) { + unicode_scalar_values = Utf8ToUtf32CodePoint(key->compose); + } + rapidjson::Document event(rapidjson::kObjectType); auto& allocator = event.GetAllocator(); event.AddMember(kKeyMapKey, kLinuxKeyMap, allocator); event.AddMember(kToolkitKey, kGtkToolkit, allocator); - event.AddMember(kUnicodeScalarValuesKey, 0, allocator); - event.AddMember(kKeyCodeKey, gtk_keycode, allocator); - event.AddMember(kScanCodeKey, key->keycode, allocator); - event.AddMember(kModifiersKey, gtk_modifiers, allocator); + event.AddMember(kUnicodeScalarValuesKey, unicode_scalar_values, allocator); + event.AddMember(kKeyCodeKey, key_code, allocator); + event.AddMember(kScanCodeKey, scan_code, allocator); + event.AddMember(kModifiersKey, modifiers, allocator); if (is_down) { event.AddMember(kTypeKey, kKeyDown, allocator); } else { diff --git a/shell/platform/tizen/channels/key_event_channel.h b/shell/platform/tizen/channels/key_event_channel.h index 234dd108ab6a6..e70cbdfb707db 100644 --- a/shell/platform/tizen/channels/key_event_channel.h +++ b/shell/platform/tizen/channels/key_event_channel.h @@ -20,7 +20,7 @@ class KeyEventChannel { explicit KeyEventChannel(BinaryMessenger* messenger); virtual ~KeyEventChannel(); - void SendKeyEvent(Ecore_Event_Key* key, + void SendKeyEvent(Ecore_Event_Key* event, bool is_down, std::function callback); diff --git a/shell/platform/tizen/key_event_handler.cc b/shell/platform/tizen/key_event_handler.cc index 1a87e5c720e74..f1725c8b04fdf 100644 --- a/shell/platform/tizen/key_event_handler.cc +++ b/shell/platform/tizen/key_event_handler.cc @@ -4,9 +4,12 @@ #include "key_event_handler.h" -#ifndef __X64_SHELL__ +#ifdef __X64_SHELL__ +#include +#else #include #endif +#include #include "flutter/shell/platform/tizen/flutter_tizen_engine.h" #include "flutter/shell/platform/tizen/logger.h" @@ -18,9 +21,29 @@ namespace { constexpr char kBackKey[] = "XF86Back"; constexpr char kExitKey[] = "XF86Exit"; +// The system may define its default behavior for some special key events. +// The following keys should always be handled by the app first. +const std::vector kRemappableSystemKeys = { + "XF86Menu", "XF86Back", "XF86AudioPlay", + "XF86AudioPause", "XF86AudioStop", "XF86AudioNext", + "XF86AudioPrev", "XF86AudioRewind", "XF86AudioForward", + "XF86AudioPlayPause", "XF86AudioRecord", "XF86LowerChannel", + "XF86RaiseChannel", "XF86ChannelList", "XF86PreviousChannel", + "XF86SysMenu", "XF86SimpleMenu", "XF86History", + "XF86Favorites", "XF86Info", "XF86Red", + "XF86Green", "XF86Yellow", "XF86Blue", + "XF86Subtitle", "XF86PlayBack", "XF86ChannelGuide", + "XF86Caption", "XF86Exit", +}; + } // namespace KeyEventHandler::KeyEventHandler(FlutterTizenEngine* engine) : engine_(engine) { + if (!engine->renderer() || !engine->renderer()->IsValid()) { + return; + } + engine->renderer()->BindKeys(kRemappableSystemKeys); + key_event_handlers_.push_back( ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, OnKey, this)); key_event_handlers_.push_back( @@ -34,49 +57,53 @@ KeyEventHandler::~KeyEventHandler() { key_event_handlers_.clear(); } -Eina_Bool KeyEventHandler::OnKey(void* data, int type, void* event) { +Eina_Bool KeyEventHandler::OnKey(void* data, int type, void* raw_event) { auto* self = reinterpret_cast(data); - auto* key = reinterpret_cast(event); + auto* event = reinterpret_cast(raw_event); auto* engine = self->engine_; - auto is_down = type == ECORE_EVENT_KEY_DOWN; + bool is_down = type == ECORE_EVENT_KEY_DOWN; - if (self->engine_->renderer()->GetWindowId() != key->window) { + if (engine->renderer()->GetWindowId() != event->window) { return ECORE_CALLBACK_PASS_ON; } if (is_down) { - FT_LOG(Info) << "Key pressed: " << key->key << "(" << key->keycode << ")"; + FT_LOG(Info) << "Key symbol: " << event->key << ", code: 0x" << std::setw(8) + << std::setfill('0') << std::right << std::hex + << event->keycode; } if (engine->text_input_channel()) { - if (engine->text_input_channel()->SendKeyEvent(key, is_down)) { - return ECORE_CALLBACK_PASS_ON; + if (engine->text_input_channel()->SendKeyEvent(event, is_down)) { + return ECORE_CALLBACK_DONE; } } if (engine->platform_view_channel()) { - engine->platform_view_channel()->SendKeyEvent(key, is_down); + engine->platform_view_channel()->SendKeyEvent(event, is_down); } if (engine->key_event_channel()) { engine->key_event_channel()->SendKeyEvent( - key, is_down, - [engine, keyname = std::string(key->keyname), is_down](bool handled) { + event, is_down, + [engine, symbol = std::string(event->key), is_down](bool handled) { if (handled) { return; } - if (keyname == kBackKey && !is_down) { + if (symbol == kBackKey && !is_down) { if (engine->navigation_channel()) { engine->navigation_channel()->PopRoute(); } - } else if (keyname == kExitKey && !is_down) { -#ifndef __X64_SHELL__ + } else if (symbol == kExitKey && !is_down) { +#ifdef __X64_SHELL__ + exit(EXIT_SUCCESS); +#else ui_app_exit(); #endif } }); } - return ECORE_CALLBACK_PASS_ON; + return ECORE_CALLBACK_DONE; } } // namespace flutter diff --git a/shell/platform/tizen/tizen_renderer.h b/shell/platform/tizen/tizen_renderer.h index 0c05e8ade4d9a..8dc9abbc205f1 100644 --- a/shell/platform/tizen/tizen_renderer.h +++ b/shell/platform/tizen/tizen_renderer.h @@ -60,6 +60,8 @@ class TizenRenderer { virtual bool IsSupportedExtension(const char* name) = 0; + virtual void BindKeys(const std::vector& keys) = 0; + protected: explicit TizenRenderer(Geometry geometry, bool transparent, diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc index d2fee4d0b5f74..671cee94b58dc 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc @@ -611,4 +611,11 @@ void TizenRendererEcoreWl2::SetTizenPolicyNotificationLevel(int level) { tizen_policy_, ecore_wl2_window_surface_get(ecore_wl2_window_), level); } +void TizenRendererEcoreWl2::BindKeys(const std::vector& keys) { + for (const auto& key : keys) { + ecore_wl2_window_keygrab_set(ecore_wl2_window_, key.c_str(), 0, 0, 0, + ECORE_WL2_WINDOW_KEYGRAB_TOPMOST); + } +} + } // namespace flutter diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.h b/shell/platform/tizen/tizen_renderer_ecore_wl2.h index 94ad5782536af..468249802e57d 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.h +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.h @@ -53,6 +53,8 @@ class TizenRendererEcoreWl2 : public TizenRenderer { bool IsSupportedExtension(const char* name) override; + void BindKeys(const std::vector& keys) override; + private: void Show(); diff --git a/shell/platform/tizen/tizen_renderer_evas_gl.cc b/shell/platform/tizen/tizen_renderer_evas_gl.cc index 71516d6fc7495..c4a2fc32824fd 100644 --- a/shell/platform/tizen/tizen_renderer_evas_gl.cc +++ b/shell/platform/tizen/tizen_renderer_evas_gl.cc @@ -4,16 +4,17 @@ #include "tizen_renderer_evas_gl.h" +#include +#ifndef __X64_SHELL__ +#include +#endif + #include "tizen_evas_gl_helper.h" Evas_GL* g_evas_gl = nullptr; EVAS_GL_GLOBAL_GLES3_DEFINE(); #include "flutter/shell/platform/tizen/logger.h" -#ifndef __X64_SHELL__ -#include -#endif - namespace flutter { TizenRendererEvasGL::TizenRendererEvasGL(Geometry geometry, @@ -785,4 +786,10 @@ bool TizenRendererEvasGL::IsSupportedExtension(const char* name) { return strcmp(name, "EGL_TIZEN_image_native_surface") == 0; } +void TizenRendererEvasGL::BindKeys(const std::vector& keys) { + for (const auto& key : keys) { + eext_win_keygrab_set(evas_window_, key.c_str()); + } +} + } // namespace flutter diff --git a/shell/platform/tizen/tizen_renderer_evas_gl.h b/shell/platform/tizen/tizen_renderer_evas_gl.h index f38e1420f97fe..eb1525ecad76f 100644 --- a/shell/platform/tizen/tizen_renderer_evas_gl.h +++ b/shell/platform/tizen/tizen_renderer_evas_gl.h @@ -37,6 +37,8 @@ class TizenRendererEvasGL : public TizenRenderer { void* GetWindowHandle() override { return evas_window_; } + Evas_Object* GetImageHandle() { return graphics_adapter_; } + void SetRotate(int angle) override; void SetGeometry(int32_t x, int32_t y, @@ -51,7 +53,7 @@ class TizenRendererEvasGL : public TizenRenderer { bool IsSupportedExtension(const char* name) override; - Evas_Object* GetImageHandle() { return graphics_adapter_; } + void BindKeys(const std::vector& keys) override; private: void Show(); diff --git a/shell/platform/tizen/touch_event_handler.cc b/shell/platform/tizen/touch_event_handler.cc index f684411187d4d..3f4a32c283512 100644 --- a/shell/platform/tizen/touch_event_handler.cc +++ b/shell/platform/tizen/touch_event_handler.cc @@ -13,6 +13,9 @@ namespace flutter { TouchEventHandler::TouchEventHandler(FlutterTizenEngine* engine) : engine_(engine) { + if (!engine->renderer() || !engine->renderer()->IsValid()) { + return; + } touch_event_handlers_.push_back( ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, OnTouch, this)); touch_event_handlers_.push_back( @@ -21,7 +24,6 @@ TouchEventHandler::TouchEventHandler(FlutterTizenEngine* engine) ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL, OnTouch, this)); touch_event_handlers_.push_back( ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, OnTouch, this)); - window_id_ = engine_->renderer()->GetWindowId(); } TouchEventHandler::~TouchEventHandler() { @@ -40,19 +42,17 @@ void TouchEventHandler::SendFlutterPointerEvent(FlutterPointerPhase phase, int device_id = 0) { // Correct errors caused by window rotation. auto geometry = engine_->renderer()->GetWindowGeometry(); - double width = geometry.w; - double height = geometry.h; double new_x = x, new_y = y; if (rotation == 90) { - new_x = height - y; + new_x = geometry.h - y; new_y = x; } else if (rotation == 180) { - new_x = width - x; - new_y = height - y; + new_x = geometry.w - x; + new_y = geometry.h - y; } else if (rotation == 270) { new_x = y; - new_y = width - x; + new_y = geometry.w - x; } FlutterPointerEvent event = {}; @@ -74,10 +74,11 @@ void TouchEventHandler::SendFlutterPointerEvent(FlutterPointerPhase phase, Eina_Bool TouchEventHandler::OnTouch(void* data, int type, void* event) { auto* self = reinterpret_cast(data); + auto window_id = self->engine_->renderer()->GetWindowId(); if (type == ECORE_EVENT_MOUSE_BUTTON_DOWN) { auto* button_event = reinterpret_cast(event); - if (self->window_id_ == button_event->window) { + if (window_id == button_event->window) { self->pointer_state_ = true; self->SendFlutterPointerEvent(kDown, button_event->x, button_event->y, 0, 0, button_event->timestamp, @@ -87,7 +88,7 @@ Eina_Bool TouchEventHandler::OnTouch(void* data, int type, void* event) { } else if (type == ECORE_EVENT_MOUSE_BUTTON_UP) { auto* button_event = reinterpret_cast(event); - if (self->window_id_ == button_event->window) { + if (window_id == button_event->window) { self->pointer_state_ = false; self->SendFlutterPointerEvent(kUp, button_event->x, button_event->y, 0, 0, button_event->timestamp, @@ -96,7 +97,7 @@ Eina_Bool TouchEventHandler::OnTouch(void* data, int type, void* event) { } } else if (type == ECORE_EVENT_MOUSE_MOVE) { auto* move_event = reinterpret_cast(event); - if (self->window_id_ == move_event->window) { + if (window_id == move_event->window) { if (self->pointer_state_) { self->SendFlutterPointerEvent(kMove, move_event->x, move_event->y, 0, 0, move_event->timestamp, @@ -106,7 +107,7 @@ Eina_Bool TouchEventHandler::OnTouch(void* data, int type, void* event) { } } else if (type == ECORE_EVENT_MOUSE_WHEEL) { auto* wheel_event = reinterpret_cast(event); - if (self->window_id_ == wheel_event->window) { + if (window_id == wheel_event->window) { double scroll_delta_x = 0.0, scroll_delta_y = 0.0; if (wheel_event->direction == kScrollDirectionVertical) { scroll_delta_y += wheel_event->z; diff --git a/shell/platform/tizen/touch_event_handler.h b/shell/platform/tizen/touch_event_handler.h index f37d0a082f450..a0ded51fc3d12 100644 --- a/shell/platform/tizen/touch_event_handler.h +++ b/shell/platform/tizen/touch_event_handler.h @@ -29,7 +29,6 @@ class TouchEventHandler { FlutterTizenEngine* engine_; std::vector touch_event_handlers_; bool pointer_state_ = false; - uintptr_t window_id_ = 0; void SendFlutterPointerEvent(FlutterPointerPhase phase, double x, From 279094fa3e1b91890d8411b9813da31f669b4739 Mon Sep 17 00:00:00 2001 From: Swift Kim Date: Fri, 4 Feb 2022 17:55:49 +0900 Subject: [PATCH 2/4] Fix x64 build --- shell/platform/tizen/channels/key_event_channel.cc | 2 +- shell/platform/tizen/tizen_renderer_evas_gl.cc | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/shell/platform/tizen/channels/key_event_channel.cc b/shell/platform/tizen/channels/key_event_channel.cc index 7d22b8de038b7..12b81e271d8ca 100644 --- a/shell/platform/tizen/channels/key_event_channel.cc +++ b/shell/platform/tizen/channels/key_event_channel.cc @@ -30,7 +30,7 @@ constexpr char kKeyDown[] = "keydown"; constexpr char kGtkToolkit[] = "gtk"; constexpr char kLinuxKeyMap[] = "linux"; -// Mapping from Tizen-specific key symbols to generalized (XKB) scan codes +// Mapping from Tizen-specific key symbols to standard XKB scan codes // (mainly for TV remote control support). // // The values are originally defined in: diff --git a/shell/platform/tizen/tizen_renderer_evas_gl.cc b/shell/platform/tizen/tizen_renderer_evas_gl.cc index c4a2fc32824fd..d681445e203a0 100644 --- a/shell/platform/tizen/tizen_renderer_evas_gl.cc +++ b/shell/platform/tizen/tizen_renderer_evas_gl.cc @@ -4,8 +4,8 @@ #include "tizen_renderer_evas_gl.h" -#include #ifndef __X64_SHELL__ +#include #include #endif @@ -787,9 +787,11 @@ bool TizenRendererEvasGL::IsSupportedExtension(const char* name) { } void TizenRendererEvasGL::BindKeys(const std::vector& keys) { +#ifndef __X64_SHELL__ for (const auto& key : keys) { eext_win_keygrab_set(evas_window_, key.c_str()); } +#endif } } // namespace flutter From e8def6505da51732bd1dce19016fc6acdccda783 Mon Sep 17 00:00:00 2001 From: Swift Kim Date: Mon, 7 Feb 2022 13:56:22 +0900 Subject: [PATCH 3/4] Minimize key remapping --- .../tizen/channels/key_event_channel.cc | 51 +++++-------------- shell/platform/tizen/key_event_handler.cc | 7 ++- 2 files changed, 16 insertions(+), 42 deletions(-) diff --git a/shell/platform/tizen/channels/key_event_channel.cc b/shell/platform/tizen/channels/key_event_channel.cc index 12b81e271d8ca..17b7db1850bd6 100644 --- a/shell/platform/tizen/channels/key_event_channel.cc +++ b/shell/platform/tizen/channels/key_event_channel.cc @@ -30,43 +30,17 @@ constexpr char kKeyDown[] = "keydown"; constexpr char kGtkToolkit[] = "gtk"; constexpr char kLinuxKeyMap[] = "linux"; -// Mapping from Tizen-specific key symbols to standard XKB scan codes -// (mainly for TV remote control support). +// Mapping from TV remote control key symbols to standard XKB scan codes. // // The values are originally defined in: -// - xkb-tizen-data/tizen_key_layout.txt.common +// - xkb-tizen-data/tizen_key_layout.txt.tv // - flutter/keyboard_maps.dart (kLinuxToPhysicalKey) const std::map kSymbolToScanCode = { - {"XF86AudioRaiseVolume", 0x0000007b}, // audioVolumeUp - {"XF86AudioLowerVolume", 0x0000007a}, // audioVolumeDown - {"XF86Menu", 0x00000087}, // contextMenu - {"XF86PowerOff", 0x0000007c}, // power - {"XF86Home", 0x0000006e}, // home - {"XF86AudioPlay", 0x000000d7}, // mediaPlay - {"XF86AudioPause", 0x000000d1}, // mediaPause - {"XF86AudioStop", 0x000000ae}, // mediaStop - {"XF86AudioNext", 0x000000ab}, // mediaTrackNext - {"XF86AudioPrev", 0x000000ad}, // mediaTrackPrevious - {"XF86AudioRewind", 0x000000b0}, // mediaRewind - {"XF86AudioForward", 0x000000d8}, // mediaFastForward - {"XF86AudioPlayPause", 0x000000ac}, // mediaPlayPause - {"XF86AudioMute", 0x00000079}, // audioVolumeMute - {"XF86AudioRecord", 0x000000af}, // mediaRecord - {"XF86HomePage", 0x000000b4}, // browserHome - {"XF86WWW", 0x0000009e}, // launchInternetBrowser - {"XF86Mail", 0x000000a3}, // launchMail - {"XF86ScreenSaver", 0x0000024d}, // launchScreenSaver - {"XF86MonBrightnessDown", 0x000000e8}, // brightnessDown - {"XF86MonBrightnessUp", 0x000000e9}, // brightnessUp - {"XF86Call", 0x000000b1}, // launchPhone - {"XF86LowerChannel", 0x000001a3}, // channelDown - {"XF86RaiseChannel", 0x000001a2}, // channelUp - {"XF86SysMenu", 0x00000087}, // contextMenu - {"XF86Close", 0x000000d6}, // close - {"XF86Info", 0x0000016e}, // info - {"XF86Phone", 0x000000b1}, // launchPhone - {"XF86PlayBack", 0x000000ac}, // mediaPlayPause - {"XF86ChannelGuide", 0x00000172}, // programGuide + {"XF86AudioPlay", 0x000000d7}, // mediaPlay + {"XF86AudioPlayPause", 0x000000ac}, // mediaPlayPause + {"XF86Menu", 0x00000087}, // contextMenu + {"XF86PlayBack", 0x000000ac}, // mediaPlayPause + {"XF86SysMenu", 0x00000087}, // contextMenu }; // Mapping from physical scan codes to logical (GTK) key codes. @@ -284,14 +258,15 @@ void KeyEventChannel::SendKeyEvent(Ecore_Event_Key* key, bool is_down, std::function callback) { uint32_t scan_code = key->keycode; - auto iter = kSymbolToScanCode.find(key->key); - if (iter != kSymbolToScanCode.end()) { - scan_code = iter->second; + auto iter1 = kSymbolToScanCode.find(key->key); + if (iter1 != kSymbolToScanCode.end()) { + scan_code = iter1->second; } uint32_t key_code = 0; - if (kScanCodeToKeyCode.count(scan_code)) { - key_code = kScanCodeToKeyCode.at(scan_code); + auto iter2 = kScanCodeToKeyCode.find(scan_code); + if (iter2 != kScanCodeToKeyCode.end()) { + key_code = iter2->second; } int modifiers = 0; diff --git a/shell/platform/tizen/key_event_handler.cc b/shell/platform/tizen/key_event_handler.cc index f1725c8b04fdf..b8b1f63408ef0 100644 --- a/shell/platform/tizen/key_event_handler.cc +++ b/shell/platform/tizen/key_event_handler.cc @@ -21,9 +21,8 @@ namespace { constexpr char kBackKey[] = "XF86Back"; constexpr char kExitKey[] = "XF86Exit"; -// The system may define its default behavior for some special key events. -// The following keys should always be handled by the app first. -const std::vector kRemappableSystemKeys = { +// Keys that should always be handled by the app first but not by the system. +const std::vector kBindableSystemKeys = { "XF86Menu", "XF86Back", "XF86AudioPlay", "XF86AudioPause", "XF86AudioStop", "XF86AudioNext", "XF86AudioPrev", "XF86AudioRewind", "XF86AudioForward", @@ -42,7 +41,7 @@ KeyEventHandler::KeyEventHandler(FlutterTizenEngine* engine) : engine_(engine) { if (!engine->renderer() || !engine->renderer()->IsValid()) { return; } - engine->renderer()->BindKeys(kRemappableSystemKeys); + engine->renderer()->BindKeys(kBindableSystemKeys); key_event_handlers_.push_back( ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, OnKey, this)); From b1da80e6c0b2305acc4bbf8843a0b7ff85932523 Mon Sep 17 00:00:00 2001 From: Swift Kim Date: Thu, 10 Feb 2022 18:26:04 +0900 Subject: [PATCH 4/4] Rename kModifierMap --- shell/platform/tizen/channels/key_event_channel.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shell/platform/tizen/channels/key_event_channel.cc b/shell/platform/tizen/channels/key_event_channel.cc index 17b7db1850bd6..e9e876c9d7649 100644 --- a/shell/platform/tizen/channels/key_event_channel.cc +++ b/shell/platform/tizen/channels/key_event_channel.cc @@ -226,7 +226,7 @@ const std::map kScanCodeToKeyCode = { // The values are originally defined in: // - efl/Ecore_Input.h // - flutter/raw_keyboard_linux.dart (GtkKeyHelper) -const std::map kModifierMap = { +const std::map kEcoreModifierToGtkModifier = { {0x0001, 1 << 0}, // SHIFT (modifierShift) {0x0002, 1 << 2}, // CTRL (modifierControl) {0x0004, 1 << 3}, // ALT (modifierMod1) @@ -239,7 +239,7 @@ const std::map kModifierMap = { uint32_t Utf8ToUtf32CodePoint(const char* utf8) { std::wstring_convert, wchar_t> converter; for (auto wchar : converter.from_bytes(utf8)) { - return std::uint_least32_t(wchar); + return wchar; } return 0; } @@ -270,7 +270,7 @@ void KeyEventChannel::SendKeyEvent(Ecore_Event_Key* key, } int modifiers = 0; - for (auto element : kModifierMap) { + for (auto element : kEcoreModifierToGtkModifier) { if (element.first & key->modifiers) { modifiers |= element.second; }