]> Dogcows Code - chaz/openbox/blobdiff - openbox/action.c
give actions a ref count
[chaz/openbox] / openbox / action.c
index bef8768039d80488527029dfc92fcd833a0f008e..52a602ccf7071ba53818f0737a8307c4a5083d0c 100644 (file)
@@ -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.
This page took 0.023626 seconds and 4 git commands to generate.