diff --git a/src/client.c b/src/client.c index a0a836e..b92c264 100644 --- a/src/client.c +++ b/src/client.c @@ -1732,6 +1732,7 @@ clientFrame (DisplayInfo *display_info, Window w, gboolean recapture) clientGetInitialNetWmDesktop (c); /* workarea will be updated when shown, no need to worry here */ clientGetNetStruts (c); + clientGetExtra (c); /* Once we know the type of window, we can initialize window position */ if (!FLAG_TEST (c->xfwm_flags, XFWM_FLAG_SESSION_MANAGED)) diff --git a/src/client.h b/src/client.h index e8bc4e3..b5e54df 100644 --- a/src/client.h +++ b/src/client.h @@ -161,6 +161,7 @@ #define CLIENT_FLAG_DEMANDS_ATTENTION (1L<<17) #define CLIENT_FLAG_HAS_SHAPE (1L<<18) #define CLIENT_FLAG_FULLSCREN_MONITORS (1L<<19) +#define CLIENT_FLAG_TITLELESS_MAXIMIZE (1L<<20) #define WM_FLAG_DELETE (1L<<0) #define WM_FLAG_INPUT (1L<<1) diff --git a/src/display.c b/src/display.c index 00318d5..4f847f4 100644 --- a/src/display.c +++ b/src/display.c @@ -169,7 +169,8 @@ myDisplayInitAtoms (DisplayInfo *display_info) "XFWM4_COMPOSITING_MANAGER", "XFWM4_TIMESTAMP_PROP", "_XROOTPMAP_ID", - "_XSETROOT_ID" + "_XSETROOT_ID", + "_GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED" }; g_assert (ATOM_COUNT == G_N_ELEMENTS (atom_names)); diff --git a/src/display.h b/src/display.h index 8797237..a297cf2 100644 --- a/src/display.h +++ b/src/display.h @@ -265,6 +265,7 @@ enum XFWM4_TIMESTAMP_PROP, XROOTPMAP, XSETROOT, + _GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED, ATOM_COUNT }; diff --git a/src/events.c b/src/events.c index 4b49171..044cd11 100644 --- a/src/events.c +++ b/src/events.c @@ -1921,6 +1921,11 @@ handlePropertyNotify (DisplayInfo *display_info, XPropertyEvent * ev) TRACE ("Window 0x%lx has NET_WM_SYNC_REQUEST_COUNTER set to 0x%lx", c->window, c->xsync_counter); } #endif /* HAVE_XSYNC */ + else if (ev->atom == display_info->atoms[_GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED]) + { + TRACE ("Client \"%s\" Window 0x%lx has received GTK CRAP\n", c->name, c->window); + clientUpdateExtra (c); + } return status; } diff --git a/src/frame.c b/src/frame.c index 515d331..23c01cd 100644 --- a/src/frame.c +++ b/src/frame.c @@ -125,7 +125,8 @@ frameTop (Client * c) if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER) && !(FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN) || (FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED_VERT) - && c->screen_info->params->titleless_maximize + && (c->screen_info->params->titleless_maximize + || FLAG_TEST (c->flags, CLIENT_FLAG_TITLELESS_MAXIMIZE)) && c->screen_info->params->borderless_maximize ) ) @@ -148,7 +149,8 @@ frameBottom (Client * c) && (c->screen_info->params->borderless_maximize)) && !(FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED_VERT) && (c->screen_info->params->borderless_maximize) - && (c->screen_info->params->titleless_maximize)) + && (c->screen_info->params->titleless_maximize + || FLAG_TEST (c->flags, CLIENT_FLAG_TITLELESS_MAXIMIZE))) ) { return c->screen_info->sides[SIDE_BOTTOM][ACTIVE].height; @@ -219,7 +221,8 @@ frameHeight (Client * c) && !( FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED_VERT) && (c->screen_info->params->borderless_maximize) - && (c->screen_info->params->titleless_maximize) + && (c->screen_info->params->titleless_maximize + || FLAG_TEST (c->flags, CLIENT_FLAG_TITLELESS_MAXIMIZE)) )) { @@ -977,11 +980,14 @@ frameDrawWin (Client * c) && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN) && !(FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) && (c->screen_info->params->borderless_maximize) - && (c->screen_info->params->titleless_maximize))) + && (c->screen_info->params->titleless_maximize + || FLAG_TEST (c->flags, CLIENT_FLAG_TITLELESS_MAXIMIZE)) + )) { vert_only = FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED_VERT) - && (c->screen_info->params->titleless_maximize) - && (c->screen_info->params->borderless_maximize); //only vertical decorations shown (titleless vertical maximize) + && (c->screen_info->params->borderless_maximize) //only vertical decorations shown (titleless vertical maximize) + && (c->screen_info->params->titleless_maximize + || FLAG_TEST (c->flags, CLIENT_FLAG_TITLELESS_MAXIMIZE)); if (vert_only) { diff --git a/src/netwm.c b/src/netwm.c index 1352f08..9e3647c 100644 --- a/src/netwm.c +++ b/src/netwm.c @@ -136,6 +136,44 @@ clientSetNetState (Client * c) } void +clientGetExtra (Client *c) +{ + long val; + DisplayInfo *display_info; + + display_info = c->screen_info->display_info; + + getHint (display_info, c->window, _GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED, &val); + if (val) + FLAG_SET (c->flags, CLIENT_FLAG_TITLELESS_MAXIMIZE); +} + +void +clientUpdateExtra (Client *c) +{ + long val; + unsigned long maximization_flags = 0L; + DisplayInfo *display_info; + + display_info = c->screen_info->display_info; + + getHint (display_info, c->window, _GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED, &val); + if (val) + FLAG_SET (c->flags, CLIENT_FLAG_TITLELESS_MAXIMIZE); + else + FLAG_UNSET (c->flags, CLIENT_FLAG_TITLELESS_MAXIMIZE); + + if (FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED)) + { + maximization_flags = c->flags & CLIENT_FLAG_MAXIMIZED; + + /* Force an update by clearing the internal flags */ + FLAG_UNSET (c->flags, CLIENT_FLAG_MAXIMIZED_HORIZ | CLIENT_FLAG_MAXIMIZED_VERT); + clientToggleMaximized (c, maximization_flags, TRUE); + } +} + +void clientGetNetState (Client * c) { ScreenInfo *screen_info;