]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
add a notifier for clients changing desktops. use it to update the send-to menu if...
[chaz/openbox] / openbox / client.c
index 47bfcabcb5ff6a547f2e7287fe124d47ca68ec5c..0d74882ce87abf53cee7df2157d4f455d21665df 100644 (file)
 
 typedef struct
 {
-    ObClientDestructor func;
+    ObClientCallback func;
     gpointer data;
-} Destructor;
+} ClientCallback;
 
-GList            *client_list        = NULL;
+GList            *client_list          = NULL;
 
-static GSList *client_destructors    = NULL;
+static GSList *client_destructors      = NULL;
+static GSList *client_desktop_notifies = NULL;
 
 static void client_get_all(ObClient *self);
 static void client_toggle_border(ObClient *self, gboolean show);
@@ -105,20 +106,20 @@ void client_shutdown(gboolean reconfig)
 {
 }
 
-void client_add_destructor(ObClientDestructor func, gpointer data)
+void client_add_destructor(ObClientCallback func, gpointer data)
 {
-    Destructor *d = g_new(Destructor, 1);
+    ClientCallback *d = g_new(ClientCallback, 1);
     d->func = func;
     d->data = data;
     client_destructors = g_slist_prepend(client_destructors, d);
 }
 
-void client_remove_destructor(ObClientDestructor func)
+void client_remove_destructor(ObClientCallback func)
 {
     GSList *it;
 
     for (it = client_destructors; it; it = g_slist_next(it)) {
-        Destructor *d = it->data;
+        ClientCallback *d = it->data;
         if (d->func == func) {
             g_free(d);
             client_destructors = g_slist_delete_link(client_destructors, it);
@@ -127,6 +128,29 @@ void client_remove_destructor(ObClientDestructor func)
     }
 }
 
+void client_add_desktop_notify(ObClientCallback func, gpointer data)
+{
+    ClientCallback *d = g_new(ClientCallback, 1);
+    d->func = func;
+    d->data = data;
+    client_desktop_notifies = g_slist_prepend(client_desktop_notifies, d);
+}
+
+void client_remove_desktop_notify(ObClientCallback func)
+{
+    GSList *it;
+
+    for (it = client_desktop_notifies; it; it = g_slist_next(it)) {
+        ClientCallback *d = it->data;
+        if (d->func == func) {
+            g_free(d);
+            client_desktop_notifies =
+                g_slist_delete_link(client_desktop_notifies, it);
+            break;
+        }
+    }
+}
+
 void client_set_list()
 {
     Window *windows, *win_it;
@@ -533,7 +557,7 @@ void client_unmanage(ObClient *self)
         screen_update_areas();
 
     for (it = client_destructors; it; it = g_slist_next(it)) {
-        Destructor *d = it->data;
+        ClientCallback *d = it->data;
         d->func(self, d->data);
     }
 
@@ -3001,6 +3025,12 @@ void client_set_desktop_recursive(ObClient *self,
             focus_order_to_top(self);
         else
             focus_order_to_bottom(self);
+
+        /* call the notifies */
+        for (it = client_desktop_notifies; it; it = g_slist_next(it)) {
+            ClientCallback *d = it->data;
+            d->func(self, d->data);
+        }
     }
 
     /* move all transients */
This page took 0.02427 seconds and 4 git commands to generate.