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 }