6
#include <glib-object.h>
9
typedef struct _WMCallbackData
16
static Window wm_window = None;
19
wm_common_get_window_manager_property (Atom atom)
21
Atom utf8_string, type;
29
if (wm_window == None)
32
utf8_string = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "UTF8_STRING", False);
34
gdk_error_trap_push ();
37
result = XGetWindowProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
42
&type, &format, &nitems,
43
&bytes_after, (guchar **) &val);
45
if (gdk_error_trap_pop () || result != Success ||
46
type != utf8_string || format != 8 || nitems == 0 ||
47
!g_utf8_validate (val, nitems, NULL))
53
retval = g_strndup (val, nitems);
63
wm_common_get_current_window_manager (void)
65
Atom atom = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "_NET_WM_NAME", False);
68
result = wm_common_get_window_manager_property (atom);
72
return g_strdup (WM_COMMON_UNKNOWN);
76
wm_common_get_current_keybindings (void)
78
Atom keybindings_atom = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "_GNOME_WM_KEYBINDINGS", False);
79
char *keybindings = wm_common_get_window_manager_property (keybindings_atom);
85
results = g_strsplit(keybindings, ",", -1);
86
for (p = results; *p; p++)
92
Atom wm_atom = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "_NET_WM_NAME", False);
93
char *wm_name = wm_common_get_window_manager_property (wm_atom);
94
char *to_copy[] = { NULL, NULL };
96
to_copy[0] = wm_name ? wm_name : WM_COMMON_UNKNOWN;
98
results = g_strdupv (to_copy);
106
update_wm_window (void)
114
XGetWindowProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), GDK_ROOT_WINDOW (),
115
XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "_NET_SUPPORTING_WM_CHECK", False),
116
0, G_MAXLONG, False, XA_WINDOW, &type, &format,
117
&nitems, &bytes_after, (guchar **) &xwindow);
119
if (type != XA_WINDOW)
125
gdk_error_trap_push ();
126
XSelectInput (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), *xwindow, StructureNotifyMask | PropertyChangeMask);
127
XSync (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), False);
129
if (gdk_error_trap_pop ())
136
wm_window = *xwindow;
140
static GdkFilterReturn
141
wm_window_event_filter (GdkXEvent *xev,
145
WMCallbackData *ncb_data = (WMCallbackData*) data;
146
XEvent *xevent = (XEvent *)xev;
148
if ((xevent->type == DestroyNotify &&
149
wm_window != None && xevent->xany.window == wm_window) ||
150
(xevent->type == PropertyNotify &&
151
xevent->xany.window == GDK_ROOT_WINDOW () &&
152
xevent->xproperty.atom == (XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "_NET_SUPPORTING_WM_CHECK", False))) ||
153
(xevent->type == PropertyNotify &&
154
wm_window != None && xevent->xany.window == wm_window &&
155
xevent->xproperty.atom == (XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "_NET_WM_NAME", False))))
158
(* ncb_data->func) ((gpointer)wm_common_get_current_window_manager(),
162
return GDK_FILTER_CONTINUE;
166
wm_common_register_window_manager_change (GFunc func,
169
WMCallbackData *ncb_data;
171
ncb_data = g_new0 (WMCallbackData, 1);
173
ncb_data->func = func;
174
ncb_data->data = data;
176
gdk_window_add_filter (NULL, wm_window_event_filter, ncb_data);
180
XSelectInput (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), GDK_ROOT_WINDOW (), PropertyChangeMask);
181
XSync (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), False);