Fix the Focus/Activate actions to focus windows on other desktops correctly
authorDana Jansens <danakj@orodu.net>
Wed, 9 Dec 2009 18:25:19 +0000 (13:25 -0500)
committerDana Jansens <danakj@orodu.net>
Wed, 9 Dec 2009 18:25:19 +0000 (13:25 -0500)
openbox/actions/focus.c
openbox/client.c
openbox/client.h
openbox/client_list_combined_menu.c
openbox/client_list_menu.c
openbox/event.c

index 0ef9d26..8da8ed5 100644 (file)
@@ -2,6 +2,7 @@
 #include "openbox/event.h"
 #include "openbox/client.h"
 #include "openbox/focus.h"
+#include "openbox/screen.h"
 
 typedef struct {
     gboolean here;
@@ -56,7 +57,7 @@ static gboolean run_func(ObActionsData *data, gpointer options)
              data->context != OB_FRAME_CONTEXT_FRAME))
         {
             actions_client_move(data, TRUE);
-            client_activate(data->client, o->here, FALSE, FALSE, TRUE);
+            client_activate(data->client, TRUE, o->here, FALSE, FALSE, TRUE);
             actions_client_move(data, FALSE);
         }
     } else if (data->context == OB_FRAME_CONTEXT_DESKTOP) {
index c457695..b3f9536 100644 (file)
@@ -3931,7 +3931,8 @@ static void client_present(ObClient *self, gboolean here, gboolean raise,
 }
 
 /* this function exists to map to the net_active_window message in the ewmh */
-void client_activate(ObClient *self, gboolean desktop, gboolean raise,
+void client_activate(ObClient *self, gboolean desktop,
+                     gboolean here, gboolean raise,
                      gboolean unshade, gboolean user)
 {
     if ((user && (desktop ||
@@ -3939,7 +3940,7 @@ void client_activate(ObClient *self, gboolean desktop, gboolean raise,
                   self->desktop == screen_desktop)) ||
         client_can_steal_focus(self, event_curtime, CurrentTime))
     {
-        client_present(self, FALSE, raise, unshade);
+        client_present(self, here, raise, unshade);
     }
     else
         client_hilite(self, TRUE);
index 15ae222..3b1e042 100644 (file)
@@ -577,13 +577,16 @@ gboolean client_focus(ObClient *self);
   when the user deliberately selects a window for use.
   @param desktop If true, and the window is on another desktop, it will still
                  be activated.
+  @param here If true, and the window is on another desktop, it will be moved
+              to the current desktop, otherwise the desktop will switch to
+              where the window is.
   @param raise If true, the client is brought to the front.
   @param unshade If true, the client is unshaded (if it is shaded)
   @param user If true, then a user action is what requested the activation;
               otherwise, it means an application requested it on its own
 */
-void client_activate(ObClient *self, gboolean desktop, gboolean raise,
-                     gboolean unshade, gboolean user);
+void client_activate(ObClient *self, gboolean desktop, gboolean here,
+                     gboolean raise, gboolean unshade, gboolean user);
 
 /*! Bring all of its helper windows to its desktop. These are the utility and
   stuff windows. */
index ad23cd4..593010e 100644 (file)
@@ -114,7 +114,7 @@ static void menu_execute(ObMenuEntry *self, ObMenuFrame *f,
     else {
         ObClient *t = self->data.normal.data;
         if (t) { /* it's set to NULL if its destroyed */
-            client_activate(t, TRUE, TRUE, TRUE, TRUE);
+            client_activate(t, TRUE, FALSE, TRUE, TRUE, TRUE);
             /* if the window is omnipresent then we need to go to its
                desktop */
             if (t->desktop == DESKTOP_ALL)
index ca4534b..2e87259 100644 (file)
@@ -101,7 +101,7 @@ static void desk_menu_execute(ObMenuEntry *self, ObMenuFrame *f,
 {
     ObClient *t = self->data.normal.data;
     if (t) { /* it's set to NULL if its destroyed */
-        client_activate(t, TRUE, TRUE, TRUE, TRUE);
+        client_activate(t, TRUE, FALSE, TRUE, TRUE, TRUE);
         /* if the window is omnipresent then we need to go to its
            desktop */
         if (t->desktop == DESKTOP_ALL)
index e07d6a3..b4bd827 100644 (file)
@@ -1276,7 +1276,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
                                        it can happen now when the window is on
                                        another desktop, but we still don't
                                        want it! */
-        client_activate(client, FALSE, TRUE, TRUE, TRUE);
+        client_activate(client, FALSE, FALSE, TRUE, TRUE, TRUE);
         break;
     case ClientMessage:
         /* validate cuz we query stuff off the client here */
@@ -1332,7 +1332,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
                 ob_debug_type(OB_DEBUG_APP_BUGS,
                               "_NET_ACTIVE_WINDOW message for window %s is "
                               "missing source indication\n", client->title);
-            client_activate(client, FALSE, TRUE, TRUE,
+            client_activate(client, FALSE, FALSE, TRUE, TRUE,
                             (e->xclient.data.l[0] == 0 ||
                              e->xclient.data.l[0] == 2));
         } else if (msgtype == prop_atoms.net_wm_moveresize) {