1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-15 10:30:25 -08:00

Update Android port

* java/org/gnu/emacs/EmacsService.java (sync): Delete function.
* java/org/gnu/emacs/EmacsView.java (handleDirtyBitmap): Erase
with window background.
(onDetachedFromWindow): Only recycle bitmap if non-NULL.
* java/org/gnu/emacs/EmacsWindow.java (background): New field.
(changeWindowBackground): Set it.
* src/android.c (struct android_emacs_service): Remove `sync'.
(android_init_emacs_service): Likewise.
(android_sync): Delete function.
* src/androidfns.c (android_create_tip_frame): Set frame
background color correctly.
(Fx_show_tip): Make the tip frame visible.
* src/androidgui.h: Update prototypes.
* src/androidterm.c (handle_one_android_event): Handle tooltip
movement correctly.
This commit is contained in:
Po Lu 2023-03-06 11:25:51 +08:00
parent 0dbbdd20f4
commit 97ca0a8551
7 changed files with 29 additions and 39 deletions

View file

@ -481,25 +481,6 @@ public final class EmacsService extends Service
return String.valueOf (keysym);
}
public void
sync ()
{
Runnable runnable;
runnable = new Runnable () {
public void
run ()
{
synchronized (this)
{
notify ();
}
}
};
syncRunnable (runnable);
}
/* Start the Emacs service if necessary. On Android 26 and up,

View file

@ -168,7 +168,7 @@ public final class EmacsView extends ViewGroup
= Bitmap.createBitmap (measuredWidth,
measuredHeight,
Bitmap.Config.ARGB_8888);
bitmap.eraseColor (0xffffffff);
bitmap.eraseColor (window.background | 0xff000000);
/* And canvases. */
canvas = new Canvas (bitmap);
@ -507,7 +507,10 @@ public final class EmacsView extends ViewGroup
synchronized (this)
{
/* Recycle the bitmap and call GC. */
bitmap.recycle ();
if (bitmap != null)
bitmap.recycle ();
bitmap = null;
canvas = null;
surfaceView.setBitmap (null, null);

View file

@ -129,6 +129,10 @@ public final class EmacsWindow extends EmacsHandleObject
/* Whether or not this window is fullscreen. */
public boolean fullscreen;
/* The window background pixel. This is used by EmacsView when
creating new bitmaps. */
public volatile int background;
public
EmacsWindow (short handle, final EmacsWindow parent, int x, int y,
int width, int height, boolean overrideRedirect)
@ -183,6 +187,9 @@ public final class EmacsWindow extends EmacsHandleObject
/* scratchGC is used as the argument to a FillRectangles req. */
scratchGC.foreground = pixel;
scratchGC.markDirty (false);
/* Make the background known to the view as well. */
background = pixel;
}
public Rect

View file

@ -104,7 +104,6 @@ struct android_emacs_service
jmethodID get_screen_height;
jmethodID detect_mouse;
jmethodID name_keysym;
jmethodID sync;
jmethodID browse_url;
jmethodID restart_emacs;
jmethodID update_ic;
@ -2122,7 +2121,6 @@ android_init_emacs_service (void)
FIND_METHOD (get_screen_height, "getScreenHeight", "(Z)I");
FIND_METHOD (detect_mouse, "detectMouse", "()Z");
FIND_METHOD (name_keysym, "nameKeysym", "(I)Ljava/lang/String;");
FIND_METHOD (sync, "sync", "()V");
FIND_METHOD (browse_url, "browseUrl", "(Ljava/lang/String;)"
"Ljava/lang/String;");
FIND_METHOD (restart_emacs, "restartEmacs", "()V");
@ -4514,15 +4512,6 @@ android_translate_coordinates (android_window src, int x,
ANDROID_DELETE_LOCAL_REF (coordinates);
}
void
android_sync (void)
{
(*android_java_env)->CallVoidMethod (android_java_env,
emacs_service,
service_class.sync);
android_exception_check ();
}
int
android_wc_lookup_string (android_key_pressed_event *event,
wchar_t *buffer_return, int wchars_buffer,

View file

@ -1883,9 +1883,10 @@ android_create_tip_frame (struct android_display_info *dpyinfo,
unsigned long mask;
block_input ();
mask = ANDROID_CW_OVERRIDE_REDIRECT;
mask = ANDROID_CW_OVERRIDE_REDIRECT | ANDROID_CW_BACK_PIXEL;
attrs.override_redirect = true;
attrs.background_pixel = FRAME_BACKGROUND_PIXEL (f);
tip_window
= FRAME_ANDROID_WINDOW (f)
= android_create_window (FRAME_DISPLAY_INFO (f)->root_window,
@ -2314,10 +2315,6 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
android_map_raised (FRAME_ANDROID_WINDOW (tip_f));
unblock_input ();
/* Synchronize with the UI thread. This is required to prevent ugly
black splotches. */
android_sync ();
/* Garbage the tip frame too. */
SET_FRAME_GARBAGED (tip_f);
@ -2328,6 +2325,11 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
unbind_to (count_1, Qnil);
windows_or_buffers_changed = old_windows_or_buffers_changed;
/* MapNotify events are not sent on Android, so make the frame
visible. */
SET_FRAME_VISIBLE (tip_f, true);
start_timer:
/* Let the tip disappear after timeout seconds. */
tip_timer = call3 (Qrun_at_time, timeout, Qnil,

View file

@ -606,8 +606,6 @@ extern void android_move_resize_window (android_window, int, int,
extern void android_map_raised (android_window);
extern void android_translate_coordinates (android_window, int,
int, int *, int *);
extern void android_sync (void);
extern int android_wc_lookup_string (android_key_pressed_event *,
wchar_t *, int, int *,
enum android_lookup_status *);

View file

@ -676,6 +676,16 @@ handle_one_android_event (struct android_display_info *dpyinfo,
if (!f)
goto OTHER;
if (FRAME_TOOLTIP_P (f))
{
if (FRAME_PIXEL_HEIGHT (f) != configureEvent.xconfigure.height
|| FRAME_PIXEL_WIDTH (f) != configureEvent.xconfigure.width)
SET_FRAME_GARBAGED (f);
FRAME_PIXEL_HEIGHT (f) = configureEvent.xconfigure.height;
FRAME_PIXEL_WIDTH (f) = configureEvent.xconfigure.width;
}
int width = configureEvent.xconfigure.width;
int height = configureEvent.xconfigure.height;