summaryrefslogtreecommitdiff
path: root/openbox/actions/if.c
diff options
context:
space:
mode:
Diffstat (limited to 'openbox/actions/if.c')
-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;
+}