1 module events.keyboard; 2 3 import kernel; 4 import old; 5 import config; 6 import types; 7 import cboxapp; 8 import gui.bar; 9 10 import deimos.X11.X; 11 import deimos.X11.Xlib; 12 import deimos.X11.keysymdef; 13 import deimos.X11.Xutil; 14 import deimos.X11.Xatom; 15 import std.stdio; 16 import events.interfaces; 17 18 struct Key { 19 uint mod; 20 KeySym keysym; 21 void function(const Arg* a) func; 22 const Arg arg; 23 24 this(uint mod, KeySym keysym, void function(const Arg* a) func) { 25 this(mod, keysym, func, null); 26 } 27 this(T)(uint mod, KeySym keysym, void function(const Arg* a) func, T arg) { 28 this.mod = mod; 29 this.keysym = keysym; 30 this.func = func; 31 this.arg = makeArg(arg); 32 } 33 } 34 35 class KeyboardEvents : EventInterface 36 { 37 Key[] keys; 38 39 this() 40 { 41 keys = [ 42 Key( MODKEY, XK_p, &spawn, dmenucmd ), // dmenucmd 43 Key( MODKEY|ShiftMask, XK_Return, &spawn, termcmd ), // termcmd 44 Key( MODKEY, XK_b, &togglebar ), 45 Key( MODKEY, XK_j, &focusstack, +1 ), 46 Key( MODKEY, XK_k, &focusstack, -1 ), 47 Key( MODKEY, XK_i, &incnmaster, +1 ), 48 Key( MODKEY, XK_d, &incnmaster, -1 ), 49 Key( MODKEY, XK_h, &setmfact, -0.05 ), 50 Key( MODKEY, XK_l, &setmfact, +0.05 ), 51 Key( MODKEY, XK_Return, &zoom ), 52 Key( MODKEY, XK_Tab, &view ), 53 Key( MODKEY|ShiftMask, XK_c, &killclient ), 54 Key( MODKEY, XK_t, &setlayout, &layouts[0] ), 55 Key( MODKEY, XK_f, &setlayout, &layouts[1] ), 56 Key( MODKEY, XK_m, &setlayout, &layouts[2] ), 57 Key( MODKEY, XK_space, &setlayout, 0 ), 58 Key( MODKEY|ShiftMask, XK_space, &togglefloating, 0 ), 59 Key( MODKEY, XK_0, &view, ~0 ), 60 Key( MODKEY|ShiftMask, XK_0, &tag, ~0 ), 61 Key( MODKEY, XK_comma, &focusmon, -1 ), 62 Key( MODKEY, XK_period, &focusmon, +1 ), 63 Key( MODKEY|ShiftMask, XK_comma, &tagmon, -1 ), 64 Key( MODKEY|ShiftMask, XK_period, &tagmon, +1 ), 65 Key( MODKEY, XK_1, &view, 1<<0 ), 66 Key( MODKEY|ControlMask, XK_1, &toggleview, 1<<0 ), 67 Key( MODKEY|ShiftMask, XK_1, &tag, 1<<0 ), 68 Key( MODKEY|ControlMask|ShiftMask, XK_1, &toggletag, 1<<0 ), 69 Key( MODKEY, XK_2, &view, 1<<1 ), 70 Key( MODKEY|ControlMask, XK_2, &toggleview, 1<<1 ), 71 Key( MODKEY|ShiftMask, XK_2, &tag, 1<<1 ), 72 Key( MODKEY|ControlMask|ShiftMask, XK_2, &toggletag, 1<<1 ), 73 Key( MODKEY, XK_3, &view, 1<<2 ), 74 Key( MODKEY|ControlMask, XK_3, &toggleview, 1<<2 ), 75 Key( MODKEY|ShiftMask, XK_3, &tag, 1<<2 ), 76 Key( MODKEY|ControlMask|ShiftMask, XK_3, &toggletag, 1<<2 ), 77 Key( MODKEY, XK_4, &view, 1<<3 ), 78 Key( MODKEY|ControlMask, XK_4, &toggleview, 1<<3 ), 79 Key( MODKEY|ShiftMask, XK_4, &tag, 1<<3 ), 80 Key( MODKEY|ControlMask|ShiftMask, XK_4, &toggletag, 1<<3 ), 81 Key( MODKEY, XK_5, &view, 1<<4 ), 82 Key( MODKEY|ControlMask, XK_5, &toggleview, 1<<4 ), 83 Key( MODKEY|ShiftMask, XK_5, &tag, 1<<4 ), 84 Key( MODKEY|ControlMask|ShiftMask, XK_5, &toggletag, 1<<4 ), 85 Key( MODKEY, XK_6, &view, 1<<5 ), 86 Key( MODKEY|ControlMask, XK_6, &toggleview, 1<<5 ), 87 Key( MODKEY|ShiftMask, XK_6, &tag, 1<<5 ), 88 Key( MODKEY|ControlMask|ShiftMask, XK_6, &toggletag, 1<<5 ), 89 Key( MODKEY, XK_7, &view, 1<<6 ), 90 Key( MODKEY|ControlMask, XK_7, &toggleview, 1<<6 ), 91 Key( MODKEY|ShiftMask, XK_7, &tag, 1<<6 ), 92 Key( MODKEY|ControlMask|ShiftMask, XK_7, &toggletag, 1<<6 ), 93 Key( MODKEY, XK_8, &view, 1<<7 ), 94 Key( MODKEY|ControlMask, XK_8, &toggleview, 1<<7 ), 95 Key( MODKEY|ShiftMask, XK_8, &tag, 1<<7 ), 96 Key( MODKEY|ControlMask|ShiftMask, XK_8, &toggletag, 1<<7 ), 97 Key( MODKEY, XK_9, &view, 1<<8 ), 98 Key( MODKEY|ControlMask, XK_9, &toggleview, 1<<8 ), 99 Key( MODKEY|ShiftMask, XK_9, &tag, 1<<8 ), 100 Key( MODKEY|ControlMask|ShiftMask, XK_9, &toggletag, 1<<8 ), 101 Key( MODKEY|ShiftMask, XK_q, &quit ) 102 ]; 103 } 104 105 void addEvent() 106 { 107 } 108 109 void listen(XEvent *e) 110 { 111 switch (e.type) { 112 case KeyPress: 113 this.keypress(e); 114 break; 115 default: { } 116 } 117 } 118 119 void keypress(XEvent *e) 120 { 121 uint i; 122 KeySym keysym; 123 XKeyEvent *ev; 124 125 ev = &e.xkey; 126 keysym = XKeycodeToKeysym(AppDisplay.instance().dpy, cast(KeyCode)ev.keycode, 0); 127 foreach(ref const key; keys) { 128 if(keysym == key.keysym 129 && CLEANMASK(key.mod) == CLEANMASK(ev.state) 130 && key.func) { 131 key.func( &(key.arg) ); 132 } 133 } 134 } 135 136 void grabkeys() 137 { 138 updatenumlockmask(); 139 { 140 uint i, j; 141 uint[] modifiers = [ 0, LockMask, numlockmask, numlockmask|LockMask ]; 142 KeyCode code; 143 144 XUngrabKey(AppDisplay.instance().dpy, AnyKey, AnyModifier, rootWin); 145 foreach(ref const key; keys) { 146 code = XKeysymToKeycode(AppDisplay.instance().dpy, key.keysym); 147 if(code) { 148 foreach(ref const mod; modifiers) { 149 XGrabKey(AppDisplay.instance().dpy, code, key.mod | mod, rootWin, 150 True, GrabModeAsync, GrabModeAsync); 151 } 152 } 153 } 154 } 155 } 156 157 Key[] getKeys() 158 { 159 return this.keys; 160 } 161 }