My build of dwm
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

240 lines
8.3 KiB

  1. diff -up ../dwm-5.8.2-0/config.def.h ./config.def.h
  2. --- ../dwm-5.8.2-0/config.def.h 2010-06-10 22:47:51.660949000 +0200
  3. +++ ./config.def.h 2010-06-11 00:18:55.082073000 +0200
  4. @@ -16,6 +16,9 @@ static const Bool topbar = Tr
  5. /* tagging */
  6. static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
  7. +/* include(s) defining functions */
  8. +#include "keymodes.pre.h"
  9. +
  10. static const Rule rules[] = {
  11. /* class instance title tags mask isfloating monitor */
  12. { "Gimp", NULL, NULL, 0, True, -1 },
  13. @@ -47,9 +50,11 @@ static const Layout layouts[] = {
  14. /* commands */
  15. static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
  16. static const char *termcmd[] = { "uxterm", NULL };
  17. +static const char *helpcmd[] = { "uxterm", "-e", "man", "dwm", NULL };
  18. static Key keys[] = {
  19. /* modifier key function argument */
  20. + { MODKEY, XK_Escape, setkeymode, {.ui = COMMANDMODE} },
  21. { MODKEY, XK_p, spawn, {.v = dmenucmd } },
  22. { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
  23. { MODKEY, XK_b, togglebar, {0} },
  24. @@ -83,6 +88,30 @@ static Key keys[] = {
  25. { MODKEY|ShiftMask, XK_q, quit, {0} },
  26. };
  27. +static Key cmdkeys[] = {
  28. + /* modifier keys function argument */
  29. + { 0, XK_Escape, clearcmd, {0} },
  30. + { ControlMask, XK_c, clearcmd, {0} },
  31. + { 0, XK_i, setkeymode, {.ui = INSERTMODE} },
  32. +};
  33. +static Command commands[] = {
  34. + /* modifier (4 keys) keysyms (4 keys) function argument */
  35. + { {ControlMask, ShiftMask, 0, 0}, {XK_w, XK_h, 0, 0}, setlayout, {.v = &layouts[0]} },
  36. + { {ControlMask, 0, 0, 0}, {XK_w, XK_o, 0, 0}, setlayout, {.v = &layouts[2]} },
  37. + { {ControlMask, ShiftMask, 0, 0}, {XK_w, XK_o, 0, 0}, onlyclient, {0} },
  38. + { {ControlMask, 0, 0, 0}, {XK_w, XK_v, 0, 0}, setlayout, {.v = &layouts[0]} },
  39. + { {ControlMask, 0, 0, 0}, {XK_w, XK_less, 0, 0}, setmfact, {.f = -0.05} },
  40. + { {ControlMask, ShiftMask, 0, 0}, {XK_w, XK_less, 0, 0}, setmfact, {.f = +0.05} },
  41. + { {ControlMask, ShiftMask, 0, 0}, {XK_w, XK_0, 0, 0}, setmfact, {.f = +1.50} },
  42. + { {ShiftMask, 0, 0, 0}, {XK_period, XK_e, 0, 0}, spawn, {.v = dmenucmd} },
  43. + { {ShiftMask, 0, 0, 0}, {XK_period, XK_o, 0, 0}, spawn, {.v = dmenucmd} },
  44. + { {ShiftMask, 0, 0, 0}, {XK_period, XK_h, XK_Return, 0}, spawn, {.v = helpcmd} },
  45. + { {ShiftMask, 0, 0, 0}, {XK_period, XK_q, XK_Return, 0}, quit, {0} },
  46. + { {ShiftMask, 0, 0, 0}, {XK_period, XK_b, XK_d, XK_Return}, killclient, {0} },
  47. + { {ShiftMask, 0, 0, 0}, {XK_period, XK_b, XK_n, XK_Return}, focusstack, {.i = +1} },
  48. + { {ShiftMask, 0, ShiftMask, 0}, {XK_period, XK_b, XK_n, XK_Return}, focusstack, {.i = -1} },
  49. +};
  50. +
  51. /* button definitions */
  52. /* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
  53. static Button buttons[] = {
  54. @@ -100,3 +129,5 @@ static Button buttons[] = {
  55. { ClkTagBar, MODKEY, Button3, toggletag, {0} },
  56. };
  57. +/* include(s) depending on the configuration variables */
  58. +#include "keymodes.post.h"
  59. diff -up ../dwm-5.8.2-0/dwm.c ./dwm.c
  60. --- ../dwm-5.8.2-0/dwm.c 2010-06-10 22:47:51.669677000 +0200
  61. +++ ./dwm.c 2010-06-11 00:18:55.106090000 +0200
  62. @@ -970,7 +970,7 @@ grabbuttons(Client *c, Bool focused) {
  63. }
  64. void
  65. -grabkeys(void) {
  66. +grabdefkeys(void) {
  67. updatenumlockmask();
  68. {
  69. unsigned int i, j;
  70. @@ -1052,7 +1052,7 @@ isuniquegeom(XineramaScreenInfo *unique,
  71. #endif /* XINERAMA */
  72. void
  73. -keypress(XEvent *e) {
  74. +defkeypress(XEvent *e) {
  75. unsigned int i;
  76. KeySym keysym;
  77. XKeyEvent *ev;
  78. diff -up ../dwm-5.8.2-0/keymodes.post.h ./keymodes.post.h
  79. --- ../dwm-5.8.2-0/keymodes.post.h 2010-06-11 00:21:46.000000000 +0200
  80. +++ ./keymodes.post.h 2010-06-11 00:18:55.119222000 +0200
  81. @@ -0,0 +1,124 @@
  82. +/* See LICENSE file for copyright and license details. */
  83. +/* © 2010 joten <joten@freenet.de> */
  84. +
  85. +/* function implementations */
  86. +void
  87. +clearcmd(const Arg *arg) {
  88. + unsigned int i;
  89. +
  90. + for(i = 0; i < LENGTH(cmdkeysym); i++) {
  91. + cmdkeysym[i] = 0;
  92. + cmdmod[i] = 0;
  93. + }
  94. +}
  95. +
  96. +void
  97. +grabkeys(void) {
  98. + if(keymode == INSERTMODE) {
  99. + grabdefkeys();
  100. + } else if(keymode == COMMANDMODE) {
  101. + XUngrabKey(dpy, AnyKey, AnyModifier, root);
  102. + XGrabKey(dpy, AnyKey, AnyModifier, root,
  103. + True, GrabModeAsync, GrabModeAsync);
  104. + }
  105. +}
  106. +
  107. +void
  108. +keypress(XEvent *e) {
  109. + unsigned int i, j;
  110. + Arg a = {0};
  111. + Bool ismatch = False, maybematch = False;
  112. + KeySym keysym;
  113. + XKeyEvent *ev;
  114. +
  115. + if(keymode == INSERTMODE)
  116. + defkeypress(e);
  117. + else if(keymode == COMMANDMODE) {
  118. + ev = &e->xkey;
  119. + keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
  120. + if(keysym < XK_Shift_L || keysym > XK_Hyper_R) {
  121. + for(i = 0; i < LENGTH(cmdkeys); i++)
  122. + if(keysym == cmdkeys[i].keysym
  123. + && CLEANMASK(cmdkeys[i].mod) == CLEANMASK(ev->state)
  124. + && cmdkeys[i].func) {
  125. + cmdkeys[i].func(&(cmdkeys[i].arg));
  126. + ismatch = True;
  127. + break;
  128. + }
  129. + if(!ismatch) {
  130. + for(j = 0; j < LENGTH(cmdkeysym); j++)
  131. + if(cmdkeysym[j] == 0) {
  132. + cmdkeysym[j] = keysym;
  133. + cmdmod[j] = ev->state;
  134. + break;
  135. + }
  136. + for(i = 0; i < LENGTH(commands); i++) {
  137. + for(j = 0; j < LENGTH(cmdkeysym); j++) {
  138. + if(cmdkeysym[j] == commands[i].keysym[j]
  139. + && CLEANMASK(cmdmod[j]) == CLEANMASK(commands[i].mod[j]))
  140. + ismatch = True;
  141. + else if(cmdkeysym[j] == 0
  142. + && cmdmod[j] == 0) {
  143. + ismatch = False;
  144. + maybematch = True;
  145. + break;
  146. + } else {
  147. + ismatch = False;
  148. + break;
  149. + }
  150. + }
  151. + if(ismatch) {
  152. + if(commands[i].func)
  153. + commands[i].func(&(commands[i].arg));
  154. + clearcmd(&a);
  155. + break;
  156. + }
  157. +
  158. + }
  159. + if(!maybematch)
  160. + clearcmd(&a);
  161. + }
  162. + }
  163. + }
  164. +}
  165. +
  166. +void
  167. +onlyclient(const Arg *arg) {
  168. + Client *c;
  169. + XEvent ev;
  170. +
  171. + if(!selmon->sel)
  172. + return;
  173. + for(c = selmon->clients; c; c = c->next)
  174. + if(c != selmon->sel && ISVISIBLE(c)) {
  175. + if(isprotodel(c)) {
  176. + ev.type = ClientMessage;
  177. + ev.xclient.window = c->win;
  178. + ev.xclient.message_type = wmatom[WMProtocols];
  179. + ev.xclient.format = 32;
  180. + ev.xclient.data.l[0] = wmatom[WMDelete];
  181. + ev.xclient.data.l[1] = CurrentTime;
  182. + XSendEvent(dpy, c->win, False, NoEventMask, &ev);
  183. + }
  184. + else {
  185. + XGrabServer(dpy);
  186. + XSetErrorHandler(xerrordummy);
  187. + XSetCloseDownMode(dpy, DestroyAll);
  188. + XKillClient(dpy, c->win);
  189. + XSync(dpy, False);
  190. + XSetErrorHandler(xerror);
  191. + XUngrabServer(dpy);
  192. + }
  193. + }
  194. +}
  195. +
  196. +void
  197. +setkeymode(const Arg *arg) {
  198. + Arg a = {0};
  199. +
  200. + if(!arg)
  201. + return;
  202. + keymode = arg->ui;
  203. + clearcmd(&a);
  204. + grabkeys();
  205. +}
  206. diff -up ../dwm-5.8.2-0/keymodes.pre.h ./keymodes.pre.h
  207. --- ../dwm-5.8.2-0/keymodes.pre.h 2010-06-11 00:21:38.000000000 +0200
  208. +++ ./keymodes.pre.h 2010-06-11 00:18:55.121759000 +0200
  209. @@ -0,0 +1,24 @@
  210. +/* See LICENSE file for copyright and license details. */
  211. +/* © 2010 joten <joten@freenet.de> */
  212. +
  213. +#define COMMANDMODE 1
  214. +#define INSERTMODE 2
  215. +
  216. +typedef struct {
  217. + unsigned int mod[4];
  218. + KeySym keysym[4];
  219. + void (*func)(const Arg *);
  220. + const Arg arg;
  221. +} Command;
  222. +
  223. +/* function declarations */
  224. +static void clearcmd(const Arg *arg);
  225. +static void defkeypress(XEvent *e);
  226. +static void grabdefkeys(void);
  227. +static void onlyclient(const Arg *arg);
  228. +static void setkeymode(const Arg *arg);
  229. +
  230. +/* variables */
  231. +static unsigned int cmdmod[4];
  232. +static unsigned int keymode = COMMANDMODE;
  233. +static KeySym cmdkeysym[4];