add destructor functions for clients that you acn subscribe with, and use these inste...
authorDana Jansens <danakj@orodu.net>
Sat, 30 Aug 2003 17:46:23 +0000 (17:46 +0000)
committerDana Jansens <danakj@orodu.net>
Sat, 30 Aug 2003 17:46:23 +0000 (17:46 +0000)
openbox/client.c
openbox/client.h
openbox/menu.c
openbox/moveresize.c

index e653ed1..aa83e2b 100644 (file)
@@ -32,7 +32,8 @@
 #define CLIENT_NOPROPAGATEMASK (ButtonPressMask | ButtonReleaseMask | \
                                ButtonMotionMask)
 
-GList      *client_list      = NULL;
+GList      *client_list        = NULL;
+GSList     *client_destructors = NULL;
 
 static void client_get_all(ObClient *self);
 static void client_toggle_border(ObClient *self, gboolean show);
@@ -58,6 +59,16 @@ void client_shutdown()
 {
 }
 
+void client_add_destructor(ObClientDestructorFunc func)
+{
+    client_destructors = g_slist_prepend(client_destructors, (gpointer)func);
+}
+
+void client_remove_destructor(ObClientDestructorFunc func)
+{
+    client_destructors = g_slist_remove(client_destructors, (gpointer)func);
+}
+
 void client_set_list()
 {
     Window *windows, *win_it;
@@ -414,13 +425,11 @@ void client_unmanage(ObClient *self)
         }
     }
 
-    if (moveresize_client == self)
-        moveresize_end(TRUE);
-
-    /* menus can be associated with a client, so close any that are since
-       we are disappearing now */
-    menu_frame_hide_all_client(self);
-    
+    for (it = client_destructors; it; it = g_slist_next(it)) {
+        ObClientDestructorFunc func = (ObClientDestructorFunc) it->data;
+        func(self);
+    }
+        
     if (focus_client == self) {
         XEvent e;
 
index eec1b75..758851e 100644 (file)
@@ -243,6 +243,11 @@ extern GList *client_list;
 void client_startup();
 void client_shutdown();
 
+typedef void (*ObClientDestructorFunc)(ObClient *c);
+
+void client_add_destructor(ObClientDestructorFunc func);
+void client_remove_destructor(ObClientDestructorFunc func);
+
 /*! Manages all existing windows */
 void client_manage_all();
 /*! Manages a given window */
index 8a4c28b..c8e16e4 100644 (file)
@@ -55,6 +55,13 @@ static gboolean menu_open(gchar *file, xmlDocPtr *doc, xmlNodePtr *node)
     return loaded;
 }
 
+static void client_dest(ObClient *c)
+{
+    /* menus can be associated with a client, so close any that are since
+       we are disappearing now */
+    menu_frame_hide_all_client(c);
+}
+
 void menu_startup()
 {
     xmlDocPtr doc;
@@ -91,10 +98,14 @@ void menu_startup()
 
         g_assert(menu_parse_state.menus == NULL);
     }
+
+    client_add_destructor(client_dest);
 }
 
 void menu_shutdown()
 {
+    client_remove_destructor(client_dest);
+
     parse_shutdown(menu_parse_inst);
     menu_parse_inst = NULL;
 
index 9916c12..8f92f71 100644 (file)
@@ -30,6 +30,12 @@ static Popup *popup = NULL;
 #define POPUP_X (10)
 #define POPUP_Y (10)
 
+static void client_dest(ObClient *c)
+{
+    if (moveresize_client == c)
+        moveresize_end(TRUE);    
+}
+
 void moveresize_startup()
 {
     XSetWindowAttributes attrib;
@@ -38,10 +44,14 @@ void moveresize_startup()
     popup_size_to_string(popup, "W:  0000  W:  0000");
 
     attrib.save_under = True;
+
+    client_add_destructor(client_dest);
 }
 
 void moveresize_shutdown()
 {
+    client_remove_destructor(client_dest);
+
     popup_free(popup);
     popup = NULL;
 }