all repos — openbox @ d9e08487dffd010f4434d24b98a3a571b2e5a600

openbox fork - make it a bit more like ryudo

when ending actions which can move windows, and we were using the mouse, instead of doing a focus fallback, which instantly focuses, and doesn't raise, we do an event_enter_client which simulates the act of entering the window with the pointer
Dana Jansens danakj@orodu.net
commit

d9e08487dffd010f4434d24b98a3a571b2e5a600

parent

6538a5ccb2199d518b854baa6d790387b448484e

3 files changed, 123 insertions(+), 108 deletions(-)

jump to
M openbox/action.copenbox/action.c

@@ -33,15 +33,27 @@ #include "config.h"

#include <glib.h> -#define ACT_START(d) \ - ((d->any.context != OB_FRAME_CONTEXT_CLIENT && config_focus_follow) ? \ - grab_pointer(TRUE, OB_CURSOR_NONE), 0 : 0) +inline void client_action_start(union ActionData *data) +{ + if (config_focus_follow) + if (data->any.context != OB_FRAME_CONTEXT_CLIENT && !data->any.button) + grab_pointer(TRUE, OB_CURSOR_NONE); +} -#define ACT_END(d) \ - ((d->any.context != OB_FRAME_CONTEXT_CLIENT && config_focus_follow) ? \ - grab_pointer(FALSE, OB_CURSOR_NONE), \ - (d->any.button ? focus_fallback(OB_FOCUS_FALLBACK_NOFOCUS), 1 : 0) : \ - 0) +inline void client_action_end(union ActionData *data) +{ + if (config_focus_follow) + if (data->any.context != OB_FRAME_CONTEXT_CLIENT) { + if (!data->any.button) { + grab_pointer(FALSE, OB_CURSOR_NONE); + } else { + ObClient *c; + + if ((c = client_under_pointer())) + event_enter_client(c); + } + } +} typedef struct ActionString { const gchar *name;

@@ -916,22 +928,22 @@ }

} if (raise) { - ACT_START(data); + client_action_start(data); stacking_raise(CLIENT_AS_WINDOW(c)); - ACT_END(data); + client_action_end(data); } else { - ACT_START(data); + client_action_start(data); stacking_lower(CLIENT_AS_WINDOW(c)); - ACT_END(data); + client_action_end(data); } } void action_raise(union ActionData *data) { if (data->client.any.c) { - ACT_START(data); + client_action_start(data); stacking_raise(CLIENT_AS_WINDOW(data->client.any.c)); - ACT_END(data); + client_action_end(data); } }

@@ -939,13 +951,13 @@ void action_unshaderaise(union ActionData *data)

{ if (data->client.any.c) { if (data->client.any.c->shaded) { - ACT_START(data); + client_action_start(data); client_shade(data->client.any.c, FALSE); - ACT_END(data); + client_action_end(data); } else { - ACT_START(data); + client_action_start(data); stacking_raise(CLIENT_AS_WINDOW(data->client.any.c)); - ACT_END(data); + client_action_end(data); } } }

@@ -956,9 +968,9 @@ if (data->client.any.c) {

if (data->client.any.c->shaded) stacking_lower(CLIENT_AS_WINDOW(data->client.any.c)); else { - ACT_START(data); + client_action_start(data); client_shade(data->client.any.c, TRUE); - ACT_END(data); + client_action_end(data); } } }

@@ -966,9 +978,9 @@

void action_lower(union ActionData *data) { if (data->client.any.c) { - ACT_START(data); + client_action_start(data); stacking_lower(CLIENT_AS_WINDOW(data->client.any.c)); - ACT_END(data); + client_action_end(data); } }

@@ -987,27 +999,27 @@

void action_shade(union ActionData *data) { if (data->client.any.c) { - ACT_START(data); + client_action_start(data); client_shade(data->client.any.c, TRUE); - ACT_END(data); + client_action_end(data); } } void action_unshade(union ActionData *data) { if (data->client.any.c) { - ACT_START(data); + client_action_start(data); client_shade(data->client.any.c, FALSE); - ACT_END(data); + client_action_end(data); } } void action_toggle_shade(union ActionData *data) { if (data->client.any.c) { - ACT_START(data); + client_action_start(data); client_shade(data->client.any.c, !data->client.any.c->shaded); - ACT_END(data); + client_action_end(data); } }

@@ -1023,9 +1035,9 @@ void action_move_relative_horz(union ActionData *data)

{ ObClient *c = data->relative.any.c; if (c) { - ACT_START(data); + client_action_start(data); client_move(c, c->area.x + data->relative.delta, c->area.y); - ACT_END(data); + client_action_end(data); } }

@@ -1033,9 +1045,9 @@ void action_move_relative_vert(union ActionData *data)

{ ObClient *c = data->relative.any.c; if (c) { - ACT_START(data); + client_action_start(data); client_move(c, c->area.x, c->area.y + data->relative.delta); - ACT_END(data); + client_action_end(data); } }

@@ -1043,11 +1055,11 @@ void action_resize_relative_horz(union ActionData *data)

{ ObClient *c = data->relative.any.c; if (c) { - ACT_START(data); + client_action_start(data); client_resize(c, c->area.width + data->relative.delta * c->size_inc.width, c->area.height); - ACT_END(data); + client_action_end(data); } }

@@ -1055,96 +1067,96 @@ void action_resize_relative_vert(union ActionData *data)

{ ObClient *c = data->relative.any.c; if (c && !c->shaded) { - ACT_START(data); + client_action_start(data); client_resize(c, c->area.width, c->area.height + data->relative.delta * c->size_inc.height); - ACT_END(data); + client_action_end(data); } } void action_maximize_full(union ActionData *data) { if (data->client.any.c) { - ACT_START(data); + client_action_start(data); client_maximize(data->client.any.c, TRUE, 0, TRUE); - ACT_END(data); + client_action_end(data); } } void action_unmaximize_full(union ActionData *data) { if (data->client.any.c) { - ACT_START(data); + client_action_start(data); client_maximize(data->client.any.c, FALSE, 0, TRUE); - ACT_END(data); + client_action_end(data); } } void action_toggle_maximize_full(union ActionData *data) { if (data->client.any.c) { - ACT_START(data); + client_action_start(data); client_maximize(data->client.any.c, !(data->client.any.c->max_horz || data->client.any.c->max_vert), 0, TRUE); - ACT_END(data); + client_action_end(data); } } void action_maximize_horz(union ActionData *data) { if (data->client.any.c) { - ACT_START(data); + client_action_start(data); client_maximize(data->client.any.c, TRUE, 1, TRUE); - ACT_END(data); + client_action_end(data); } } void action_unmaximize_horz(union ActionData *data) { if (data->client.any.c) { - ACT_START(data); + client_action_start(data); client_maximize(data->client.any.c, FALSE, 1, TRUE); - ACT_END(data); + client_action_end(data); } } void action_toggle_maximize_horz(union ActionData *data) { if (data->client.any.c) { - ACT_START(data); + client_action_start(data); client_maximize(data->client.any.c, !data->client.any.c->max_horz, 1, TRUE); - ACT_END(data); + client_action_end(data); } } void action_maximize_vert(union ActionData *data) { if (data->client.any.c) { - ACT_START(data); + client_action_start(data); client_maximize(data->client.any.c, TRUE, 2, TRUE); - ACT_END(data); + client_action_end(data); } } void action_unmaximize_vert(union ActionData *data) { if (data->client.any.c) { - ACT_START(data); + client_action_start(data); client_maximize(data->client.any.c, FALSE, 2, TRUE); - ACT_END(data); + client_action_end(data); } } void action_toggle_maximize_vert(union ActionData *data) { if (data->client.any.c) { - ACT_START(data); + client_action_start(data); client_maximize(data->client.any.c, !data->client.any.c->max_vert, 2, TRUE); - ACT_END(data); + client_action_end(data); } }

@@ -1209,10 +1221,10 @@ {

ObClient *c = data->client.any.c; if (c) { - ACT_START(data); + client_action_start(data); c->decorate = !c->decorate; client_setup_decor_and_functions(c); - ACT_END(data); + client_action_end(data); } }

@@ -1327,9 +1339,9 @@ default:

g_assert_not_reached(); } frame_frame_gravity(c->frame, &x, &y); - ACT_START(data); + client_action_start(data); client_move(c, x, y); - ACT_END(data); + client_action_end(data); }

@@ -1393,9 +1405,9 @@ }

frame_frame_gravity(c->frame, &x, &y); width -= c->frame->size.left + c->frame->size.right; height -= c->frame->size.top + c->frame->size.bottom; - ACT_START(data); + client_action_start(data); client_move_resize(c, x, y, width, height); - ACT_END(data); + client_action_end(data); } void action_send_to_layer(union ActionData *data)

@@ -1409,12 +1421,12 @@ {

ObClient *c = data->layer.any.c; if (c) { - ACT_START(data); + client_action_start(data); if (data->layer.layer < 0) client_set_layer(c, c->below ? 0 : -1); else if (data->layer.layer > 0) client_set_layer(c, c->above ? 0 : 1); - ACT_END(data); + client_action_end(data); } }
M openbox/event.copenbox/event.c

@@ -97,7 +97,6 @@ };

static int mask_table_size; static guint ignore_enter_focus = 0; -static ObClient *focus_delay_client; static gboolean menu_can_hide;

@@ -602,6 +601,25 @@ for (it = group->members; it; it = g_slist_next(it))

event_handle_client(it->data, e); } +void event_enter_client(ObClient *client) +{ + g_assert(config_focus_follow); + + if (client_normal(client) && client_can_focus(client)) { + if (config_focus_delay) { + ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func); + ob_main_loop_timeout_add(ob_main_loop, + config_focus_delay, + focus_delay_func, + client, NULL); + } else { + client_focus(client); + if (config_focus_raise) + stacking_raise(CLIENT_AS_WINDOW(client)); + } + } +} + static void event_handle_client(ObClient *client, XEvent *e) { XEvent ce;

@@ -694,12 +712,7 @@ client->frame->close_hover = FALSE;

frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_FRAME: - if (client == focus_delay_client) { - ob_main_loop_timeout_remove_data(ob_main_loop, - focus_delay_func, - focus_delay_client); - focus_delay_client = NULL; - } + break; default: break; }

@@ -736,39 +749,26 @@ client->frame->close_hover = TRUE;

frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_FRAME: - if (!nofocus && config_focus_follow && - client_normal(client) && client_can_focus(client)) { - if (e->xcrossing.mode == NotifyGrab || - e->xcrossing.detail == NotifyInferior || - e->xcrossing.mode == NotifyUngrab) - { + if (e->xcrossing.mode == NotifyGrab || + e->xcrossing.detail == NotifyInferior || + e->xcrossing.mode == NotifyUngrab) + { #ifdef DEBUG_FOCUS - ob_debug("%sNotify mode %d detail %d on %lx IGNORED\n", - (e->type == EnterNotify ? "Enter" : "Leave"), - e->xcrossing.mode, - e->xcrossing.detail, client?client->window:0); + ob_debug("%sNotify mode %d detail %d on %lx IGNORED\n", + (e->type == EnterNotify ? "Enter" : "Leave"), + e->xcrossing.mode, + e->xcrossing.detail, client?client->window:0); #endif - } else { + } else { #ifdef DEBUG_FOCUS - ob_debug("%sNotify mode %d detail %d on %lx, " - "focusing window\n", - (e->type == EnterNotify ? "Enter" : "Leave"), - e->xcrossing.mode, - e->xcrossing.detail, client?client->window:0); + ob_debug("%sNotify mode %d detail %d on %lx, " + "focusing window\n", + (e->type == EnterNotify ? "Enter" : "Leave"), + e->xcrossing.mode, + e->xcrossing.detail, client?client->window:0); #endif - if (config_focus_delay) { - ob_main_loop_timeout_add(ob_main_loop, - config_focus_delay, - focus_delay_func, - client, NULL); - focus_delay_client = client; - } else { - client_focus(client); - if (config_focus_raise) - stacking_raise - (CLIENT_AS_WINDOW(focus_delay_client)); - } - } + if (!nofocus && config_focus_follow) + event_enter_client(client); } break; default:

@@ -1252,22 +1252,19 @@ }

static gboolean focus_delay_func(gpointer data) { - if (data == focus_delay_client) { - client_focus(focus_delay_client); - if (config_focus_raise) - stacking_raise(CLIENT_AS_WINDOW(focus_delay_client)); - } + ObClient *c = data; + + client_focus(c); + if (config_focus_raise) + stacking_raise(CLIENT_AS_WINDOW(c)); return FALSE; /* no repeat */ } static void focus_delay_client_dest(gpointer data) { ObClient *c = data; - if (c == focus_delay_client) { - ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, - focus_delay_client); - focus_delay_client = NULL; - } + + ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, c); } void event_ignore_enter_focus(guint num)
M openbox/event.hopenbox/event.h

@@ -22,6 +22,8 @@

#include <X11/Xlib.h> #include <glib.h> +struct _ObClient; + /*! Time at which the last event with a timestamp occured. */ extern Time event_lasttime;

@@ -36,5 +38,9 @@

/*! Request that a number of EnterNotify events not be used for distributing focus */ void event_ignore_enter_focus(guint num); + +/*! Make as if the mouse just entered the client, use only when using focus + follows mouse */ +void event_enter_client(struct _ObClient *client); #endif