give actions a ref count
This commit is contained in:
parent
9ed3baf9db
commit
adb9bb700f
5 changed files with 19 additions and 10 deletions
|
@ -65,19 +65,26 @@ typedef struct
|
||||||
void (*setup)(ObAction **, ObUserAction uact);
|
void (*setup)(ObAction **, ObUserAction uact);
|
||||||
} ActionString;
|
} ActionString;
|
||||||
|
|
||||||
static ObAction *action_new(void (*func)(union ActionData *data),
|
static ObAction *action_new(void (*func)(union ActionData *data))
|
||||||
ObUserAction uact)
|
|
||||||
{
|
{
|
||||||
ObAction *a = g_new0(ObAction, 1);
|
ObAction *a = g_new0(ObAction, 1);
|
||||||
|
a->ref = 1;
|
||||||
a->func = func;
|
a->func = func;
|
||||||
|
|
||||||
return a;
|
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 == NULL) return;
|
||||||
|
|
||||||
|
if (--a->ref > 0) return;
|
||||||
|
|
||||||
/* deal with pointers */
|
/* deal with pointers */
|
||||||
if (a->func == action_execute || a->func == action_restart)
|
if (a->func == action_execute || a->func == action_restart)
|
||||||
g_free(a->data.execute.path);
|
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
|
assumptions that there is only one menu (and submenus) open at
|
||||||
a time! */
|
a time! */
|
||||||
if (uact == OB_USER_ACTION_MENU_SELECTION) {
|
if (uact == OB_USER_ACTION_MENU_SELECTION) {
|
||||||
action_free(*a);
|
action_unref(*a);
|
||||||
a = NULL;
|
a = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -772,7 +779,7 @@ ObAction *action_from_string(const gchar *name, ObUserAction uact)
|
||||||
for (i = 0; actionstrings[i].name; i++)
|
for (i = 0; actionstrings[i].name; i++)
|
||||||
if (!g_ascii_strcasecmp(name, actionstrings[i].name)) {
|
if (!g_ascii_strcasecmp(name, actionstrings[i].name)) {
|
||||||
exist = TRUE;
|
exist = TRUE;
|
||||||
a = action_new(actionstrings[i].func, uact);
|
a = action_new(actionstrings[i].func);
|
||||||
if (actionstrings[i].setup)
|
if (actionstrings[i].setup)
|
||||||
actionstrings[i].setup(&a, uact);
|
actionstrings[i].setup(&a, uact);
|
||||||
/* only key bindings can be interactive. thus saith the xor.
|
/* only key bindings can be interactive. thus saith the xor.
|
||||||
|
|
|
@ -152,7 +152,8 @@ union ActionData {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _ObAction {
|
struct _ObAction {
|
||||||
ObUserAction act;
|
guint ref;
|
||||||
|
|
||||||
/* The func member acts like an enum to tell which one of the structs in
|
/* The func member acts like an enum to tell which one of the structs in
|
||||||
the data union are valid.
|
the data union are valid.
|
||||||
*/
|
*/
|
||||||
|
@ -176,7 +177,8 @@ struct _ObAction {
|
||||||
ObAction *action_from_string(const gchar *name, ObUserAction uact);
|
ObAction *action_from_string(const gchar *name, ObUserAction uact);
|
||||||
ObAction *action_parse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
|
ObAction *action_parse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
|
||||||
ObUserAction uact);
|
ObUserAction uact);
|
||||||
void action_free(ObAction *a);
|
void action_ref(ObAction *a);
|
||||||
|
void action_unref(ObAction *a);
|
||||||
|
|
||||||
/*! Executes a list of actions.
|
/*! Executes a list of actions.
|
||||||
@param c The client associated with the action. Can be NULL.
|
@param c The client associated with the action. Can be NULL.
|
||||||
|
|
|
@ -34,7 +34,7 @@ void tree_destroy(KeyBindingTree *tree)
|
||||||
g_free(it->data);
|
g_free(it->data);
|
||||||
g_list_free(tree->keylist);
|
g_list_free(tree->keylist);
|
||||||
for (sit = tree->actions; sit != NULL; sit = sit->next)
|
for (sit = tree->actions; sit != NULL; sit = sit->next)
|
||||||
action_free(sit->data);
|
action_unref(sit->data);
|
||||||
g_slist_free(tree->actions);
|
g_slist_free(tree->actions);
|
||||||
}
|
}
|
||||||
g_free(tree);
|
g_free(tree);
|
||||||
|
|
|
@ -326,7 +326,7 @@ void menu_entry_free(ObMenuEntry *self)
|
||||||
case OB_MENU_ENTRY_TYPE_NORMAL:
|
case OB_MENU_ENTRY_TYPE_NORMAL:
|
||||||
g_free(self->data.normal.label);
|
g_free(self->data.normal.label);
|
||||||
while (self->data.normal.actions) {
|
while (self->data.normal.actions) {
|
||||||
action_free(self->data.normal.actions->data);
|
action_unref(self->data.normal.actions->data);
|
||||||
self->data.normal.actions =
|
self->data.normal.actions =
|
||||||
g_slist_delete_link(self->data.normal.actions,
|
g_slist_delete_link(self->data.normal.actions,
|
||||||
self->data.normal.actions);
|
self->data.normal.actions);
|
||||||
|
|
|
@ -142,7 +142,7 @@ void mouse_unbind_all()
|
||||||
GSList *it;
|
GSList *it;
|
||||||
|
|
||||||
for (it = b->actions[j]; it; it = it->next)
|
for (it = b->actions[j]; it; it = it->next)
|
||||||
action_free(it->data);
|
action_unref(it->data);
|
||||||
g_slist_free(b->actions[j]);
|
g_slist_free(b->actions[j]);
|
||||||
}
|
}
|
||||||
g_free(b);
|
g_free(b);
|
||||||
|
|
Loading…
Reference in a new issue