window: Add individual CSS classes based on edge constraints

The last touch on this patch series is making GtkWindow able to
selectively adjust various UI details based on the different
tiled edges. The main driver here is that we don't want to show
shadows on edges that are constrained.

This patch adds the necessary code to do that, while still
maintaining compatibility with the old ways.

https://bugzilla.gnome.org/show_bug.cgi?id=783669
This commit is contained in:
Georges Basile Stavracas Neto 2017-08-18 20:12:23 -03:00
parent 03204f8cdb
commit b1c4e9afef
4 changed files with 57 additions and 12 deletions

View File

@ -6919,13 +6919,40 @@ update_window_style_classes (GtkWindow *window)
{
GtkWindowPrivate *priv = window->priv;
GtkStyleContext *context;
guint edge_constraints;
context = gtk_widget_get_style_context (GTK_WIDGET (window));
edge_constraints = priv->edge_constraints;
if (priv->tiled)
gtk_style_context_add_class (context, "tiled");
if (!priv->edge_constraints)
{
if (priv->tiled)
gtk_style_context_add_class (context, "tiled");
else
gtk_style_context_remove_class (context, "tiled");
}
else
gtk_style_context_remove_class (context, "tiled");
{
if (edge_constraints & GDK_WINDOW_STATE_TOP_TILED)
gtk_style_context_add_class (context, "tiled-top");
else
gtk_style_context_remove_class (context, "tiled-top");
if (edge_constraints & GDK_WINDOW_STATE_RIGHT_TILED)
gtk_style_context_add_class (context, "tiled-right");
else
gtk_style_context_remove_class (context, "tiled-right");
if (edge_constraints & GDK_WINDOW_STATE_BOTTOM_TILED)
gtk_style_context_add_class (context, "tiled-bottom");
else
gtk_style_context_remove_class (context, "tiled-bottom");
if (edge_constraints & GDK_WINDOW_STATE_LEFT_TILED)
gtk_style_context_add_class (context, "tiled-left");
else
gtk_style_context_remove_class (context, "tiled-left");
}
if (priv->maximized)
gtk_style_context_add_class (context, "maximized");
@ -7191,7 +7218,13 @@ gtk_window_state_event (GtkWidget *widget,
update_edge_constraints (window, event);
if (event->changed_mask & (GDK_WINDOW_STATE_FULLSCREEN | GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_TILED))
if (event->changed_mask & (GDK_WINDOW_STATE_FULLSCREEN |
GDK_WINDOW_STATE_MAXIMIZED |
GDK_WINDOW_STATE_TILED |
GDK_WINDOW_STATE_TOP_TILED |
GDK_WINDOW_STATE_RIGHT_TILED |
GDK_WINDOW_STATE_BOTTOM_TILED |
GDK_WINDOW_STATE_LEFT_TILED))
{
update_window_style_classes (window);
update_window_buttons (window);

View File

@ -1557,6 +1557,10 @@ headerbar {
// squared corners when the window is maximized, tiled, or fullscreen
.tiled &,
.tiled-top &,
.tiled-left &,
.tiled-right &,
.tiled-bottom &,
.maximized &,
.fullscreen & {
&:backdrop, & {
@ -1604,7 +1608,11 @@ headerbar {
}
}
.background:not(.tiled):not(.maximized):not(.solid-csd) .titlebar {
.background:not(.tiled):not(.maximized):not(.solid-csd) .titlebar,
.background:not(.tiled-top):not(.maximized):not(.solid-csd) .titlebar,
.background:not(.tiled-left):not(.maximized):not(.solid-csd) .titlebar,
.background:not(.tiled-right):not(.maximized):not(.solid-csd) .titlebar,
.background:not(.tiled-bottom):not(.maximized):not(.solid-csd) .titlebar {
&:backdrop, & {
border-top-left-radius: 7px;
border-top-right-radius: 7px;
@ -4236,7 +4244,11 @@ decoration {
.maximized &,
.fullscreen &,
.tiled & { border-radius: 0; }
.tiled &,
.tiled-top &,
.tiled-left &,
.tiled-right &,
.tiled-bottom & { border-radius: 0; }
.popup & { box-shadow: none; }

View File

@ -650,7 +650,7 @@ searchbar, .location-bar { border-width: 0 0 1px; padding: 3px; }
.selection-mode.titlebar:not(headerbar) .selection-menu:backdrop .arrow, .selection-mode.titlebar:not(headerbar) .selection-menu .arrow, headerbar.selection-mode .selection-menu:backdrop .arrow, headerbar.selection-mode .selection-menu .arrow { -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); color: rgba(255, 255, 255, 0.5); -gtk-icon-shadow: none; }
.tiled .titlebar:backdrop:not(headerbar), .tiled .titlebar:not(headerbar), .maximized .titlebar:backdrop:not(headerbar), .maximized .titlebar:not(headerbar), .fullscreen .titlebar:backdrop:not(headerbar), .fullscreen .titlebar:not(headerbar), .tiled headerbar:backdrop, .tiled headerbar, .maximized headerbar:backdrop, .maximized headerbar, .fullscreen headerbar:backdrop, .fullscreen headerbar { border-radius: 0; }
.tiled .titlebar:backdrop:not(headerbar), .tiled .titlebar:not(headerbar), .tiled-top .titlebar:backdrop:not(headerbar), .tiled-top .titlebar:not(headerbar), .tiled-left .titlebar:backdrop:not(headerbar), .tiled-left .titlebar:not(headerbar), .tiled-right .titlebar:backdrop:not(headerbar), .tiled-right .titlebar:not(headerbar), .tiled-bottom .titlebar:backdrop:not(headerbar), .tiled-bottom .titlebar:not(headerbar), .maximized .titlebar:backdrop:not(headerbar), .maximized .titlebar:not(headerbar), .fullscreen .titlebar:backdrop:not(headerbar), .fullscreen .titlebar:not(headerbar), .tiled headerbar:backdrop, .tiled headerbar, .tiled-top headerbar:backdrop, .tiled-top headerbar, .tiled-left headerbar:backdrop, .tiled-left headerbar, .tiled-right headerbar:backdrop, .tiled-right headerbar, .tiled-bottom headerbar:backdrop, .tiled-bottom headerbar, .maximized headerbar:backdrop, .maximized headerbar, .fullscreen headerbar:backdrop, .fullscreen headerbar { border-radius: 0; }
.default-decoration.titlebar:not(headerbar), headerbar.default-decoration { min-height: 28px; padding: 4px; }
@ -662,7 +662,7 @@ headerbar entry, headerbar spinbutton, headerbar separator, headerbar button { m
headerbar switch { margin-top: 9px; margin-bottom: 9px; }
.background:not(.tiled):not(.maximized):not(.solid-csd) .titlebar:backdrop, .background:not(.tiled):not(.maximized):not(.solid-csd) .titlebar { border-top-left-radius: 7px; border-top-right-radius: 7px; }
.background:not(.tiled):not(.maximized):not(.solid-csd) .titlebar:backdrop, .background:not(.tiled):not(.maximized):not(.solid-csd) .titlebar, .background:not(.tiled-top):not(.maximized):not(.solid-csd) .titlebar:backdrop, .background:not(.tiled-top):not(.maximized):not(.solid-csd) .titlebar, .background:not(.tiled-left):not(.maximized):not(.solid-csd) .titlebar:backdrop, .background:not(.tiled-left):not(.maximized):not(.solid-csd) .titlebar, .background:not(.tiled-right):not(.maximized):not(.solid-csd) .titlebar:backdrop, .background:not(.tiled-right):not(.maximized):not(.solid-csd) .titlebar, .background:not(.tiled-bottom):not(.maximized):not(.solid-csd) .titlebar:backdrop, .background:not(.tiled-bottom):not(.maximized):not(.solid-csd) .titlebar { border-top-left-radius: 7px; border-top-right-radius: 7px; }
window:not(.tiled):not(.maximized):not(.fullscreen):not(.solid-csd) separator:first-child + headerbar:backdrop, window:not(.tiled):not(.maximized):not(.fullscreen):not(.solid-csd) separator:first-child + headerbar, window:not(.tiled):not(.maximized):not(.fullscreen):not(.solid-csd) headerbar:first-child:backdrop, window:not(.tiled):not(.maximized):not(.fullscreen):not(.solid-csd) headerbar:first-child { border-top-left-radius: 7px; }
@ -1828,7 +1828,7 @@ decoration { border-radius: 7px 7px 0 0; border-width: 0px; box-shadow: 0 3px 9p
decoration:backdrop { box-shadow: 0 3px 9px 1px transparent, 0 2px 6px 2px rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(27, 31, 32, 0.9); transition: 200ms ease-out; }
.maximized decoration, .fullscreen decoration, .tiled decoration { border-radius: 0; }
.maximized decoration, .fullscreen decoration, .tiled decoration, .tiled-top decoration, .tiled-left decoration, .tiled-right decoration, .tiled-bottom decoration { border-radius: 0; }
.popup decoration { box-shadow: none; }

View File

@ -658,7 +658,7 @@ searchbar, .location-bar { border-width: 0 0 1px; padding: 3px; }
.selection-mode.titlebar:not(headerbar) .selection-menu:backdrop .arrow, .selection-mode.titlebar:not(headerbar) .selection-menu .arrow, headerbar.selection-mode .selection-menu:backdrop .arrow, headerbar.selection-mode .selection-menu .arrow { -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); color: rgba(255, 255, 255, 0.5); -gtk-icon-shadow: none; }
.tiled .titlebar:backdrop:not(headerbar), .tiled .titlebar:not(headerbar), .maximized .titlebar:backdrop:not(headerbar), .maximized .titlebar:not(headerbar), .fullscreen .titlebar:backdrop:not(headerbar), .fullscreen .titlebar:not(headerbar), .tiled headerbar:backdrop, .tiled headerbar, .maximized headerbar:backdrop, .maximized headerbar, .fullscreen headerbar:backdrop, .fullscreen headerbar { border-radius: 0; }
.tiled .titlebar:backdrop:not(headerbar), .tiled .titlebar:not(headerbar), .tiled-top .titlebar:backdrop:not(headerbar), .tiled-top .titlebar:not(headerbar), .tiled-left .titlebar:backdrop:not(headerbar), .tiled-left .titlebar:not(headerbar), .tiled-right .titlebar:backdrop:not(headerbar), .tiled-right .titlebar:not(headerbar), .tiled-bottom .titlebar:backdrop:not(headerbar), .tiled-bottom .titlebar:not(headerbar), .maximized .titlebar:backdrop:not(headerbar), .maximized .titlebar:not(headerbar), .fullscreen .titlebar:backdrop:not(headerbar), .fullscreen .titlebar:not(headerbar), .tiled headerbar:backdrop, .tiled headerbar, .tiled-top headerbar:backdrop, .tiled-top headerbar, .tiled-left headerbar:backdrop, .tiled-left headerbar, .tiled-right headerbar:backdrop, .tiled-right headerbar, .tiled-bottom headerbar:backdrop, .tiled-bottom headerbar, .maximized headerbar:backdrop, .maximized headerbar, .fullscreen headerbar:backdrop, .fullscreen headerbar { border-radius: 0; }
.default-decoration.titlebar:not(headerbar), headerbar.default-decoration { min-height: 28px; padding: 4px; }
@ -670,7 +670,7 @@ headerbar entry, headerbar spinbutton, headerbar separator, headerbar button { m
headerbar switch { margin-top: 9px; margin-bottom: 9px; }
.background:not(.tiled):not(.maximized):not(.solid-csd) .titlebar:backdrop, .background:not(.tiled):not(.maximized):not(.solid-csd) .titlebar { border-top-left-radius: 7px; border-top-right-radius: 7px; }
.background:not(.tiled):not(.maximized):not(.solid-csd) .titlebar:backdrop, .background:not(.tiled):not(.maximized):not(.solid-csd) .titlebar, .background:not(.tiled-top):not(.maximized):not(.solid-csd) .titlebar:backdrop, .background:not(.tiled-top):not(.maximized):not(.solid-csd) .titlebar, .background:not(.tiled-left):not(.maximized):not(.solid-csd) .titlebar:backdrop, .background:not(.tiled-left):not(.maximized):not(.solid-csd) .titlebar, .background:not(.tiled-right):not(.maximized):not(.solid-csd) .titlebar:backdrop, .background:not(.tiled-right):not(.maximized):not(.solid-csd) .titlebar, .background:not(.tiled-bottom):not(.maximized):not(.solid-csd) .titlebar:backdrop, .background:not(.tiled-bottom):not(.maximized):not(.solid-csd) .titlebar { border-top-left-radius: 7px; border-top-right-radius: 7px; }
window:not(.tiled):not(.maximized):not(.fullscreen):not(.solid-csd) separator:first-child + headerbar:backdrop, window:not(.tiled):not(.maximized):not(.fullscreen):not(.solid-csd) separator:first-child + headerbar, window:not(.tiled):not(.maximized):not(.fullscreen):not(.solid-csd) headerbar:first-child:backdrop, window:not(.tiled):not(.maximized):not(.fullscreen):not(.solid-csd) headerbar:first-child { border-top-left-radius: 7px; }
@ -1848,7 +1848,7 @@ decoration { border-radius: 7px 7px 0 0; border-width: 0px; box-shadow: 0 3px 9p
decoration:backdrop { box-shadow: 0 3px 9px 1px transparent, 0 2px 6px 2px rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(0, 0, 0, 0.18); transition: 200ms ease-out; }
.maximized decoration, .fullscreen decoration, .tiled decoration { border-radius: 0; }
.maximized decoration, .fullscreen decoration, .tiled decoration, .tiled-top decoration, .tiled-left decoration, .tiled-right decoration, .tiled-bottom decoration { border-radius: 0; }
.popup decoration { box-shadow: none; }