[gtk+] x11: Store toplevel list in GdkDisplay



commit 5999b1c73a6cf69bd552ee026bc0d74aced88acf
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Nov 13 16:32:34 2017 -0500

    x11: Store toplevel list in GdkDisplay
    
    This will let us get rid of the root window.

 gdk/x11/gdkdevice-core-x11.c |    2 --
 gdk/x11/gdkdevice-xi2.c      |    1 -
 gdk/x11/gdkdisplay-x11.c     |   18 +-----------------
 gdk/x11/gdkdisplay-x11.h     |    1 +
 gdk/x11/gdkdnd-x11.c         |    1 -
 gdk/x11/gdkmonitor-x11.c     |    2 --
 gdk/x11/gdkscreen-x11.c      |    2 --
 gdk/x11/gdkxid.c             |   14 ++++++++++++--
 8 files changed, 14 insertions(+), 27 deletions(-)
---
diff --git a/gdk/x11/gdkdevice-core-x11.c b/gdk/x11/gdkdevice-core-x11.c
index 6176f6c..b166ba8 100644
--- a/gdk/x11/gdkdevice-core-x11.c
+++ b/gdk/x11/gdkdevice-core-x11.c
@@ -523,8 +523,6 @@ gdk_x11_device_core_window_at_position (GdkDevice       *device,
             }
         }
 
-      g_list_free (toplevels);
-
       xwindow = pointer_window;
     }
 
diff --git a/gdk/x11/gdkdevice-xi2.c b/gdk/x11/gdkdevice-xi2.c
index 210c72b..733b652 100644
--- a/gdk/x11/gdkdevice-xi2.c
+++ b/gdk/x11/gdkdevice-xi2.c
@@ -606,7 +606,6 @@ gdk_x11_device_xi2_window_at_position (GdkDevice       *device,
                 }
             }
 
-          g_list_free (toplevels);
           if (pointer_window != None)
             break;
         }
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c
index a9f4e2e..a165917 100644
--- a/gdk/x11/gdkdisplay-x11.c
+++ b/gdk/x11/gdkdisplay-x11.c
@@ -3160,23 +3160,7 @@ gdk_x11_display_get_root_window (GdkDisplay *display)
 GList *
 gdk_x11_display_get_toplevel_windows (GdkDisplay *display)
 {
-  GdkWindow * root_window;
-  GList *new_list = NULL;
-  GList *tmp_list;
-
-  root_window = gdk_x11_display_get_root_window (display);
-
-  tmp_list = root_window->children;
-  while (tmp_list)
-    {
-      GdkWindow *w = tmp_list->data;
-
-      if (w->window_type != GDK_WINDOW_FOREIGN)
-        new_list = g_list_prepend (new_list, w);
-      tmp_list = tmp_list->next;
-    }
-
-  return new_list;
+  return GDK_X11_DISPLAY (display)->toplevels;
 }
 
 static void
diff --git a/gdk/x11/gdkdisplay-x11.h b/gdk/x11/gdkdisplay-x11.h
index 87b5f7f..3ddc777 100644
--- a/gdk/x11/gdkdisplay-x11.h
+++ b/gdk/x11/gdkdisplay-x11.h
@@ -40,6 +40,7 @@ struct _GdkX11Display
   Display *xdisplay;
   GdkScreen *screen;
   GList *screens;
+  GList *toplevels;
 
   GSource *event_source;
 
diff --git a/gdk/x11/gdkdnd-x11.c b/gdk/x11/gdkdnd-x11.c
index 71e8c29..fc6ea69 100644
--- a/gdk/x11/gdkdnd-x11.c
+++ b/gdk/x11/gdkdnd-x11.c
@@ -600,7 +600,6 @@ gdk_window_cache_new (GdkDisplay *display)
                                height * impl->window_scale,
                                 gdk_window_is_visible (window));
         }
-      g_list_free (toplevel_windows);
       return result;
     }
 
diff --git a/gdk/x11/gdkmonitor-x11.c b/gdk/x11/gdkmonitor-x11.c
index 8cfddfe..9de9060 100644
--- a/gdk/x11/gdkmonitor-x11.c
+++ b/gdk/x11/gdkmonitor-x11.c
@@ -55,8 +55,6 @@ gdk_monitor_has_fullscreen_window (GdkMonitor *monitor)
         }
     }
 
-  g_list_free (toplevels);
-
   return has_fullscreen;
 }
 
diff --git a/gdk/x11/gdkscreen-x11.c b/gdk/x11/gdkscreen-x11.c
index e5c0f2c..c16107e 100644
--- a/gdk/x11/gdkscreen-x11.c
+++ b/gdk/x11/gdkscreen-x11.c
@@ -840,8 +840,6 @@ _gdk_x11_screen_set_window_scale (GdkX11Screen *x11_screen,
       _gdk_x11_window_set_window_scale (window, scale);
     }
 
-  g_list_free (toplevels);
-
   for (i = 0; i < x11_display->monitors->len; i++)
     {
       GdkMonitor *monitor = GDK_MONITOR (x11_display->monitors->pdata[i]);
diff --git a/gdk/x11/gdkxid.c b/gdk/x11/gdkxid.c
index 8302e74..1a8171e 100644
--- a/gdk/x11/gdkxid.c
+++ b/gdk/x11/gdkxid.c
@@ -61,6 +61,9 @@ _gdk_x11_display_add_window (GdkDisplay *display,
     g_warning ("XID collision, trouble ahead");
 
   g_hash_table_insert (display_x11->xid_ht, xid, data);
+
+  if (gdk_window_get_parent (GDK_WINDOW (data)) == NULL)
+    display_x11->toplevels = g_list_prepend (display_x11->toplevels, data);
 }
 
 void
@@ -68,13 +71,20 @@ _gdk_x11_display_remove_window (GdkDisplay *display,
                                 XID         xid)
 {
   GdkX11Display *display_x11;
+  GdkWindow *window;
 
   g_return_if_fail (GDK_IS_DISPLAY (display));
 
   display_x11 = GDK_X11_DISPLAY (display);
 
-  if (display_x11->xid_ht)
-    g_hash_table_remove (display_x11->xid_ht, &xid);
+  if (!display_x11->xid_ht)
+    return;
+
+  window = g_hash_table_lookup (display_x11->xid_ht, &xid);
+  if (window && gdk_window_get_parent (window) == NULL)
+    display_x11->toplevels = g_list_remove (display_x11->toplevels, window);
+
+  g_hash_table_remove (display_x11->xid_ht, &xid);
 }
 
 /**


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