JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Silence format string warnings with debug enabled;
[spectrwm.git] / scrotwm.c
index 3f1cbdd..e129b42 100644 (file)
--- a/scrotwm.c
+++ b/scrotwm.c
@@ -50,7 +50,7 @@
 
 static const char      *cvstag = "$scrotwm$";
 
-#define        SWM_VERSION     "0.6"
+#define        SWM_VERSION     "0.7"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -181,6 +181,7 @@ char                        *bar_fonts[] = {
 /* terminal + args */
 char                   *spawn_term[] = { "xterm", NULL };
 char                   *spawn_screenshot[] = { "screenshot.sh", NULL, NULL };
+char                   *spawn_lock[] = { "xlock", NULL };
 char                   *spawn_menu[] = { "dmenu_run", "-fn", NULL, "-nb", NULL,
                            "-nf", NULL, "-sb", NULL, "-sf", NULL, NULL };
 
@@ -1687,6 +1688,7 @@ struct key {
        { MODKEY | ShiftMask,   XK_s,           screenshot,     {.id = SWM_ARG_ID_SS_WINDOW} },
        { MODKEY,               XK_t,           floating_toggle,{0} },
        { MODKEY | ShiftMask,   XK_v,           version,        {0} },
+       { MODKEY | ShiftMask,   XK_Delete,      spawn,          {.argv = spawn_lock} },
 };
 
 void
@@ -1721,7 +1723,7 @@ resize(struct ws_win *win, union arg *args)
        XEvent                  ev;
        Time                    time = 0;
 
-       DNPRINTF(SWM_D_MOUSE, "resize: win %d floating %d trans %d\n",
+       DNPRINTF(SWM_D_MOUSE, "resize: win %lu floating %d trans %d\n",
            win->id, win->floating, win->transient);
 
        if (!(win->transient != 0 || win->floating != 0))
@@ -1796,7 +1798,7 @@ move(struct ws_win *win, union arg *args)
        Time                    time = 0;
        int                     restack = 0;
 
-       DNPRINTF(SWM_D_MOUSE, "move: win %d floating %d trans %d\n",
+       DNPRINTF(SWM_D_MOUSE, "move: win %lu floating %d trans %d\n",
            win->id, win->floating, win->transient);
 
        if (win->floating == 0) {
@@ -2006,42 +2008,49 @@ manage_window(Window id)
        if ((win = calloc(1, sizeof(struct ws_win))) == NULL)
                errx(1, "calloc: failed to allocate memory for new window");
 
+       /* Get all the window data in one shot */
        ws_idx_atom = XInternAtom(display, "_SWM_WS", False);
        if (ws_idx_atom)
                XGetWindowProperty(display, id, ws_idx_atom, 0, SWM_PROPLEN,
                    False, XA_STRING, &type, &format, &nitems, &bytes, &prop);
-
        XGetWindowAttributes(display, id, &win->wa);
+       XGetTransientForHint(display, id, &trans);
+       XGetWMNormalHints(display, id, &win->sh, &mask); /* XXX function? */
+       if (trans) {
+               win->transient = trans;
+               DNPRINTF(SWM_D_MISC, "manage_window: win %u transient %u\n",
+                   (unsigned)win->id, win->transient);
+       }
+       
+       /*
+        * Figure out where to put the window. If it was previously assigned to
+        * a workspace (either by spawn() or manually moving), and isn't
+        * transient, * put it in the same workspace
+        */
        r = root_to_region(win->wa.root);
-       /* If the window was managed before, put it in the same workspace */
-       if (prop) {
+       if (prop && win->transient == 0) {
                DNPRINTF(SWM_D_PROP, "got property _SWM_WS=%s\n", prop);
                ws_idx = strtonum(prop, 0, 9, &errstr);
-               if (errstr)
+               if (errstr) {
                        DNPRINTF(SWM_D_EVENT, "window idx is %s: %s",
                            errstr, prop);
+               }
                ws = &r->s->ws[ws_idx];
        } else
                ws = r->ws;
 
+       /* set up the window layout */
        win->id = id;
        win->ws = ws;
        win->s = r->s;  /* this never changes */
        TAILQ_INSERT_TAIL(&ws->winlist, win, entry);
 
-       XGetTransientForHint(display, win->id, &trans);
-       if (trans) {
-               win->transient = trans;
-               DNPRINTF(SWM_D_MISC, "manage_window: win %u transient %u\n",
-                   (unsigned)win->id, win->transient);
-       }
        win->g.w = win->wa.width;
        win->g.h = win->wa.height;
        win->g.x = win->wa.x;
        win->g.y = win->wa.y;
 
-       XGetWMNormalHints(display, win->id, &win->sh, &mask); /* XXX function? */
-
+       /* Set window properties so we can remember this after reincarnation */
        if (ws_idx_atom && prop == NULL &&
            snprintf(ws_idx_str, SWM_PROPLEN, "%d", ws->idx) < SWM_PROPLEN) {
                DNPRINTF(SWM_D_PROP, "setting property _SWM_WS to %s\n",