all repos — openbox @ 8e76e328639ba42cdafa5306f924b0491faec969

openbox fork - make it a bit more like ryudo

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
commit

8e76e328639ba42cdafa5306f924b0491faec969

parent

2c6c0757fa497f4c1e0648bcbb1927c0fa12862f

4 files changed, 43 insertions(+), 8 deletions(-)

jump to
M openbox/client.copenbox/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.hopenbox/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/menu.copenbox/menu.c

@@ -55,6 +55,13 @@ g_free(p);

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 @@ xmlFreeDoc(doc);

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;
M openbox/moveresize.copenbox/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; }