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 +}