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