From af01da31502b20300222213e693457320e4158e4 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 30 Sep 2012 22:41:34 -0400 Subject: [PATCH] Allow windows created by execute actions to steal focus if the user isn't interacting with another window (Fix bug 5419). When the execute action was run, we would say that the user had used the focused at that time. Then when a new window popped up, we'd think the user was busy in the current window and prevent the new one from steal focus. Now the execute action does not update the "user interacted with the focused window" timestamp anymore. So, if they aren't currently typing in some window when they trigger an execute action, and the window appears, it will steal focus. --- openbox/actions.c | 25 +++++++++++++++++++++++-- openbox/actions.h | 2 ++ openbox/actions/execute.c | 1 + openbox/event.h | 2 +- 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/openbox/actions.c b/openbox/actions.c index afbd9cb6..ac849a97 100644 --- a/openbox/actions.c +++ b/openbox/actions.c @@ -51,6 +51,7 @@ struct _ObActionsDefinition { ObActionsDataFreeFunc free; ObActionsRunFunc run; ObActionsShutdownFunc shutdown; + gboolean modifies_focused_window; }; struct _ObActionsAct { @@ -103,12 +104,13 @@ ObActionsDefinition* do_register(const gchar *name, return NULL; } - def = g_slice_new(ObActionsDefinition); + def = g_slice_new0(ObActionsDefinition); def->ref = 1; def->name = g_strdup(name); def->free = free; def->run = run; def->shutdown = NULL; + def->modifies_focused_window = TRUE; registered = g_slist_prepend(registered, def); return def; @@ -156,6 +158,22 @@ gboolean actions_set_shutdown(const gchar *name, return FALSE; } +gboolean actions_set_modifies_focused_window(const gchar *name, + gboolean modifies) +{ + GSList *it; + ObActionsDefinition *def; + + for (it = registered; it; it = g_slist_next(it)) { + def = it->data; + if (!g_ascii_strcasecmp(name, def->name)) { + def->modifies_focused_window = modifies; + return TRUE; + } + } + return FALSE; +} + static void actions_definition_ref(ObActionsDefinition *def) { ++def->ref; @@ -340,8 +358,11 @@ void actions_run_acts(GSList *acts, if (!act->def->run(&data, act->options)) { if (actions_act_is_interactive(act)) actions_interactive_end_act(); - if (client && client == focus_client) + if (client && client == focus_client && + act->def->modifies_focused_window) + { update_user_time = TRUE; + } } else { /* make sure its interactive if it returned TRUE */ g_assert(act->i_input); diff --git a/openbox/actions.h b/openbox/actions.h index e03bc577..f413ad82 100644 --- a/openbox/actions.h +++ b/openbox/actions.h @@ -82,6 +82,8 @@ gboolean actions_register(const gchar *name, gboolean actions_set_shutdown(const gchar *name, ObActionsShutdownFunc shutdown); +gboolean actions_set_modifies_focused_window(const gchar *name, + gboolean modifies); ObActionsAct* actions_parse(xmlNodePtr node); ObActionsAct* actions_parse_string(const gchar *name); diff --git a/openbox/actions/execute.c b/openbox/actions/execute.c index 380ffa00..df600fa0 100644 --- a/openbox/actions/execute.c +++ b/openbox/actions/execute.c @@ -33,6 +33,7 @@ void action_execute_startup(void) { actions_register("Execute", setup_func, free_func, run_func); actions_set_shutdown("Execute", shutdown_func); + actions_set_modifies_focused_window("Execute", FALSE); client_add_destroy_notify(client_dest, NULL); } diff --git a/openbox/event.h b/openbox/event.h index 4d9984e1..cc441405 100644 --- a/openbox/event.h +++ b/openbox/event.h @@ -26,7 +26,7 @@ struct _ObClient; /*! The amount of time before a window appears that is checked for user input to determine if the user is working in another window */ -#define OB_EVENT_USER_TIME_DELAY (1000) /* 1.0 seconds */ +#define OB_EVENT_USER_TIME_DELAY (1000) /* milliseconds */ /*! The last user-interaction time, as given by the clients */ extern Time event_last_user_time; -- 2.39.2