diff options
| author | Po Lu <luangruo@yahoo.com> | 2025-11-24 10:16:21 +0800 |
|---|---|---|
| committer | Po Lu <luangruo@yahoo.com> | 2025-11-24 10:16:49 +0800 |
| commit | 7550791287503ebc582c92841f6483032aa0b050 (patch) | |
| tree | 12d9c7bcc1cba5a0ddf0a2be2199c661af6de429 /java | |
| parent | 435c3948a477a3e24af9cd866584c4e0f41f86b9 (diff) | |
Support `toolkit-theme-set-functions' on Android and execute hooks safely
* java/org/gnu/emacs/EmacsNative.java (setEmacsParams): New arg
UIMODE.
(sendConfigurationChanged): New args DETAIL and UI_MODE.
* java/org/gnu/emacs/EmacsNoninteractive.java (main1): Provide
an undefined UI mode.
* java/org/gnu/emacs/EmacsService.java (EmacsService): New field
uiMode.
(onCreate): Initialize this field at start-up and provide the
same to setEmacsParams.
(onConfigurationChanged): If the UI mode has been altered,
generate a configuration changed event to match.
* src/android.c (android_ui_mode): New variable.
(setEmacsParams): New argument UI_MODE. Initialize the same
from this variable.
* src/androidgui.h (enum android_configuration_changed): New
enum.
(struct android_configuration_changed_event): New field
`DETAIL'. Convert fields providing specifics into a union of
display density information and a UI mode integer.
* src/androidterm.c (handle_one_android_event): Handle both
manners of configuration change events.
(android_term_init): Initialize Vtoolkit_theme from UI mode
provided at start-up.
* src/frame.c (syms_of_frame): Always define Vtoolkit_theme.
Define Qtoolkit_theme_set_functions.
* src/gtkutil.c (xg_update_dark_mode_for_all_displays):
* src/w32term.c (w32_read_socket): Generate special toolkit
theme events, rather than executing hooks directly within the
read_socket callback.
* src/keyboard.c (kbd_buffer_get_event)
<TOOLKIT_THEME_CHANGED_EVENT>: Run Qtoolkit_theme_set_functions
and set Vtoolkit_theme from event->ie.arg.
* src/termhooks.h (enum event_kind): New event
TOOLKIT_THEME_CHANGED_EVENT.
Diffstat (limited to 'java')
| -rw-r--r-- | java/org/gnu/emacs/EmacsNative.java | 9 | ||||
| -rw-r--r-- | java/org/gnu/emacs/EmacsNoninteractive.java | 2 | ||||
| -rw-r--r-- | java/org/gnu/emacs/EmacsService.java | 20 |
3 files changed, 25 insertions, 6 deletions
diff --git a/java/org/gnu/emacs/EmacsNative.java b/java/org/gnu/emacs/EmacsNative.java index 49a21ce1c4d..fac4b6f01df 100644 --- a/java/org/gnu/emacs/EmacsNative.java +++ b/java/org/gnu/emacs/EmacsNative.java @@ -61,6 +61,9 @@ public final class EmacsNative scaledDensity is the DPI value used to translate point sizes to pixel sizes when loading fonts. + uiMode holds the bits of the system's UI mode specification + defining the active system theme. + classPath must be the classpath of this app_process process, or NULL. @@ -74,6 +77,7 @@ public final class EmacsNative float pixelDensityX, float pixelDensityY, float scaledDensity, + int uiMode, String classPath, EmacsService emacsService, int apiLevel); @@ -197,8 +201,9 @@ public final class EmacsNative public static native void sendNotificationAction (String tag, String action); /* Send an ANDROID_CONFIGURATION_CHANGED event. */ - public static native void sendConfigurationChanged (float dpiX, float dpiY, - float dpiScaled); + public static native void sendConfigurationChanged (int detail, float dpiX, + float dpiY, float dpiScaled, + int ui_mode); /* Return the file name associated with the specified file descriptor, or NULL if there is none. */ diff --git a/java/org/gnu/emacs/EmacsNoninteractive.java b/java/org/gnu/emacs/EmacsNoninteractive.java index 83ef04b1cf1..b4d055ce4c9 100644 --- a/java/org/gnu/emacs/EmacsNoninteractive.java +++ b/java/org/gnu/emacs/EmacsNoninteractive.java @@ -67,7 +67,7 @@ public final class EmacsNoninteractive cacheDir = context.getCacheDir ().getCanonicalPath (); EmacsNative.setEmacsParams (assets, filesDir, libDir, cacheDir, 0.0f, - 0.0f, 0.0f, null, null, + 0.0f, 0.0f, 0x0, null, null, Build.VERSION.SDK_INT); /* Now find the dump file that Emacs should use, if it has already diff --git a/java/org/gnu/emacs/EmacsService.java b/java/org/gnu/emacs/EmacsService.java index 3630329839f..d141f6f4d0d 100644 --- a/java/org/gnu/emacs/EmacsService.java +++ b/java/org/gnu/emacs/EmacsService.java @@ -150,6 +150,10 @@ public final class EmacsService extends Service consulted for font scaling. */ private double dpiX, dpiY, dpiScaled; + /* The display's previously observed UI mode as it relates to the + system theme. */ + private int uiMode; + static { servicingQuery = new AtomicInteger (); @@ -240,6 +244,7 @@ public final class EmacsService extends Service float tempScaledDensity; Resources resources; DisplayMetrics metrics; + Configuration configuration; super.onCreate (); @@ -254,6 +259,8 @@ public final class EmacsService extends Service tempScaledDensity = ((getScaledDensity (metrics) / metrics.density) * pixelDensityX); + configuration = resources.getConfiguration (); + uiMode = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK; resolver = getContentResolver (); mainThread = Thread.currentThread (); @@ -311,7 +318,8 @@ public final class EmacsService extends Service EmacsNative.setEmacsParams (manager, filesDir, libDir, cacheDir, pixelDensityX, pixelDensityY, scaledDensity, - classPath, EmacsService.this, + uiMode, classPath, + EmacsService.this, Build.VERSION.SDK_INT); } }, extraStartupArguments); @@ -375,8 +383,14 @@ public final class EmacsService extends Service dpiX = pixelDensityX; dpiY = pixelDensityY; dpiScaled = scaledDensity; - EmacsNative.sendConfigurationChanged (pixelDensityX, pixelDensityY, - scaledDensity); + EmacsNative.sendConfigurationChanged (0, pixelDensityX, pixelDensityY, + scaledDensity, 0); + } + + if ((newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK) != uiMode) + { + uiMode = newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK; + EmacsNative.sendConfigurationChanged (1, 0.0f, 0.0f, 0.0f, uiMode); } super.onConfigurationChanged (newConfig); |
