From 3f25b907bd1fbea563ddf335fb3d308094fa81c6 Mon Sep 17 00:00:00 2001
From: tv <tv@nomic.retiolum>
Date: Wed, 30 Jan 2013 20:39:28 +0100
Subject: [PATCH 1/3] When using -g hint the WM that we've got user specified
 geometry

Without this some window managers (e.g. fvwm) will ignore the initial
window position and place it according to it's own rules.
---
 main.c   |  1 -
 window.c | 68 +++++++++++++++++++++++++++++++++++++++++---------------
 window.h |  3 +++
 3 files changed, 53 insertions(+), 19 deletions(-)

diff --git a/main.c b/main.c
index 936be3e..1be4cd3 100644
--- a/main.c
+++ b/main.c
@@ -26,7 +26,6 @@
 #include <sys/select.h>
 #include <sys/stat.h>
 #include <sys/time.h>
-#include <X11/Xutil.h>
 #include <X11/keysym.h>
 
 #include "types.h"
diff --git a/window.c b/window.c
index 216cfc1..5c41be3 100644
--- a/window.c
+++ b/window.c
@@ -124,6 +124,9 @@ void win_init(win_t *win) {
 	win->bar.bgcol = win_alloc_color(win, BAR_BG_COLOR);
 	win->bar.fgcol = win_alloc_color(win, BAR_FG_COLOR);
 
+	win->sizehints.flags = PWinGravity;
+	win->sizehints.win_gravity = NorthWestGravity;
+
 	if (setlocale(LC_CTYPE, "") == NULL || XSupportsLocale() == 0)
 		warn("no locale support");
 
@@ -133,17 +136,24 @@ void win_init(win_t *win) {
 }
 
 void win_set_sizehints(win_t *win) {
-	XSizeHints sizehints;
 
 	if (win == NULL || win->xwin == None)
 		return;
 
-	sizehints.flags = PMinSize | PMaxSize;
-	sizehints.min_width = win->w;
-	sizehints.max_width = win->w;
-	sizehints.min_height = win->h + win->bar.h;
-	sizehints.max_height = win->h + win->bar.h;
-	XSetWMNormalHints(win->env.dpy, win->xwin, &sizehints);
+	if ((win->sizehints.flags & PMinSize) == 1) {
+		win->sizehints.min_width = win->w;
+		win->sizehints.min_height = win->h + win->bar.h;
+	}
+	if ((win->sizehints.flags & PMaxSize) == 1) {
+		win->sizehints.max_width = win->w;
+		win->sizehints.max_height = win->h + win->bar.h;
+	}
+	if ((win->sizehints.flags & USPosition) == 1) {
+		win->sizehints.x = win->x;
+		win->sizehints.y = win->y;
+	}
+
+	XSetWMNormalHints(win->env.dpy, win->xwin, &win->sizehints);
 }
 
 void win_open(win_t *win) {
@@ -165,22 +175,42 @@ void win_open(win_t *win) {
 	else
 		gmask = XParseGeometry(options->geometry, &win->x, &win->y,
 		                       &win->w, &win->h);
-	if ((gmask & WidthValue) == 0)
+	if ((gmask & WidthValue) == 0) {
 		win->w = WIN_WIDTH;
+	} else {
+		win->sizehints.flags |= USSize;
+	}
 	if (win->w > e->scrw)
 		win->w = e->scrw;
-	if ((gmask & HeightValue) == 0)
+	if ((gmask & HeightValue) == 0) {
 		win->h = WIN_HEIGHT;
+	} else {
+		win->sizehints.flags |= USSize;
+	}
 	if (win->h > e->scrh)
 		win->h = e->scrh;
-	if ((gmask & XValue) == 0)
+	if ((gmask & XValue) == 0) {
 		win->x = (e->scrw - win->w) / 2;
-	else if ((gmask & XNegative) != 0)
-		win->x += e->scrw - win->w;
-	if ((gmask & YValue) == 0)
+	} else {
+		if ((gmask & XNegative) != 0) {
+			win->x += e->scrw - win->w;
+			win->sizehints.win_gravity = NorthEastGravity;
+		}
+		win->sizehints.flags |= USPosition;
+	}
+	if ((gmask & YValue) == 0) {
 		win->y = (e->scrh - win->h) / 2;
-	else if ((gmask & YNegative) != 0)
-		win->y += e->scrh - win->h;
+	} else {
+		if ((gmask & YNegative) != 0) {
+			win->y += e->scrh - win->h;
+			if (win->sizehints.win_gravity == NorthEastGravity) {
+				win->sizehints.win_gravity = SouthEastGravity;
+			} else {
+				win->sizehints.win_gravity = SouthWestGravity;
+			}
+		}
+		win->sizehints.flags |= USPosition;
+	}
 
 	win->xwin = XCreateWindow(e->dpy, RootWindow(e->dpy, e->scr),
 	                          win->x, win->y, win->w, win->h, 0,
@@ -220,7 +250,9 @@ void win_open(win_t *win) {
 	}
 
 	if (options->fixed_win)
-		win_set_sizehints(win);
+		win->sizehints.flags |= PMinSize | PMaxSize;
+
+	win_set_sizehints(win);
 
 	XMapWindow(e->dpy, win->xwin);
 	XFlush(e->dpy);
@@ -291,8 +323,8 @@ bool win_moveresize(win_t *win, int x, int y, unsigned int w, unsigned int h) {
 	win->w = w;
 	win->h = h - win->bar.h;
 
-	if (options->fixed_win)
-		win_set_sizehints(win);
+
+	win_set_sizehints(win);
 
 	XMoveResizeWindow(win->env.dpy, win->xwin, x, y, w, h);
 
diff --git a/window.h b/window.h
index 6bc6595..60f2864 100644
--- a/window.h
+++ b/window.h
@@ -20,6 +20,7 @@
 #define WINDOW_H
 
 #include <X11/Xlib.h>
+#include <X11/Xutil.h>
 
 #include "types.h"
 
@@ -48,6 +49,8 @@ typedef struct {
 	unsigned int h; /* = win height - bar height */
 	unsigned int bw;
 
+	XSizeHints sizehints;
+
 	bool fullscreen;
 
 	struct {

From cef8d51153073d694f66889ad536736109aaf77e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bert=20M=C3=BCnnich?= <be.muennich@gmail.com>
Date: Sat, 9 Feb 2013 01:36:10 +0100
Subject: [PATCH 2/3] Refined US{Position,Size} & WinGravity handling

---
 window.c | 78 ++++++++++++++++++++++++++++----------------------------
 1 file changed, 39 insertions(+), 39 deletions(-)

diff --git a/window.c b/window.c
index e011953..2c42a7d 100644
--- a/window.c
+++ b/window.c
@@ -21,7 +21,6 @@
 
 #include <string.h>
 #include <locale.h>
-#include <X11/Xutil.h>
 #include <X11/cursorfont.h>
 
 #include "options.h"
@@ -30,6 +29,8 @@
 #include "config.h"
 
 enum {
+	WIN_MIN_W  = 50,
+	WIN_MIN_H  = 30,
 	H_TEXT_PAD = 5,
 	V_TEXT_PAD = 1
 };
@@ -127,8 +128,16 @@ void win_init(win_t *win)
 	win->bar.bgcol = win_alloc_color(win, BAR_BG_COLOR);
 	win->bar.fgcol = win_alloc_color(win, BAR_FG_COLOR);
 
-	win->sizehints.flags = PWinGravity;
+	win->sizehints.flags = PWinGravity | PMinSize;
 	win->sizehints.win_gravity = NorthWestGravity;
+	if (options->fixed_win) {
+		/* actual min/max values set in win_update_sizehints() */
+		win->sizehints.flags |= PMaxSize;
+	} else {
+		/* min values only set here, never updated in win_update_sizehints() */
+		win->sizehints.min_width  = WIN_MIN_W;
+		win->sizehints.min_height = WIN_MIN_H;
+	}
 
 	if (setlocale(LC_CTYPE, "") == NULL || XSupportsLocale() == 0)
 		warn("no locale support");
@@ -138,25 +147,23 @@ void win_init(win_t *win)
 	wm_delete_win = XInternAtom(e->dpy, "WM_DELETE_WINDOW", False);
 }
 
-void win_set_sizehints(win_t *win)
+void win_update_sizehints(win_t *win)
 {
-
 	if (win == NULL || win->xwin == None)
 		return;
 
-	if ((win->sizehints.flags & PMinSize) == 1) {
-		win->sizehints.min_width = win->w;
-		win->sizehints.min_height = win->h + win->bar.h;
+	if ((win->sizehints.flags & USSize) != 0) {
+		win->sizehints.width  = win->w;
+		win->sizehints.height = win->h;
 	}
-	if ((win->sizehints.flags & PMaxSize) == 1) {
-		win->sizehints.max_width = win->w;
-		win->sizehints.max_height = win->h + win->bar.h;
-	}
-	if ((win->sizehints.flags & USPosition) == 1) {
+	if ((win->sizehints.flags & USPosition) != 0) {
 		win->sizehints.x = win->x;
 		win->sizehints.y = win->y;
 	}
-
+	if (options->fixed_win) {
+		win->sizehints.min_width  = win->sizehints.max_width  = win->w;
+		win->sizehints.min_height = win->sizehints.max_height = win->h + win->bar.h;
+	}
 	XSetWMNormalHints(win->env.dpy, win->xwin, &win->sizehints);
 }
 
@@ -180,41 +187,38 @@ void win_open(win_t *win)
 	else
 		gmask = XParseGeometry(options->geometry, &win->x, &win->y,
 		                       &win->w, &win->h);
-	if ((gmask & WidthValue) == 0) {
+	if ((gmask & WidthValue) != 0)
+		win->sizehints.flags |= USSize;
+	else
 		win->w = WIN_WIDTH;
-	} else {
+	win->w = MAX(win->w, WIN_MIN_W);
+	win->w = MIN(win->w, e->scrw);
+	if ((gmask & HeightValue) != 0)
 		win->sizehints.flags |= USSize;
-	}
-	if (win->w > e->scrw)
-		win->w = e->scrw;
-	if ((gmask & HeightValue) == 0) {
+	else
 		win->h = WIN_HEIGHT;
-	} else {
-		win->sizehints.flags |= USSize;
-	}
-	if (win->h > e->scrh)
-		win->h = e->scrh;
-	if ((gmask & XValue) == 0) {
-		win->x = (e->scrw - win->w) / 2;
-	} else {
+	win->h = MAX(win->h, WIN_MIN_H);
+	win->h = MIN(win->h, e->scrh);
+	if ((gmask & XValue) != 0) {
 		if ((gmask & XNegative) != 0) {
 			win->x += e->scrw - win->w;
 			win->sizehints.win_gravity = NorthEastGravity;
 		}
 		win->sizehints.flags |= USPosition;
-	}
-	if ((gmask & YValue) == 0) {
-		win->y = (e->scrh - win->h) / 2;
 	} else {
+		win->x = (e->scrw - win->w) / 2;
+	}
+	if ((gmask & YValue) != 0) {
 		if ((gmask & YNegative) != 0) {
 			win->y += e->scrh - win->h;
-			if (win->sizehints.win_gravity == NorthEastGravity) {
+			if (win->sizehints.win_gravity == NorthEastGravity)
 				win->sizehints.win_gravity = SouthEastGravity;
-			} else {
+			else
 				win->sizehints.win_gravity = SouthWestGravity;
-			}
 		}
 		win->sizehints.flags |= USPosition;
+	} else {
+		win->y = (e->scrh - win->h) / 2;
 	}
 
 	win->xwin = XCreateWindow(e->dpy, RootWindow(e->dpy, e->scr),
@@ -254,10 +258,7 @@ void win_open(win_t *win)
 		win->h -= win->bar.h;
 	}
 
-	if (options->fixed_win)
-		win->sizehints.flags |= PMinSize | PMaxSize;
-
-	win_set_sizehints(win);
+	win_update_sizehints(win);
 
 	XMapWindow(e->dpy, win->xwin);
 	XFlush(e->dpy);
@@ -332,8 +333,7 @@ bool win_moveresize(win_t *win, int x, int y, unsigned int w, unsigned int h)
 	win->w = w;
 	win->h = h - win->bar.h;
 
-
-	win_set_sizehints(win);
+	win_update_sizehints(win);
 
 	XMoveResizeWindow(win->env.dpy, win->xwin, x, y, w, h);
 

From 1e2ddc44d85c87449a6ad2ad62689fb41cfae858 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bert=20M=C3=BCnnich?= <ber.t@gmx.com>
Date: Sat, 9 Feb 2013 17:24:41 +0100
Subject: [PATCH 3/3] No checks on window size, use whatever the user has
 specified

---
 Makefile |  2 +-
 window.c | 17 +++--------------
 2 files changed, 4 insertions(+), 15 deletions(-)

diff --git a/Makefile b/Makefile
index ef3bd79..1c7a95d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-VERSION = git-20130208
+VERSION = git-20130209
 
 PREFIX    = /usr/local
 MANPREFIX = $(PREFIX)/share/man
diff --git a/window.c b/window.c
index 2c42a7d..00b052c 100644
--- a/window.c
+++ b/window.c
@@ -29,8 +29,6 @@
 #include "config.h"
 
 enum {
-	WIN_MIN_W  = 50,
-	WIN_MIN_H  = 30,
 	H_TEXT_PAD = 5,
 	V_TEXT_PAD = 1
 };
@@ -128,16 +126,11 @@ void win_init(win_t *win)
 	win->bar.bgcol = win_alloc_color(win, BAR_BG_COLOR);
 	win->bar.fgcol = win_alloc_color(win, BAR_FG_COLOR);
 
-	win->sizehints.flags = PWinGravity | PMinSize;
+	win->sizehints.flags = PWinGravity;
 	win->sizehints.win_gravity = NorthWestGravity;
-	if (options->fixed_win) {
+	if (options->fixed_win)
 		/* actual min/max values set in win_update_sizehints() */
-		win->sizehints.flags |= PMaxSize;
-	} else {
-		/* min values only set here, never updated in win_update_sizehints() */
-		win->sizehints.min_width  = WIN_MIN_W;
-		win->sizehints.min_height = WIN_MIN_H;
-	}
+		win->sizehints.flags |= PMinSize | PMaxSize;
 
 	if (setlocale(LC_CTYPE, "") == NULL || XSupportsLocale() == 0)
 		warn("no locale support");
@@ -191,14 +184,10 @@ void win_open(win_t *win)
 		win->sizehints.flags |= USSize;
 	else
 		win->w = WIN_WIDTH;
-	win->w = MAX(win->w, WIN_MIN_W);
-	win->w = MIN(win->w, e->scrw);
 	if ((gmask & HeightValue) != 0)
 		win->sizehints.flags |= USSize;
 	else
 		win->h = WIN_HEIGHT;
-	win->h = MAX(win->h, WIN_MIN_H);
-	win->h = MIN(win->h, e->scrh);
 	if ((gmask & XValue) != 0) {
 		if ((gmask & XNegative) != 0) {
 			win->x += e->scrw - win->w;