summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-09-26 16:47:12 +0000
committerDana Jansens <danakj@orodu.net>2003-09-26 16:47:12 +0000
commitadb9bb700f3235728dacc1d3e3daad81abd93e9a (patch)
tree59f659d62fbd6ae6e642276823d6484e17afa13f /openbox
parent9ed3baf9dbf0c4c1dcf4b63262eca03247b50a0d (diff)
give actions a ref count
Diffstat (limited to 'openbox')
-rw-r--r--openbox/action.c17
-rw-r--r--openbox/action.h6
-rw-r--r--openbox/keytree.c2
-rw-r--r--openbox/menu.c2
-rw-r--r--openbox/mouse.c2
5 files changed, 19 insertions, 10 deletions
diff --git a/openbox/action.c b/openbox/action.c
index bef87680..52a602cc 100644
--- a/openbox/action.c
+++ b/openbox/action.c
@@ -65,19 +65,26 @@ typedef struct
void (*setup)(ObAction **, ObUserAction uact);
} ActionString;
-static ObAction *action_new(void (*func)(union ActionData *data),
- ObUserAction uact)
+static ObAction *action_new(void (*func)(union ActionData *data))
{
ObAction *a = g_new0(ObAction, 1);
+ a->ref = 1;
a->func = func;
return a;
}
-void action_free(ObAction *a)
+void action_ref(ObAction *a)
+{
+ ++a->ref;
+}
+
+void action_unref(ObAction *a)
{
if (a == NULL) return;
+ if (--a->ref > 0) return;
+
/* deal with pointers */
if (a->func == action_execute || a->func == action_restart)
g_free(a->data.execute.path);
@@ -359,7 +366,7 @@ void setup_action_showmenu(ObAction **a, ObUserAction uact)
assumptions that there is only one menu (and submenus) open at
a time! */
if (uact == OB_USER_ACTION_MENU_SELECTION) {
- action_free(*a);
+ action_unref(*a);
a = NULL;
}
}
@@ -772,7 +779,7 @@ ObAction *action_from_string(const gchar *name, ObUserAction uact)
for (i = 0; actionstrings[i].name; i++)
if (!g_ascii_strcasecmp(name, actionstrings[i].name)) {
exist = TRUE;
- a = action_new(actionstrings[i].func, uact);
+ a = action_new(actionstrings[i].func);
if (actionstrings[i].setup)
actionstrings[i].setup(&a, uact);
/* only key bindings can be interactive. thus saith the xor.
diff --git a/openbox/action.h b/openbox/action.h
index 3edc96b9..a2f941ed 100644
--- a/openbox/action.h
+++ b/openbox/action.h
@@ -152,7 +152,8 @@ union ActionData {
};
struct _ObAction {
- ObUserAction act;
+ guint ref;
+
/* The func member acts like an enum to tell which one of the structs in
the data union are valid.
*/
@@ -176,7 +177,8 @@ struct _ObAction {
ObAction *action_from_string(const gchar *name, ObUserAction uact);
ObAction *action_parse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
ObUserAction uact);
-void action_free(ObAction *a);
+void action_ref(ObAction *a);
+void action_unref(ObAction *a);
/*! Executes a list of actions.
@param c The client associated with the action. Can be NULL.
diff --git a/openbox/keytree.c b/openbox/keytree.c
index 960b0506..02ad3cad 100644
--- a/openbox/keytree.c
+++ b/openbox/keytree.c
@@ -34,7 +34,7 @@ void tree_destroy(KeyBindingTree *tree)
g_free(it->data);
g_list_free(tree->keylist);
for (sit = tree->actions; sit != NULL; sit = sit->next)
- action_free(sit->data);
+ action_unref(sit->data);
g_slist_free(tree->actions);
}
g_free(tree);
diff --git a/openbox/menu.c b/openbox/menu.c
index cf3fa555..2bd382cb 100644
--- a/openbox/menu.c
+++ b/openbox/menu.c
@@ -326,7 +326,7 @@ void menu_entry_free(ObMenuEntry *self)
case OB_MENU_ENTRY_TYPE_NORMAL:
g_free(self->data.normal.label);
while (self->data.normal.actions) {
- action_free(self->data.normal.actions->data);
+ action_unref(self->data.normal.actions->data);
self->data.normal.actions =
g_slist_delete_link(self->data.normal.actions,
self->data.normal.actions);
diff --git a/openbox/mouse.c b/openbox/mouse.c
index 0fd2a828..414be04e 100644
--- a/openbox/mouse.c
+++ b/openbox/mouse.c
@@ -142,7 +142,7 @@ void mouse_unbind_all()
GSList *it;
for (it = b->actions[j]; it; it = it->next)
- action_free(it->data);
+ action_unref(it->data);
g_slist_free(b->actions[j]);
}
g_free(b);