]> git.eshelyaron.com Git - emacs.git/commitdiff
Additional changes to processing of Num Lock on Android
authorPo Lu <luangruo@yahoo.com>
Sun, 12 May 2024 07:46:38 +0000 (15:46 +0800)
committerEshel Yaron <me@eshelyaron.com>
Sun, 12 May 2024 15:49:39 +0000 (17:49 +0200)
* 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
java/org/gnu/emacs/EmacsWindow.java

index 977ad90310d3070662e9edd0f5ffd43c6ee40cf9..074e7242540ceac93c344c21cba8efca104ec87d 100644 (file)
@@ -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
index 7e90675d9be83dd20cea65960f2221bb9c8483af..aa1f3e9d96d63535b2b9dcb2494fb05dbed84491 100644 (file)
@@ -633,8 +633,8 @@ public final class EmacsWindow extends EmacsHandleObject
 \f
 
   /* 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