Hi Anselm,

thank you very much for your suggestion; indeed, the placement now
works fine and the place()'d windows never loose focus.

Corrected patch attached.

Cheers,
Riccardo
=== added file 'place.c'
--- place.c	1970-01-01 00:00:00 +0000
+++ place.c	2007-05-10 15:40:32 +0000
@@ -0,0 +1,56 @@
+/* Author: Riccardo Murri <[EMAIL PROTECTED]>
+ * See LICENSE file for license details. */
+#include "dwm.h"
+#include <string.h>
+
+
+typedef enum {Top=0, Middle=1, Bottom=2} vertical_placement_t;
+typedef enum {Left=0, Center=1, Right=2} horizontal_placement_t;
+
+static void
+_place(const vertical_placement_t vpos, const horizontal_placement_t hpos)
+{
+  unsigned int nx, ny;
+  XEvent ev;
+
+  if(NULL == sel || !sel->isfloating)
+    return;
+
+  nx = wax + hpos*(waw - sel->w)/2;
+  ny = way + vpos*(wah - sel->h)/2;
+  
+  XMoveWindow(dpy, sel->win, nx, ny);
+  XSync(dpy, False);
+  while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
+}
+
+
+/** True if strings are case-insensitive equal. */
+#define streq(a,b) (0 == strcasecmp(a,b)) 
+
+void
+place(const char* arg)
+{
+  if(NULL == arg)
+    /* by default, center window in window area */
+    _place(Middle, Center);
+  else if(streq(arg, "n"))
+    _place(Top, Center);
+  else if(streq(arg, "ne"))
+    _place(Top, Right);
+  else if(streq(arg, "e"))
+    _place(Middle, Right);
+  else if(streq(arg, "se"))
+    _place(Bottom, Right);
+  else if(streq(arg, "s"))
+    _place(Bottom, Center);
+  else if(streq(arg, "sw"))
+    _place(Bottom, Left);
+  else if(streq(arg, "w"))
+    _place(Middle, Left);
+  else if(streq(arg, "nw"))
+    _place(Top, Left);
+  else 
+    /* by default, center window in window area */
+    _place(Middle, Center);
+}

=== modified file 'Makefile' (properties changed)
--- Makefile	2007-05-08 20:42:49 +0000
+++ Makefile	2007-05-08 20:43:42 +0000
@@ -3,7 +3,7 @@
 
 include config.mk
 
-SRC = client.c draw.c event.c layout.c main.c tag.c util.c
+SRC = client.c draw.c event.c layout.c main.c place.c tag.c util.c
 OBJ = ${SRC:.c=.o}
 
 all: options dwm

=== modified file 'config.default.h' (properties changed)
--- config.default.h	2007-05-08 20:42:49 +0000
+++ config.default.h	2007-05-08 20:46:26 +0000
@@ -55,6 +55,15 @@
 	{ MODKEY,			XK_Return,	zoom,		NULL }, \
 	{ MODKEY|ShiftMask,		XK_space,	togglefloating,	NULL }, \
 	{ MODKEY|ShiftMask,		XK_c,		killclient,	NULL }, \
+        { MODKEY|ControlMask,           XK_KP_1,         place,         "sw" }, \
+        { MODKEY|ControlMask,           XK_KP_2,         place,         "s" }, \
+        { MODKEY|ControlMask,           XK_KP_3,         place,         "se" }, \
+        { MODKEY|ControlMask,           XK_KP_4,         place,         "w" }, \
+        { MODKEY|ControlMask,           XK_KP_5,         place,         NULL }, \
+        { MODKEY|ControlMask,           XK_KP_6,         place,         "e" }, \
+        { MODKEY|ControlMask,           XK_KP_7,         place,         "nw" }, \
+        { MODKEY|ControlMask,           XK_KP_8,         place,         "n" }, \
+        { MODKEY|ControlMask,           XK_KP_9,         place,         "ne" }, \
 	{ MODKEY,			XK_0,		view,		NULL }, \
 	{ MODKEY,			XK_1,		view,		"0" }, \
 	{ MODKEY,			XK_2,		view,		"1" }, \

=== modified file 'dwm.h' (properties changed)
--- dwm.h	2007-05-08 20:42:49 +0000
+++ dwm.h	2007-05-08 20:44:42 +0000
@@ -133,6 +133,9 @@
 void quit(const char *arg);		/* quit dwm nicely */
 int xerror(Display *dsply, XErrorEvent *ee);	/* dwm's X error handler */
 
+/* place.c */
+void place(const char* arg);            /* place sel window at cardinal point of screen */
+
 /* tag.c */
 void compileregs(void);			/* initialize regexps of rules defined in config.h */
 Bool isvisible(Client *c);		/* returns True if client is visible */

Reply via email to