dwm-exitmenu-6.3.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-exitmenu-6.3.diff (3498B)
---
1 diff --git a/config.def.h b/config.def.h
2 index a2ac963..92a6a81 100644
3 --- a/config.def.h
4 +++ b/config.def.h
5 @@ -60,6 +60,7 @@ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn()
6 static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
7 static const char *termcmd[] = { "st", NULL };
8
9 +#include "exitdwm.c"
10 static Key keys[] = {
11 /* modifier key function argument */
12 { MODKEY, XK_p, spawn, {.v = dmenucmd } },
13 @@ -94,7 +95,7 @@ static Key keys[] = {
14 TAGKEYS( XK_7, 6)
15 TAGKEYS( XK_8, 7)
16 TAGKEYS( XK_9, 8)
17 - { MODKEY|ShiftMask, XK_q, quit, {0} },
18 + { MODKEY|ShiftMask, XK_e, exitdwm, {0} },
19 };
20
21 /* button definitions */
22 diff --git a/exitdwm.c b/exitdwm.c
23 new file mode 100644
24 index 0000000..74c514f
25 --- /dev/null
26 +++ b/exitdwm.c
27 @@ -0,0 +1,87 @@
28 +# include <stdio.h>
29 +# include <string.h>
30 +
31 +void exitdwm ()
32 +{
33 +# if \
34 + defined S_LOCK || \
35 + defined S_RESTART_DWM || \
36 + defined S_OFFSCREEN || \
37 + defined S_EXIT || \
38 + defined S_REBOOT || \
39 + defined S_SHUTDOWN || \
40 + defined S_LOCK_ICON || \
41 + defined S_RESTART_DWM_ICON || \
42 + defined S_OFFSCREEN_ICON || \
43 + defined S_EXIT_ICON || \
44 + defined S_REBOOT_ICON || \
45 + defined S_SHUTDOWN_ICON || \
46 + defined S_FORMAT || \
47 + defined S_FORMAT_CLEAR
48 +# error (conflicting macro names)
49 +# endif
50 +
51 +# define S_LOCK "Lock"
52 +# define S_RESTART_DWM "restart Dwm"
53 +# define S_OFFSCREEN "Off-screen"
54 +# define S_EXIT "Exit"
55 +# define S_REBOOT "Reboot"
56 +# define S_SHUTDOWN "Shutdown"
57 +# define S_LOCK_ICON "\uf023" // <= FontAwesome icons
58 +# define S_RESTART_DWM_ICON "\uf01e"
59 +# define S_OFFSCREEN_ICON "\uf108"
60 +# define S_EXIT_ICON "\uf2f5"
61 +# define S_REBOOT_ICON "\uf021"
62 +# define S_SHUTDOWN_ICON "\uf011"
63 +
64 +# define S_FORMAT(ACTION) S_##ACTION##_ICON " " S_##ACTION
65 +# define S_FORMAT_CLEAR "sed 's/^..//'"
66 +
67 + FILE * exit_menu = popen (
68 + "echo \""
69 + S_FORMAT (LOCK) "\n"
70 + S_FORMAT (RESTART_DWM) "\n"
71 + S_FORMAT (OFFSCREEN) "\n"
72 + S_FORMAT (EXIT) "\n"
73 + S_FORMAT (REBOOT) "\n"
74 + S_FORMAT (SHUTDOWN)
75 + "\" | dmenu -p exit: | " S_FORMAT_CLEAR
76 + ,
77 + "r"
78 + );
79 +
80 + char exit_action [16];
81 +
82 + if (
83 + exit_menu == NULL ||
84 + fscanf (exit_menu, "%15[a-zA-Z -]", exit_action) == EOF
85 + ) {
86 + fputs ("Error. Failure in exit_dwm.", stderr);
87 + goto close_streams;
88 + }
89 +
90 + if (strcmp (exit_action, S_LOCK) == 0) system ("slock & sleep .5; xset dpms force off");
91 + else if (strcmp (exit_action, S_RESTART_DWM) == 0) quit (& (const Arg) {1});
92 + else if (strcmp (exit_action, S_OFFSCREEN) == 0) system ("sleep .5; xset dpms force off");
93 + else if (strcmp (exit_action, S_EXIT) == 0) quit (& (const Arg) {0});
94 + else if (strcmp (exit_action, S_REBOOT) == 0) system ("systemctl reboot");
95 + else if (strcmp (exit_action, S_SHUTDOWN) == 0) system ("systemctl poweroff -i");
96 +
97 +close_streams:
98 + pclose (exit_menu);
99 +
100 +# undef S_LOCK
101 +# undef S_RESTART_DWM
102 +# undef S_OFFSCREEN
103 +# undef S_EXIT
104 +# undef S_REBOOT
105 +# undef S_SHUTDOWN
106 +# undef S_LOCK_ICON
107 +# undef S_RESTART_DWM_ICON
108 +# undef S_OFFSCREEN_ICON
109 +# undef S_EXIT_ICON
110 +# undef S_REBOOT_ICON
111 +# undef S_SHUTDOWN_ICON
112 +# undef S_FORMAT
113 +# undef S_FORMAT_CLEAR
114 +}