leanflutter/hotkey_manager

Phantom key presses

kmalyshev opened this issue · 1 comments

Hello,
First of all - thank you for your package. It saved me a ton of time.
I'm on macOS v13.0.1, M1 macbook. Everything written below is related to inapp hotkeys.

I added a log to hotkey_manager.dart file, _handleRawKeyEvent method to track everything that happens in the package.

    print(
        'RawKeyEvent: lastPressedKey: $_lastPressedHotKey, identifier: ${_lastPressedHotKey?.identifier} $value, ${value.character}, ${value.logicalKey}');

On any keypress i receive 2 additional events:

KeyDown: RawKeyEvent: lastPressedKey: null, identifier: null RawKeyDownEvent#c6e77(logicalKey: LogicalKeyboardKey#d0ba2(keyId: "0x200000100", keyLabel: "Control Left", debugName: "Control Left"), physicalKey: PhysicalKeyboardKey#ea6e1(usbHidUsage: "0x000700e0", debugName: "Control Left"), repeat: false), null, LogicalKeyboardKey#d0ba2(keyId: "0x200000100", keyLabel: "Control Left", debugName: "Control Left")

KeyDown: flutter: RawKeyEvent: lastPressedKey: null, identifier: null RawKeyUpEvent#7fb91(logicalKey: LogicalKeyboardKey#df100(keyId: "0x200000102", keyLabel: "Shift Left", debugName: "Shift Left"), physicalKey: PhysicalKeyboardKey#ed430(usbHidUsage: "0x000700e1", debugName: "Shift Left")), null, LogicalKeyboardKey#df100(keyId: "0x200000102", keyLabel: "Shift Left", debugName: "Shift Left")

KeyUp for them is never registered.
It doesn't bother me, just noticed. The actual problem is below:

If you register any key to hide the app on keyDown, then keyUp event is never triggered for that key. Therefore method 'handleRawKeyEvent' inside raw_keyboard.dart never removes that key from _keysPressed. As the result
HotKey? hotKey = _hotKeyList.firstWhereOrNull( inside hotkey_manager.dart
triggers the following code inside 'raw_keyboard.dart' class
bool isKeyPressed(LogicalKeyboardKey key) => RawKeyboard.instance.keysPressed.contains(key);
returns true for an event it shouldn't be triggering (because firstWhereOrNull iterates over all registered hotkeys)

I made a workaround by hiding the window on keyUp event, however the problematic code is still inside.

I was wrong, it's an issue with flutter's rawKeyboard, the issue is well-described here - flutter/flutter#99330