| updating formatting and bindings. - tmuxwm - A window manager utilising only tm… | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit 0c9292114ad047eb9cd8596e19bf25b3ca11f25f | |
| parent 54885b726e65161bdd389e6a6bcf67d4fa66d692 | |
| Author: Jay Scott <[email protected]> | |
| Date: Sun, 8 Dec 2019 19:38:16 +0000 | |
| updating formatting and bindings. | |
| Diffstat: | |
| M Makefile | 4 ++-- | |
| M tmuxwm.c | 169 ++++++++++++++++++-----------… | |
| 2 files changed, 100 insertions(+), 73 deletions(-) | |
| --- | |
| diff --git a/Makefile b/Makefile | |
| @@ -1,4 +1,4 @@ | |
| -CC = gcc | |
| +CC = gcc | |
| CFLAGS = -lX11 | |
| OBJ = tmuxwm.c | |
| NAME = tmuxwm | |
| @@ -11,5 +11,5 @@ tmuxwm: ${OBJ} | |
| clean: | |
| rm -f ${NAME} | |
| -install: | |
| +install: | |
| cp ${NAME} /usr/bin/ | |
| diff --git a/tmuxwm.c b/tmuxwm.c | |
| @@ -15,36 +15,33 @@ | |
| #include <X11/Xutil.h> | |
| #include <X11/XF86keysym.h> | |
| -typedef struct Bind { KeySym sym; int mod; const char * const *args; } Bind; | |
| -typedef const char * const Arg[]; | |
| - | |
| -/* The next ~30 lines could be separated into a "config.h", but this is BMFM | |
| - * code: By Me For Me. So I don't care to separate it for your convenience. | |
| - */ | |
| - | |
| -Arg tmux_client = (Arg) { "st", "-e", "tmux", "new-session", NULL }; | |
| - | |
| -static Bind bind[] = { | |
| - { XK_Return, Mod4Mask, (Arg) { "tmux", "rename-window", NULL … | |
| - { XK_Tab, Mod4Mask, (Arg) { "tmux", "last-pane", NULL } }, | |
| - { XK_space, Mod4Mask, (Arg) { "tmux", "new-window", NULL } }, | |
| - { XK_1, Mod4Mask, (Arg) { "tmux", "select-window", "-t",… | |
| - { XK_2, Mod4Mask, (Arg) { "tmux", "select-window", "-t",… | |
| - { XK_3, Mod4Mask, (Arg) { "tmux", "select-window", "-t",… | |
| - { XK_4, Mod4Mask, (Arg) { "tmux", "select-window", "-t",… | |
| - { XK_5, Mod4Mask, (Arg) { "tmux", "select-window", "-t",… | |
| - { XK_6, Mod4Mask, (Arg) { "tmux", "select-window", "-t",… | |
| - { XK_7, Mod4Mask, (Arg) { "tmux", "select-window", "-t",… | |
| - { XK_8, Mod4Mask, (Arg) { "tmux", "select-window", "-t",… | |
| - { XK_9, Mod4Mask, (Arg) { "tmux", "select-window", "-t",… | |
| - { XK_h, Mod4Mask, (Arg) { "tmux", "split-window", "-h", … | |
| - { XK_v, Mod4Mask, (Arg) { "tmux", "split-window", "-v", … | |
| - { XK_w, Mod4Mask, (Arg) { "firefox", NULL} }, | |
| - { XK_Menu, 0, (Arg) { "interrobang", NULL } }, | |
| +typedef struct Bind { KeySym sym; int mod; const char *const *args; } Bind; | |
| +typedef const char *const Arg[]; | |
| + | |
| +Arg tmux_client = (Arg) {"st", "-e", "tmux", "new-session", NULL }; | |
| + | |
| +static Bind bind[] = | |
| +{ | |
| + { XK_Return, Mod4Mask, (Arg) {"tmux", "rename-… | |
| + { XK_Tab, Mod4Mask, (Arg) {"tmux", "last-pa… | |
| + { XK_space, Mod4Mask, (Arg) {"tmux", "new-win… | |
| + { XK_1, Mod4Mask, (Arg) {"tmux", "… | |
| + { XK_2, Mod4Mask, (Arg) {"tmux", "… | |
| + { XK_3, Mod4Mask, (Arg) {"tmux", "… | |
| + { XK_4, Mod4Mask, (Arg) {"tmux", "… | |
| + { XK_5, Mod4Mask, (Arg) {"tmux", "… | |
| + { XK_6, Mod4Mask, (Arg) {"tmux", "… | |
| + { XK_7, Mod4Mask, (Arg) {"tmux", "… | |
| + { XK_8, Mod4Mask, (Arg) {"tmux", "… | |
| + { XK_9, Mod4Mask, (Arg) {"tmux", "… | |
| + { XK_h, Mod4Mask, (Arg) {"tmux", "… | |
| + { XK_v, Mod4Mask, (Arg) {"tmux", "… | |
| + { XK_f, Mod4Mask, (Arg) {"firefox", NULL }… | |
| + { XK_p, Mod4Mask, (Arg) {"rofi", "… | |
| + { XK_z, Mod4Mask, (Arg) {"/home/jay/.bin/battery", … | |
| + { XK_x, Mod4Mask, (Arg) {"/home/jay/.bin/all-time", NULL }… | |
| }; | |
| -/* End of potential "config.h" content | |
| - */ | |
| static void buttonpress(XEvent *); | |
| static void configurerequest(XEvent *); | |
| @@ -56,122 +53,152 @@ static void unmapnotify(XEvent *); | |
| static Display *dpy; | |
| static Window root; | |
| static int sw, sh; | |
| -static void (*handler[LASTEvent])(XEvent *) = { | |
| - [ButtonPress] = buttonpress, | |
| - [ConfigureRequest] = configurerequest, | |
| - [EnterNotify] = enternotify, | |
| - [KeyPress] = keypress, | |
| - [MapRequest] = maprequest, | |
| +static void (*handler[LASTEvent])(XEvent *) = | |
| +{ | |
| + [ButtonPress] = buttonpress, | |
| + [ConfigureRequest] = configurerequest, | |
| + [EnterNotify] = enternotify, | |
| + [KeyPress] = keypress, | |
| + [MapRequest] = maprequest, | |
| }; | |
| -static int xerror(Display *d, XErrorEvent *e) { | |
| +static int xerror(Display *d, XErrorEvent *e) | |
| +{ | |
| char msg[256]; | |
| + | |
| XGetErrorText(d, e->error_code, msg, sizeof(msg)); | |
| - fprintf(stderr,"[X11 %d:%d] %s\n", e->request_code, e->error_code, msg… | |
| + fprintf(stderr, "[X11 %d:%d] %s\n", e->request_code, e->error_code, ms… | |
| } | |
| -static inline int spawn(Arg args) { | |
| - if (fork() != 0) return 1; | |
| +static inline int spawn(Arg args) | |
| +{ | |
| + if (fork() != 0) | |
| + return 1; | |
| close(ConnectionNumber(dpy)); | |
| setsid(); | |
| execvp(args[0], args); | |
| } | |
| -int main(int argc, const char **argv) { | |
| +int main(int argc, const char **argv) | |
| +{ | |
| signal(SIGCHLD, SIG_IGN); | |
| - if(!(dpy = XOpenDisplay(0x0))) return 1; | |
| + if (!(dpy = XOpenDisplay(0x0))) | |
| + return 1; | |
| XSetErrorHandler(xerror); | |
| root = DefaultRootWindow(dpy); | |
| sw = DisplayWidth(dpy, DefaultScreen(dpy)); | |
| sh = DisplayHeight(dpy, DefaultScreen(dpy)); | |
| XGrabKey(dpy, XKeysymToKeycode(dpy, XK_Tab), Mod1Mask, root, True, Gra… | |
| - XGrabKey(dpy, XKeysymToKeycode(dpy, XK_Return), Mod4Mask|ShiftMask, ro… | |
| + XGrabKey(dpy, XKeysymToKeycode(dpy, XK_Return), Mod4Mask | ShiftMask, … | |
| int i; | |
| - for (i = 0; i < sizeof(bind)/sizeof(bind[0]); ++i) | |
| + for (i = 0; i < sizeof(bind) / sizeof(bind[0]); ++i) | |
| XGrabKey(dpy, XKeysymToKeycode(dpy, bind[i].sym), bind[i].mod,… | |
| XGrabButton(dpy, AnyButton, Mod4Mask, root, True, ButtonPressMask, Gra… | |
| XSelectInput(dpy, root, SubstructureNotifyMask | SubstructureRedirectM… | |
| XEvent ev; | |
| spawn(tmux_client); | |
| - while (!XNextEvent(dpy,&ev)) | |
| - if (handler[ev.type]) handler[ev.type](&ev); | |
| + while (!XNextEvent(dpy, &ev)) | |
| + if (handler[ev.type]) | |
| + handler[ev.type](&ev); | |
| return 0; | |
| } | |
| -void buttonpress(XEvent *ev) { | |
| +void buttonpress(XEvent *ev) | |
| +{ | |
| XButtonEvent *e = &ev->xbutton; | |
| + | |
| XRaiseWindow(dpy, e->subwindow); | |
| if (e->button == 2) | |
| XMoveResizeWindow(dpy, e->subwindow, 0, 0, sw, sh); | |
| - if (e->button != 1 && e->button !=3) | |
| + if (e->button != 1 && e->button != 3) | |
| return; | |
| XGrabPointer(dpy, root, True, PointerMotionMask | ButtonReleaseMask, | |
| - GrabModeAsync, GrabModeAsync, None, None, CurrentTime); | |
| + GrabModeAsync, GrabModeAsync, None, None, CurrentTime); | |
| XWindowAttributes attr; | |
| XGetWindowAttributes(dpy, e->subwindow, &attr); | |
| int xx = e->x_root, yy = e->y_root, px, py; | |
| XEvent ee; | |
| while (!XMaskEvent(dpy, PointerMotionMask | ButtonReleaseMask, &ee)) { | |
| - if (ee.type == ButtonRelease) break; | |
| + if (ee.type == ButtonRelease) | |
| + break; | |
| px = xx; py = yy; xx = ee.xbutton.x_root; yy = ee.xbutton.y_ro… | |
| - if (e->button == 1) { attr.x += xx - px; attr.y += yy - py; } | |
| - else if (e->button == 3) { | |
| + if (e->button == 1) { | |
| + attr.x += xx - px; attr.y += yy - py; | |
| + } else if (e->button == 3) { | |
| attr.width += xx - px; attr.height += yy - py; | |
| - if (attr.width < 12) attr.width = 12; | |
| - else if (attr.height < 12) attr.height = 12; | |
| + if (attr.width < 12) | |
| + attr.width = 12; | |
| + else if (attr.height < 12) | |
| + attr.height = 12; | |
| } | |
| XMoveResizeWindow(dpy, e->subwindow, attr.x, attr.y, attr.widt… | |
| } | |
| XUngrabPointer(dpy, CurrentTime); | |
| } | |
| -void configurerequest(XEvent *ev) { | |
| +void configurerequest(XEvent *ev) | |
| +{ | |
| XConfigureRequestEvent *e = &ev->xconfigurerequest; | |
| XWindowChanges wc; | |
| + | |
| wc.x = e->x; wc.y = e->y; wc.width = e->width; wc.height = e->height; | |
| wc.sibling = Above; wc.stack_mode = e->detail; wc.border_width = e->bo… | |
| XConfigureWindow(dpy, e->window, e->value_mask, &wc); | |
| } | |
| -void enternotify(XEvent *ev) { | |
| +void enternotify(XEvent *ev) | |
| +{ | |
| XSetInputFocus(dpy, ev->xcrossing.window, RevertToPointerRoot, Current… | |
| } | |
| -void keypress(XEvent *ev) { | |
| +void keypress(XEvent *ev) | |
| +{ | |
| XKeyEvent *e = &ev->xkey; | |
| KeySym sym = XkbKeycodeToKeysym(dpy, e->keycode, 0, 0); | |
| int i; | |
| - if (e->state == Mod1Mask && sym == XK_Tab) | |
| + | |
| + if (e->state == Mod1Mask && sym == XK_Tab) { | |
| XCirculateSubwindowsUp(dpy, root); | |
| - else if (e->state == (Mod4Mask|ShiftMask) && sym == XK_Return) | |
| + } else if (e->state == (Mod4Mask | ShiftMask) && sym == XK_Return) { | |
| spawn(tmux_client); | |
| - else for (i = 0; i < sizeof(bind)/sizeof(bind[0]); ++i) | |
| - if (bind[i].sym == sym && bind[i].mod == e->state && bind[i].a… | |
| + } else { | |
| + for (i = 0; i < sizeof(bind) / sizeof(bind[0]); ++i) | |
| + if (bind[i].sym == sym && bind[i].mod == e->state && b… | |
| spawn(bind[i].args); | |
| + } | |
| } | |
| -#define MapFocus 0x01 | |
| -#define MapFull 0x02 | |
| -void maprequest(XEvent *ev) { | |
| +#define MapFocus 0x01 | |
| +#define MapFull 0x02 | |
| + | |
| +void maprequest(XEvent *ev) | |
| +{ | |
| XMapRequestEvent *e = &ev->xmaprequest; | |
| XWindowAttributes wa; | |
| + | |
| if (!XGetWindowAttributes(dpy, e->window, &wa) || wa.override_redirect) | |
| return; | |
| int flags = MapFocus | MapFull; | |
| XWMHints *wmHint; | |
| - if ( (wmHint=XGetWMHints(dpy,e->window)) ) { | |
| - if (wmHint->flags & InputHint && !wmHint->input) flags &= ~Map… | |
| + if ((wmHint = XGetWMHints(dpy, e->window))) { | |
| + if (wmHint->flags & InputHint && !wmHint->input) | |
| + flags &= ~MapFocus; | |
| XFree(wmHint); | |
| } | |
| XClassHint csHint; | |
| XGetClassHint(dpy, e->window, &csHint); | |
| - if (strncmp(csHint.res_name,"Float",5) == 0) flags &= ~MapFull; | |
| - if (strncmp(csHint.res_class,"Float",5) == 0) flags &= ~MapFull; | |
| + if (strncmp(csHint.res_name, "Float", 5) == 0) | |
| + flags &= ~MapFull; | |
| + if (strncmp(csHint.res_class, "Float", 5) == 0) | |
| + flags &= ~MapFull; | |
| Window parent; | |
| - if (XGetTransientForHint(dpy, e->window, &parent)) flags &= ~MapFull; | |
| - if (flags & MapFocus) XSelectInput(dpy, e->window, EnterWindowMask); | |
| - if (flags & MapFull) XMoveResizeWindow(dpy, e->window, 0, 0, sw, sh); | |
| - else XMoveResizeWindow(dpy, e->window, wa.x, wa.y, wa.width, wa.height… | |
| + if (XGetTransientForHint(dpy, e->window, &parent)) | |
| + flags &= ~MapFull; | |
| + if (flags & MapFocus) | |
| + XSelectInput(dpy, e->window, EnterWindowMask); | |
| + if (flags & MapFull) | |
| + XMoveResizeWindow(dpy, e->window, 0, 0, sw, sh); | |
| + else | |
| + XMoveResizeWindow(dpy, e->window, wa.x, wa.y, wa.width, wa.hei… | |
| XMapWindow(dpy, e->window); | |
| } | |
| - |