1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-06 06:20:55 -08:00

Fix omission of updates to child frames on Android

* java/org/gnu/emacs/EmacsView.java (onAttachedFromWindow):
Force a layout cycle rather than report exposure immediately.
(prepareForLayout): Delete function.

* java/org/gnu/emacs/EmacsWindow.java (mapWindow): Remove
redundant calls to prepareForLayout.

* src/androidterm.c (handle_one_android_event): Do not swap
buffers when exposure is registered by a frame only partially
updated.
This commit is contained in:
Po Lu 2024-06-24 12:04:05 +08:00
parent 0edacf2aa7
commit 73a58329a6
3 changed files with 22 additions and 23 deletions

View file

@ -267,13 +267,6 @@ public final class EmacsView extends ViewGroup
return canvas; return canvas;
} }
public synchronized void
prepareForLayout (int wantedWidth, int wantedHeight)
{
measuredWidth = wantedWidth;
measuredHeight = wantedWidth;
}
@Override @Override
protected void protected void
onMeasure (int widthMeasureSpec, int heightMeasureSpec) onMeasure (int widthMeasureSpec, int heightMeasureSpec)
@ -773,23 +766,30 @@ public final class EmacsView extends ViewGroup
/* Collect the bitmap storage; it could be large. */ /* Collect the bitmap storage; it could be large. */
Runtime.getRuntime ().gc (); Runtime.getRuntime ().gc ();
super.onDetachedFromWindow (); super.onDetachedFromWindow ();
} }
@Override @Override
public synchronized void public void
onAttachedToWindow () onAttachedToWindow ()
{ {
isAttachedToWindow = true; synchronized (this)
{
isAttachedToWindow = true;
/* Dirty the bitmap, as it was destroyed when onDetachedFromWindow /* Dirty the bitmap, as it was destroyed when
was called. */ onDetachedFromWindow was called. */
bitmapDirty = true; bitmapDirty = true;
/* Now expose the view contents again. */ /* Rather than unconditionally generating an exposure event upon
EmacsNative.sendExpose (this.window.handle, 0, 0, window attachment, avoid delivering successive Exposure
measuredWidth, measuredHeight); events if the size of the window has changed but is still to
be reported by clearing the measured width and height, and
requesting another layout computation. */
measuredWidth = measuredHeight = 0;
}
requestLayout ();
super.onAttachedToWindow (); super.onAttachedToWindow ();
} }

View file

@ -492,7 +492,6 @@ public final class EmacsWindow extends EmacsHandleObject
/* Attach the view. */ /* Attach the view. */
try try
{ {
view.prepareForLayout (width, height);
windowManager.addView (view, params); windowManager.addView (view, params);
/* Record the window manager being used in the /* Record the window manager being used in the
@ -517,11 +516,6 @@ public final class EmacsWindow extends EmacsHandleObject
public void public void
run () run ()
{ {
/* Prior to mapping the view, set its measuredWidth and
measuredHeight to some reasonable value, in order to
avoid excessive bitmap dirtying. */
view.prepareForLayout (width, height);
view.setVisibility (View.VISIBLE); view.setVisibility (View.VISIBLE);
if (!getDontFocusOnMap ()) if (!getDontFocusOnMap ())

View file

@ -1279,7 +1279,12 @@ handle_one_android_event (struct android_display_info *dpyinfo,
{ {
expose_frame (f, event->xexpose.x, event->xexpose.y, expose_frame (f, event->xexpose.x, event->xexpose.y,
event->xexpose.width, event->xexpose.height); event->xexpose.width, event->xexpose.height);
show_back_buffer (f);
/* Do not display the back buffer if F is yet being
updated, as this might trigger premature bitmap
reconfiguration. */
if (FRAME_ANDROID_COMPLETE_P (f))
show_back_buffer (f);
} }
} }