added dev.c instead of kb.c
44f2e8b9
6 file(s) · +137 −146
| 3 | 3 | ||
| 4 | 4 | include config.mk |
|
| 5 | 5 | ||
| 6 | - | SRC = client.c draw.c event.c kb.c mouse.c util.c wm.c |
|
| 6 | + | SRC = client.c dev.c draw.c event.c util.c wm.c |
|
| 7 | 7 | OBJ = ${SRC:.c=.o} |
|
| 8 | 8 | MAN1 = dwm.1 |
|
| 9 | 9 | BIN = dwm |
| 37 | 37 | Configuration |
|
| 38 | 38 | ------------- |
|
| 39 | 39 | The configuration of dwm is done by customizing the wm.h source file. To |
|
| 40 | - | customize the key bindings edit kb.c. |
|
| 40 | + | customize the key bindings edit dev.c. |
| 1 | + | /* |
|
| 2 | + | * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> |
|
| 3 | + | * See LICENSE file for license details. |
|
| 4 | + | */ |
|
| 5 | + | ||
| 6 | + | #include "wm.h" |
|
| 7 | + | ||
| 8 | + | #include <stdlib.h> |
|
| 9 | + | #include <string.h> |
|
| 10 | + | #include <unistd.h> |
|
| 11 | + | #include <X11/keysym.h> |
|
| 12 | + | ||
| 13 | + | /********** CUSTOMIZE **********/ |
|
| 14 | + | ||
| 15 | + | const char *term[] = { |
|
| 16 | + | "aterm", "-tr", "+sb", "-bg", "black", "-fg", "white", "-fn", |
|
| 17 | + | "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*",NULL |
|
| 18 | + | }; |
|
| 19 | + | const char *browse[] = { "firefox", NULL }; |
|
| 20 | + | ||
| 21 | + | static Key key[] = { |
|
| 22 | + | { Mod1Mask, XK_Return, (void (*)(void *))spawn, term }, |
|
| 23 | + | { Mod1Mask, XK_w, (void (*)(void *))spawn, browse }, |
|
| 24 | + | { Mod1Mask, XK_k, sel, "prev" }, |
|
| 25 | + | { Mod1Mask, XK_j, sel, "next" }, |
|
| 26 | + | { Mod1Mask, XK_space, toggle, NULL }, |
|
| 27 | + | { Mod1Mask, XK_m, max, NULL }, |
|
| 28 | + | { Mod1Mask | ShiftMask, XK_c, ckill, NULL }, |
|
| 29 | + | { Mod1Mask | ShiftMask, XK_q, quit, NULL }, |
|
| 30 | + | }; |
|
| 31 | + | ||
| 32 | + | /********** CUSTOMIZE **********/ |
|
| 33 | + | ||
| 34 | + | void |
|
| 35 | + | update_keys(void) |
|
| 36 | + | { |
|
| 37 | + | unsigned int i, len; |
|
| 38 | + | KeyCode code; |
|
| 39 | + | ||
| 40 | + | len = sizeof(key) / sizeof(key[0]); |
|
| 41 | + | for(i = 0; i < len; i++) { |
|
| 42 | + | code = XKeysymToKeycode(dpy, key[i].keysym); |
|
| 43 | + | XUngrabKey(dpy, code, key[i].mod, root); |
|
| 44 | + | XGrabKey(dpy, code, key[i].mod, root, True, GrabModeAsync, GrabModeAsync); |
|
| 45 | + | } |
|
| 46 | + | } |
|
| 47 | + | ||
| 48 | + | void |
|
| 49 | + | keypress(XEvent *e) |
|
| 50 | + | { |
|
| 51 | + | XKeyEvent *ev = &e->xkey; |
|
| 52 | + | unsigned int i, len; |
|
| 53 | + | KeySym keysym; |
|
| 54 | + | ||
| 55 | + | keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); |
|
| 56 | + | len = sizeof(key) / sizeof(key[0]); |
|
| 57 | + | for(i = 0; i < len; i++) |
|
| 58 | + | if((keysym == key[i].keysym) && (key[i].mod == ev->state)) { |
|
| 59 | + | if(key[i].func) |
|
| 60 | + | key[i].func(key[i].aux); |
|
| 61 | + | return; |
|
| 62 | + | } |
|
| 63 | + | } |
|
| 64 | + | ||
| 65 | + | #define ButtonMask (ButtonPressMask | ButtonReleaseMask) |
|
| 66 | + | #define MouseMask (ButtonMask | PointerMotionMask) |
|
| 67 | + | ||
| 68 | + | void |
|
| 69 | + | mresize(Client *c) |
|
| 70 | + | { |
|
| 71 | + | XEvent ev; |
|
| 72 | + | int ocx, ocy; |
|
| 73 | + | ||
| 74 | + | ocx = c->x; |
|
| 75 | + | ocy = c->y; |
|
| 76 | + | if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync, |
|
| 77 | + | None, cursor[CurResize], CurrentTime) != GrabSuccess) |
|
| 78 | + | return; |
|
| 79 | + | XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h); |
|
| 80 | + | for(;;) { |
|
| 81 | + | XMaskEvent(dpy, MouseMask | ExposureMask, &ev); |
|
| 82 | + | switch(ev.type) { |
|
| 83 | + | default: break; |
|
| 84 | + | case Expose: |
|
| 85 | + | handler[Expose](&ev); |
|
| 86 | + | break; |
|
| 87 | + | case MotionNotify: |
|
| 88 | + | XFlush(dpy); |
|
| 89 | + | c->w = abs(ocx - ev.xmotion.x); |
|
| 90 | + | c->h = abs(ocy - ev.xmotion.y); |
|
| 91 | + | c->x = (ocx <= ev.xmotion.x) ? ocx : ocx - c->w; |
|
| 92 | + | c->y = (ocy <= ev.xmotion.y) ? ocy : ocy - c->h; |
|
| 93 | + | resize(c); |
|
| 94 | + | break; |
|
| 95 | + | case ButtonRelease: |
|
| 96 | + | XUngrabPointer(dpy, CurrentTime); |
|
| 97 | + | return; |
|
| 98 | + | } |
|
| 99 | + | } |
|
| 100 | + | } |
|
| 101 | + | ||
| 102 | + | void |
|
| 103 | + | mmove(Client *c) |
|
| 104 | + | { |
|
| 105 | + | XEvent ev; |
|
| 106 | + | int x1, y1, ocx, ocy, di; |
|
| 107 | + | unsigned int dui; |
|
| 108 | + | Window dummy; |
|
| 109 | + | ||
| 110 | + | ocx = c->x; |
|
| 111 | + | ocy = c->y; |
|
| 112 | + | if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync, |
|
| 113 | + | None, cursor[CurMove], CurrentTime) != GrabSuccess) |
|
| 114 | + | return; |
|
| 115 | + | XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); |
|
| 116 | + | for(;;) { |
|
| 117 | + | XMaskEvent(dpy, MouseMask | ExposureMask, &ev); |
|
| 118 | + | switch (ev.type) { |
|
| 119 | + | default: break; |
|
| 120 | + | case Expose: |
|
| 121 | + | handler[Expose](&ev); |
|
| 122 | + | break; |
|
| 123 | + | case MotionNotify: |
|
| 124 | + | XFlush(dpy); |
|
| 125 | + | c->x = ocx + (ev.xmotion.x - x1); |
|
| 126 | + | c->y = ocy + (ev.xmotion.y - y1); |
|
| 127 | + | resize(c); |
|
| 128 | + | break; |
|
| 129 | + | case ButtonRelease: |
|
| 130 | + | XUngrabPointer(dpy, CurrentTime); |
|
| 131 | + | return; |
|
| 132 | + | } |
|
| 133 | + | } |
|
| 134 | + | } |
| 1 | - | /* |
|
| 2 | - | * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> |
|
| 3 | - | * See LICENSE file for license details. |
|
| 4 | - | */ |
|
| 5 | - | ||
| 6 | - | #include "wm.h" |
|
| 7 | - | ||
| 8 | - | #include <X11/keysym.h> |
|
| 9 | - | ||
| 10 | - | /********** CUSTOMIZE **********/ |
|
| 11 | - | ||
| 12 | - | const char *term[] = { |
|
| 13 | - | "aterm", "-tr", "+sb", "-bg", "black", "-fg", "white", "-fn", |
|
| 14 | - | "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*",NULL |
|
| 15 | - | }; |
|
| 16 | - | const char *browse[] = { "firefox", NULL }; |
|
| 17 | - | ||
| 18 | - | static Key key[] = { |
|
| 19 | - | { Mod1Mask, XK_Return, (void (*)(void *))spawn, term }, |
|
| 20 | - | { Mod1Mask, XK_w, (void (*)(void *))spawn, browse }, |
|
| 21 | - | { Mod1Mask, XK_k, sel, "prev" }, |
|
| 22 | - | { Mod1Mask, XK_j, sel, "next" }, |
|
| 23 | - | { Mod1Mask, XK_space, toggle, NULL }, |
|
| 24 | - | { Mod1Mask, XK_m, max, NULL }, |
|
| 25 | - | { Mod1Mask | ShiftMask, XK_c, ckill, NULL }, |
|
| 26 | - | { Mod1Mask | ShiftMask, XK_q, quit, NULL }, |
|
| 27 | - | }; |
|
| 28 | - | ||
| 29 | - | /********** CUSTOMIZE **********/ |
|
| 30 | - | ||
| 31 | - | void |
|
| 32 | - | update_keys(void) |
|
| 33 | - | { |
|
| 34 | - | unsigned int i, len; |
|
| 35 | - | KeyCode code; |
|
| 36 | - | ||
| 37 | - | len = sizeof(key) / sizeof(key[0]); |
|
| 38 | - | for(i = 0; i < len; i++) { |
|
| 39 | - | code = XKeysymToKeycode(dpy, key[i].keysym); |
|
| 40 | - | XUngrabKey(dpy, code, key[i].mod, root); |
|
| 41 | - | XGrabKey(dpy, code, key[i].mod, root, True, GrabModeAsync, GrabModeAsync); |
|
| 42 | - | } |
|
| 43 | - | } |
|
| 44 | - | ||
| 45 | - | void |
|
| 46 | - | keypress(XEvent *e) |
|
| 47 | - | { |
|
| 48 | - | XKeyEvent *ev = &e->xkey; |
|
| 49 | - | unsigned int i, len; |
|
| 50 | - | KeySym keysym; |
|
| 51 | - | ||
| 52 | - | keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); |
|
| 53 | - | len = sizeof(key) / sizeof(key[0]); |
|
| 54 | - | for(i = 0; i < len; i++) |
|
| 55 | - | if((keysym == key[i].keysym) && (key[i].mod == ev->state)) { |
|
| 56 | - | if(key[i].func) |
|
| 57 | - | key[i].func(key[i].aux); |
|
| 58 | - | return; |
|
| 59 | - | } |
|
| 60 | - | } |
| 1 | - | /* |
|
| 2 | - | * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> |
|
| 3 | - | * See LICENSE file for license details. |
|
| 4 | - | */ |
|
| 5 | - | ||
| 6 | - | #include <stdlib.h> |
|
| 7 | - | #include <string.h> |
|
| 8 | - | #include <unistd.h> |
|
| 9 | - | ||
| 10 | - | #include "wm.h" |
|
| 11 | - | ||
| 12 | - | #define ButtonMask (ButtonPressMask | ButtonReleaseMask) |
|
| 13 | - | #define MouseMask (ButtonMask | PointerMotionMask) |
|
| 14 | - | ||
| 15 | - | void |
|
| 16 | - | mresize(Client *c) |
|
| 17 | - | { |
|
| 18 | - | XEvent ev; |
|
| 19 | - | int ocx, ocy; |
|
| 20 | - | ||
| 21 | - | ocx = c->x; |
|
| 22 | - | ocy = c->y; |
|
| 23 | - | if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync, |
|
| 24 | - | None, cursor[CurResize], CurrentTime) != GrabSuccess) |
|
| 25 | - | return; |
|
| 26 | - | XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h); |
|
| 27 | - | for(;;) { |
|
| 28 | - | XMaskEvent(dpy, MouseMask | ExposureMask, &ev); |
|
| 29 | - | switch(ev.type) { |
|
| 30 | - | default: break; |
|
| 31 | - | case Expose: |
|
| 32 | - | handler[Expose](&ev); |
|
| 33 | - | break; |
|
| 34 | - | case MotionNotify: |
|
| 35 | - | XFlush(dpy); |
|
| 36 | - | c->w = abs(ocx - ev.xmotion.x); |
|
| 37 | - | c->h = abs(ocy - ev.xmotion.y); |
|
| 38 | - | c->x = (ocx <= ev.xmotion.x) ? ocx : ocx - c->w; |
|
| 39 | - | c->y = (ocy <= ev.xmotion.y) ? ocy : ocy - c->h; |
|
| 40 | - | resize(c); |
|
| 41 | - | break; |
|
| 42 | - | case ButtonRelease: |
|
| 43 | - | XUngrabPointer(dpy, CurrentTime); |
|
| 44 | - | return; |
|
| 45 | - | } |
|
| 46 | - | } |
|
| 47 | - | } |
|
| 48 | - | ||
| 49 | - | void |
|
| 50 | - | mmove(Client *c) |
|
| 51 | - | { |
|
| 52 | - | XEvent ev; |
|
| 53 | - | int x1, y1, ocx, ocy, di; |
|
| 54 | - | unsigned int dui; |
|
| 55 | - | Window dummy; |
|
| 56 | - | ||
| 57 | - | ocx = c->x; |
|
| 58 | - | ocy = c->y; |
|
| 59 | - | if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync, |
|
| 60 | - | None, cursor[CurMove], CurrentTime) != GrabSuccess) |
|
| 61 | - | return; |
|
| 62 | - | XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); |
|
| 63 | - | for(;;) { |
|
| 64 | - | XMaskEvent(dpy, MouseMask | ExposureMask, &ev); |
|
| 65 | - | switch (ev.type) { |
|
| 66 | - | default: break; |
|
| 67 | - | case Expose: |
|
| 68 | - | handler[Expose](&ev); |
|
| 69 | - | break; |
|
| 70 | - | case MotionNotify: |
|
| 71 | - | XFlush(dpy); |
|
| 72 | - | c->x = ocx + (ev.xmotion.x - x1); |
|
| 73 | - | c->y = ocy + (ev.xmotion.y - y1); |
|
| 74 | - | resize(c); |
|
| 75 | - | break; |
|
| 76 | - | case ButtonRelease: |
|
| 77 | - | XUngrabPointer(dpy, CurrentTime); |
|
| 78 | - | return; |
|
| 79 | - | } |
|
| 80 | - | } |
|
| 81 | - | } |
| 115 | 115 | /* event.c */ |
|
| 116 | 116 | extern void discard_events(long even_mask); |
|
| 117 | 117 | ||
| 118 | - | /* kb.c */ |
|
| 118 | + | /* dev.c */ |
|
| 119 | 119 | extern void update_keys(void); |
|
| 120 | 120 | extern void keypress(XEvent *e); |
|
| 121 | - | ||
| 122 | - | /* mouse.c */ |
|
| 123 | 121 | extern void mresize(Client *c); |
|
| 124 | 122 | extern void mmove(Client *c); |
|
| 125 | 123 |