diff --git a/Makefile b/Makefile index 8573837..738af94 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ CFLAGS+= -std=c99 -Wall -Wextra -pedantic -LDADD+= -lX11 +LDADD+= -lX11 -lXext LDFLAGS= PREFIX?= /usr BINDIR?= $(PREFIX)/bin diff --git a/config.def.h b/config.def.h index aaaf38d..b25dc08 100644 --- a/config.def.h +++ b/config.def.h @@ -2,6 +2,7 @@ #define CONFIG_H #define MOD Mod4Mask +#define ROUND_CORNERS 20 const char* menu[] = {"dmenu_run", 0}; const char* term[] = {"st", 0}; diff --git a/sowm.c b/sowm.c index d1b4c2a..56bf509 100644 --- a/sowm.c +++ b/sowm.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -43,6 +44,7 @@ static void win_del(Window w); static void win_fs(); static void win_kill(); static void win_next(); +static void win_round_corners(Window w, int rad); static void win_to_ws(const Arg arg); static void ws_go(const Arg arg); static int xerror() { return 0;} @@ -105,6 +107,9 @@ void notify_motion(XEvent *e) { wy + (mouse.button == 1 ? yd : 0), ww + (mouse.button == 3 ? xd : 0), wh + (mouse.button == 3 ? yd : 0)); + + if (mouse.button == 3) + win_round_corners(mouse.subwindow, ROUND_CORNERS); } void key_press(XEvent *e) { @@ -185,6 +190,41 @@ void win_fs() { } else XMoveResizeWindow(d, cur->w, cur->wx, cur->wy, cur->ww, cur->wh); + + win_round_corners(cur->w, cur->f ? 0 : ROUND_CORNERS); +} + +void win_round_corners(Window w, int rad) { + unsigned int ww, wh, dia = 2 * rad; + + win_size(w, &(int){1}, &(int){1}, &ww, &wh); + + if (ww < dia || wh < dia) return; + + Pixmap mask = XCreatePixmap(d, w, ww, wh, 1); + + if (!mask) return; + + XGCValues xgcv; + GC shape_gc = XCreateGC(d, mask, 0, &xgcv); + + if (!shape_gc) { + XFreePixmap(d, mask); + return; + } + + XSetForeground(d, shape_gc, 0); + XFillRectangle(d, mask, shape_gc, 0, 0, ww, wh); + XSetForeground(d, shape_gc, 1); + XFillArc(d, mask, shape_gc, 0, 0, dia, dia, 0, 23040); + XFillArc(d, mask, shape_gc, ww-dia-1, 0, dia, dia, 0, 23040); + XFillArc(d, mask, shape_gc, 0, wh-dia-1, dia, dia, 0, 23040); + XFillArc(d, mask, shape_gc, ww-dia-1, wh-dia-1, dia, dia, 0, 23040); + XFillRectangle(d, mask, shape_gc, rad, 0, ww-dia, wh); + XFillRectangle(d, mask, shape_gc, 0, rad, ww, wh-dia); + XShapeCombineMask(d, w, ShapeBounding, 0, 0, mask, ShapeSet); + XFreePixmap(d, mask); + XFreeGC(d, shape_gc); } void win_to_ws(const Arg arg) { @@ -241,6 +281,8 @@ void configure_request(XEvent *e) { .sibling = ev->above, .stack_mode = ev->detail }); + + win_round_corners(ev->window, ROUND_CORNERS); } void map_request(XEvent *e) { @@ -253,6 +295,7 @@ void map_request(XEvent *e) { if (wx + wy == 0) win_center(); + win_round_corners(w, ROUND_CORNERS); XMapWindow(d, w); win_focus(list->prev); }