]> Dogcows Code - chaz/openbox/commitdiff
likewise if a window is unmanaged and we were trying to give it focus, we want to...
authorDana Jansens <danakj@orodu.net>
Sun, 13 May 2007 07:38:35 +0000 (07:38 +0000)
committerDana Jansens <danakj@orodu.net>
Sun, 13 May 2007 07:38:35 +0000 (07:38 +0000)
add a notifier for windows being hidden, and use that instead - it handles both cases.

openbox/client.c
openbox/client.h
openbox/focus.c

index 208024cf92ebf1c8eeb8629ec776bf34182d89fe..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;
@@ -565,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 */
@@ -2383,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
@@ -2400,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
index bc7c32e8473913a1eb46749caf4f537ce409c515..1a2273f461193f94c84378ab84fa6699f64cd84a 100644 (file)
@@ -312,6 +312,10 @@ typedef void (*ObClientCallback)(ObClient *client, gpointer data);
 void client_add_destructor(ObClientCallback func, gpointer data);
 void client_remove_destructor(ObClientCallback func);
 
+/*! Get notified when the client is hidden */
+void client_add_hide_notify(ObClientCallback func, gpointer data);
+void client_remove_hide_notify(ObClientCallback func);
+
 /*! Manages all existing windows */
 void client_manage_all();
 /*! Manages a given window
index 92cd76626fa9b0ce114a79a92bb5ba4fe30912fd..39b12d00246c426032d6dc2103f4b74045e363b1 100644 (file)
@@ -68,7 +68,7 @@ static gboolean valid_focus_target(ObClient *ft,
                                    gboolean dock_windows,
                                    gboolean desktop_windows);
 static void focus_cycle_destructor(ObClient *client, gpointer data);
-static void focus_tried_destructor(ObClient *client, gpointer data);
+static void focus_tried_hide_notify(ObClient *client, gpointer data);
 
 static Window createWindow(Window parent, gulong mask,
                            XSetWindowAttributes *attrib)
@@ -87,7 +87,7 @@ void focus_startup(gboolean reconfig)
         XSetWindowAttributes attr;
 
         client_add_destructor(focus_cycle_destructor, NULL);
-        client_add_destructor(focus_tried_destructor, NULL);
+        client_add_hide_notify(focus_tried_hide_notify, NULL);
 
         /* start with nothing focused */
         focus_nothing();
@@ -141,7 +141,7 @@ void focus_shutdown(gboolean reconfig)
 
     if (!reconfig) {
         client_remove_destructor(focus_cycle_destructor);
-        client_remove_destructor(focus_tried_destructor);
+        client_remove_hide_notify(focus_tried_hide_notify);
 
         /* reset focus to root */
         XSetInputFocus(ob_display, PointerRoot, RevertToNone, CurrentTime);
@@ -942,7 +942,7 @@ ObClient *focus_order_find_first(guint desktop)
     return NULL;
 }
 
-static void focus_tried_destructor(ObClient *client, gpointer data)
+static void focus_tried_hide_notify(ObClient *client, gpointer data)
 {
     XEvent ce;
 
This page took 0.037932 seconds and 4 git commands to generate.