Allow windows created by execute actions to steal focus if the user isn't interacting...
[dana/openbox.git] / openbox / actions.c
index afbd9cb..ac849a9 100644 (file)
@@ -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);