From: Dana Jansens Date: Fri, 26 Sep 2003 16:47:12 +0000 (+0000) Subject: give actions a ref count X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=adb9bb700f3235728dacc1d3e3daad81abd93e9a;p=chaz%2Fopenbox give actions a ref count --- 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);