summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2025-11-24 10:16:21 +0800
committerPo Lu <luangruo@yahoo.com>2025-11-24 10:16:49 +0800
commit7550791287503ebc582c92841f6483032aa0b050 (patch)
tree12d9c7bcc1cba5a0ddf0a2be2199c661af6de429 /java
parent435c3948a477a3e24af9cd866584c4e0f41f86b9 (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.java9
-rw-r--r--java/org/gnu/emacs/EmacsNoninteractive.java2
-rw-r--r--java/org/gnu/emacs/EmacsService.java20
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);