]> Dogcows Code - chaz/openbox/blobdiff - openbox/actions/if.c
Add ForEach action which is like If but runs on all clients
[chaz/openbox] / openbox / actions / if.c
index 8a31c9a08d3dd5d1abae8e2e5484441c1541bf5d..1802c6ac21e12c0bbc45c5888277522cd1f61297 100644 (file)
@@ -64,15 +64,22 @@ typedef struct {
     GArray* queries;
     GSList *thenacts;
     GSList *elseacts;
+    gboolean stop;
 } Options;
 
 static gpointer setup_func(xmlNodePtr node);
 static void     free_func(gpointer options);
-static gboolean run_func(ObActionsData *data, gpointer options);
+static gboolean run_func_if(ObActionsData *data, gpointer options);
+static gboolean run_func_stop(ObActionsData *data, gpointer options);
+static gboolean run_func_foreach(ObActionsData *data, gpointer options);
 
 void action_if_startup(void)
 {
-    actions_register("If", setup_func, free_func, run_func);
+    actions_register("If", setup_func, free_func, run_func_if);
+    actions_register("Stop", NULL, NULL, run_func_stop);
+    actions_register("ForEach", setup_func, free_func, run_func_foreach);
+
+    actions_set_can_stop("Stop", TRUE);
 }
 
 static inline void set_bool(xmlNodePtr node,
@@ -228,7 +235,7 @@ static void free_func(gpointer options)
 }
 
 /* Always return FALSE because its not interactive */
-static gboolean run_func(ObActionsData *data, gpointer options)
+static gboolean run_func_if(ObActionsData *data, gpointer options)
 {
     Options *o = options;
     ObClient *action_target = data->client;
@@ -351,3 +358,34 @@ static gboolean run_func(ObActionsData *data, gpointer options)
 
     return FALSE;
 }
+
+static gboolean run_func_foreach(ObActionsData *data, gpointer options)
+{
+    GList *it;
+    Options *o = options;
+
+    o->stop = FALSE;
+
+    for (it = client_list; it; it = g_list_next(it)) {
+        data->client = it->data;
+        run_func_if(data, options);
+        if (o->stop) {
+            break;
+        }
+    }
+
+    return FALSE;
+}
+
+static gboolean run_func_stop(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    /* This stops the loop above so we don't invoke actions on any more
+       clients */
+    o->stop = TRUE;
+
+    /* TRUE causes actions_run_acts to not run further actions on the current
+       client */
+    return TRUE;
+}
This page took 0.020529 seconds and 4 git commands to generate.