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 */