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 }