summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-08-30 17:46:23 +0000
committerDana Jansens <danakj@orodu.net>2003-08-30 17:46:23 +0000
commit8e76e328639ba42cdafa5306f924b0491faec969 (patch)
tree286b5d45b2adece699b87455aa9fbfadb7e86aec /openbox
parent2c6c0757fa497f4c1e0648bcbb1927c0fa12862f (diff)
add destructor functions for clients that you acn subscribe with, and use these instead of hardcoding special cases in the unmanage code
Diffstat (limited to 'openbox')
-rw-r--r--openbox/client.c25
-rw-r--r--openbox/client.h5
-rw-r--r--openbox/menu.c11
-rw-r--r--openbox/moveresize.c10
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;
}