Xinqi Bao's Git
f4b0ba1c5c5a8a1e0edb77921d15b7c85982a54e
2 * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
3 * See LICENSE file for license details.
11 #include <X11/keysym.h>
12 #include <X11/Xatom.h>
16 static void ckill(Arg
*arg
);
17 static void nextc(Arg
*arg
);
18 static void prevc(Arg
*arg
);
19 static void max(Arg
*arg
);
20 static void ttrunc(Arg
*arg
);
21 static void tappend(Arg
*arg
);
22 static void zoom(Arg
*arg
);
24 /********** CUSTOMIZE **********/
26 const char *term
[] = {
27 "urxvtc", "-tr", "+sb", "-bg", "black", "-fg", "white", "-fn",
28 "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*",NULL
30 const char *browse
[] = { "firefox", NULL
};
31 const char *xlock
[] = { "xlock", NULL
};
34 /* modifier key function arguments */
35 { Mod1Mask
, XK_Return
, zoom
, { 0 } },
36 { Mod1Mask
, XK_k
, prevc
, { 0 } },
37 { Mod1Mask
, XK_j
, nextc
, { 0 } },
38 { Mod1Mask
, XK_m
, max
, { 0 } },
39 { Mod1Mask
, XK_0
, view
, { .i
= Tscratch
} },
40 { Mod1Mask
, XK_1
, view
, { .i
= Tdev
} },
41 { Mod1Mask
, XK_2
, view
, { .i
= Twww
} },
42 { Mod1Mask
, XK_3
, view
, { .i
= Twork
} },
43 { Mod1Mask
, XK_space
, tiling
, { 0 } },
44 { Mod1Mask
|ShiftMask
, XK_space
, floating
, { 0 } },
45 { Mod1Mask
|ShiftMask
, XK_0
, ttrunc
, { .i
= Tscratch
} },
46 { Mod1Mask
|ShiftMask
, XK_1
, ttrunc
, { .i
= Tdev
} },
47 { Mod1Mask
|ShiftMask
, XK_2
, ttrunc
, { .i
= Twww
} },
48 { Mod1Mask
|ShiftMask
, XK_3
, ttrunc
, { .i
= Twork
} },
49 { Mod1Mask
|ShiftMask
, XK_c
, ckill
, { 0 } },
50 { Mod1Mask
|ShiftMask
, XK_q
, quit
, { 0 } },
51 { Mod1Mask
|ShiftMask
, XK_Return
, spawn
, { .argv
= term
} },
52 { Mod1Mask
|ShiftMask
, XK_w
, spawn
, { .argv
= browse
} },
53 { Mod1Mask
|ShiftMask
, XK_l
, spawn
, { .argv
= xlock
} },
54 { ControlMask
, XK_0
, tappend
, { .i
= Tscratch
} },
55 { ControlMask
, XK_1
, tappend
, { .i
= Tdev
} },
56 { ControlMask
, XK_2
, tappend
, { .i
= Twww
} },
57 { ControlMask
, XK_3
, tappend
, { .i
= Twork
} },
60 /********** CUSTOMIZE **********/
65 static unsigned int len
= key
? sizeof(key
) / sizeof(key
[0]) : 0;
69 for(i
= 0; i
< len
; i
++) {
70 code
= XKeysymToKeycode(dpy
, key
[i
].keysym
);
71 XUngrabKey(dpy
, code
, key
[i
].mod
, root
);
72 XGrabKey(dpy
, code
, key
[i
].mod
, root
, True
,
73 GrabModeAsync
, GrabModeAsync
);
80 XKeyEvent
*ev
= &e
->xkey
;
81 static unsigned int len
= key
? sizeof(key
) / sizeof(key
[0]) : 0;
85 keysym
= XKeycodeToKeysym(dpy
, (KeyCode
)ev
->keycode
, 0);
86 for(i
= 0; i
< len
; i
++)
87 if((keysym
== key
[i
].keysym
) && (key
[i
].mod
== ev
->state
)) {
89 key
[i
].func(&key
[i
].arg
);
102 if(sel
== getnext(clients
) && sel
->next
) {
103 if((c
= getnext(sel
->next
)))
107 for(l
= &clients
; *l
&& *l
!= sel
; l
= &(*l
)->next
);
110 sel
->next
= clients
; /* pop */
123 sel
->w
= sw
- 2 * sel
->border
;
124 sel
->h
= sh
- 2 * sel
->border
- bh
;
135 sel
->tags
[arg
->i
] = tags
[arg
->i
];
146 for(i
= 0; i
< TLast
; i
++)
159 if((c
= sel
->revert
&& sel
->revert
->tags
[tsel
] ? sel
->revert
: NULL
)) {
173 if(!(c
= getnext(sel
->next
)))
174 c
= getnext(clients
);
187 if(sel
->proto
& WM_PROTOCOL_DELWIN
)
188 sendevent(sel
->win
, wm_atom
[WMProtocols
], wm_atom
[WMDelete
]);
190 XKillClient(dpy
, sel
->win
);