add raise action
authorDana Jansens <danakj@orodu.net>
Fri, 22 Jun 2007 14:24:23 +0000 (14:24 +0000)
committerDana Jansens <danakj@orodu.net>
Fri, 22 Jun 2007 14:24:23 +0000 (14:24 +0000)
Makefile.am
openbox/action.c
openbox/actions.c
openbox/actions.h
openbox/actions/all.c
openbox/actions/all.h
openbox/actions/focus.c
openbox/actions/raise.c [new file with mode: 0644]

index a1bc264..cebec40 100644 (file)
@@ -164,6 +164,7 @@ openbox_openbox_SOURCES = \
        openbox/actions/exit.c \
        openbox/actions/focus.c \
        openbox/actions/move.c \
+       openbox/actions/raise.c \
        openbox/actions/reconfigure.c \
        openbox/actions/restart.c \
        openbox/actions/showdesktop.c \
index cdf48df..f0fe691 100644 (file)
 
 #include <glib.h>
 
-static gulong ignore_start = 0;
 
-static void client_action_start(union ActionData *data)
-{
-    ignore_start = event_start_ignore_all_enters();
-}
-
-static void client_action_end(union ActionData *data, gboolean allow_enters)
-{
-    if (config_focus_follow)
-        if (data->any.context != OB_FRAME_CONTEXT_CLIENT) {
-            if (!data->any.button && data->any.c && !allow_enters) {
-                event_end_ignore_all_enters(ignore_start);
-            } else {
-                ObClient *c;
-
-                /* usually this is sorta redundant, but with a press action
-                   that moves windows our from under the cursor, the enter
-                   event will come as a GrabNotify which is ignored, so this
-                   makes a fake enter event
-                */
-                if ((c = client_under_pointer()) && c != data->any.c) {
-                    ob_debug_type(OB_DEBUG_FOCUS,
-                                  "Generating fake enter because we did a "
-                                  "mouse-event action");
-                    event_enter_client(c);
-                }
-            }
-        }
-}
 
 typedef struct
 {
@@ -499,11 +470,6 @@ ActionString actionstrings[] =
         setup_client_action
     },
     {
-        "raise",
-        action_raise,
-        setup_client_action
-    },
-    {
         "lower",
         action_lower,
         setup_client_action
@@ -957,12 +923,6 @@ ObAction *action_parse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
                             prop_atoms.net_wm_moveresize_size_bottomright;
                     g_free(s);
                 }
-            } else if (act->func == action_raise ||
-                       act->func == action_lower ||
-                       act->func == action_raiselower ||
-                       act->func == action_shadelower ||
-                       act->func == action_unshaderaise) {
-            }
             INTERACTIVE_LIMIT(act, uact);
         }
         g_free(actname);
@@ -1097,13 +1057,6 @@ void action_raiselower(union ActionData *data)
     client_action_end(data, config_focus_under_mouse);
 }
 
-void action_raise(union ActionData *data)
-{
-    client_action_start(data);
-    stacking_raise(CLIENT_AS_WINDOW(data->client.any.c));
-    client_action_end(data, config_focus_under_mouse);
-}
-
 void action_unshaderaise(union ActionData *data)
 {
     if (data->client.any.c->shaded)
index a4308e6..67dc3d3 100644 (file)
 #include "gettext.h"
 #include "grab.h"
 #include "screen.h"
+#include "event.h"
+#include "config.h"
+#include "client.h"
+#include "debug.h"
 
 #include "actions/all.h"
 
@@ -307,3 +311,31 @@ gboolean actions_interactive_input_event(XEvent *e)
     }
     return used;
 }
+
+void actions_client_move(ObActionsData *data, gboolean start)
+{
+    static gulong ignore_start = 0;
+    if (start)
+        ignore_start = event_start_ignore_all_enters();
+    else if (config_focus_follow &&
+             data->context != OB_FRAME_CONTEXT_CLIENT)
+    {
+        if (!data->button && data->client && !config_focus_under_mouse)
+            event_end_ignore_all_enters(ignore_start);
+        else {
+            struct _ObClient *c;
+
+            /* usually this is sorta redundant, but with a press action
+               that moves windows our from under the cursor, the enter
+               event will come as a GrabNotify which is ignored, so this
+               makes a fake enter event
+            */
+            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);
+            }
+        }
+    }
+}
index 7c69b10..477e4ba 100644 (file)
@@ -90,3 +90,6 @@ gboolean actions_interactive_act_running();
 void actions_interactive_cancel_act();
 
 gboolean actions_interactive_input_event(XEvent *e);
+
+/*! Function for actions to call when they are moving a client around */
+void actions_client_move(ObActionsData *data, gboolean start);
index 71e439e..4bc4814 100644 (file)
@@ -14,4 +14,5 @@ void action_all_startup()
     action_close_startup();
     action_move_startup();
     action_focus_startup();
+    action_raise_startup();
 }
index 2f2cf18..01716e3 100644 (file)
@@ -15,5 +15,6 @@ void action_breakchroot_startup();
 void action_close_startup();
 void action_move_startup();
 void action_focus_startup();
+void action_raise_startup();
 
 #endif
index 9be6741..254850e 100644 (file)
@@ -51,10 +51,9 @@ static gboolean run_func(ObActionsData *data, gpointer options)
         {
             client_activate(data->client, o->here, FALSE, FALSE, TRUE);
         }
-    } else {
-        /* focus action on something other than a client, make keybindings
-           work for this openbox instance, but don't focus any specific client
-        */
+    } else if (data->context == OB_FRAME_CONTEXT_DESKTOP) {
+        /* focus action on the root window. make keybindings work for this
+           openbox instance, but don't focus any specific client */
         focus_nothing();
     }
 
diff --git a/openbox/actions/raise.c b/openbox/actions/raise.c
new file mode 100644 (file)
index 0000000..916c27b
--- /dev/null
@@ -0,0 +1,24 @@
+#include "openbox/actions.h"
+#include "openbox/stacking.h"
+
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_raise_startup()
+{
+    actions_register("Raise",
+                     NULL, NULL,
+                     run_func,
+                     NULL, NULL);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    if (data->client) {
+        actions_client_move(data, TRUE);
+        stacking_raise(CLIENT_AS_WINDOW(data->client));
+        actions_client_move(data, FALSE);
+    }
+
+    return FALSE;
+}