dwm-foreground-20240220-9f88553.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-foreground-20240220-9f88553.diff (5117B)
       ---
            1 From 507895940574e77386d53f81df541e3903bf1ba3 Mon Sep 17 00:00:00 2001
            2 From: espro1 <ericspero@icloud.com>
            3 Date: Tue, 20 Feb 2024 16:11:05 -0500
            4 Subject: [PATCH] Essentially a layout for a special class of floating windows.
            5  When a window is foregrounded, it is floated, resized, and moved to a
            6  predictable location
            7 
            8 ---
            9  config.def.h |  3 ++
           10  dwm.c        | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++-
           11  2 files changed, 84 insertions(+), 1 deletion(-)
           12 
           13 diff --git a/config.def.h b/config.def.h
           14 index 9efa774..718e7c3 100644
           15 --- a/config.def.h
           16 +++ b/config.def.h
           17 @@ -37,6 +37,8 @@ static const int nmaster     = 1;    /* number of clients in master area */
           18  static const int resizehints = 1;    /* 1 means respect size hints in tiled resizals */
           19  static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
           20  
           21 +static const float fgw = .6,fgh = .6;
           22 +
           23  static const Layout layouts[] = {
           24          /* symbol     arrange function */
           25          { "[]=",      tile },    /* first entry is default */
           26 @@ -78,6 +80,7 @@ static const Key keys[] = {
           27          { MODKEY,                       XK_f,      setlayout,      {.v = &layouts[1]} },
           28          { MODKEY,                       XK_m,      setlayout,      {.v = &layouts[2]} },
           29          { MODKEY,                       XK_space,  setlayout,      {0} },
           30 +        { MODKEY|Mod4Mask,              XK_space,  toggleforegrounded, {0} },
           31          { MODKEY|ShiftMask,             XK_space,  togglefloating, {0} },
           32          { MODKEY,                       XK_0,      view,           {.ui = ~0 } },
           33          { MODKEY|ShiftMask,             XK_0,      tag,            {.ui = ~0 } },
           34 diff --git a/dwm.c b/dwm.c
           35 index f1d86b2..12b037d 100644
           36 --- a/dwm.c
           37 +++ b/dwm.c
           38 @@ -92,9 +92,10 @@ struct Client {
           39          int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid;
           40          int bw, oldbw;
           41          unsigned int tags;
           42 -        int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
           43 +        int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, isforegrounded;
           44          Client *next;
           45          Client *snext;
           46 +        Client *tnext;
           47          Monitor *mon;
           48          Window win;
           49  };
           50 @@ -127,6 +128,7 @@ struct Monitor {
           51          Client *clients;
           52          Client *sel;
           53          Client *stack;
           54 +        Client *foregrounded;
           55          Monitor *next;
           56          Window barwin;
           57          const Layout *lt[2];
           58 @@ -210,6 +212,7 @@ static void tag(const Arg *arg);
           59  static void tagmon(const Arg *arg);
           60  static void tile(Monitor *m);
           61  static void togglebar(const Arg *arg);
           62 +static void toggleforegrounded(const Arg *arg);
           63  static void togglefloating(const Arg *arg);
           64  static void toggletag(const Arg *arg);
           65  static void toggleview(const Arg *arg);
           66 @@ -415,6 +418,21 @@ attachstack(Client *c)
           67          c->mon->stack = c;
           68  }
           69  
           70 +void
           71 +attachforegrounded (Client *c)
           72 +{
           73 +        c->tnext = c->mon->foregrounded;
           74 +        c->mon->foregrounded = c;
           75 +}
           76 +
           77 +void
           78 +detachforegrounded (Client *c)
           79 +{
           80 +        Client **tc;
           81 +        for (tc = &c->mon->foregrounded; *tc && *tc != c; tc = &(*tc)->tnext);
           82 +        *tc = c->tnext;
           83 +}
           84 +
           85  void
           86  buttonpress(XEvent *e)
           87  {
           88 @@ -1209,6 +1227,39 @@ nexttiled(Client *c)
           89          return c;
           90  }
           91  
           92 +Client *
           93 +nextforegrounded(Client *c)
           94 +{
           95 +        for (; c && (!c->isforegrounded || !ISVISIBLE(c)); c = c->tnext);
           96 +        return c;
           97 +}
           98 +
           99 +void
          100 +arrangeforegrounded (Monitor *m)
          101 +{
          102 +        unsigned int n,i,x,y,w,h;
          103 +        Client *c;
          104 +
          105 +        for (n = 0, c = nextforegrounded(m->foregrounded); c; c = nextforegrounded(c->tnext), n++);
          106 +        if (n == 0)
          107 +                return;
          108 +
          109 +        for (i = 0, c = nextforegrounded(m->foregrounded); c; c = nextforegrounded(c->tnext), i++){
          110 +                if (n == 1) {
          111 +                        x = m->mx + (m->mw - m->mw * fgw) / 2;
          112 +                        y = m->my + (m->mh - m->mh * fgh) / 2;
          113 +                        w = (m->mw * fgw) - (2 * (m->foregrounded->bw));
          114 +                        h = (m->mh * fgh) - (2 * (m->foregrounded->bw));
          115 +                } else {
          116 +                        x = (n - 1 - i) * (m->mw / n);
          117 +                        y = m->my + (m->mh - m->mh * fgh) / 2;
          118 +                        w = (m->mw * (1 / (float)n)) - (2 * (m->foregrounded->bw));
          119 +                        h = (m->mh * fgh) - (2 * (m->foregrounded->bw));
          120 +                }
          121 +                resize(c,x,y,w,h,0);
          122 +        }
          123 +}
          124 +
          125  void
          126  pop(Client *c)
          127  {
          128 @@ -1721,6 +1772,24 @@ togglebar(const Arg *arg)
          129          arrange(selmon);
          130  }
          131  
          132 +void
          133 +toggleforegrounded(const Arg *arg)
          134 +{
          135 +        if (!selmon->sel)
          136 +                return;
          137 +        if (selmon->sel->isfullscreen) /* no support for fullscreen windows */
          138 +                return;
          139 +
          140 +        selmon->sel->isforegrounded || selmon->sel->isfloating ?
          141 +                detachforegrounded(selmon->sel) : attachforegrounded(selmon->sel);
          142 +
          143 +        selmon->sel->isforegrounded = selmon->sel->isfloating =
          144 +                !selmon->sel->isfloating && !selmon->sel->isforegrounded;
          145 +        
          146 +        arrangeforegrounded(selmon);
          147 +        arrange(selmon);
          148 +}
          149 +
          150  void
          151  togglefloating(const Arg *arg)
          152  {
          153 @@ -1732,6 +1801,11 @@ togglefloating(const Arg *arg)
          154          if (selmon->sel->isfloating)
          155                  resize(selmon->sel, selmon->sel->x, selmon->sel->y,
          156                          selmon->sel->w, selmon->sel->h, 0);
          157 +        if (selmon->sel->isforegrounded) {
          158 +                selmon->sel->isforegrounded = 0;
          159 +                detachforegrounded(selmon->sel);
          160 +                arrangeforegrounded(selmon);
          161 +        }
          162          arrange(selmon);
          163  }
          164  
          165 @@ -1783,6 +1857,12 @@ unmanage(Client *c, int destroyed)
          166  
          167          detach(c);
          168          detachstack(c);
          169 +
          170 +        if (c->isforegrounded){
          171 +                detachforegrounded(c);
          172 +                arrangeforegrounded(m);
          173 +        }
          174 +
          175          if (!destroyed) {
          176                  wc.border_width = c->oldbw;
          177                  XGrabServer(dpy); /* avoid race conditions */
          178 -- 
          179 2.43.0
          180