> BTW, why do you think that it should be set once in config.h
> which applications should start in floating mode?

You don't have to do that for every application. If there is some
misbehaving application I use only so often, I tend to activate
floating mode (mod+f), start the application, make it floating
(mod+shift+space) and go back to tiling mode (mod+t). But for
applications I'm using more frequently editing config.h and recompiling
dwm might be worth it.

> If the policy of the Developers is that dwm should be configured through
> config.h (I am not arguing agains that) can one restart dwm on the fly
> after recompiling it?

I too found it cumbersome to quit the whole X session just to try out
a config setting for dwm (or upgrading it).

I added this line to config.h:

        { MODKEY|ShiftMask,             XK_r,      restart,        {0} },

and used the following patch to make dwm restart by pressing
MODKEY+shift+r.

It's not perfect, because dwm will not remeber which window has which
tags or which tags you're currently viewing, but that wasn't my main
concern.

--- dwm.orig/dwm.c
+++ dwm/dwm.c
@@ -238,6 +238,7 @@ static int xerror(Display *dpy, XErrorEv
 static int xerrordummy(Display *dpy, XErrorEvent *ee);
 static int xerrorstart(Display *dpy, XErrorEvent *ee);
 static void zoom(const Arg *arg);
+static void restart(const Arg *arg);
 
 /* variables */
 static const char broken[] = "broken";
@@ -264,6 +265,7 @@ static void (*handler[LASTEvent]) (XEven
 static Atom wmatom[WMLast], netatom[NetLast];
 static Bool otherwm;
 static Bool running = True;
+static Bool do_restart = False;
 static Cursor cursor[CurLast];
 static Display *dpy;
 static DC dc;
@@ -1999,6 +2001,12 @@ zoom(const Arg *arg) {
        arrange(c->mon);
 }
 
+void
+restart(const Arg *arg) {
+       do_restart = 1;
+       running = 0;
+}
+
 int
 main(int argc, char *argv[]) {
        if(argc == 2 && !strcmp("-v", argv[1]))
@@ -2015,5 +2023,7 @@ main(int argc, char *argv[]) {
        run();
        cleanup();
        XCloseDisplay(dpy);
+       if (do_restart)
+               execlp(argv[0], argv[0], NULL);
        return 0;
 }

-- 
Eckehard Berns

Reply via email to