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