From ea813f8203d59ecda90464aa24b1643be91b58ad Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sun, 12 May 2024 15:46:38 +0800 Subject: [PATCH] Additional changes to processing of Num Lock on Android * java/org/gnu/emacs/EmacsView.java (onKeyDown, onKeyMultiple) (onKeyDown): Disregard Num and Scroll Lock keys, and return value of window functions to the system. * java/org/gnu/emacs/EmacsWindow.java (eventModifiers): Return normalized meta state, not only those bits the system considers modifiers. (onKeyDown, onKeyUp): Ignore numpad keys to which no base characters are assigned, so that the system may generate the proper action keys instead. (cherry picked from commit ea98a6af2f30eccfed3e152149c6a039bd16ff33) --- java/org/gnu/emacs/EmacsView.java | 45 +++++++++++++++-------------- java/org/gnu/emacs/EmacsWindow.java | 43 ++++++++++++++++++++------- 2 files changed, 57 insertions(+), 31 deletions(-) diff --git a/java/org/gnu/emacs/EmacsView.java b/java/org/gnu/emacs/EmacsView.java index 977ad90310d..074e7242540 100644 --- a/java/org/gnu/emacs/EmacsView.java +++ b/java/org/gnu/emacs/EmacsView.java @@ -505,42 +505,45 @@ public final class EmacsView extends ViewGroup public boolean onKeyDown (int keyCode, KeyEvent event) { - if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP - || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN - || keyCode == KeyEvent.KEYCODE_VOLUME_MUTE) - && !EmacsNative.shouldForwardMultimediaButtons ()) - return false; + if (((keyCode == KeyEvent.KEYCODE_VOLUME_UP + || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN + || keyCode == KeyEvent.KEYCODE_VOLUME_MUTE) + && !EmacsNative.shouldForwardMultimediaButtons ()) + || keyCode == KeyEvent.KEYCODE_SCROLL_LOCK + || keyCode == KeyEvent.KEYCODE_NUM_LOCK) + return super.onKeyDown (keyCode, event); - window.onKeyDown (keyCode, event); - return true; + return window.onKeyDown (keyCode, event); } @Override public boolean onKeyMultiple (int keyCode, int repeatCount, KeyEvent event) { - if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP - || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN - || keyCode == KeyEvent.KEYCODE_VOLUME_MUTE) - && !EmacsNative.shouldForwardMultimediaButtons ()) - return false; + if (((keyCode == KeyEvent.KEYCODE_VOLUME_UP + || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN + || keyCode == KeyEvent.KEYCODE_VOLUME_MUTE) + && !EmacsNative.shouldForwardMultimediaButtons ()) + || keyCode == KeyEvent.KEYCODE_SCROLL_LOCK + || keyCode == KeyEvent.KEYCODE_NUM_LOCK) + return super.onKeyMultiple (keyCode, repeatCount, event); - window.onKeyDown (keyCode, event); - return true; + return window.onKeyDown (keyCode, event); } @Override public boolean onKeyUp (int keyCode, KeyEvent event) { - if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP - || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN - || keyCode == KeyEvent.KEYCODE_VOLUME_MUTE) - && !EmacsNative.shouldForwardMultimediaButtons ()) - return false; + if (((keyCode == KeyEvent.KEYCODE_VOLUME_UP + || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN + || keyCode == KeyEvent.KEYCODE_VOLUME_MUTE) + && !EmacsNative.shouldForwardMultimediaButtons ()) + || keyCode == KeyEvent.KEYCODE_SCROLL_LOCK + || keyCode == KeyEvent.KEYCODE_NUM_LOCK) + return super.onKeyUp (keyCode, event); - window.onKeyUp (keyCode, event); - return true; + return window.onKeyUp (keyCode, event); } @Override diff --git a/java/org/gnu/emacs/EmacsWindow.java b/java/org/gnu/emacs/EmacsWindow.java index 7e90675d9be..aa1f3e9d96d 100644 --- a/java/org/gnu/emacs/EmacsWindow.java +++ b/java/org/gnu/emacs/EmacsWindow.java @@ -633,8 +633,8 @@ public final class EmacsWindow extends EmacsHandleObject /* Return the modifier mask associated with the specified keyboard - input EVENT. Replace bits corresponding to Left or Right keys - with their corresponding general modifier bits. */ + input EVENT. Replace bits representing Left or Right keys with + their corresponding general modifier bits. */ public static int eventModifiers (KeyEvent event) @@ -642,7 +642,7 @@ public final class EmacsWindow extends EmacsHandleObject int state; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) - state = event.getModifiers (); + state = KeyEvent.normalizeMetaState (event.getMetaState ()); else { /* Replace this with getMetaState and manual @@ -667,10 +667,10 @@ public final class EmacsWindow extends EmacsHandleObject /* event.getCharacters is used because older input methods still require it. */ @SuppressWarnings ("deprecation") - public void + public boolean onKeyDown (int keyCode, KeyEvent event) { - int state, state_1, extra_ignored; + int state, state_1, extra_ignored, unicode_char; long serial; String characters; @@ -686,7 +686,7 @@ public final class EmacsWindow extends EmacsHandleObject Deliver onKeyDown events in onKeyUp instead, so as not to navigate backwards during gesture navigation. */ - return; + return true; } state = eventModifiers (event); @@ -720,23 +720,36 @@ public final class EmacsWindow extends EmacsHandleObject state &= ~KeyEvent.META_ALT_MASK; } + unicode_char = getEventUnicodeChar (event, state_1); + + /* If a NUMPAD_ key is detected for which no character is returned, + return false without sending the key event, as this will prompt + the system to send an event with the corresponding action + key. */ + + if (keyCode >= KeyEvent.KEYCODE_NUMPAD_0 + && keyCode <= KeyEvent.KEYCODE_NUMPAD_RIGHT_PAREN + && unicode_char == 0) + return false; + synchronized (eventStrings) { serial = EmacsNative.sendKeyPress (this.handle, event.getEventTime (), state, keyCode, - getEventUnicodeChar (event, - state_1)); + unicode_char); characters = event.getCharacters (); if (characters != null && characters.length () > 1) saveUnicodeString ((int) serial, characters); } + + return true; } - public void + public boolean onKeyUp (int keyCode, KeyEvent event) { int state, state_1, unicode_char, extra_ignored; @@ -781,12 +794,20 @@ public final class EmacsWindow extends EmacsHandleObject /* If the key press's been canceled, return immediately. */ if ((event.getFlags () & KeyEvent.FLAG_CANCELED) != 0) - return; + return true; /* Dispatch the key press event that was deferred till now. */ EmacsNative.sendKeyPress (this.handle, event.getEventTime (), state, keyCode, unicode_char); } + /* If a NUMPAD_ key is detected for which no character is returned, + return false without sending the key event, as this will prompt + the system to send an event with the corresponding action + key. */ + else if (keyCode >= KeyEvent.KEYCODE_NUMPAD_0 + && keyCode <= KeyEvent.KEYCODE_NUMPAD_RIGHT_PAREN + && unicode_char == 0) + return false; EmacsNative.sendKeyRelease (this.handle, event.getEventTime (), state, keyCode, unicode_char); @@ -804,6 +825,8 @@ public final class EmacsWindow extends EmacsHandleObject lastQuitKeyRelease = time; } + + return true; } public void -- 2.39.5