summaryrefslogtreecommitdiff
path: root/openbox/actions
diff options
context:
space:
mode:
authorMikael Magnusson <mikachu@gmail.com>2013-08-19 00:03:51 +0200
committerMikael Magnusson <mikachu@gmail.com>2013-08-19 21:35:44 +0200
commit780b2428a2463f164608c498f7d2e586016b8e11 (patch)
tree907040e1ca50ac6d07cef48748055941073c229e /openbox/actions
parent2d5239b60a5caa20c6030fa996ea4711113dcea6 (diff)
Add ForEach action which is like If but runs on all clients
Also adds a Stop action that lets you stop running, in case you only want to run actions on the first match.
Diffstat (limited to 'openbox/actions')
-rw-r--r--openbox/actions/if.c44
1 files changed, 41 insertions, 3 deletions
diff --git a/openbox/actions/if.c b/openbox/actions/if.c
index 8a31c9a0..1802c6ac 100644
--- a/openbox/actions/if.c
+++ b/openbox/actions/if.c
@@ -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;
+}