X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Factions.c;h=023fab3ab5c96291ce0508c4527bc035cdfd0c07;hb=3bd4397b6ec5212bfe53a36892746962dc45dbeb;hp=26def97809bd6153d49e2ee64173db07d9eca7ed;hpb=d18d9c9379e3387073fc9346e9857fdde077b985;p=chaz%2Fopenbox diff --git a/openbox/actions.c b/openbox/actions.c index 26def978..023fab3a 100644 --- a/openbox/actions.c +++ b/openbox/actions.c @@ -186,14 +186,12 @@ ObActionsAct* actions_parse_string(const gchar *name) if ((act = actions_build_act_from_string(name))) { if (act->def->canbeinteractive) { - if (act->def->setup.i) { + if (act->def->setup.i) act->options = act->def->setup.i(NULL, &act->i_pre, &act->i_input, &act->i_cancel, &act->i_post); - g_assert(!!act->i_input == !!act->i_cancel); - } } else { if (act->def->setup.n) @@ -210,18 +208,16 @@ ObActionsAct* actions_parse(xmlNodePtr node) gchar *name; ObActionsAct *act = NULL; - if (obt_parse_attr_string(node, "name", &name)) { + if (obt_xml_attr_string(node, "name", &name)) { if ((act = actions_build_act_from_string(name))) { /* there is more stuff to parse here */ if (act->def->canbeinteractive) { - if (act->def->setup.i) { + if (act->def->setup.i) act->options = act->def->setup.i(node->children, &act->i_pre, &act->i_input, &act->i_cancel, &act->i_post); - g_assert(!!act->i_input == !!act->i_cancel); - } } else { if (act->def->setup.n) @@ -236,7 +232,7 @@ ObActionsAct* actions_parse(xmlNodePtr node) gboolean actions_act_is_interactive(ObActionsAct *act) { - return act->i_cancel != NULL; + return act->i_input != NULL; } void actions_act_ref(ObActionsAct *act) @@ -308,9 +304,12 @@ void actions_run_acts(GSList *acts, if (interactive_act) actions_interactive_cancel_act(); if (act->i_pre) - act->i_pre(act->options); - ok = actions_interactive_begin_act(act, state); + if (!act->i_pre(state, act->options)) + act->i_input = NULL; /* remove the interactivity */ } + /* check again cuz it might have been cancelled */ + if (actions_act_is_interactive(act)) + ok = actions_interactive_begin_act(act, state); } /* fire the action's run function with this data */ @@ -320,7 +319,7 @@ void actions_run_acts(GSList *acts, actions_interactive_end_act(); } else { /* make sure its interactive if it returned TRUE */ - g_assert(act->i_cancel); + g_assert(act->i_input); /* no actions are run after the interactive one */ break; @@ -337,7 +336,8 @@ gboolean actions_interactive_act_running(void) void actions_interactive_cancel_act(void) { if (interactive_act) { - interactive_act->i_cancel(interactive_act->options); + if (interactive_act->i_cancel) + interactive_act->i_cancel(interactive_act->options); actions_interactive_end_act(); } } @@ -408,13 +408,19 @@ void actions_client_move(ObActionsData *data, gboolean start) are ignored during a grab, so don't force fake ones when they should be ignored */ - if ((c = client_under_pointer()) && c != data->client && - !grab_on_pointer()) - { - ob_debug_type(OB_DEBUG_FOCUS, - "Generating fake enter because we did a " - "mouse-event action"); - event_enter_client(c); + if (!grab_on_pointer()) { + if ((c = client_under_pointer()) && c != data->client) { + ob_debug_type(OB_DEBUG_FOCUS, + "Generating fake enter because we did a " + "mouse-event action"); + event_enter_client(c); + } + else if (!c && c != data->client) { + ob_debug_type(OB_DEBUG_FOCUS, + "Generating fake leave because we did a " + "mouse-event action"); + event_enter_client(data->client); + } } } else if (!data->button && !config_focus_under_mouse)