Precache the _NET_VIRTUAL_ROOTS atom.

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)
This commit is contained in:
Matthias Clasen 2005-01-19 19:53:12 +00:00 committed by Matthias Clasen
parent 56e0ee04fc
commit fbe8255db6
5 changed files with 67 additions and 12 deletions

View 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):

View 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):

View 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):

View 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

View 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)
{
unsigned int ww, wh, wb, wd;
int wx, wy;
if (XGetGeometry (GDK_WINDOW_XDISPLAY (window), xwindow, &root, &wx, &wy, &ww, &wh, &wb, &wd))
if (XGetGeometry (GDK_DISPLAY_XDISPLAY (window), xwindow,
&root, &wx, &wy, &ww, &wh, &wb, &wd))
{
rect->x = wx;
rect->y = wy;
rect->width = ww;
rect->height = wh;
}
}
fail:
if (vroots)
XFree (vroots);
gdk_error_trap_pop ();
}