Fix the Focus/Activate actions to focus windows on other desktops correctly

This commit is contained in:
Dana Jansens 2009-12-09 13:25:19 -05:00
parent 9f74f1e244
commit 324ba15ebc
6 changed files with 14 additions and 9 deletions

View file

@ -2,6 +2,7 @@
#include "openbox/event.h" #include "openbox/event.h"
#include "openbox/client.h" #include "openbox/client.h"
#include "openbox/focus.h" #include "openbox/focus.h"
#include "openbox/screen.h"
typedef struct { typedef struct {
gboolean here; gboolean here;
@ -56,7 +57,7 @@ static gboolean run_func(ObActionsData *data, gpointer options)
data->context != OB_FRAME_CONTEXT_FRAME)) data->context != OB_FRAME_CONTEXT_FRAME))
{ {
actions_client_move(data, TRUE); 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); actions_client_move(data, FALSE);
} }
} else if (data->context == OB_FRAME_CONTEXT_DESKTOP) { } else if (data->context == OB_FRAME_CONTEXT_DESKTOP) {

View 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 */ /* 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) gboolean unshade, gboolean user)
{ {
if ((user && (desktop || if ((user && (desktop ||
@ -3939,7 +3940,7 @@ void client_activate(ObClient *self, gboolean desktop, gboolean raise,
self->desktop == screen_desktop)) || self->desktop == screen_desktop)) ||
client_can_steal_focus(self, event_curtime, CurrentTime)) client_can_steal_focus(self, event_curtime, CurrentTime))
{ {
client_present(self, FALSE, raise, unshade); client_present(self, here, raise, unshade);
} }
else else
client_hilite(self, TRUE); client_hilite(self, TRUE);

View file

@ -577,13 +577,16 @@ gboolean client_focus(ObClient *self);
when the user deliberately selects a window for use. when the user deliberately selects a window for use.
@param desktop If true, and the window is on another desktop, it will still @param desktop If true, and the window is on another desktop, it will still
be activated. 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 raise If true, the client is brought to the front.
@param unshade If true, the client is unshaded (if it is shaded) @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; @param user If true, then a user action is what requested the activation;
otherwise, it means an application requested it on its own otherwise, it means an application requested it on its own
*/ */
void client_activate(ObClient *self, gboolean desktop, gboolean raise, void client_activate(ObClient *self, gboolean desktop, gboolean here,
gboolean unshade, gboolean user); gboolean raise, gboolean unshade, gboolean user);
/*! Bring all of its helper windows to its desktop. These are the utility and /*! Bring all of its helper windows to its desktop. These are the utility and
stuff windows. */ stuff windows. */

View file

@ -114,7 +114,7 @@ static void menu_execute(ObMenuEntry *self, ObMenuFrame *f,
else { else {
ObClient *t = self->data.normal.data; ObClient *t = self->data.normal.data;
if (t) { /* it's set to NULL if its destroyed */ 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 /* if the window is omnipresent then we need to go to its
desktop */ desktop */
if (t->desktop == DESKTOP_ALL) if (t->desktop == DESKTOP_ALL)

View file

@ -101,7 +101,7 @@ static void desk_menu_execute(ObMenuEntry *self, ObMenuFrame *f,
{ {
ObClient *t = self->data.normal.data; ObClient *t = self->data.normal.data;
if (t) { /* it's set to NULL if its destroyed */ 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 /* if the window is omnipresent then we need to go to its
desktop */ desktop */
if (t->desktop == DESKTOP_ALL) if (t->desktop == DESKTOP_ALL)

View file

@ -1276,7 +1276,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
it can happen now when the window is on it can happen now when the window is on
another desktop, but we still don't another desktop, but we still don't
want it! */ want it! */
client_activate(client, FALSE, TRUE, TRUE, TRUE); client_activate(client, FALSE, FALSE, TRUE, TRUE, TRUE);
break; break;
case ClientMessage: case ClientMessage:
/* validate cuz we query stuff off the client here */ /* 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, ob_debug_type(OB_DEBUG_APP_BUGS,
"_NET_ACTIVE_WINDOW message for window %s is " "_NET_ACTIVE_WINDOW message for window %s is "
"missing source indication\n", client->title); "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] == 0 ||
e->xclient.data.l[0] == 2)); e->xclient.data.l[0] == 2));
} else if (msgtype == prop_atoms.net_wm_moveresize) { } else if (msgtype == prop_atoms.net_wm_moveresize) {