diff --git a/ChangeLog b/ChangeLog index a4acc7ec3a..76a97f11c1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2005-01-19 Matthias Clasen + * 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): diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index a4acc7ec3a..76a97f11c1 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,5 +1,11 @@ 2005-01-19 Matthias Clasen + * 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): diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index a4acc7ec3a..76a97f11c1 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,5 +1,11 @@ 2005-01-19 Matthias Clasen + * 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): diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c index ba0883ce27..a046e5e644 100644 --- a/gdk/x11/gdkdisplay-x11.c +++ b/gdk/x11/gdkdisplay-x11.c @@ -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 diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c index bcde9073c4..da250e5c17 100644 --- a/gdk/x11/gdkwindow-x11.c +++ b/gdk/x11/gdkwindow-x11.c @@ -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 (); }