summaryrefslogtreecommitdiff
path: root/java/org/gnu/emacs/EmacsNative.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/org/gnu/emacs/EmacsNative.java')
-rw-r--r--java/org/gnu/emacs/EmacsNative.java359
1 files changed, 359 insertions, 0 deletions
diff --git a/java/org/gnu/emacs/EmacsNative.java b/java/org/gnu/emacs/EmacsNative.java
new file mode 100644
index 00000000000..654e94b1a7d
--- /dev/null
+++ b/java/org/gnu/emacs/EmacsNative.java
@@ -0,0 +1,359 @@
+/* Communication module for Android terminals. -*- c-file-style: "GNU" -*-
+
+Copyright (C) 2023-2024 Free Software Foundation, Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
+
+package org.gnu.emacs;
+
+import android.content.res.AssetManager;
+
+import android.graphics.Bitmap;
+
+import android.view.inputmethod.ExtractedText;
+import android.view.inputmethod.ExtractedTextRequest;
+import android.view.inputmethod.SurroundingText;
+import android.view.inputmethod.TextAttribute;
+import android.view.inputmethod.TextSnapshot;
+
+public final class EmacsNative
+{
+ /* List of native libraries that must be loaded during class
+ initialization. */
+ private static final String[] libraryDeps;
+
+
+ /* Like `dup' in C. */
+ public static native int dup (int fd);
+
+ /* Like `close' in C. */
+ public static native int close (int fd);
+
+ /* Obtain the fingerprint of this build of Emacs. The fingerprint
+ can be used to determine the dump file name. */
+ public static native String getFingerprint ();
+
+ /* Set certain parameters before initializing Emacs.
+
+ assetManager must be the asset manager associated with the
+ context that is loading Emacs. It is saved and remains for the
+ remainder the lifetime of the Emacs process.
+
+ filesDir must be the package's data storage location for the
+ current Android user.
+
+ libDir must be the package's data storage location for native
+ libraries. It is used as PATH.
+
+ cacheDir must be the package's cache directory. It is used as
+ the `temporary-file-directory'.
+
+ pixelDensityX and pixelDensityY are the DPI values that will be
+ used by Emacs.
+
+ scaledDensity is the DPI value used to translate point sizes to
+ pixel sizes when loading fonts.
+
+ classPath must be the classpath of this app_process process, or
+ NULL.
+
+ emacsService must be the EmacsService singleton, or NULL.
+
+ apiLevel is the version of Android being run. */
+ public static native void setEmacsParams (AssetManager assetManager,
+ String filesDir,
+ String libDir,
+ String cacheDir,
+ float pixelDensityX,
+ float pixelDensityY,
+ float scaledDensity,
+ String classPath,
+ EmacsService emacsService,
+ int apiLevel);
+
+ /* Initialize Emacs with the argument array ARGV. Each argument
+ must contain a NULL terminated string, or else the behavior is
+ undefined.
+
+ DUMPFILE is the dump file to use, or NULL if Emacs is to load
+ loadup.el itself. */
+ public static native void initEmacs (String argv[], String dumpFile);
+
+ /* Call shut_down_emacs to auto-save and unlock files in the main
+ thread, then return. */
+ public static native void shutDownEmacs ();
+
+ /* Garbage collect and clear each frame's image cache. */
+ public static native void onLowMemory ();
+
+ /* Abort and generate a native core dump. */
+ public static native void emacsAbort ();
+
+ /* Set Vquit_flag to t, resulting in Emacs quitting as soon as
+ possible. */
+ public static native void quit ();
+
+ /* Send an ANDROID_CONFIGURE_NOTIFY event. The values of all the
+ functions below are the serials of the events sent. */
+ public static native long sendConfigureNotify (short window, long time,
+ int x, int y, int width,
+ int height);
+
+ /* Send an ANDROID_KEY_PRESS event. */
+ public static native long sendKeyPress (short window, long time, int state,
+ int keyCode, int unicodeChar);
+
+ /* Send an ANDROID_KEY_RELEASE event. */
+ public static native long sendKeyRelease (short window, long time, int state,
+ int keyCode, int unicodeChar);
+
+ /* Send an ANDROID_FOCUS_IN event. */
+ public static native long sendFocusIn (short window, long time);
+
+ /* Send an ANDROID_FOCUS_OUT event. */
+ public static native long sendFocusOut (short window, long time);
+
+ /* Send an ANDROID_WINDOW_ACTION event. */
+ public static native long sendWindowAction (short window, int action);
+
+ /* Send an ANDROID_ENTER_NOTIFY event. */
+ public static native long sendEnterNotify (short window, int x, int y,
+ long time);
+
+ /* Send an ANDROID_LEAVE_NOTIFY event. */
+ public static native long sendLeaveNotify (short window, int x, int y,
+ long time);
+
+ /* Send an ANDROID_MOTION_NOTIFY event. */
+ public static native long sendMotionNotify (short window, int x, int y,
+ long time);
+
+ /* Send an ANDROID_BUTTON_PRESS event. */
+ public static native long sendButtonPress (short window, int x, int y,
+ long time, int state,
+ int button);
+
+ /* Send an ANDROID_BUTTON_RELEASE event. */
+ public static native long sendButtonRelease (short window, int x, int y,
+ long time, int state,
+ int button);
+
+ /* Send an ANDROID_TOUCH_DOWN event. */
+ public static native long sendTouchDown (short window, int x, int y,
+ long time, int pointerID,
+ int flags);
+
+ /* Send an ANDROID_TOUCH_UP event. */
+ public static native long sendTouchUp (short window, int x, int y,
+ long time, int pointerID,
+ int flags);
+
+ /* Send an ANDROID_TOUCH_MOVE event. */
+ public static native long sendTouchMove (short window, int x, int y,
+ long time, int pointerID,
+ int flags);
+
+ /* Send an ANDROID_WHEEL event. */
+ public static native long sendWheel (short window, int x, int y,
+ long time, int state,
+ float xDelta, float yDelta);
+
+ /* Send an ANDROID_ICONIFIED event. */
+ public static native long sendIconified (short window);
+
+ /* Send an ANDROID_DEICONIFIED event. */
+ public static native long sendDeiconified (short window);
+
+ /* Send an ANDROID_CONTEXT_MENU event. */
+ public static native long sendContextMenu (short window, int menuEventID,
+ int menuEventSerial);
+
+ /* Send an ANDROID_EXPOSE event. */
+ public static native long sendExpose (short window, int x, int y,
+ int width, int height);
+
+ /* Send an ANDROID_DND_DRAG event. */
+ public static native long sendDndDrag (short window, int x, int y);
+
+ /* Send an ANDROID_DND_URI event. */
+ public static native long sendDndUri (short window, int x, int y,
+ String text);
+
+ /* Send an ANDROID_DND_TEXT event. */
+ public static native long sendDndText (short window, int x, int y,
+ String text);
+
+ /* Send an ANDROID_NOTIFICATION_CANCELED event. */
+ public static native void sendNotificationDeleted (String tag);
+
+ /* Send an ANDROID_NOTIFICATION_ACTION event. */
+ public static native void sendNotificationAction (String tag, String action);
+
+ /* Return the file name associated with the specified file
+ descriptor, or NULL if there is none. */
+ public static native byte[] getProcName (int fd);
+
+ /* Notice that the Emacs thread will now start waiting for the main
+ thread's looper to respond. */
+ public static native void beginSynchronous ();
+
+ /* Notice that the Emacs thread will has finished waiting for the
+ main thread's looper to respond. */
+ public static native void endSynchronous ();
+
+ /* Prevent deadlocks while reliably allowing queries from the Emacs
+ thread to the main thread to complete by waiting for a query to
+ start from the main thread, then answer it; assume that a query
+ is certain to start shortly. */
+ public static native void answerQuerySpin ();
+
+ /* Return whether or not KEYCODE_VOLUME_DOWN, KEYCODE_VOLUME_UP and
+ 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 ();
+
+
+
+ /* Input connection functions. These mostly correspond to their
+ counterparts in Android's InputConnection. */
+
+ public static native void beginBatchEdit (short window);
+ public static native void endBatchEdit (short window);
+ public static native void commitCompletion (short window, String text,
+ int position);
+ public static native void commitText (short window, String text,
+ int position);
+ public static native void deleteSurroundingText (short window,
+ int leftLength,
+ int rightLength);
+ public static native void finishComposingText (short window);
+ public static native void replaceText (short window, int start, int end,
+ String text, int newCursorPosition,
+ TextAttribute attributes);
+ public static native String getSelectedText (short window, int flags);
+ public static native String getTextAfterCursor (short window, int length,
+ int flags);
+ public static native String getTextBeforeCursor (short window, int length,
+ int flags);
+ public static native void setComposingText (short window, String text,
+ int newCursorPosition);
+ public static native void setComposingRegion (short window, int start,
+ int end);
+ public static native void setSelection (short window, int start, int end);
+ public static native void performEditorAction (short window,
+ int editorAction);
+ public static native void performContextMenuAction (short window,
+ int contextMenuAction);
+ public static native ExtractedText getExtractedText (short window,
+ ExtractedTextRequest req,
+ int flags);
+ public static native void requestSelectionUpdate (short window);
+ public static native void requestCursorUpdates (short window, int mode);
+ public static native void clearInputFlags (short window);
+ public static native SurroundingText getSurroundingText (short window,
+ int left, int right,
+ int flags);
+ public static native TextSnapshot takeSnapshot (short window);
+
+
+ /* Return the current value of the selection, or -1 upon
+ failure. */
+ public static native int[] getSelection (short window);
+
+
+ /* Graphics functions used as replacements for potentially buggy
+ Android APIs. */
+
+ public static native void blitRect (Bitmap src, Bitmap dest, int x1,
+ int y1, int x2, int y2);
+
+ /* Increment the generation ID of the specified BITMAP, forcing its
+ texture to be re-uploaded to the GPU. */
+ public static native void notifyPixelsChanged (Bitmap bitmap);
+
+
+ /* Functions used to synchronize document provider access with the
+ main thread. */
+
+ /* Wait for a call to `safPostRequest' while also reading async
+ input.
+
+ If asynchronous input arrives and sets Vquit_flag, return 1. */
+ public static native int safSyncAndReadInput ();
+
+ /* Wait for a call to `safPostRequest'. */
+ public static native void safSync ();
+
+ /* Post the semaphore used to await the completion of SAF
+ operations. */
+ public static native void safPostRequest ();
+
+ /* Detect and return FD is writable. FD may be truncated to 0 bytes
+ in the process. */
+ public static native boolean ftruncate (int fd);
+
+
+ /* Functions that assist in generating content file names. */
+
+ /* Calculate an 8 digit checksum for the byte array DISPLAYNAME
+ suitable for inclusion in a content file name. */
+ public static native String displayNameHash (byte[] displayName);
+
+ static
+ {
+ /* Older versions of Android cannot link correctly with shared
+ libraries that link with other shared libraries built along
+ Emacs unless all requisite shared libraries are explicitly
+ loaded from Java.
+
+ Every time you add a new shared library dependency to Emacs,
+ please add it here as well. */
+
+ libraryDeps = new String[] { "c++_shared", "gnustl_shared",
+ "stlport_shared", "gabi++_shared",
+ "png_emacs", "selinux_emacs",
+ "crypto_emacs", "pcre_emacs",
+ "packagelistparser_emacs",
+ "gnutls_emacs", "gmp_emacs",
+ "nettle_emacs", "p11-kit_emacs",
+ "tasn1_emacs", "hogweed_emacs",
+ "jansson_emacs", "jpeg_emacs",
+ "tiff_emacs", "xml2_emacs",
+ "icuuc_emacs", "harfbuzz_emacs",
+ "tree-sitter_emacs", };
+
+ for (String dependency : libraryDeps)
+ {
+ try
+ {
+ System.loadLibrary (dependency);
+ }
+ catch (UnsatisfiedLinkError exception)
+ {
+ /* Ignore this exception. */
+ }
+ }
+
+ System.loadLibrary ("emacs");
+ };
+};