88 lines
2.2 KiB
C
88 lines
2.2 KiB
C
|
# 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
|
||
|
}
|