char *bar_argv[] = { NULL, NULL };
int bar_pipe[2];
char bar_ext[SWM_BAR_MAX];
+char bar_vertext[SWM_BAR_MAX];
+int bar_version = 0;
sig_atomic_t bar_alarm = 0;
int bar_delay = 30;
int bar_enabled = 1;
#define SWM_ARG_ID_CYCLESC_DOWN (15)
#define SWM_ARG_ID_SS_ALL (0)
#define SWM_ARG_ID_SS_WINDOW (1)
+#define SWM_ARG_ID_DONTCENTER (0)
+#define SWM_ARG_ID_CENTER (1)
char **argv;
};
for (i = 0; i < ScreenCount(display); i++) {
x = 1;
TAILQ_FOREACH(r, &screens[i].rl, entry) {
- snprintf(loc, sizeof loc, "%s %d:%d %s",
- s, x++, r->ws->idx + 1, bar_ext);
+ snprintf(loc, sizeof loc, "%s %d:%d %s %s",
+ s, x++, r->ws->idx + 1, bar_ext, bar_vertext);
bar_print(r, loc);
}
}
}
void
+version(struct swm_region *r, union arg *args)
+{
+ bar_version = !bar_version;
+ if (bar_version)
+ strlcpy(bar_vertext, cvstag, sizeof bar_vertext);
+ else
+ strlcpy(bar_vertext, "", sizeof bar_vertext);
+ bar_update();
+}
+
+void
config_win(struct ws_win *win)
{
XConfigureEvent ce;
Atom ws_idx_atom = 0;
unsigned char ws_idx_str[SWM_PROPLEN];
+ if (win == NULL)
+ return;
+
DNPRINTF(SWM_D_MOVE, "send_to_ws: win: %lu\n", win->id);
ws = win->ws;
{ MODKEY | ShiftMask, XK_x, wkill, {0} },
{ MODKEY, XK_s, screenshot, {.id = SWM_ARG_ID_SS_ALL} },
{ MODKEY | ShiftMask, XK_s, screenshot, {.id = SWM_ARG_ID_SS_WINDOW} },
+ { MODKEY | ShiftMask, XK_v, version, {0} },
};
void
-resize_window(struct ws_win *win)
+resize_window(struct ws_win *win, int center)
{
unsigned int mask;
XWindowChanges wc;
r = root_to_region(win->wa.root);
bzero(&wc, sizeof wc);
- mask = CWX | CWY | CWBorderWidth | CWWidth | CWHeight;
+ mask = CWBorderWidth | CWWidth | CWHeight;
wc.border_width = 1;
wc.width = win->g.w;
wc.height = win->g.h;
- wc.x = (WIDTH(r) - win->g.w) / 2;
- wc.y = (HEIGHT(r) - win->g.h) / 2;
+ if (center == SWM_ARG_ID_CENTER) {
+ wc.x = (WIDTH(r) - win->g.w) / 2;
+ wc.y = (HEIGHT(r) - win->g.h) / 2;
+ mask |= CWX | CWY;
+ }
DNPRINTF(SWM_D_STACK, "resize_window: win %lu x %d y %d w %d h %d\n",
win->id, wc.x, wc.y, wc.width, wc.height);
}
void
-resize(struct ws_win *win)
+resize(struct ws_win *win, union arg *args)
{
XEvent ev;
- int nw, nh;
DNPRINTF(SWM_D_MOUSE, "resize: win %d floating %d trans %d\n",
win->id, win->floating, win->transient);
break;
case MotionNotify:
XSync(display, False);
- win->g.w = nw = ev.xmotion.x;
- win->g.h = nh = ev.xmotion.y;
- resize_window(win);
+ if (ev.xmotion.x < 0)
+ ev.xmotion.x = 0;
+ if (ev.xmotion.y < 0)
+ ev.xmotion.y = 0;
+ win->g.w = ev.xmotion.x;
+ win->g.h = ev.xmotion.y;
+ resize_window(win, args->id);
break;
}
} while (ev.type != ButtonRelease);
}
void
-click(struct ws_win *win, union arg *args)
+move_window(struct ws_win *win)
{
- DNPRINTF(SWM_D_MOUSE, "click: button: %d\n", args->id);
+ unsigned int mask;
+ XWindowChanges wc;
+ struct swm_region *r;
- switch (args->id) {
- case Button1:
- break;
- case Button2:
- break;
- case Button3:
- resize(win);
- break;
- default:
+ r = root_to_region(win->wa.root);
+ bzero(&wc, sizeof wc);
+ mask = CWX | CWY;
+ wc.x = win->g.x;
+ wc.y = win->g.y;
+
+ DNPRINTF(SWM_D_STACK, "move_window: win %lu x %d y %d w %d h %d\n",
+ win->id, wc.x, wc.y, wc.width, wc.height);
+
+ XConfigureWindow(display, win->id, mask, &wc);
+ config_win(win);
+}
+
+void
+move(struct ws_win *win, union arg *args)
+{
+ XEvent ev;
+
+ DNPRINTF(SWM_D_MOUSE, "move: win %d floating %d trans %d\n",
+ win->id, win->floating, win->transient);
+
+ if (!(win->transient != 0 || win->floating != 0))
return;
- }
+
+ if (XGrabPointer(display, win->id, False, MOUSEMASK, GrabModeAsync,
+ GrabModeAsync, None, None /* cursor */, CurrentTime) != GrabSuccess)
+ return;
+ XWarpPointer(display, None, win->id, 0, 0, 0, 0, 0, 0);
+ do {
+ XMaskEvent(display, MOUSEMASK | ExposureMask |
+ SubstructureRedirectMask, &ev);
+ switch(ev.type) {
+ case ConfigureRequest:
+ case Expose:
+ case MapRequest:
+ handler[ev.type](&ev);
+ break;
+ case MotionNotify:
+ XSync(display, False);
+ win->g.x = ev.xmotion.x_root;
+ win->g.y = ev.xmotion.y_root;
+ move_window(win);
+ break;
+ }
+ } while (ev.type != ButtonRelease);
+ XWarpPointer(display, None, win->id, 0, 0, 0, 0, 0, 0);
+ XUngrabPointer(display, CurrentTime);
+
+ /* drain events */
+ while (XCheckMaskEvent(display, EnterWindowMask, &ev));
}
/* mouse */
union arg args;
} buttons[] = {
/* action key mouse button func args */
- { client_click, MODKEY, Button3, click, {.id=Button3} },
+ { client_click, MODKEY, Button3, resize, {.id = SWM_ARG_ID_DONTCENTER} },
+ { client_click, MODKEY | ShiftMask, Button3, resize, {.id = SWM_ARG_ID_CENTER} },
+ { client_click, MODKEY, Button1, move, {0} },
};
void