birdwm

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 3232d836c9dd4d9a777200bcc4fee81d69f4d340
parent a03b4eedea522d4bb0dd7ea298751068db0c717c
Author: grouse <bdmfegys@duck.com>
Date:   Fri,  1 Dec 2023 23:53:33 -0500

successfully built after patching exitmenu

Diffstat:
Mconfig.def.h | 6+++++-
Aexitdwm.c | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 92 insertions(+), 1 deletion(-)

diff --git a/config.def.h b/config.def.h @@ -113,6 +113,8 @@ static const char *voldown[] = { "volume.sh", "down", NULL}; static const char *volmute[] = { "volume.sh", "mute", NULL}; static const char *firefox[] = { "librewolf", NULL}; + +#include "exitdwm.c" static const Key keys[] = { /* modifier key function argument */ { MODKEY, XK_p, spawn, {.v = dmenucmd } }, @@ -157,8 +159,10 @@ static const Key keys[] = { TAGKEYS( XK_7, 6) TAGKEYS( XK_8, 7) TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_q, quit, {0} }, +// following line is commented out due to exitmenu patch +// { MODKEY|ShiftMask, XK_q, quit, {0} }, { MODKEY|ControlMask|ShiftMask, XK_q, quit, {1} }, + { MODKEY|ShiftMask, XK_e, exitdwm, {0} }, }; /* button definitions */ diff --git a/exitdwm.c b/exitdwm.c @@ -0,0 +1,87 @@ +# include <stdio.h> +# include <string.h> + +void exitdwm () +{ +# if \ + defined S_LOCK || \ + defined S_RESTART_DWM || \ + defined S_OFFSCREEN || \ + defined S_EXIT || \ + defined S_REBOOT || \ + defined S_SHUTDOWN || \ + defined S_LOCK_ICON || \ + defined S_RESTART_DWM_ICON || \ + defined S_OFFSCREEN_ICON || \ + defined S_EXIT_ICON || \ + defined S_REBOOT_ICON || \ + defined S_SHUTDOWN_ICON || \ + defined S_FORMAT || \ + defined S_FORMAT_CLEAR +# error (conflicting macro names) +# endif + +# define S_LOCK "Lock" +# define S_RESTART_DWM "restart Dwm" +# define S_OFFSCREEN "Off-screen" +# define S_EXIT "Exit" +# define S_REBOOT "Reboot" +# define S_SHUTDOWN "Shutdown" +# define S_LOCK_ICON "\uf023" // <= FontAwesome icons +# define S_RESTART_DWM_ICON "\uf01e" +# define S_OFFSCREEN_ICON "\uf108" +# define S_EXIT_ICON "\uf2f5" +# define S_REBOOT_ICON "\uf021" +# define S_SHUTDOWN_ICON "\uf011" + +# define S_FORMAT(ACTION) S_##ACTION##_ICON " " S_##ACTION +# define S_FORMAT_CLEAR "sed 's/^..//'" + + FILE * exit_menu = popen ( + "echo \"" + S_FORMAT (LOCK) "\n" + S_FORMAT (RESTART_DWM) "\n" + S_FORMAT (OFFSCREEN) "\n" + S_FORMAT (EXIT) "\n" + S_FORMAT (REBOOT) "\n" + S_FORMAT (SHUTDOWN) + "\" | dmenu -p exit: | " S_FORMAT_CLEAR + , + "r" + ); + + char exit_action [16]; + + if ( + exit_menu == NULL || + fscanf (exit_menu, "%15[a-zA-Z -]", exit_action) == EOF + ) { + fputs ("Error. Failure in exit_dwm.", stderr); + goto close_streams; + } + + if (strcmp (exit_action, S_LOCK) == 0) system ("slock & sleep .5; xset dpms force off"); + else if (strcmp (exit_action, S_RESTART_DWM) == 0) quit (& (const Arg) {1}); + else if (strcmp (exit_action, S_OFFSCREEN) == 0) system ("sleep .5; xset dpms force off"); + else if (strcmp (exit_action, S_EXIT) == 0) quit (& (const Arg) {0}); + else if (strcmp (exit_action, S_REBOOT) == 0) system ("systemctl reboot"); + else if (strcmp (exit_action, S_SHUTDOWN) == 0) system ("systemctl poweroff -i"); + +close_streams: + pclose (exit_menu); + +# undef S_LOCK +# undef S_RESTART_DWM +# undef S_OFFSCREEN +# undef S_EXIT +# undef S_REBOOT +# undef S_SHUTDOWN +# undef S_LOCK_ICON +# undef S_RESTART_DWM_ICON +# undef S_OFFSCREEN_ICON +# undef S_EXIT_ICON +# undef S_REBOOT_ICON +# undef S_SHUTDOWN_ICON +# undef S_FORMAT +# undef S_FORMAT_CLEAR +}