From: Andy Spencer Date: Mon, 19 Sep 2011 00:32:56 +0000 (+0000) Subject: Add border to focused window X-Git-Url: http://pileus.org/git/?p=wmpus;a=commitdiff_plain;h=7f25be55ead02fba1baf4a84c709e123b07bc4c7 Add border to focused window --- diff --git a/.vimrc b/.vimrc index b24f8ee..74019fc 100644 --- a/.vimrc +++ b/.vimrc @@ -1 +1,2 @@ set makeprg=make\ debug +au filetype c set tags=tags;,~/.tags/X11.tags diff --git a/sys-x11.c b/sys-x11.c index 69b5bcb..052b0a8 100644 --- a/sys-x11.c +++ b/sys-x11.c @@ -11,6 +11,8 @@ #include "sys.h" #include "wm.h" +#define BORDER 2 + /* Internal structures */ struct win_sys { Window xid; @@ -29,10 +31,15 @@ typedef enum { wm_proto, wm_focus, net_strut, natoms } atom_t; +typedef enum { + clr_focus, clr_unfocus, clr_urgent, ncolors +} color_t; + /* Global data */ static void *win_cache = NULL; static Atom atoms[natoms]; static int (*xerrorxlib)(Display *, XErrorEvent *); +static unsigned long colors[ncolors]; /* Conversion functions */ static keymap_t key2sym[] = { @@ -229,6 +236,16 @@ static int win_viewable(win_t *win) return True; } +/* Drawing functions */ +unsigned long get_color(Display *dpy, const char *name) +{ + XColor color; + int screen = DefaultScreen(dpy); + Colormap cmap = DefaultColormap(dpy, screen); + XAllocNamedColor(dpy, cmap, name, &color, &color); + return color.pixel; +} + /* Callbacks */ static void process_event(int type, XEvent *ev, win_t *root) { @@ -360,10 +377,11 @@ static int xerror(Display *dpy, XErrorEvent *err) void sys_move(win_t *win, int x, int y, int w, int h) { //printf("sys_move: %p - %d,%d %dx%d\n", win, x, y, w, h); - win->x = MAX(x,0); win->y = MAX(y,0); - win->w = MAX(w,1); win->h = MAX(h,1); - XMoveResizeWindow(win->sys->dpy, win->sys->xid, - win->x, win->y, win->w, win->h); + int b = 2*BORDER; + win->x = MAX(x,0); win->y = MAX(y,0); + win->w = MAX(w,1+b); win->h = MAX(h,1+b); + w = MAX(w-b,1); h = MAX(h-b,1); + XMoveResizeWindow(win->sys->dpy, win->sys->xid, x, y, w, h); /* Flush events, so moving window doesn't cuase re-focus * There's probably a better way to do this */ @@ -382,6 +400,16 @@ void sys_raise(win_t *win) void sys_focus(win_t *win) { printf("sys_focus: %p\n", win); + + /* Set border on focused window */ + static win_t *last = NULL; + if (last) + XSetWindowBorder(last->sys->dpy, last->sys->xid, colors[clr_unfocus]); + XSetWindowBorder(win->sys->dpy, win->sys->xid, colors[clr_focus]); + XSetWindowBorderWidth(win->sys->dpy, win->sys->xid, BORDER); + last = win; + + /* Set actual focus */ XSetInputFocus(win->sys->dpy, win->sys->xid, RevertToPointerRoot, CurrentTime); XSendEvent(win->sys->dpy, win->sys->xid, False, NoEventMask, &(XEvent){ @@ -432,6 +460,10 @@ win_t *sys_init(void) atoms[wm_proto] = XInternAtom(dpy, "WM_PROTOCOLS", False); atoms[wm_focus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); atoms[net_strut] = XInternAtom(dpy, "_NET_WM_STRUT", False); + colors[clr_focus] = get_color(dpy, "#a0a0ff"); + colors[clr_unfocus] = get_color(dpy, "#101066"); + colors[clr_urgent] = get_color(dpy, "#ff0000"); + printf("colors = #%06lx #%06lx #%06lx\n", colors[0], colors[1], colors[2]); XSelectInput(dpy, xid, SubstructureRedirectMask|SubstructureNotifyMask); XSetInputFocus(dpy, None, RevertToNone, CurrentTime); xerrorxlib = XSetErrorHandler(xerror); diff --git a/wm-wmii.c b/wm-wmii.c index e202518..23d57b8 100644 --- a/wm-wmii.c +++ b/wm-wmii.c @@ -6,8 +6,8 @@ #include "wm.h" #define MODKEY alt -#define MARGIN 10 -#define STACK 20 +#define MARGIN 0 +#define STACK 25 /* Loca types */ struct win_wm {