← Back to team overview

xig-team team mailing list archive

[Merge] lp:~smspillaz/xig/xig.disconnect-signals into lp:xig

 

Sam Spilsbury has proposed merging lp:~smspillaz/xig/xig.disconnect-signals into lp:xig with lp:~smspillaz/xig/xig.clean-up-after-clients as a prerequisite.

Requested reviews:
  Xig Development Team (xig-team)

For more details, see:
https://code.launchpad.net/~smspillaz/xig/xig.disconnect-signals/+merge/89535

Disconnect signals the remote client is interested in when it goes away.
-- 
https://code.launchpad.net/~smspillaz/xig/xig.disconnect-signals/+merge/89535
Your team Xig Development Team is requested to review the proposed merge of lp:~smspillaz/xig/xig.disconnect-signals into lp:xig.
=== modified file 'src/xig-server.c'
--- src/xig-server.c	2012-01-21 13:31:23 +0000
+++ src/xig-server.c	2012-01-21 13:31:23 +0000
@@ -189,6 +189,20 @@
     g_hash_table_remove (server->priv->drawables, GINT_TO_POINTER (xig_drawable_get_id (XIG_DRAWABLE (pixmap))));
 }
 
+static void
+xig_disconnect_client_recursive (XigRemoteClient *client, XigWindow *window)
+{
+    GList *children = xig_window_get_children (window);
+
+    g_signal_handlers_disconnect_matched (window, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, client);
+
+    while (children)
+    {
+        XigWindow *child = XIG_WINDOW (children->data);
+        xig_disconnect_client_recursive (client, child);
+        children = g_list_next (children);
+    }
+}
 
 static void
 xig_remote_client_disconnected_cb (XigRemoteClient *client, XigServer *server)
@@ -220,6 +234,18 @@
         list = g_list_next (list);
     }
 
+    GList     *screens = server->priv->screens;
+
+    while (screens)
+    {
+        XigScreen *screen = (XigScreen *) screens->data;
+        XigWindow *root = xig_screen_get_root (screen);
+
+        xig_disconnect_client_recursive (client, root);
+
+        screens = g_list_next (screens);
+    }
+
     g_list_free (orig);
 
     g_object_unref (client);


Follow ups