x11: Fix handling of `RRScreenChangeNotify`/`RRNotify` events
authorIan Douglas Scott <idscott@system76.com>
Sat, 28 Aug 2021 00:57:01 +0000 (17:57 -0700)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 2 Sep 2021 23:59:41 +0000 (19:59 -0400)
It seems these are sent with `xwindow` set to the root window, so this
was failing to find a surface and get the screen from that.

I'm not sure if there's a reason not to get the screen this way
elsewhere in the function, but it seems this should be correct.

This fixes the behavior of `gdk_x11_display_get_monitors()`, which
wasn't correctly changing when monitors were added or removed. For
instance, this python code was always showing the same number of
monitors when one was turned off and on, but updates correctly with this
change applied:

```python
import gi
gi.require_version("GLib", "2.0")
gi.require_version("Gdk", "4.0")
gi.require_version("Gtk", "4.0")
from gi.repository import GLib, Gdk, Gtk

def f():
    print(len(Gdk.Display.get_default().get_monitors()))
    return True
GLib.timeout_add_seconds(1, f)

GLib.MainLoop().run()
```

gdk/x11/gdkdisplay-x11.c

index 33a3648f4ebb023a227954b2929bdaebe1847d1d..a03690c788c6082a6b83820c7f7af0331849a74f 100644 (file)
@@ -1037,8 +1037,8 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
       if (xevent->type - display_x11->xrandr_event_base == RRScreenChangeNotify ||
           xevent->type - display_x11->xrandr_event_base == RRNotify)
        {
-          if (x11_screen)
-            _gdk_x11_screen_size_changed (x11_screen, xevent);
+          if (display_x11->screen)
+            _gdk_x11_screen_size_changed (display_x11->screen, xevent);
        }
       else
 #endif