X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fopenbox;a=blobdiff_plain;f=openbox%2Factions%2Fif.c;fp=openbox%2Factions%2Fif.c;h=1802c6ac21e12c0bbc45c5888277522cd1f61297;hp=8a31c9a08d3dd5d1abae8e2e5484441c1541bf5d;hb=780b2428a2463f164608c498f7d2e586016b8e11;hpb=2d5239b60a5caa20c6030fa996ea4711113dcea6 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; +}