give actions a ref count

This commit is contained in:
Dana Jansens 2003-09-26 16:47:12 +00:00
parent 9ed3baf9db
commit adb9bb700f
5 changed files with 19 additions and 10 deletions

View file

@ -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.

View file

@ -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.

View file

@ -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);

View file

@ -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);

View file

@ -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);