From 297ccd967f24e37bc51c057da43c862291a55ddd Mon Sep 17 00:00:00 2001 From: Po Lu Date: Wed, 30 Aug 2023 10:07:49 +0800 Subject: Facilitate typing `C-SPC' on Android * doc/emacs/android.texi (Android Windowing): Mention C-SPC interception and how it may be disabled. * java/org/gnu/emacs/EmacsNative.java (shouldForwardCtrlSpace): New function. * java/org/gnu/emacs/EmacsView.java (onKeyPreIme): New function. If the provided key code is SPC and the event's modifier key mask contains ControlMask, relay it directly to onKeyDown. * java/org/gnu/emacs/EmacsWindow.java (eventModifiers): Export and make static. * src/android.c (shouldForwardCtrlSpace): New function. * src/androidfns.c (syms_of_androidfns) : New defvar. --- java/org/gnu/emacs/EmacsNative.java | 4 ++++ java/org/gnu/emacs/EmacsView.java | 20 ++++++++++++++++++++ java/org/gnu/emacs/EmacsWindow.java | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) (limited to 'java/org/gnu') diff --git a/java/org/gnu/emacs/EmacsNative.java b/java/org/gnu/emacs/EmacsNative.java index fae0ba98f86..a4b45aafbc1 100644 --- a/java/org/gnu/emacs/EmacsNative.java +++ b/java/org/gnu/emacs/EmacsNative.java @@ -196,6 +196,10 @@ public final class EmacsNative KEYCODE_VOLUME_MUTE should be forwarded to Emacs. */ public static native boolean shouldForwardMultimediaButtons (); + /* Return whether KEYCODE_SPACE combined with META_CTRL_MASK should + be prevented from reaching the system input method. */ + public static native boolean shouldForwardCtrlSpace (); + /* Initialize the current thread, by blocking signals that do not interest it. */ public static native void setupSystemThread (); diff --git a/java/org/gnu/emacs/EmacsView.java b/java/org/gnu/emacs/EmacsView.java index 5a4bcbaa005..04c3d824027 100644 --- a/java/org/gnu/emacs/EmacsView.java +++ b/java/org/gnu/emacs/EmacsView.java @@ -470,6 +470,26 @@ public final class EmacsView extends ViewGroup surfaceView.setBitmap (bitmap, damageRect); } + @Override + public boolean + onKeyPreIme (int keyCode, KeyEvent event) + { + /* Several Android systems intercept key events representing + C-SPC. Avert this by detecting C-SPC events here and relaying + them directly to onKeyDown. + + Make this optional though, since some input methods also + leverage C-SPC as a shortcut for switching languages. */ + + if ((keyCode == KeyEvent.KEYCODE_SPACE + && (window.eventModifiers (event) + & KeyEvent.META_CTRL_MASK) != 0) + && !EmacsNative.shouldForwardCtrlSpace ()) + return onKeyDown (keyCode, event); + + return super.onKeyPreIme (keyCode, event); + } + @Override public boolean onKeyDown (int keyCode, KeyEvent event) diff --git a/java/org/gnu/emacs/EmacsWindow.java b/java/org/gnu/emacs/EmacsWindow.java index aff5046b22e..3738376a6f4 100644 --- a/java/org/gnu/emacs/EmacsWindow.java +++ b/java/org/gnu/emacs/EmacsWindow.java @@ -576,7 +576,7 @@ public final class EmacsWindow extends EmacsHandleObject input EVENT. Replace bits corresponding to Left or Right keys with their corresponding general modifier bits. */ - private int + public static int eventModifiers (KeyEvent event) { int state; -- cgit v1.2.1