]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
when i said it handled both cases, i was mistaken, so use a callback for each case.
[chaz/openbox] / openbox / client.c
index 8428be6b54db3d060cc3c1e0cbfaee0c0f34edb6..112b8d8b900623ed1dcf53772a1d801e9909a446 100644 (file)
@@ -65,6 +65,7 @@ typedef struct
 GList            *client_list          = NULL;
 
 static GSList *client_destructors      = NULL;
+static GSList *client_hide_notifies    = NULL;
 
 static void client_get_all(ObClient *self, gboolean real);
 static void client_toggle_border(ObClient *self, gboolean show);
@@ -91,6 +92,7 @@ static void client_present(ObClient *self, gboolean here, gboolean raise);
 static GSList *client_search_all_top_parents_internal(ObClient *self,
                                                       gboolean bylayer,
                                                       ObStackingLayer layer);
+static void client_call_callbacks(ObClient *self, GSList *list);
 
 void client_startup(gboolean reconfig)
 {
@@ -104,6 +106,16 @@ void client_shutdown(gboolean reconfig)
     if (reconfig) return;
 }
 
+static void client_call_callbacks(ObClient *self, GSList *list)
+{
+    GSList *it;
+
+    for (it = list; it; it = g_slist_next(it)) {
+        ClientCallback *d = it->data;
+        d->func(self, d->data);
+    }
+}
+
 void client_add_destructor(ObClientCallback func, gpointer data)
 {
     ClientCallback *d = g_new(ClientCallback, 1);
@@ -126,6 +138,29 @@ void client_remove_destructor(ObClientCallback func)
     }
 }
 
+void client_add_hide_notify(ObClientCallback func, gpointer data)
+{
+    ClientCallback *d = g_new(ClientCallback, 1);
+    d->func = func;
+    d->data = data;
+    client_hide_notifies = g_slist_prepend(client_destructors, d);
+}
+
+void client_remove_hide_notify(ObClientCallback func)
+{
+    GSList *it;
+
+    for (it = client_hide_notifies; it; it = g_slist_next(it)) {
+        ClientCallback *d = it->data;
+        if (d->func == func) {
+            g_free(d);
+            client_hide_notifies =
+                g_slist_delete_link(client_hide_notifies, it);
+            break;
+        }
+    }
+}
+
 void client_set_list()
 {
     Window *windows, *win_it;
@@ -466,11 +501,6 @@ void client_manage(Window window)
     */
     client_show(self);
 
-    /* use client_focus instead of client_activate cuz client_activate does
-       stuff like switch desktops etc and I'm not interested in all that when
-       a window maps since its not based on an action from the user like
-       clicking a window to activate it. so keep the new window out of the way
-       but do focus it. */
     if (activate) {
         gboolean stacked = client_restore_session_stacking(self);
         client_present(self, FALSE, !stacked);
@@ -570,10 +600,7 @@ void client_unmanage(ObClient *self)
     if (STRUT_EXISTS(self->strut))
         screen_update_areas();
 
-    for (it = client_destructors; it; it = g_slist_next(it)) {
-        ClientCallback *d = it->data;
-        d->func(self, d->data);
-    }
+    client_call_callbacks(self, client_destructors);
 
     /* tell our parent(s) that we're gone */
     if (self->transient_for == OB_TRAN_GROUP) { /* transient of group */
@@ -2388,6 +2415,8 @@ void client_hide(ObClient *self)
 {
     if (!client_should_show(self)) {
         frame_hide(self->frame);
+
+        client_call_callbacks(self, client_hide_notifies);
     }
 
     /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it
@@ -2405,6 +2434,8 @@ void client_showhide(ObClient *self)
     }
     else {
         frame_hide(self->frame);
+
+        client_call_callbacks(self, client_hide_notifies);
     }
 
     /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it
This page took 0.023362 seconds and 4 git commands to generate.