dwm-mark-new-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-mark-new-6.2.diff (6906B)
       ---
            1 From 753860d3435e2968358f2bf8daf70bf625fe75fe Mon Sep 17 00:00:00 2001
            2 From: Kajetan Puchalski <kajetan.puchalski@tuta.io>
            3 Date: Mon, 5 Oct 2020 11:04:31 +0100
            4 Subject: [PATCH] Updated Mark patch to work with 6.2
            5 
            6 ---
            7  config.def.h |  14 +++++--
            8  drw.h    |   2 +-
            9  dwm.c    | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
           10  3 files changed, 118 insertions(+), 9 deletions(-)
           11 
           12 diff --git a/config.def.h b/config.def.h
           13 index 3858d75..a416c97 100644
           14 --- a/config.def.h
           15 +++ b/config.def.h
           16 @@ -12,10 +12,13 @@ static const char col_gray2[]       = "#444444";
           17  static const char col_gray3[]       = "#bbbbbb";
           18  static const char col_gray4[]       = "#eeeeee";
           19  static const char col_cyan[]        = "#005577";
           20 -static const char *colors[][3]      = {
           21 -        /*               fg         bg         border   */
           22 -        [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
           23 -        [SchemeSel]  = { col_gray4, col_cyan,  col_cyan  },
           24 +static const char normmarkcolor[]   = "#775500";        /*border color for marked client*/
           25 +static const char selmarkcolor[]    = "#775577";        /*border color for marked client on focus*/
           26 +
           27 +static const char *colors[][4]      = {
           28 +        /*               fg         bg         border     mark   */
           29 +        [SchemeNorm] = { col_gray3, col_gray1, col_gray2, normmarkcolor },
           30 +        [SchemeSel]  = { col_gray4, col_cyan,  col_cyan,  selmarkcolor  },
           31  };
           32  
           33  /* tagging */
           34 @@ -94,6 +97,9 @@ static Key keys[] = {
           35          TAGKEYS(                        XK_8,                      7)
           36          TAGKEYS(                        XK_9,                      8)
           37          { MODKEY|ShiftMask,             XK_q,      quit,           {0} },
           38 +    { MODKEY,                       XK_semicolon, togglemark,   {0} },
           39 +    { MODKEY,                       XK_o,      swapfocus,      {0} },
           40 +    { MODKEY,                       XK_u,      swapclient,     {0} },
           41  };
           42  
           43  /* button definitions */
           44 diff --git a/drw.h b/drw.h
           45 index 4bcd5ad..97aae99 100644
           46 --- a/drw.h
           47 +++ b/drw.h
           48 @@ -12,7 +12,7 @@ typedef struct Fnt {
           49          struct Fnt *next;
           50  } Fnt;
           51  
           52 -enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */
           53 +enum { ColFg, ColBg, ColBorder, ColMark }; /* Clr scheme index */
           54  typedef XftColor Clr;
           55  
           56  typedef struct {
           57 diff --git a/dwm.c b/dwm.c
           58 index 664c527..195b8eb 100644
           59 --- a/dwm.c
           60 +++ b/dwm.c
           61 @@ -201,17 +201,21 @@ static void setclientstate(Client *c, long state);
           62  static void setfocus(Client *c);
           63  static void setfullscreen(Client *c, int fullscreen);
           64  static void setlayout(const Arg *arg);
           65 +static void setmark(Client *c);
           66  static void setmfact(const Arg *arg);
           67  static void setup(void);
           68  static void seturgent(Client *c, int urg);
           69  static void showhide(Client *c);
           70  static void sigchld(int unused);
           71  static void spawn(const Arg *arg);
           72 +static void swapclient(const Arg *arg);
           73 +static void swapfocus(const Arg *arg);
           74  static void tag(const Arg *arg);
           75  static void tagmon(const Arg *arg);
           76  static void tile(Monitor *);
           77  static void togglebar(const Arg *arg);
           78  static void togglefloating(const Arg *arg);
           79 +static void togglemark(const Arg *arg);
           80  static void toggletag(const Arg *arg);
           81  static void toggleview(const Arg *arg);
           82  static void unfocus(Client *c, int setfocus);
           83 @@ -268,6 +272,7 @@ static Display *dpy;
           84  static Drw *drw;
           85  static Monitor *mons, *selmon;
           86  static Window root, wmcheckwin;
           87 +static Client *mark;
           88  
           89  /* configuration, allows nested code to access above variables */
           90  #include "config.h"
           91 @@ -796,7 +801,10 @@ focus(Client *c)
           92                  detachstack(c);
           93                  attachstack(c);
           94                  grabbuttons(c, 1);
           95 -                XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel);
           96 +                if (c == mark)
           97 +                        XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColMark].pixel);
           98 +                else
           99 +                        XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel);
          100                  setfocus(c);
          101          } else {
          102                  XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
          103 @@ -1052,7 +1060,10 @@ manage(Window w, XWindowAttributes *wa)
          104  
          105          wc.border_width = c->bw;
          106          XConfigureWindow(dpy, w, CWBorderWidth, &wc);
          107 -        XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel);
          108 +        if (c == mark)
          109 +                XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColMark].pixel);
          110 +        else
          111 +                XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel);
          112          configure(c); /* propagates border_width, if size doesn't change */
          113          updatewindowtype(c);
          114          updatesizehints(c);
          115 @@ -1512,6 +1523,23 @@ setlayout(const Arg *arg)
          116                  drawbar(selmon);
          117  }
          118  
          119 +void
          120 +setmark(Client *c)
          121 +{
          122 +        if (c == mark)
          123 +                return;
          124 +        if (mark) {
          125 +                XSetWindowBorder(dpy, mark->win, scheme[mark == selmon->sel
          126 +                                ? SchemeSel : SchemeNorm][ColBorder].pixel);
          127 +                mark = 0;
          128 +        }
          129 +        if (c) {
          130 +                XSetWindowBorder(dpy, c->win, scheme[c == selmon->sel
          131 +                                ? SchemeSel : SchemeNorm][ColMark].pixel);
          132 +                mark = c;
          133 +        }
          134 +}
          135 +
          136  /* arg > 1.0 will set mfact absolutely */
          137  void
          138  setmfact(const Arg *arg)
          139 @@ -1570,7 +1598,7 @@ setup(void)
          140          /* init appearance */
          141          scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
          142          for (i = 0; i < LENGTH(colors); i++)
          143 -                scheme[i] = drw_scm_create(drw, colors[i], 3);
          144 +                scheme[i] = drw_scm_create(drw, colors[i], 4);
          145          /* init bars */
          146          updatebars();
          147          updatestatus();
          148 @@ -1653,6 +1681,75 @@ spawn(const Arg *arg)
          149          }
          150  }
          151  
          152 +void
          153 +swapclient(const Arg *arg)
          154 +{
          155 +        Client *s, *m, t;
          156 +
          157 +        if (!mark || !selmon->sel || mark == selmon->sel
          158 +            || !selmon->lt[selmon->sellt]->arrange)
          159 +                return;
          160 +        s = selmon->sel;
          161 +        m = mark;
          162 +        t = *s;
          163 +        strcpy(s->name, m->name);
          164 +        s->win = m->win;
          165 +        s->x = m->x;
          166 +        s->y = m->y;
          167 +        s->w = m->w;
          168 +        s->h = m->h;
          169 +
          170 +        m->win = t.win;
          171 +        strcpy(m->name, t.name);
          172 +        m->x = t.x;
          173 +        m->y = t.y;
          174 +        m->w = t.w;
          175 +        m->h = t.h;
          176 +
          177 +        selmon->sel = m;
          178 +        mark = s;
          179 +        focus(s);
          180 +        setmark(m);
          181 +
          182 +        arrange(s->mon);
          183 +        if (s->mon != m->mon) {
          184 +                arrange(m->mon);
          185 +        }
          186 +}
          187 +
          188 +void
          189 +swapfocus(const Arg *arg)
          190 +{
          191 +        Client *t;
          192 +
          193 +        if (!selmon->sel || !mark || selmon->sel == mark)
          194 +                return;
          195 +        t = selmon->sel;
          196 +        if (mark->mon != selmon) {
          197 +                unfocus(selmon->sel, 0);
          198 +                selmon = mark->mon;
          199 +        }
          200 +        if (ISVISIBLE(mark)) {
          201 +                focus(mark);
          202 +                restack(selmon);
          203 +        } else {
          204 +                selmon->seltags ^= 1;
          205 +                selmon->tagset[selmon->seltags] = mark->tags;
          206 +                focus(mark);
          207 +                arrange(selmon);
          208 +        }
          209 +        setmark(t);
          210 +}
          211 +
          212 +void
          213 +togglemark(const Arg *arg)
          214 +{
          215 +        if (!selmon->sel)
          216 +                return;
          217 +        setmark(selmon->sel == mark ? 0 : selmon->sel);
          218 +}
          219 +
          220 +
          221  void
          222  tag(const Arg *arg)
          223  {
          224 @@ -1755,7 +1852,10 @@ unfocus(Client *c, int setfocus)
          225          if (!c)
          226                  return;
          227          grabbuttons(c, 0);
          228 -        XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel);
          229 +        if (c == mark)
          230 +                XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColMark].pixel);
          231 +        else
          232 +                XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel);
          233          if (setfocus) {
          234                  XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
          235                  XDeleteProperty(dpy, root, netatom[NetActiveWindow]);
          236 @@ -1768,6 +1868,9 @@ unmanage(Client *c, int destroyed)
          237          Monitor *m = c->mon;
          238          XWindowChanges wc;
          239  
          240 +        if (c == mark)
          241 +                setmark(0);
          242 +
          243          detach(c);
          244          detachstack(c);
          245          if (!destroyed) {
          246 -- 
          247 2.28.0
          248