dwm-restartsig-20180523-6.2.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-restartsig-20180523-6.2.diff (3313B)
       ---
            1 From 2991f37f0aaf44b9f9b11e7893ff0af8eb88f649 Mon Sep 17 00:00:00 2001
            2 From: Christopher Drelich <cd@cdrakka.com>
            3 Date: Wed, 23 May 2018 22:50:38 -0400
            4 Subject: [PATCH] Modifies quit to handle restarts and adds SIGHUP and SIGTERM
            5  handlers.
            6 
            7 Modified quit() to restart if it receives arg .i = 1
            8 MOD+CTRL+SHIFT+Q was added to confid.def.h to do just that.
            9 
           10 Signal handlers were handled for SIGHUP and SIGTERM.
           11 If dwm receives these signals it calls quit() with
           12 arg .i = to 1 or 0, respectively.
           13 
           14 To restart dwm:
           15 MOD+CTRL+SHIFT+Q
           16 or
           17 kill -HUP dwmpid
           18 
           19 To quit dwm cleanly:
           20 MOD+SHIFT+Q
           21 or
           22 kill -TERM dwmpid
           23 ---
           24  config.def.h |  1 +
           25  dwm.1        | 10 ++++++++++
           26  dwm.c        | 22 ++++++++++++++++++++++
           27  3 files changed, 33 insertions(+)
           28 
           29 diff --git a/config.def.h b/config.def.h
           30 index a9ac303..e559429 100644
           31 --- a/config.def.h
           32 +++ b/config.def.h
           33 @@ -94,6 +94,7 @@ static Key keys[] = {
           34          TAGKEYS(                        XK_8,                      7)
           35          TAGKEYS(                        XK_9,                      8)
           36          { MODKEY|ShiftMask,             XK_q,      quit,           {0} },
           37 +        { MODKEY|ControlMask|ShiftMask, XK_q,      quit,           {1} }, 
           38  };
           39  
           40  /* button definitions */
           41 diff --git a/dwm.1 b/dwm.1
           42 index 13b3729..36a331c 100644
           43 --- a/dwm.1
           44 +++ b/dwm.1
           45 @@ -142,6 +142,9 @@ Add/remove all windows with nth tag to/from the view.
           46  .TP
           47  .B Mod1\-Shift\-q
           48  Quit dwm.
           49 +.TP
           50 +.B Mod1\-Control\-Shift\-q
           51 +Restart dwm.
           52  .SS Mouse commands
           53  .TP
           54  .B Mod1\-Button1
           55 @@ -155,6 +158,13 @@ Resize focused window while dragging. Tiled windows will be toggled to the float
           56  .SH CUSTOMIZATION
           57  dwm is customized by creating a custom config.h and (re)compiling the source
           58  code. This keeps it fast, secure and simple.
           59 +.SH SIGNALS
           60 +.TP
           61 +.B SIGHUP - 1
           62 +Restart the dwm process.
           63 +.TP
           64 +.B SIGTERM - 15
           65 +Cleanly terminate the dwm process.
           66  .SH SEE ALSO
           67  .BR dmenu (1),
           68  .BR st (1)
           69 diff --git a/dwm.c b/dwm.c
           70 index bb95e26..286eecd 100644
           71 --- a/dwm.c
           72 +++ b/dwm.c
           73 @@ -205,6 +205,8 @@ static void setup(void);
           74  static void seturgent(Client *c, int urg);
           75  static void showhide(Client *c);
           76  static void sigchld(int unused);
           77 +static void sighup(int unused);
           78 +static void sigterm(int unused);
           79  static void spawn(const Arg *arg);
           80  static void tag(const Arg *arg);
           81  static void tagmon(const Arg *arg);
           82 @@ -260,6 +262,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
           83          [UnmapNotify] = unmapnotify
           84  };
           85  static Atom wmatom[WMLast], netatom[NetLast];
           86 +static int restart = 0;
           87  static int running = 1;
           88  static Cur *cursor[CurLast];
           89  static Clr **scheme;
           90 @@ -1248,6 +1251,7 @@ propertynotify(XEvent *e)
           91  void
           92  quit(const Arg *arg)
           93  {
           94 +        if(arg->i) restart = 1;
           95          running = 0;
           96  }
           97  
           98 @@ -1536,6 +1540,9 @@ setup(void)
           99          /* clean up any zombies immediately */
          100          sigchld(0);
          101  
          102 +        signal(SIGHUP, sighup);
          103 +        signal(SIGTERM, sigterm);
          104 +
          105          /* init screen */
          106          screen = DefaultScreen(dpy);
          107          sw = DisplayWidth(dpy, screen);
          108 @@ -1637,6 +1644,20 @@ sigchld(int unused)
          109  }
          110  
          111  void
          112 +sighup(int unused)
          113 +{
          114 +        Arg a = {.i = 1};
          115 +        quit(&a);
          116 +}
          117 +
          118 +void
          119 +sigterm(int unused)
          120 +{
          121 +        Arg a = {.i = 0};
          122 +        quit(&a);
          123 +}
          124 +
          125 +void
          126  spawn(const Arg *arg)
          127  {
          128          if (arg->v == dmenucmd)
          129 @@ -2139,6 +2160,7 @@ main(int argc, char *argv[])
          130          setup();
          131          scan();
          132          run();
          133 +        if(restart) execvp(argv[0], argv);
          134          cleanup();
          135          XCloseDisplay(dpy);
          136          return EXIT_SUCCESS;
          137 -- 
          138 2.7.4
          139