[gtk+] Broadway: Remove display assumptions



commit f733fa88f585693a12137210c02aa93451b293c9
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Oct 25 10:31:31 2014 -0400

    Broadway: Remove display assumptions
    
    In various places, the broadway backend was just using
    the default display and assumed that it is the broadway
    display. That may not be the case in a multi-backend world,
    so instead iterate over all displays and use the first
    broadway display - still not perfect, but enough to survive
    for now.

 gdk/broadway/gdkdevice-broadway.c |    2 +-
 gdk/broadway/gdkeventsource.c     |   21 +++++++++++++++++++--
 gdk/broadway/gdkwindow-broadway.c |   29 +++++++++++++++++++++++++++--
 3 files changed, 47 insertions(+), 5 deletions(-)
---
diff --git a/gdk/broadway/gdkdevice-broadway.c b/gdk/broadway/gdkdevice-broadway.c
index 3c89479..cfd9f96 100644
--- a/gdk/broadway/gdkdevice-broadway.c
+++ b/gdk/broadway/gdkdevice-broadway.c
@@ -344,7 +344,7 @@ gdk_broadway_device_window_at_position (GdkDevice       *device,
   GdkWindow *root_window;
   GdkWindow *window;
 
-  screen = gdk_screen_get_default ();
+  screen = gdk_display_get_default_screen (gdk_device_get_display (device));
   root_window = gdk_screen_get_root_window (screen);
 
   gdk_broadway_device_query_state (device, root_window, NULL, &window, NULL, NULL, win_x, win_y, mask);
diff --git a/gdk/broadway/gdkeventsource.c b/gdk/broadway/gdkeventsource.c
index 08dd073..d878521 100644
--- a/gdk/broadway/gdkeventsource.c
+++ b/gdk/broadway/gdkeventsource.c
@@ -92,14 +92,31 @@ gdk_event_source_check (GSource *source)
 void
 _gdk_broadway_events_got_input (BroadwayInputMsg *message)
 {
-  GdkDisplay *display = gdk_display_get_default ();
-  GdkBroadwayDisplay *display_broadway = GDK_BROADWAY_DISPLAY (display);
+  GdkDisplay *display;
+  GdkBroadwayDisplay *display_broadway;
   GdkBroadwayDeviceManager *device_manager;
   GdkScreen *screen;
   GdkWindow *window;
   GdkEvent *event = NULL;
   GList *node;
+  GSList *list, *d;
+
+  display = NULL;
+
+  list = gdk_display_manager_list_displays (gdk_display_manager_get ());
+  for (d = list; d; d = d->next)
+    {
+      if (GDK_IS_BROADWAY_DISPLAY (d->data))
+        {
+          display = d->data;
+          break;
+        }
+    }
+  g_slist_free (list);
+
+  g_assert (display != NULL);
 
+  display_broadway = GDK_BROADWAY_DISPLAY (display);
   device_manager = GDK_BROADWAY_DEVICE_MANAGER (gdk_display_get_device_manager (display));
 
   switch (message->base.type) {
diff --git a/gdk/broadway/gdkwindow-broadway.c b/gdk/broadway/gdkwindow-broadway.c
index 24db20c..e0bded1 100644
--- a/gdk/broadway/gdkwindow-broadway.c
+++ b/gdk/broadway/gdkwindow-broadway.c
@@ -28,6 +28,8 @@
 #include "gdkwindow-broadway.h"
 #include "gdkscreen-broadway.h"
 
+#include "gdkbroadwaydisplay.h"
+#include "gdkdisplay.h"
 #include "gdkwindow.h"
 #include "gdkwindowimpl.h"
 #include "gdkdisplay-broadway.h"
@@ -81,6 +83,28 @@ G_DEFINE_TYPE (GdkWindowImplBroadway,
               gdk_window_impl_broadway,
               GDK_TYPE_WINDOW_IMPL)
 
+static GdkDisplay *
+find_broadway_display (void)
+{
+  GdkDisplay *display;
+  GSList *list, *l;
+
+  display = NULL;
+
+  list = gdk_display_manager_list_displays (gdk_display_manager_get ());
+  for (l = list; l; l = l->next)
+    {
+      if (GDK_IS_BROADWAY_DISPLAY (l->data))
+        {
+          display = l->data;
+          break; 
+        }
+    }
+  g_slist_free (list);
+
+  return display;
+}
+
 static void
 update_dirty_windows_and_sync (void)
 {
@@ -88,7 +112,8 @@ update_dirty_windows_and_sync (void)
   GdkBroadwayDisplay *display;
   gboolean updated_surface;
 
-  display = GDK_BROADWAY_DISPLAY (gdk_display_get_default ());
+  display = GDK_BROADWAY_DISPLAY (find_broadway_display ());
+  g_assert (display != NULL);
 
   updated_surface = FALSE;
   for (l = display->toplevels; l != NULL; l = l->next)
@@ -120,7 +145,7 @@ flush_idle (gpointer data)
 {
   flush_id = 0;
 
-  gdk_display_flush (gdk_display_get_default ());
+  gdk_display_flush (find_broadway_display ());
 
   return FALSE;
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]