diff options
| author | Dana Jansens <danakj@orodu.net> | 2007-06-22 02:30:13 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2007-06-22 02:30:13 +0000 |
| commit | ae624a1487fd7db9291c4de1a3b2c34fcab89ef9 (patch) | |
| tree | 5dd29bbaa8f007fcaab3c406cb8bd35690652eca /openbox/actions.c | |
| parent | 8becd1f93f9a8a448ca61372e50bd8bf79e7ab9d (diff) | |
add code for interactive actions
Diffstat (limited to 'openbox/actions.c')
| -rw-r--r-- | openbox/actions.c | 79 |
1 files changed, 76 insertions, 3 deletions
diff --git a/openbox/actions.c b/openbox/actions.c index c516969e..7087f37d 100644 --- a/openbox/actions.c +++ b/openbox/actions.c @@ -18,9 +18,15 @@ #include "actions.h" #include "gettext.h" +#include "grab.h" -static void actions_definition_ref(ObActionsDefinition *def); -static void actions_definition_unref(ObActionsDefinition *def); +static void actions_definition_ref(ObActionsDefinition *def); +static void actions_definition_unref(ObActionsDefinition *def); +static gboolean actions_interactive_begin_act(ObActionsAct *act, guint state); +static void actions_interactive_end_act(); + +static ObActionsAct *interactive_act = NULL; +static guint interactive_initial_state = 0; struct _ObActionsDefinition { guint ref; @@ -202,6 +208,7 @@ void actions_run_acts(GSList *acts, for (it = acts; it; it = g_slist_next(it)) { ObActionsData data; ObActionsAct *act = it->data; + gboolean ok = TRUE; data.type = act->def->type; actions_setup_data(&data, uact, time, state, x, y); @@ -216,7 +223,73 @@ void actions_run_acts(GSList *acts, g_assert_not_reached(); } + if (actions_act_is_interactive(act) && + (!interactive_act || interactive_act->def != act->def)) + { + ok = actions_interactive_begin_act(act, state); + } + /* fire the action's run function with this data */ - act->def->run(&data, act->options); + if (ok) { + if (!act->def->run(&data, act->options)) + actions_interactive_end_act(); + else + break; /* no actions are run after the interactive one */ + } + } +} + +gboolean actions_interactive_act_running() +{ + return interactive_act != NULL; +} + +void actions_interactive_cancel_act() +{ + if (interactive_act) { + interactive_act->def->i_cancel(interactive_act->options); + actions_interactive_end_act(); + } +} + +static gboolean actions_interactive_begin_act(ObActionsAct *act, guint state) +{ + /* cancel the old one */ + if (interactive_act) + actions_interactive_cancel_act(); + + if (grab_keyboard()) { + interactive_act = act; + actions_act_ref(interactive_act); + + interactive_initial_state = state; + return TRUE; + } + else + return FALSE; +} + +static void actions_interactive_end_act() +{ + if (interactive_act) { + ungrab_keyboard(); + + actions_act_unref(interactive_act); + interactive_act = NULL; + } +} + +gboolean actions_interactive_input_event(XEvent *e) +{ + gboolean used = FALSE; + if (interactive_act) { + if (!interactive_act->def->i_input(interactive_initial_state, e, + interactive_act->options, &used)) + { + used = TRUE; /* if it cancelled the action then it has to of + been used */ + actions_interactive_end_act(); + } } + return used; } |
