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

Fix remaining Android bugs reported over the past months

* java/org/gnu/emacs/EmacsActivity.java (attachWindow):
Guarantee that child windows promoted to toplevels receive
layout parameters that direct them to receive their parents'
dimensions.  Otherwise, the size of the window as a child is
retained on Huawei HarmonyOS 4.2 and possibly other Android
distributions.

* java/org/gnu/emacs/EmacsService.java (updateCursorAnchorInfo):
Run anchor updates on the UI thread, as
`InputMethodManager#updateCursorAnchorInfo' is liable to call
`View#requestLayout'.

* java/org/gnu/emacs/EmacsView.java (onMeasure): Always call
`measureChildren', or child frames' onLayout handlers might not
be invoked after they request a layout cycle and are duly
processed in `onLayout'.
(swapBuffers): Delete erroneous commentary.

* java/org/gnu/emacs/EmacsWindow.java (viewLayout): If
overrideRedirect, don't inadvertently clear rect.left and
rect.top by recording the window's WM window-relative position.
Fix typos.
(reparentTo): Invalidate focus after transferring frame.
(translateCoordinates): Account for override-redirect windows.
Mostly important for mouse-drag-and-drop-region.
This commit is contained in:
Po Lu 2025-02-19 20:40:12 +08:00
parent e97be722d3
commit ded77fefff
4 changed files with 71 additions and 24 deletions

View file

@ -50,6 +50,7 @@ import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewManager;
import android.view.WindowManager;
@ -331,23 +332,39 @@ public final class EmacsWindow extends EmacsHandleObject
{
int rectWidth, rectHeight;
rect.left = left;
rect.top = top;
rect.right = right;
rect.bottom = bottom;
/* If this is an override-redirect window, don't ever modify
rect.left and rect.top, as its WM window will always have been
moved in unison with itself. */
if (overrideRedirect)
{
rect.right = rect.left + (right - left);
rect.bottom = rect.top + (bottom - top);
}
/* If parent is null, use xPosition and yPosition instead of the
geometry rectangle positions. */
else if (parent == null)
{
rect.left = xPosition;
rect.top = yPosition;
rect.right = rect.left + (right - left);
rect.bottom = rect.top + (bottom - top);
}
/* Otherwise accept the new position offered by the toolkit. FIXME:
isn't there a potential race condition here if the toolkit lays
out EmacsView after a child frame's rect is set but before it
calls onLayout to read the modifies rect? */
else
{
rect.left = left;
rect.top = top;
rect.right = right;
rect.bottom = bottom;
}
rectWidth = right - left;
rectHeight = bottom - top;
/* If parent is null, use xPosition and yPosition instead of the
geometry rectangle positions. */
if (parent == null)
{
left = xPosition;
top = yPosition;
}
return EmacsNative.sendConfigureNotify (this.handle,
System.currentTimeMillis (),
left, top, rectWidth,
@ -1363,6 +1380,11 @@ public final class EmacsWindow extends EmacsHandleObject
EmacsWindowManager manager;
ViewManager parent;
/* Invalidate the focus; this should transfer the input focus
to the next eligible window as this window is no longer
present in parent.children. */
EmacsActivity.invalidateFocus (7);
/* First, detach this window if necessary. */
manager = EmacsWindowManager.MANAGER;
manager.detachWindow (EmacsWindow.this);
@ -1637,6 +1659,18 @@ public final class EmacsWindow extends EmacsHandleObject
array[0] += x;
array[1] += y;
/* In the case of an override redirect window, the WM window's
extents and position match the Emacs window exactly. */
if (overrideRedirect)
{
synchronized (this)
{
array[0] += rect.left;
array[1] += rect.top;
}
}
/* Return the resulting coordinates. */
return array;
}