static const char *cvstag = "$scrotwm$";
-#define SWM_VERSION "0.7"
+#define SWM_VERSION "0.8"
#include <stdio.h>
#include <stdlib.h>
char *spawn_term[] = { "xterm", NULL };
char *spawn_screenshot[] = { "screenshot.sh", NULL, NULL };
char *spawn_lock[] = { "xlock", NULL };
+char *spawn_initscr[] = { "initscreen.sh", NULL };
char *spawn_menu[] = { "dmenu_run", "-fn", NULL, "-nb", NULL,
"-nf", NULL, "-sb", NULL, "-sf", NULL, NULL };
char *class;
char *name;
unsigned long quirk;
-#define SWM_Q_FLOAT (1<<0)
-#define SWM_Q_TRANSSZ (1<<1)
+#define SWM_Q_FLOAT (1<<0) /* float this window */
+#define SWM_Q_TRANSSZ (1<<1) /* transiend window size too small */
+#define SWM_Q_ANYWHERE (1<<2) /* don't position this window */
} quirks[] = {
{ "MPlayer", "xv", SWM_Q_FLOAT },
{ "OpenOffice.org 2.4", "VCLSalFrame", SWM_Q_FLOAT },
{ "OpenOffice.org 3.0", "VCLSalFrame", SWM_Q_FLOAT },
{ "Firefox-bin", "firefox-bin", SWM_Q_TRANSSZ},
- { NULL, NULL, 0},
+ { "Gimp", "gimp", SWM_Q_FLOAT | SWM_Q_ANYWHERE},
+ { NULL, NULL, 0},
};
/* events */
continue;
if (split && i == split) {
- colno = (winno - split) / s;
- if (stacks == 1)
- colno += (winno - split) % s;
+ colno = (winno - mwin) / stacks;
+ if (s <= (winno - mwin) % stacks)
+ colno++;
split = split + colno;
hrh = (r_g.h / colno);
extra = r_g.h - (colno * hrh);
win_g.x = r_g.x;
else
win_g.x += win_g.w + 2;
- win_g.w = (r_g.w - (msize + 2) - (stacks * 2)) / stacks;
+ win_g.w = (((r_g.w - (msize + 2)) -
+ ((stacks - 1) * 2)) / stacks);
+ if (s == 1)
+ win_g.w += (((r_g.w - (msize + 2)) -
+ ((stacks - 1) * 2)) % stacks);
s--;
j = 0;
}
{ MODKEY, XK_t, floating_toggle,{0} },
{ MODKEY | ShiftMask, XK_v, version, {0} },
{ MODKEY | ShiftMask, XK_Delete, spawn, {.argv = spawn_lock} },
+ { MODKEY | ShiftMask, XK_i, spawn, {.argv = spawn_initscr} },
};
void
struct swm_region *r;
long mask;
const char *errstr;
+ XWindowChanges wc;
if ((win = find_window(id)) != NULL)
return (win); /* already being managed */
}
}
+ /* alter window position if quirky */
+ if (win->quirks & SWM_Q_ANYWHERE) {
+ win->manual = 1; /* don't center the quirky windows */
+ bzero(&wc, sizeof wc);
+ mask = 0;
+ if (win->g.y < bar_height) {
+ win->g.y = wc.y = bar_height;
+ mask |= CWY;
+ }
+ if (win->g.w + win->g.x > WIDTH(r)) {
+ win->g.x = wc.x = WIDTH(win->ws->r) - win->g.w - 2;
+ mask |= CWX;
+ }
+ wc.border_width = 1;
+ mask |= CWBorderWidth;
+ XConfigureWindow(display, win->id, mask, &wc);
+ }
+
XSelectInput(display, id, EnterWindowMask | FocusChangeMask |
PropertyChangeMask | StructureNotifyMask);
set_win_state(win, NormalState);
+ /* floaters need to be mapped if they are in the current workspace */
+ if (win->floating && (ws->idx == r->ws->idx))
+ XMapRaised(display, win->id);
+
/* make new win focused */
focus_win(win);
ev->value_mask |= CWY | CWHeight;
}
}
- if ((ev->value_mask & (CWX|CWY)) &&
- !(ev->value_mask & (CWWidth|CWHeight)))
+ if ((ev->value_mask & (CWX | CWY)) &&
+ !(ev->value_mask & (CWWidth | CWHeight)))
config_win(win);
XMoveResizeWindow(display, win->id,
win->g.x, win->g.y, win->g.w, win->g.h);
if (wa.override_redirect)
return;
manage_window(e->xmaprequest.window);
+
stack();
}
handler[e.type](&e);
else
DNPRINTF(SWM_D_EVENT,
- "unkown event: %d\n", e.type);
+ "win: %lu unknown event: %d\n",
+ e.xany.window, e.type);
} else {
switch (e.type - xrandr_eventbase) {
case RRScreenChangeNotify:
break;
default:
DNPRINTF(SWM_D_EVENT,
- "unkown event: %d\n", e.type);
+ "win: %lu unknown xrandr event: "
+ "%d\n", e.xany.window, e.type);
break;
}
}