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.
This commit is contained in:
Po Lu 2024-05-12 15:46:38 +08:00
parent af6df8e045
commit ea98a6af2f
2 changed files with 57 additions and 31 deletions

View file

@ -505,42 +505,45 @@ else if (child.getVisibility () != GONE)
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

View file

@ -633,8 +633,8 @@ private static class Coordinate
/* 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 @@ private static class Coordinate
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 @@ private static class Coordinate
/* 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 @@ private static class Coordinate
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 @@ private static class Coordinate
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 @@ private static class Coordinate
/* 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 @@ private static class Coordinate
lastQuitKeyRelease = time;
}
return true;
}
public void