X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Factions.c;h=9a5d193c4a2b33200416867eff81d769c0d224e2;hb=1b7e813c62a6e54690d15550d51ac4269e63f346;hp=00563a700055aa7b2ebeb7064da415895dc4a30f;hpb=780d1b0961e2eed5fea4645b4398fafb4adad73a;p=chaz%2Fopenbox diff --git a/openbox/actions.c b/openbox/actions.c index 00563a70..9a5d193c 100644 --- a/openbox/actions.c +++ b/openbox/actions.c @@ -21,6 +21,8 @@ #include "grab.h" #include "screen.h" +#include "actions/all.h" + static void actions_definition_ref(ObActionsDefinition *def); static void actions_definition_unref(ObActionsDefinition *def); static gboolean actions_interactive_begin_act(ObActionsAct *act, guint state); @@ -33,7 +35,6 @@ struct _ObActionsDefinition { guint ref; gchar *name; - ObActionsType type; ObActionsDataSetupFunc setup; ObActionsDataFreeFunc free; @@ -55,6 +56,8 @@ static GSList *registered = NULL; void actions_startup(gboolean reconfig) { if (reconfig) return; + + action_all_startup(); } void actions_shutdown(gboolean reconfig) @@ -71,7 +74,6 @@ void actions_shutdown(gboolean reconfig) } gboolean actions_register(const gchar *name, - ObActionsType type, ObActionsDataSetupFunc setup, ObActionsDataFreeFunc free, ObActionsRunFunc run, @@ -81,23 +83,26 @@ gboolean actions_register(const gchar *name, GSList *it; ObActionsDefinition *def; + g_assert(run != NULL); + g_assert((i_input == NULL) == (i_cancel == NULL)); + for (it = registered; it; it = g_slist_next(it)) { def = it->data; if (!g_ascii_strcasecmp(name, def->name)) /* already registered */ return FALSE; } - g_assert((i_input == NULL) == (i_cancel == NULL)); - def = g_new(ObActionsDefinition, 1); def->ref = 1; def->name = g_strdup(name); - def->type = type; def->setup = setup; def->free = free; def->run = run; def->i_input = i_input; def->i_cancel = i_cancel; + + registered = g_slist_prepend(registered, def); + return TRUE; } @@ -117,7 +122,7 @@ static void actions_definition_unref(ObActionsDefinition *def) ObActionsAct* actions_parse_string(const gchar *name) { GSList *it; - ObActionsDefinition *def; + ObActionsDefinition *def = NULL; ObActionsAct *act = NULL; /* find the requested action */ @@ -152,7 +157,8 @@ ObActionsAct* actions_parse(ObParseInst *i, if (parse_attr_string("name", node, &name)) { if ((act = actions_parse_string(name))) /* there is more stuff to parse here */ - act->options = act->def->setup(i, doc, node->children); + if (act->def->setup) + act->options = act->def->setup(i, doc, node->xmlChildrenNode); g_free(name); } @@ -174,7 +180,8 @@ void actions_act_unref(ObActionsAct *act) { if (act && --act->ref == 0) { /* free the action specific options */ - act->def->free(act->options); + if (act->def->free) + act->def->free(act->options); /* unref the definition */ actions_definition_unref(act->def); g_free(act); @@ -186,13 +193,17 @@ static void actions_setup_data(ObActionsData *data, Time time, guint state, gint x, - gint y) + gint y, + ObFrameContext con, + struct _ObClient *client) { - data->any.uact = uact; - data->any.time = time; - data->any.state = state; - data->any.x = x; - data->any.y = y; + data->uact = uact; + data->time = time; + data->state = state; + data->x = x; + data->y = y; + data->context = con; + data->client = client; } void actions_run_acts(GSList *acts, @@ -219,18 +230,7 @@ void actions_run_acts(GSList *acts, ObActionsAct *act = it->data; gboolean ok = TRUE; - data.type = act->def->type; - actions_setup_data(&data, uact, time, state, x, y); - switch (data.type) { - case OB_ACTION_TYPE_GLOBAL: - break; - case OB_ACTION_TYPE_CLIENT: - data.client.context = con; - data.client.c = client; - break; - default: - g_assert_not_reached(); - } + actions_setup_data(&data, uact, time, state, x, y, con, client); if (actions_act_is_interactive(act) && (!interactive_act || interactive_act->def != act->def)) @@ -242,8 +242,13 @@ void actions_run_acts(GSList *acts, if (ok) { if (!act->def->run(&data, act->options)) actions_interactive_end_act(); - else - break; /* no actions are run after the interactive one */ + else { + /* make sure its interactive if it returned TRUE */ + g_assert(act->def->i_cancel && act->def->i_input); + + /* no actions are run after the interactive one */ + break; + } } } }