diff options
Diffstat (limited to 'openbox/actions/if.c')
| -rw-r--r-- | openbox/actions/if.c | 44 |
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; +} |
