One for each type of window we watch.
g_hash_table_unref (old_list);
}
g_hash_table_unref (old_list);
}
-static Bool
-gdk_xsettings_watch (GdkScreen *screen,
- GdkWindow *window);
-static Bool
-gdk_xsettings_unwatch (GdkScreen *screen,
- GdkWindow *window);
+static GdkFilterReturn
+gdk_xsettings_manager_window_filter (GdkXEvent *xevent,
+ GdkEvent *event,
+ gpointer data);
static void
check_manager_window (XSettingsClient *client)
static void
check_manager_window (XSettingsClient *client)
display = gdk_screen_get_display (client->screen);
if (client->manager_window)
display = gdk_screen_get_display (client->screen);
if (client->manager_window)
- gdk_xsettings_unwatch (client->screen, client->manager_window);
+ {
+ gdk_window_remove_filter (client->manager_window, gdk_xsettings_manager_window_filter, client->screen);
+ g_object_unref (client->manager_window);
+ }
gdk_x11_display_grab (display);
gdk_x11_display_grab (display);
if (client->manager_window)
{
if (client->manager_window)
{
- if (!gdk_xsettings_watch (client->screen, client->manager_window))
- {
- /* Inability to watch the window probably means that it was destroyed
- * after we ungrabbed
- */
- client->manager_window = NULL;
- return;
- }
+ gdk_window_add_filter (client->manager_window, gdk_xsettings_manager_window_filter, client->screen);
}
read_settings (client);
}
static GdkFilterReturn
}
read_settings (client);
}
static GdkFilterReturn
-gdk_xsettings_client_event_filter (GdkXEvent *xevent,
- GdkEvent *event,
- gpointer data)
+gdk_xsettings_root_window_filter (GdkXEvent *xevent,
+ GdkEvent *event,
+ gpointer data)
{
GdkScreen *screen = data;
{
GdkScreen *screen = data;
- GdkDisplay *display = gdk_screen_get_display (screen);
XSettingsClient *client = GDK_X11_SCREEN (screen)->xsettings_client;
XSettingsClient *client = GDK_X11_SCREEN (screen)->xsettings_client;
+ GdkDisplay *display = gdk_screen_get_display (screen);
XEvent *xev = xevent;
/* The checks here will not unlikely cause us to reread
XEvent *xev = xevent;
/* The checks here will not unlikely cause us to reread
* times when the manager changes from A->B. But manager changes
* are going to be pretty rare.
*/
* times when the manager changes from A->B. But manager changes
* are going to be pretty rare.
*/
- if (xev->xany.window == gdk_x11_window_get_xid (gdk_screen_get_root_window (screen)))
- {
- if (xev->xany.type == ClientMessage &&
- xev->xclient.message_type == gdk_x11_get_xatom_by_name_for_display (display, "MANAGER") &&
- xev->xclient.data.l[1] == client->selection_atom)
- {
- check_manager_window (client);
- return GDK_FILTER_REMOVE;
- }
- }
- else if (xev->xany.window == gdk_x11_window_get_xid (client->manager_window))
+ if (xev->xany.type == ClientMessage &&
+ xev->xclient.message_type == gdk_x11_get_xatom_by_name_for_display (display, "MANAGER") &&
+ xev->xclient.data.l[1] == client->selection_atom)
- if (xev->xany.type == DestroyNotify)
- {
- check_manager_window (client);
- /* let GDK do its cleanup */
- return GDK_FILTER_CONTINUE;
- }
- else if (xev->xany.type == PropertyNotify)
- {
- read_settings (client);
- return GDK_FILTER_REMOVE;
- }
+ check_manager_window (client);
+ return GDK_FILTER_REMOVE;
- return GDK_FILTER_CONTINUE;;
+ return GDK_FILTER_CONTINUE;
-static Bool
-gdk_xsettings_watch (GdkScreen *screen,
- GdkWindow *window)
-{
- g_object_ref (window);
- gdk_window_add_filter (window, gdk_xsettings_client_event_filter, screen);
-
- return True;
-}
-
-static Bool
-gdk_xsettings_unwatch (GdkScreen *screen,
- GdkWindow *window)
+static GdkFilterReturn
+gdk_xsettings_manager_window_filter (GdkXEvent *xevent,
+ GdkEvent *event,
+ gpointer data)
- gdk_window_remove_filter (window, gdk_xsettings_client_event_filter, screen);
- g_object_unref (window);
+ GdkScreen *screen = data;
+ XSettingsClient *client = GDK_X11_SCREEN (screen)->xsettings_client;
+ XEvent *xev = xevent;
+ if (xev->xany.type == DestroyNotify)
+ {
+ check_manager_window (client);
+ /* let GDK do its cleanup */
+ return GDK_FILTER_CONTINUE;
+ }
+ else if (xev->xany.type == PropertyNotify)
+ {
+ read_settings (client);
+ return GDK_FILTER_REMOVE;
+ }
+
+ return GDK_FILTER_CONTINUE;;
client->selection_atom = gdk_x11_get_xatom_by_name_for_display (gdk_screen_get_display (screen), selection_atom_name);
g_free (selection_atom_name);
client->selection_atom = gdk_x11_get_xatom_by_name_for_display (gdk_screen_get_display (screen), selection_atom_name);
g_free (selection_atom_name);
- gdk_xsettings_watch (screen, gdk_screen_get_root_window (screen));
+ gdk_window_add_filter (gdk_screen_get_root_window (screen), gdk_xsettings_root_window_filter, screen);
check_manager_window (client);
check_manager_window (client);
void
xsettings_client_destroy (XSettingsClient *client)
{
void
xsettings_client_destroy (XSettingsClient *client)
{
- gdk_xsettings_unwatch (client->screen, gdk_screen_get_root_window (client->screen));
+ gdk_window_remove_filter (gdk_screen_get_root_window (client->screen), gdk_xsettings_root_window_filter, client->screen);
if (client->manager_window)
if (client->manager_window)
- gdk_xsettings_unwatch (client->screen, client->manager_window);
+ {
+ gdk_window_remove_filter (client->manager_window, gdk_xsettings_manager_window_filter, client->screen);
+ g_object_unref (client->manager_window);
+ }
if (client->settings)
g_hash_table_unref (client->settings);
if (client->settings)
g_hash_table_unref (client->settings);