diff --git a/src/client.c b/src/client.c index 6c1c71815e580b0a182cb58e22f035b96537fe22..4ed822266328c03fcf370019c2888e81877a430a 100644 --- a/src/client.c +++ b/src/client.c @@ -74,12 +74,6 @@ PropertyChangeMask /* Useful macros */ -#define ACCEPT_INPUT(wmhints) \ - (!(screen_info->params->focus_hint) || \ - ((!(wmhints) || \ - ((wmhints) && !(wmhints->flags & InputHint)) || \ - ((wmhints) && (wmhints->flags & InputHint) && (wmhints->input))))) - #define START_ICONIC(c) \ ((c->wmhints) && \ (c->wmhints->initial_state == IconicState) && \ @@ -1670,7 +1664,7 @@ clientFrame (DisplayInfo *display_info, Window w, gboolean recapture) c->type_atom = None; FLAG_SET (c->flags, START_ICONIC (c) ? CLIENT_FLAG_ICONIFIED : 0); - FLAG_SET (c->wm_flags, ACCEPT_INPUT (c->wmhints) ? WM_FLAG_INPUT : 0); + FLAG_SET (c->wm_flags, HINTS_ACCEPT_INPUT (c->wmhints) ? WM_FLAG_INPUT : 0); clientGetWMProtocols (c); clientGetMWMHints (c, FALSE); @@ -2259,8 +2253,8 @@ clientHideSingle (Client * c, gboolean change_state) FLAG_SET (c->flags, CLIENT_FLAG_ICONIFIED); setWMState (display_info, c->window, IconicState); } - XUnmapWindow (display_info->dpy, c->frame); XUnmapWindow (display_info->dpy, c->window); + XUnmapWindow (display_info->dpy, c->frame); myDisplayUngrabServer (display_info); clientSetNetState (c); } diff --git a/src/client.h b/src/client.h index 8e8e6afe4a0c744157db6222a7370de065e89f83..56f18dd599c55a359b0545194b2abb017331c84e 100644 --- a/src/client.h +++ b/src/client.h @@ -179,6 +179,10 @@ FLAG_TEST(c->xfwm_flags, XFWM_FLAG_HAS_STICK) && \ !FLAG_TEST(c->flags, CLIENT_FLAG_SKIP_TASKBAR)) +#define HINTS_ACCEPT_INPUT(wmhints) (!(wmhints) || \ + ((wmhints) && !(wmhints->flags & InputHint)) || \ + ((wmhints) && (wmhints->flags & InputHint) && (wmhints->input))) + typedef enum { UNSET = 0, diff --git a/src/events.c b/src/events.c index 5563b0b4f69ae7bf095d1f6f7867fd09a1ca3145..c28735ed81dc7c5f7bad78533c82736171774225 100644 --- a/src/events.c +++ b/src/events.c @@ -1762,6 +1762,7 @@ handlePropertyNotify (DisplayInfo *display_info, XPropertyEvent * ev) frameDraw (c, TRUE, FALSE); } } + FLAG_SET (c->wm_flags, HINTS_ACCEPT_INPUT (c->wmhints) ? WM_FLAG_INPUT : 0); clientUpdateUrgency (c); } else if (ev->atom == display_info->atoms[WM_PROTOCOLS]) diff --git a/src/focus.c b/src/focus.c index 9cbc7255746500c5c4654d853f88b8192ad2f37b..41c48582fa08d7eabd6ac2512ece9392997cb3a8 100644 --- a/src/focus.c +++ b/src/focus.c @@ -72,7 +72,7 @@ clientGetTopMostFocusable (ScreenInfo *screen_info, int layer, Client * exclude) TRACE ("*** stack window \"%s\" (0x%lx), layer %i", c->name, c->window, (int) c->win_layer); - if (c->type & WINDOW_TYPE_DONT_FOCUS) + if ((c->type & WINDOW_TYPE_DONT_FOCUS) || !clientAcceptFocus (c)) { continue; } @@ -385,11 +385,12 @@ clientAcceptFocus (Client * c) { return FALSE; } - if (!FLAG_TEST (c->wm_flags, WM_FLAG_INPUT | WM_FLAG_TAKEFOCUS)) + if ((c->screen_info->params->focus_hint) + && !FLAG_TEST (c->wm_flags, WM_FLAG_INPUT | WM_FLAG_TAKEFOCUS)) { return FALSE; } - + return TRUE; } @@ -513,7 +514,7 @@ clientSetFocus (ScreenInfo *screen_info, Client * c, Time timestamp, unsigned sh TRACE ("SKIP_FOCUS set for client \"%s\" (0x%lx)", c->name, c->window); return; } - if (FLAG_TEST (c->wm_flags, WM_FLAG_INPUT)) + if (FLAG_TEST (c->wm_flags, WM_FLAG_INPUT) || !(screen_info->params->focus_hint)) { pending_focus = c; XSetInputFocus (myScreenGetXDisplay (screen_info), c->window, RevertToPointerRoot, timestamp); diff --git a/src/hints.h b/src/hints.h index 1ef3d14a6001ee8b302cdd3dd1e8d899321ab51a..ef7d431540b0a37a2038eebbbd778bba05a74148 100644 --- a/src/hints.h +++ b/src/hints.h @@ -111,6 +111,10 @@ #define NET_WM_OPAQUE 0xffffffff +/* Convenient macro */ +#define HINTS_ACCEPT_INPUT(wmhints) (!(wmhints) || \ + ((wmhints) && !(wmhints->flags & InputHint)) || \ + ((wmhints) && (wmhints->flags & InputHint) && (wmhints->input))) typedef struct { unsigned long orientation;