From fd68dbd1320ff9c52153381e6f2a38d9d4ca7481 Mon Sep 17 00:00:00 2001 From: Simon Steinbeiss Date: Thu, 27 Nov 2014 23:54:33 +0100 Subject: [PATCH] Add support for the _NET_WM_STATE_FOCUSED property (bug #11067) patch by John Lindgren, Gtk3 windows can now be drawn in unfocused style. --- src/display.c | 1 + src/display.h | 1 + src/focus.c | 6 ++++++ src/hints.c | 1 + src/netwm.c | 5 +++++ 5 files changed, 14 insertions(+) diff --git a/src/display.c b/src/display.c index 3c2e7ba..ee719f5 100644 --- a/src/display.c +++ b/src/display.c @@ -126,6 +126,7 @@ myDisplayInitAtoms (DisplayInfo *display_info) "_NET_WM_STATE_ABOVE", "_NET_WM_STATE_BELOW", "_NET_WM_STATE_DEMANDS_ATTENTION", + "_NET_WM_STATE_FOCUSED", "_NET_WM_STATE_FULLSCREEN", "_NET_WM_STATE_HIDDEN", "_NET_WM_STATE_MAXIMIZED_HORZ", diff --git a/src/display.h b/src/display.h index 8797237..2ec8993 100644 --- a/src/display.h +++ b/src/display.h @@ -221,6 +221,7 @@ enum NET_WM_STATE_ABOVE, NET_WM_STATE_BELOW, NET_WM_STATE_DEMANDS_ATTENTION, + NET_WM_STATE_FOCUSED, NET_WM_STATE_FULLSCREEN, NET_WM_STATE_HIDDEN, NET_WM_STATE_MAXIMIZED_HORZ, diff --git a/src/focus.c b/src/focus.c index c1f870c..d0bcd53 100644 --- a/src/focus.c +++ b/src/focus.c @@ -462,6 +462,8 @@ clientFocusNone (ScreenInfo *screen_info, Client *previous, guint32 timestamp) if (previous) { + FLAG_UNSET (previous->flags, XFWM_FLAG_FOCUS); + clientSetNetState (previous); frameQueueDraw (previous, FALSE); if (previous->screen_info != screen_info) { @@ -497,6 +499,8 @@ clientUpdateFocus (ScreenInfo *screen_info, Client * c, unsigned short flags) client_focus = c; if (c2) { + FLAG_UNSET (c2->flags, XFWM_FLAG_FOCUS); + clientSetNetState (c2); clientAdjustFullscreenLayer (c2, FALSE); frameQueueDraw (c2, FALSE); clientUpdateOpacity (c2); @@ -515,6 +519,8 @@ clientUpdateFocus (ScreenInfo *screen_info, Client * c, unsigned short flags) FLAG_UNSET (c->flags, CLIENT_FLAG_DEMANDS_ATTENTION); clientSetNetState (c); } + FLAG_SET (c->flags, XFWM_FLAG_FOCUS); + clientSetNetState (c); clientAdjustFullscreenLayer (c, TRUE); frameQueueDraw (c, FALSE); clientUpdateOpacity (c); diff --git a/src/hints.c b/src/hints.c index 45c243c..8bc5c4b 100644 --- a/src/hints.c +++ b/src/hints.c @@ -389,6 +389,7 @@ setNetSupportedHint (DisplayInfo *display_info, Window root, Window check_win) atoms[i++] = display_info->atoms[NET_WM_STATE_ABOVE]; atoms[i++] = display_info->atoms[NET_WM_STATE_BELOW]; atoms[i++] = display_info->atoms[NET_WM_STATE_DEMANDS_ATTENTION]; + atoms[i++] = display_info->atoms[NET_WM_STATE_FOCUSED]; atoms[i++] = display_info->atoms[NET_WM_STATE_FULLSCREEN]; atoms[i++] = display_info->atoms[NET_WM_STATE_HIDDEN]; atoms[i++] = display_info->atoms[NET_WM_STATE_MAXIMIZED_HORZ]; diff --git a/src/netwm.c b/src/netwm.c index 1352f08..89269a3 100644 --- a/src/netwm.c +++ b/src/netwm.c @@ -130,6 +130,11 @@ clientSetNetState (Client * c) TRACE ("clientSetNetState : demands_attention"); data[i++] = display_info->atoms[NET_WM_STATE_DEMANDS_ATTENTION]; } + if (FLAG_TEST (c->flags, XFWM_FLAG_FOCUS)) + { + TRACE ("clientSetNetState : focused"); + data[i++] = display_info->atoms[NET_WM_STATE_FOCUSED]; + } XChangeProperty (display_info->dpy, c->window, display_info->atoms[NET_WM_STATE], XA_ATOM, 32, PropModeReplace, (unsigned char *) data, i); -- 1.9.1