]> Dogcows Code - chaz/openbox/blobdiff - openbox/actions.c
child/parents don't get included in tests for occluding/occluded windows, because...
[chaz/openbox] / openbox / actions.c
index 9a5d193c4a2b33200416867eff81d769c0d224e2..5f146b7eb890f26c8b743ed1528b721d807e4888 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"
 
@@ -190,28 +194,28 @@ void actions_act_unref(ObActionsAct *act)
 
 static void actions_setup_data(ObActionsData *data,
                                ObUserAction uact,
-                               Time time,
                                guint state,
                                gint x,
                                gint y,
+                               gint button,
                                ObFrameContext con,
                                struct _ObClient *client)
 {
     data->uact = uact;
-    data->time = time;
     data->state = state;
     data->x = x;
     data->y = y;
+    data->button = button;
     data->context = con;
     data->client = client;
 }
 
 void actions_run_acts(GSList *acts,
                       ObUserAction uact,
-                      Time time,
                       guint state,
                       gint x,
                       gint y,
+                      gint button,
                       ObFrameContext con,
                       struct _ObClient *client)
 {
@@ -230,12 +234,14 @@ void actions_run_acts(GSList *acts,
         ObActionsAct *act = it->data;
         gboolean ok = TRUE;
 
-        actions_setup_data(&data, uact, time, state, x, y, con, client);
+        actions_setup_data(&data, uact, state, x, y, button, con, client);
 
-        if (actions_act_is_interactive(act) &&
-            (!interactive_act || interactive_act->def != act->def))
-        {
-            ok = actions_interactive_begin_act(act, state);
+        if (!interactive_act || interactive_act->def != act->def) {
+            /* cancel the old one */
+            if (interactive_act)
+                actions_interactive_cancel_act();
+            if (actions_act_is_interactive(act))
+                ok = actions_interactive_begin_act(act, state);
         }
 
         /* fire the action's run function with this data */
@@ -268,10 +274,6 @@ void actions_interactive_cancel_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);
@@ -307,3 +309,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);
+            }
+        }
+    }
+}
This page took 0.022195 seconds and 4 git commands to generate.