dwm-xfce4-panel-20220306-d39e2f3.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-xfce4-panel-20220306-d39e2f3.diff (4775B)
       ---
            1 From 2cf1eff75a6dc6ee21ed37f4f57a1eb4bf588b9f Mon Sep 17 00:00:00 2001
            2 From: Gunther Klessinger <gunther.klessinger@axiros.com>
            3 Date: Sun, 6 Mar 2022 10:32:29 +0100
            4 Subject: [PATCH] fix: Fixing problems at monitor setup changes
            5 
            6 - Panel was sometimes out of place when monitor setup was changed on the
            7   fly
            8 - Patch less intrusive than the previous one.
            9 - Tested with dwm6.3 and 6.2.
           10 ---
           11  config.def.h |  2 ++
           12  dwm.c        | 36 +++++++++++++++++++++++++++++-------
           13  2 files changed, 31 insertions(+), 7 deletions(-)
           14 
           15 diff --git a/config.def.h b/config.def.h
           16 index a2ac963..eaf909e 100644
           17 --- a/config.def.h
           18 +++ b/config.def.h
           19 @@ -3,6 +3,7 @@
           20  /* appearance */
           21  static const unsigned int borderpx  = 1;        /* border pixel of windows */
           22  static const unsigned int snap      = 32;       /* snap pixel */
           23 +static const char panel[][20]       = { "xfce4-panel", "Xfce4-panel" }; /* name & cls of panel win */
           24  static const int showbar            = 1;        /* 0 means no bar */
           25  static const int topbar             = 1;        /* 0 means bottom bar */
           26  static const char *fonts[]          = { "monospace:size=10" };
           27 @@ -29,6 +30,7 @@ static const Rule rules[] = {
           28          /* class      instance    title       tags mask     isfloating   monitor */
           29          { "Gimp",     NULL,       NULL,       0,            1,           -1 },
           30          { "Firefox",  NULL,       NULL,       1 << 8,       0,           -1 },
           31 +        { panel[1],   NULL,       NULL,       (1 << 9) - 1, 1,           -1 },
           32  };
           33  
           34  /* layout(s) */
           35 diff --git a/dwm.c b/dwm.c
           36 index a96f33c..458f3dc 100644
           37 --- a/dwm.c
           38 +++ b/dwm.c
           39 @@ -175,6 +175,7 @@ static long getstate(Window w);
           40  static int gettextprop(Window w, Atom atom, char *text, unsigned int size);
           41  static void grabbuttons(Client *c, int focused);
           42  static void grabkeys(void);
           43 +static int ispanel(Client *c);
           44  static void incnmaster(const Arg *arg);
           45  static void keypress(XEvent *e);
           46  static void killclient(const Arg *arg);
           47 @@ -713,6 +714,8 @@ drawbar(Monitor *m)
           48          }
           49  
           50          for (c = m->clients; c; c = c->next) {
           51 +        // prevent showing the panel as active application:
           52 +        if (ispanel(c)) continue;
           53                  occ |= c->tags;
           54                  if (c->isurgent)
           55                          urg |= c->tags;
           56 @@ -796,11 +799,14 @@ focus(Client *c)
           57                          selmon = c->mon;
           58                  if (c->isurgent)
           59                          seturgent(c, 0);
           60 -                detachstack(c);
           61 -                attachstack(c);
           62 -                grabbuttons(c, 1);
           63 -                XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel);
           64 -                setfocus(c);
           65 +        // prevents the panel getting focus when tag switching:
           66 +                if (!ispanel(c)) {
           67 +            detachstack(c);
           68 +            attachstack(c);
           69 +            grabbuttons(c, 1);
           70 +            XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel);
           71 +            setfocus(c);
           72 +        }
           73          } else {
           74                  XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
           75                  XDeleteProperty(dpy, root, netatom[NetActiveWindow]);
           76 @@ -833,6 +839,7 @@ focusmon(const Arg *arg)
           77          focus(NULL);
           78  }
           79  
           80 +int focussed_panel = 0; // helper for focusstack, avoids loops when panel is the only client
           81  void
           82  focusstack(const Arg *arg)
           83  {
           84 @@ -857,6 +864,12 @@ focusstack(const Arg *arg)
           85                  focus(c);
           86                  restack(selmon);
           87          }
           88 +  // skipping the panel when switching focus:
           89 +  if (ispanel(c) && focussed_panel == 0) {
           90 +    focussed_panel = 1;
           91 +    focusstack(arg);
           92 +    focussed_panel = 0;
           93 +  }
           94  }
           95  
           96  Atom
           97 @@ -967,6 +980,11 @@ grabkeys(void)
           98          }
           99  }
          100  
          101 +int
          102 +ispanel(Client *c) {
          103 +    return !strcmp(c->name, panel[0]);
          104 +}
          105 +
          106  void
          107  incnmaster(const Arg *arg)
          108  {
          109 @@ -1053,6 +1071,8 @@ manage(Window w, XWindowAttributes *wa)
          110                  && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my);
          111          c->bw = borderpx;
          112  
          113 +    // no border - even when active
          114 +    if (ispanel(c)) c->bw = c->oldbw = 0;
          115          wc.border_width = c->bw;
          116          XConfigureWindow(dpy, w, CWBorderWidth, &wc);
          117          XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel);
          118 @@ -1272,7 +1292,7 @@ recttomon(int x, int y, int w, int h)
          119  void
          120  resize(Client *c, int x, int y, int w, int h, int interact)
          121  {
          122 -        if (applysizehints(c, &x, &y, &w, &h, interact))
          123 +        if (ispanel(c) || applysizehints(c, &x, &y, &w, &h, interact))
          124                  resizeclient(c, x, y, w, h);
          125  }
          126  
          127 @@ -1286,6 +1306,8 @@ resizeclient(Client *c, int x, int y, int w, int h)
          128          c->oldw = c->w; c->w = wc.width = w;
          129          c->oldh = c->h; c->h = wc.height = h;
          130          wc.border_width = c->bw;
          131 +    // nail it to no border & y=0:
          132 +    if (ispanel(c)) c->y = c->oldy = c->bw = wc.y = wc.border_width = 0;
          133          XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
          134          configure(c);
          135          XSync(dpy, False);
          136 @@ -1994,7 +2016,7 @@ void
          137  updatestatus(void)
          138  {
          139          if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext)))
          140 -                strcpy(stext, "dwm-"VERSION);
          141 +                strcpy(stext, ""); // no shining of dwm version thru panel, when transparent
          142          drawbar(selmon);
          143  }
          144  
          145 -- 
          146 2.31.1
          147