add destructor functions for clients that you acn subscribe with, and use these instead of hardcoding special cases in the unmanage code
Dana Jansens danakj@orodu.net
4 files changed,
43 insertions(+),
8 deletions(-)
M
openbox/client.c
→
openbox/client.c
@@ -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);@@ -56,6 +57,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()@@ -414,13 +425,11 @@ client_calc_layer(it->data);
} } - 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;
M
openbox/client.h
→
openbox/client.h
@@ -243,6 +243,11 @@
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 */
M
openbox/moveresize.c
→
openbox/moveresize.c
@@ -30,6 +30,12 @@
#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 @@ popup = popup_new(FALSE);
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; }