From 8e76e328639ba42cdafa5306f924b0491faec969 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sat, 30 Aug 2003 17:46:23 +0000 Subject: [PATCH] add destructor functions for clients that you acn subscribe with, and use these instead of hardcoding special cases in the unmanage code --- openbox/client.c | 25 +++++++++++++++++-------- openbox/client.h | 5 +++++ openbox/menu.c | 11 +++++++++++ openbox/moveresize.c | 10 ++++++++++ 4 files changed, 43 insertions(+), 8 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index e653ed19..aa83e2b6 100644 --- a/openbox/client.c +++ b/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); @@ -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; diff --git a/openbox/client.h b/openbox/client.h index eec1b754..758851e1 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -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 */ diff --git a/openbox/menu.c b/openbox/menu.c index 8a4c28b9..c8e16e48 100644 --- a/openbox/menu.c +++ b/openbox/menu.c @@ -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; diff --git a/openbox/moveresize.c b/openbox/moveresize.c index 9916c12d..8f92f71f 100644 --- a/openbox/moveresize.c +++ b/openbox/moveresize.c @@ -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; } -- 2.39.2