From 21326dca12f7a51d3b8aa323dd7020aaf3703030 Mon Sep 17 00:00:00 2001
From: o9000 <mrovi9000@gmail.com>
Date: Fri, 13 Jan 2017 11:42:21 +0100
Subject: [PATCH] Panel: do not change struts (available screen size) when shown in autohide mode (issue #619)

---
 ChangeLog   |  1 +
 src/panel.c | 28 +++++++++++++++++-----------
 src/panel.h |  1 +
 3 files changed, 19 insertions(+), 11 deletions(-)

Index: tint2/src/panel.c
===================================================================
--- tint2.orig/src/panel.c
+++ tint2/src/panel.c
@@ -491,7 +491,7 @@ void update_strut(Panel *p)
 	long struts[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
 	if (panel_horizontal) {
 		int height = p->area.height + p->marginy;
-		if (panel_strut_policy == STRUT_MINIMUM || (panel_strut_policy == STRUT_FOLLOW_SIZE && p->is_hidden))
+		if (panel_strut_policy == STRUT_MINIMUM || (panel_strut_policy == STRUT_FOLLOW_SIZE && panel_autohide))
 			height = p->hidden_height;
 		if (panel_position & TOP) {
 			struts[2] = height + monitor.y;
@@ -506,7 +506,7 @@ void update_strut(Panel *p)
 		}
 	} else {
 		int width = p->area.width + p->marginx;
-		if (panel_strut_policy == STRUT_MINIMUM || (panel_strut_policy == STRUT_FOLLOW_SIZE && p->is_hidden))
+		if (panel_strut_policy == STRUT_MINIMUM || (panel_strut_policy == STRUT_FOLLOW_SIZE && panel_autohide))
 			width = p->hidden_width;
 		if (panel_position & LEFT) {
 			struts[0] = width + monitor.x;
@@ -589,21 +589,24 @@ void place_panel_all_desktops(Panel *p)
 	                PropModeReplace,
 	                (unsigned char *)&val,
 	                1);
+}
 
+void set_panel_layer(Panel *p, Layer layer)
+{
 	Atom state[4];
 	state[0] = server.atom._NET_WM_STATE_SKIP_PAGER;
 	state[1] = server.atom._NET_WM_STATE_SKIP_TASKBAR;
 	state[2] = server.atom._NET_WM_STATE_STICKY;
-	state[3] = panel_layer == BOTTOM_LAYER ? server.atom._NET_WM_STATE_BELOW : server.atom._NET_WM_STATE_ABOVE;
-	int num_atoms = panel_layer == NORMAL_LAYER ? 3 : 4;
+	state[3] = layer == BOTTOM_LAYER ? server.atom._NET_WM_STATE_BELOW : server.atom._NET_WM_STATE_ABOVE;
+	int num_atoms = layer == NORMAL_LAYER ? 3 : 4;
 	XChangeProperty(server.display,
-	                p->main_win,
-	                server.atom._NET_WM_STATE,
-	                XA_ATOM,
-	                32,
-	                PropModeReplace,
-	                (unsigned char *)state,
-	                num_atoms);
+					p->main_win,
+					server.atom._NET_WM_STATE,
+					XA_ATOM,
+					32,
+					PropModeReplace,
+					(unsigned char *)state,
+					num_atoms);
 }
 
 void replace_panel_all_desktops(Panel *p)
@@ -660,6 +663,7 @@ void set_panel_properties(Panel *p)
 	                1);
 
 	place_panel_all_desktops(p);
+	set_panel_layer(p, panel_layer);
 
 	XWMHints wmhints;
 	memset(&wmhints, 0, sizeof(wmhints));
@@ -856,6 +860,7 @@ void autohide_show(void *p)
 	panel->is_hidden = 0;
 
 	XMapSubwindows(server.display, panel->main_win); // systray windows
+	set_panel_layer(panel, TOP_LAYER);
 	if (panel_horizontal) {
 		if (panel_position & TOP)
 			XResizeWindow(server.display, panel->main_win, panel->area.width, panel->area.height);
@@ -887,6 +892,7 @@ void autohide_hide(void *p)
 {
 	Panel *panel = (Panel *)p;
 	stop_autohide_timeout(panel);
+	set_panel_layer(panel, panel_layer);
 	panel->is_hidden = TRUE;
 	if (panel_strut_policy == STRUT_FOLLOW_SIZE)
 		update_strut(panel);
Index: tint2/src/panel.h
===================================================================
--- tint2.orig/src/panel.h
+++ tint2/src/panel.h
@@ -158,6 +158,7 @@ void set_panel_items_order(Panel *p);
 void place_panel_all_desktops(Panel *p);
 void replace_panel_all_desktops(Panel *p);
 void set_panel_properties(Panel *p);
+void set_panel_layer(Panel *p, Layer layer);
 
 // draw background panel
 void set_panel_background(Panel *p);
