sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | 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