summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openbox/action.c10
-rw-r--r--openbox/client.c16
-rw-r--r--openbox/client.h10
-rw-r--r--openbox/event.c2
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;