]> Pileus Git - ~andy/gtk/commitdiff
Precache the _NET_VIRTUAL_ROOTS atom.
authorMatthias Clasen <mclasen@redhat.com>
Wed, 19 Jan 2005 19:53:12 +0000 (19:53 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Wed, 19 Jan 2005 19:53:12 +0000 (19:53 +0000)
2005-01-19  Matthias Clasen  <mclasen@redhat.com>

* gdk/x11/gdkdisplay-x11.c: Precache the _NET_VIRTUAL_ROOTS
atom.

* gdk/x11/gdkwindow-x11.c (gdk_window_get_frame_extents):
Support _NET_VIRTUAL_ROOTS.  (#163910, Carsten Haitzler)

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-8
gdk/x11/gdkdisplay-x11.c
gdk/x11/gdkwindow-x11.c

index a4acc7ec3a3c80e0a7d11659ec5f24c71a60b931..76a97f11c18c7134f907e35b2c4ecf223e76e8d3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2005-01-19  Matthias Clasen  <mclasen@redhat.com>
 
+       * gdk/x11/gdkdisplay-x11.c: Precache the _NET_VIRTUAL_ROOTS
+       atom.
+
+       * gdk/x11/gdkwindow-x11.c (gdk_window_get_frame_extents): 
+       Support _NET_VIRTUAL_ROOTS.  (#163910, Carsten Haitzler)
+       
        * gdk/gdk.symbols: 
        * gdk/x11/gdkx.h: 
        * gdk/x11/gdkdisplay-x11.c (gdk_x11_display_get_user_time): 
index a4acc7ec3a3c80e0a7d11659ec5f24c71a60b931..76a97f11c18c7134f907e35b2c4ecf223e76e8d3 100644 (file)
@@ -1,5 +1,11 @@
 2005-01-19  Matthias Clasen  <mclasen@redhat.com>
 
+       * gdk/x11/gdkdisplay-x11.c: Precache the _NET_VIRTUAL_ROOTS
+       atom.
+
+       * gdk/x11/gdkwindow-x11.c (gdk_window_get_frame_extents): 
+       Support _NET_VIRTUAL_ROOTS.  (#163910, Carsten Haitzler)
+       
        * gdk/gdk.symbols: 
        * gdk/x11/gdkx.h: 
        * gdk/x11/gdkdisplay-x11.c (gdk_x11_display_get_user_time): 
index a4acc7ec3a3c80e0a7d11659ec5f24c71a60b931..76a97f11c18c7134f907e35b2c4ecf223e76e8d3 100644 (file)
@@ -1,5 +1,11 @@
 2005-01-19  Matthias Clasen  <mclasen@redhat.com>
 
+       * gdk/x11/gdkdisplay-x11.c: Precache the _NET_VIRTUAL_ROOTS
+       atom.
+
+       * gdk/x11/gdkwindow-x11.c (gdk_window_get_frame_extents): 
+       Support _NET_VIRTUAL_ROOTS.  (#163910, Carsten Haitzler)
+       
        * gdk/gdk.symbols: 
        * gdk/x11/gdkx.h: 
        * gdk/x11/gdkdisplay-x11.c (gdk_x11_display_get_user_time): 
index ba0883ce2751a50c156db54bf521035b84469c13..a046e5e6443abd9a8ec1c812e2a81fb35d8e497a 100644 (file)
@@ -90,6 +90,7 @@ static const char *const precache_atoms[] = {
   "_NET_WM_WINDOW_TYPE",
   "_NET_WM_WINDOW_TYPE_NORMAL",
   "_NET_WM_USER_TIME",
+  "_NET_VIRTUAL_ROOTS"
 };
 
 GType
index bcde9073c47c435b8bede38da6cf1da13ac8d011..da250e5c174099e6b342c6e5c5bdf6eecd0034a8 100644 (file)
@@ -3128,12 +3128,22 @@ void
 gdk_window_get_frame_extents (GdkWindow    *window,
                               GdkRectangle *rect)
 {
+  GdkDisplay *display;
   GdkWindowObject *private;
   Window xwindow;
   Window xparent;
   Window root;
   Window *children;
+  Window *vroots;
+  Atom type_return;
   unsigned int nchildren;
+  unsigned int nvroots;
+  unsigned long nitems_return;
+  unsigned long bytes_after_return;
+  int format_return;
+  int i;
+  unsigned int ww, wh, wb, wd;
+  int wx, wy;
   
   g_return_if_fail (GDK_IS_WINDOW (window));
   g_return_if_fail (rect != NULL);
@@ -3161,35 +3171,61 @@ gdk_window_get_frame_extents (GdkWindow    *window,
 
   gdk_error_trap_push();
   
+  /* use NETWM_VIRTUAL_ROOTS if available */
+  display = gdk_drawable_get_display (window);
+  root = GDK_WINDOW_XID (gdk_screen_get_root_window (GDK_WINDOW_SCREEN (window)));
+  nvroots = 0;
+  vroots = NULL;
+  if (XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display),
+                         root,
+                         gdk_x11_get_xatom_by_name_for_display (display, 
+                                                                "_NET_VIRTUAL_ROOTS"),
+                         0, 0x7fffffff, False, XA_WINDOW, &type_return,
+                         &format_return, &nitems_return, &bytes_after_return,
+                         (unsigned char **)(&vroots))
+      == Success)
+    {
+      if ((type_return == XA_WINDOW) && (format_return == 32) && (vroots))
+       nvroots = nitems_return;
+    }
+
   xparent = GDK_WINDOW_XID (window);
   do
     {
       xwindow = xparent;
-      if (!XQueryTree (GDK_WINDOW_XDISPLAY (window), xwindow,
+      if (!XQueryTree (GDK_DISPLAY_XDISPLAY (window), xwindow,
                       &root, &xparent,
                       &children, &nchildren))
        goto fail;
       
       if (children)
        XFree (children);
+
+      /* check virtual roots */
+      for (i = 0; i < nvroots; i++)
+       {
+         if (xparent == vroots[i])
+           {
+             root = xparent;
+             break;
+           }
+       }
     }
   while (xparent != root);
   
-  if (xparent == root)
+  if (XGetGeometry (GDK_DISPLAY_XDISPLAY (window), xwindow, 
+                   &root, &wx, &wy, &ww, &wh, &wb, &wd))
     {
-      unsigned int ww, wh, wb, wd;
-      int wx, wy;
-      
-      if (XGetGeometry (GDK_WINDOW_XDISPLAY (window), xwindow, &root, &wx, &wy, &ww, &wh, &wb, &wd))
-       {
-          rect->x = wx;
-          rect->y = wy;
-          rect->width = ww;
-          rect->height = wh;
-       }
+      rect->x = wx;
+      rect->y = wy;
+      rect->width = ww;
+      rect->height = wh;
     }
 
  fail:
+  if (vroots)
+    XFree (vroots);
+
   gdk_error_trap_pop ();
 }