From b0f43a115909a810bca9bbfa664851703bfd43e1 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Tue, 8 May 2007 22:29:39 +0000 Subject: [PATCH] don't focus splash screens and toolbars and menus when you click on them. or enter them. --- openbox/action.c | 10 ++-------- openbox/client.c | 16 ++++++++++++++++ openbox/client.h | 10 ++++++++++ openbox/event.c | 2 +- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/openbox/action.c b/openbox/action.c index f8b2b7b3..4ff6bdb9 100644 --- a/openbox/action.c +++ b/openbox/action.c @@ -1199,10 +1199,7 @@ void action_execute(union ActionData *data) void action_activate(union ActionData *data) { if (data->client.any.c) { - /* similar to the openbox dock for dockapps, don't let user actions - give focus to 3rd-party docks (panels) either (unless they ask for - it themselves). */ - if (data->client.any.c->type != OB_CLIENT_TYPE_DOCK) { + if (!data->any.button || client_mouse_focusable(data->client.any.c)) { /* if using focus_delay, stop the timer now so that focus doesn't go moving on us */ event_halt_focus_delay(); @@ -1220,10 +1217,7 @@ void action_activate(union ActionData *data) void action_focus(union ActionData *data) { if (data->client.any.c) { - /* similar to the openbox dock for dockapps, don't let user actions - give focus to 3rd-party docks (panels) either (unless they ask for - it themselves). */ - if (data->client.any.c->type != OB_CLIENT_TYPE_DOCK) { + if (!data->any.button || client_mouse_focusable(data->client.any.c)) { /* if using focus_delay, stop the timer now so that focus doesn't go moving on us */ event_halt_focus_delay(); diff --git a/openbox/client.c b/openbox/client.c index e2b2636b..21a0accf 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -2394,6 +2394,22 @@ gboolean client_helper(ObClient *self) self->type == OB_CLIENT_TYPE_TOOLBAR); } +gboolean client_mouse_focusable(ObClient *self) +{ + return !(self->type == OB_CLIENT_TYPE_MENU || + self->type == OB_CLIENT_TYPE_TOOLBAR || + self->type == OB_CLIENT_TYPE_SPLASH || + self->type == OB_CLIENT_TYPE_DOCK); +} + +gboolean client_enter_focusable(ObClient *self) +{ + /* you can focus desktops but it shouldn't on enter */ + return (client_mouse_focusable(self) && + self->type != OB_CLIENT_TYPE_DESKTOP); +} + + static void client_apply_startup_state(ObClient *self, gint x, gint y) { gboolean pos = FALSE; /* has the window's position been configured? */ diff --git a/openbox/client.h b/openbox/client.h index 5fb26262..5c5fdb90 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -338,6 +338,16 @@ gboolean client_normal(ObClient *self); (utilty, menu, etc) */ gboolean client_helper(ObClient *self); +/*! Return if the client is a type which should be given focus from mouse + actions like button presses. This doesn't count for focus cycling, different + rules apply to that. */ +gboolean client_mouse_focusable(ObClient *self); + +/*! Return if the client is a type which should be given focus from the + mouse entering the window. This doesn't count for focus cycling, different + rules apply to that. */ +gboolean client_enter_focusable(ObClient *self); + /* Returns if the window is focused */ gboolean client_focused(ObClient *self); diff --git a/openbox/event.c b/openbox/event.c index 44ae7b0a..a4090b0c 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -676,7 +676,7 @@ void event_enter_client(ObClient *client) { g_assert(config_focus_follow); - if (client_normal(client) && client_can_focus(client)) { + if (client_enter_focusable(client) && client_can_focus(client)) { if (config_focus_delay) { ObFocusDelayData *data; -- 2.39.2