Xpra: Ticket #2482: macos GTK3 maximize does not stick

Remote session is a start-desktop with gnome-shell. 2560 x 1600 on mac vs 2560 x 1440 remote. Server is Fedora 31. Trying to make the desktop window fullscreen temporarily does something that looks like it is going to work, then it snaps back to where it was previously. Works fine without opengl.



Sun, 17 Nov 2019 03:19:41 GMT - mjlbach:

OpenGL info

Warning: vendor 'Intel Inc.' is greylisted,
 you may want to turn off OpenGL if you encounter bugs
/Applications/Xpra.app/Contents/Resources/lib/python/xpra/client/gl/gtk3/nativegl_client_window.py:13: Warning: g_object_get_qdata: assertion 'G_IS_OBJECT (object)' failed
  return GLContext().check_support(force_enable)  #pylint: disable=not-callable
/Applications/Xpra.app/Contents/Resources/lib/python/xpra/client/gl/gtk3/nativegl_client_window.py:13: Warning: g_object_set_qdata_full: assertion 'G_IS_OBJECT (object)' failed
  return GLContext().check_support(force_enable)  #pylint: disable=not-callable
/Applications/Xpra.app/Contents/Resources/lib/python/xpra/client/gl/gtk3/nativegl_client_window.py:13: Warning: g_object_unref: assertion 'G_IS_OBJECT (object)' failed
  return GLContext().check_support(force_enable)  #pylint: disable=not-callable
GLU.version=1.3 MacOSX
accelerate=3.1.3b1
accum-size=0
alpha-size=8
aux-buffers=0
depth=32
depth-size=24
double-buffered=1
max-viewport-dims=16384, 16384
message=
opengl=2.1
pyopengl=3.1.3b1
renderer=Intel Iris OpenGL Engine
rgba=True
safe=True
screen-0={'rgba': True, 'depth': 32, 'alpha-size': 8, 'accum-size': 0, 'depth-size': 24, 'stencil-size': 0, 'aux-buffers': 0, 'double-buffered': 1}
screen-1={'rgba': True, 'depth': 32, 'alpha-size': 8, 'accum-size': 0, 'depth-size': 32, 'stencil-size': 0, 'aux-buffers': 0, 'double-buffered': 1}
shading-language-version=1.20
stencil-size=0
success=True
texture-size-limit=16384
transparency=True
vendor=Intel Inc.
virtual-screens=2
zerocopy=True

Mon, 18 Nov 2019 03:34:48 GMT - Antoine Martin: owner changed

My guess is that this is a bug with GTK3 and multiple screens:

screen-0={'rgba': True, 'depth': 32, 'alpha-size': 8, 'accum-size': 0, 'depth-size': 24, 'stencil-size': 0, 'aux-buffers': 0, 'double-buffered': 1}
screen-1={'rgba': True, 'depth': 32, 'alpha-size': 8, 'accum-size': 0, 'depth-size': 32, 'stencil-size': 0, 'aux-buffers': 0, 'double-buffered': 1}

@mjlbach: can you reproduce with a single screen attached? And if somehow you only have one... run some of the diagnostics scripts in Xpra.app/Contents/Helpers:

GTK_info
NativeGUI_info

Does GTK see the same number of screens? Are the python2 builds also affected by this bug? This is a new regression in 3.0, right?


Mon, 18 Nov 2019 16:22:03 GMT - mjlbach: attachment set

GTK_info


Mon, 18 Nov 2019 16:23:06 GMT - mjlbach: attachment set

native_gui_info


Mon, 18 Nov 2019 16:28:10 GMT - Antoine Martin: owner, status changed

OK, so there's only one screen attached, the second one must be just a virtual screen for 32-bit vs 24-bit colours. I'll take it from there and try to reproduce.


Thu, 21 Nov 2019 06:02:46 GMT - Antoine Martin:

Log when hitting the green button:

2019-11-21 12:54:35,027 receiveWorkspaceChangeNotification_(NSConcreteNotification 0x7f8ad3e2a020 {name = NSWorkspaceActiveSpaceDidChangeNotification; object = <NSWorkspace: 0x7f8ad1406fb0>})
2019-11-21 12:54:35,029 workspace change - our windows on screen: {757: ''}
2019-11-21 12:54:35,030 delegate_cb(wake_callback)=<bound method WindowClient.resume of gtk3.client>
2019-11-21 12:54:35,030 system resumed, was suspended for
2019-11-21 12:54:35,057 popup_types(['NORMAL'])=()
2019-11-21 12:54:35,061 update_metadata({b'xid': b'0x600022', b'client-machine': b'desktop-eth1', b'pid': 16570, b'title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src', b'class-instance': (b'xterm', b'XTerm'), b'window-type': (b'NORMAL',), b'size-constraints': {b'base-size': (19, 4), b'increment': (6, 13), b'gravity': 1, b'minimum-size': (120, 17)}, b'icon-title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src'})
2019-11-21 12:54:35,061 set_metadata({b'xid': b'0x600022', b'client-machine': b'desktop-eth1', b'pid': 16570, b'title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src', b'class-instance': (b'xterm', b'XTerm'), b'window-type': (b'NORMAL',), b'size-constraints': {b'base-size': (19, 4), b'increment': (6, 13), b'gravity': 1, b'minimum-size': (120, 17)}, b'icon-title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src'})
2019-11-21 12:54:35,078 popup_types(['NORMAL'])=()
2019-11-21 12:54:35,080 update_metadata({b'xid': b'0x600022', b'client-machine': b'desktop-eth1', b'pid': 16570, b'title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src', b'class-instance': (b'xterm', b'XTerm'), b'window-type': (b'NORMAL',), b'size-constraints': {b'base-size': (19, 4), b'increment': (6, 13), b'gravity': 1, b'minimum-size': (120, 17)}, b'icon-title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src'})
2019-11-21 12:54:35,080 set_metadata({b'xid': b'0x600022', b'client-machine': b'desktop-eth1', b'pid': 16570, b'title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src', b'class-instance': (b'xterm', b'XTerm'), b'window-type': (b'NORMAL',), b'size-constraints': {b'base-size': (19, 4), b'increment': (6, 13), b'gravity': 1, b'minimum-size': (120, 17)}, b'icon-title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src'})
2019-11-21 12:54:35,095 popup_types(['NORMAL'])=()
2019-11-21 12:54:35,098 update_metadata({b'xid': b'0x600022', b'client-machine': b'desktop-eth1', b'pid': 16570, b'title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src', b'class-instance': (b'xterm', b'XTerm'), b'window-type': (b'NORMAL',), b'size-constraints': {b'base-size': (19, 4), b'increment': (6, 13), b'gravity': 1, b'minimum-size': (120, 17)}, b'icon-title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src'})
2019-11-21 12:54:35,098 set_metadata({b'xid': b'0x600022', b'client-machine': b'desktop-eth1', b'pid': 16570, b'title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src', b'class-instance': (b'xterm', b'XTerm'), b'window-type': (b'NORMAL',), b'size-constraints': {b'base-size': (19, 4), b'increment': (6, 13), b'gravity': 1, b'minimum-size': (120, 17)}, b'icon-title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src'})
2019-11-21 12:54:35,112 popup_types(['NORMAL'])=()
2019-11-21 12:54:35,115 update_metadata({b'xid': b'0x600022', b'client-machine': b'desktop-eth1', b'pid': 16570, b'title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src', b'class-instance': (b'xterm', b'XTerm'), b'window-type': (b'NORMAL',), b'size-constraints': {b'base-size': (19, 4), b'increment': (6, 13), b'gravity': 1, b'minimum-size': (120, 17)}, b'icon-title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src'})
2019-11-21 12:54:35,116 set_metadata({b'xid': b'0x600022', b'client-machine': b'desktop-eth1', b'pid': 16570, b'title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src', b'class-instance': (b'xterm', b'XTerm'), b'window-type': (b'NORMAL',), b'size-constraints': {b'base-size': (19, 4), b'increment': (6, 13), b'gravity': 1, b'minimum-size': (120, 17)}, b'icon-title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src'})
2019-11-21 12:54:35,132 popup_types(['NORMAL'])=()
2019-11-21 12:54:35,136 update_metadata({b'xid': b'0x600022', b'client-machine': b'desktop-eth1', b'pid': 16570, b'title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src', b'class-instance': (b'xterm', b'XTerm'), b'window-type': (b'NORMAL',), b'size-constraints': {b'base-size': (19, 4), b'increment': (6, 13), b'gravity': 1, b'minimum-size': (120, 17)}, b'icon-title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src'})
2019-11-21 12:54:35,136 set_metadata({b'xid': b'0x600022', b'client-machine': b'desktop-eth1', b'pid': 16570, b'title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src', b'class-instance': (b'xterm', b'XTerm'), b'window-type': (b'NORMAL',), b'size-constraints': {b'base-size': (19, 4), b'increment': (6, 13), b'gravity': 1, b'minimum-size': (120, 17)}, b'icon-title': b'antoine@desktop-eth0:~/projects/Xpra/trunk/src'})
2019-11-21 12:54:35,286 GLClientWindow(1 : GLDrawingArea(1, (1024, 690), None)).window_state_updated(GLClientWindow(1 : GLDrawingArea(1, (1024, 690), None)), <Gdk.EventWindowState object at 0x12646c6b0 (void at 0x7f8ad1c87330)>) changed_mask=<flags GDK_WINDOW_STATE_WITHDRAWN | GDK_WINDOW_STATE_FOCUSED of type Gdk.WindowState>, new_window_state=<flags GDK_WINDOW_STATE_FOCUSED of type Gdk.WindowState>
2019-11-21 12:54:35,287 _focused=True (was False)
2019-11-21 12:54:35,287 window_state_updated(..) state updates: {'focused': True}, actual updates: {'focused': True}, server updates: {'focused': True}

Thu, 21 Nov 2019 07:32:47 GMT - Antoine Martin: status changed; resolution set

Turns out that the spurious wake_callback is what is causing all the problems. We end up calling reinit_windows which doesn't know about the fullscreen state of the window (because GTK3 is unaware of it?), so it doesn't restore it. This is also what's calling update_metadata.

This is fixed in r24466 by ignoring the zero-length suspend-resume we generate from the workspace change code. The correct fix would be to not call suspend or resume from the workspace change code but to trigger the regular per window refresh change instead. (requires figuring out which windows map to the window number) - but that's harder.

Will attempt later: #2488. See also #2484.

@mjlbach: I'm closing this ticket because I could reproduce the bug you described and now the problem is gone, but feel free to re-open if I've missed anything else. There are Python3 beta 4.0 and 3.0.3-RC builds with this fix here: https://xpra.org/beta/MacOS.


Sat, 23 Jan 2021 05:52:30 GMT - migration script:

this ticket has been moved to: https://github.com/Xpra-org/xpra/issues/2482