sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

dwm-notags-20250618-cfb8627.diff (14480B)


      1 From dad55f720cc88c239253e52690c22d0797961a72 Mon Sep 17 00:00:00 2001
      2 From: Farlado <stultasergalo@gmail.com>
      3 Date: Wed, 18 Jun 2025 22:12:13 -0400
      4 Subject: [PATCH] Remove client tagging
      5 
      6 ---
      7  config.def.h |  30 ++----------
      8  dwm.c        | 135 ++++++---------------------------------------------
      9  2 files changed, 19 insertions(+), 146 deletions(-)
     10 
     11 diff --git a/config.def.h b/config.def.h
     12 index 9efa774..fbfa63f 100644
     13 --- a/config.def.h
     14 +++ b/config.def.h
     15 @@ -18,17 +18,14 @@ static const char *colors[][3]      = {
     16  	[SchemeSel]  = { col_gray4, col_cyan,  col_cyan  },
     17  };
     18  
     19 -/* tagging */
     20 -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
     21 -
     22  static const Rule rules[] = {
     23  	/* xprop(1):
     24  	 *	WM_CLASS(STRING) = instance, class
     25  	 *	WM_NAME(STRING) = title
     26  	 */
     27 -	/* class      instance    title       tags mask     isfloating   monitor */
     28 -	{ "Gimp",     NULL,       NULL,       0,            1,           -1 },
     29 -	{ "Firefox",  NULL,       NULL,       1 << 8,       0,           -1 },
     30 +	/* class      instance    title       isfloating   monitor */
     31 +	{ "Gimp",     NULL,       NULL,       1,           -1 },
     32 +	{ "Firefox",  NULL,       NULL,       0,           -1 },
     33  };
     34  
     35  /* layout(s) */
     36 @@ -46,11 +43,6 @@ static const Layout layouts[] = {
     37  
     38  /* key definitions */
     39  #define MODKEY Mod1Mask
     40 -#define TAGKEYS(KEY,TAG) \
     41 -	{ MODKEY,                       KEY,      view,           {.ui = 1 << TAG} }, \
     42 -	{ MODKEY|ControlMask,           KEY,      toggleview,     {.ui = 1 << TAG} }, \
     43 -	{ MODKEY|ShiftMask,             KEY,      tag,            {.ui = 1 << TAG} }, \
     44 -	{ MODKEY|ControlMask|ShiftMask, KEY,      toggletag,      {.ui = 1 << TAG} },
     45  
     46  /* helper for spawning shell commands in the pre dwm-5.0 fashion */
     47  #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
     48 @@ -72,28 +64,16 @@ static const Key keys[] = {
     49  	{ MODKEY,                       XK_h,      setmfact,       {.f = -0.05} },
     50  	{ MODKEY,                       XK_l,      setmfact,       {.f = +0.05} },
     51  	{ MODKEY,                       XK_Return, zoom,           {0} },
     52 -	{ MODKEY,                       XK_Tab,    view,           {0} },
     53  	{ MODKEY|ShiftMask,             XK_c,      killclient,     {0} },
     54  	{ MODKEY,                       XK_t,      setlayout,      {.v = &layouts[0]} },
     55  	{ MODKEY,                       XK_f,      setlayout,      {.v = &layouts[1]} },
     56  	{ MODKEY,                       XK_m,      setlayout,      {.v = &layouts[2]} },
     57  	{ MODKEY,                       XK_space,  setlayout,      {0} },
     58  	{ MODKEY|ShiftMask,             XK_space,  togglefloating, {0} },
     59 -	{ MODKEY,                       XK_0,      view,           {.ui = ~0 } },
     60 -	{ MODKEY|ShiftMask,             XK_0,      tag,            {.ui = ~0 } },
     61  	{ MODKEY,                       XK_comma,  focusmon,       {.i = -1 } },
     62  	{ MODKEY,                       XK_period, focusmon,       {.i = +1 } },
     63  	{ MODKEY|ShiftMask,             XK_comma,  tagmon,         {.i = -1 } },
     64  	{ MODKEY|ShiftMask,             XK_period, tagmon,         {.i = +1 } },
     65 -	TAGKEYS(                        XK_1,                      0)
     66 -	TAGKEYS(                        XK_2,                      1)
     67 -	TAGKEYS(                        XK_3,                      2)
     68 -	TAGKEYS(                        XK_4,                      3)
     69 -	TAGKEYS(                        XK_5,                      4)
     70 -	TAGKEYS(                        XK_6,                      5)
     71 -	TAGKEYS(                        XK_7,                      6)
     72 -	TAGKEYS(                        XK_8,                      7)
     73 -	TAGKEYS(                        XK_9,                      8)
     74  	{ MODKEY|ShiftMask,             XK_q,      quit,           {0} },
     75  };
     76  
     77 @@ -108,9 +88,5 @@ static const Button buttons[] = {
     78  	{ ClkClientWin,         MODKEY,         Button1,        movemouse,      {0} },
     79  	{ ClkClientWin,         MODKEY,         Button2,        togglefloating, {0} },
     80  	{ ClkClientWin,         MODKEY,         Button3,        resizemouse,    {0} },
     81 -	{ ClkTagBar,            0,              Button1,        view,           {0} },
     82 -	{ ClkTagBar,            0,              Button3,        toggleview,     {0} },
     83 -	{ ClkTagBar,            MODKEY,         Button1,        tag,            {0} },
     84 -	{ ClkTagBar,            MODKEY,         Button3,        toggletag,      {0} },
     85  };
     86  
     87 diff --git a/dwm.c b/dwm.c
     88 index 1443802..ace2a3b 100644
     89 --- a/dwm.c
     90 +++ b/dwm.c
     91 @@ -13,10 +13,9 @@
     92   * Each child of the root window is called a client, except windows which have
     93   * set the override_redirect flag. Clients are organized in a linked client
     94   * list on each monitor, the focus history is remembered through a stack list
     95 - * on each monitor. Each client contains a bit array to indicate the tags of a
     96 - * client.
     97 + * on each monitor.
     98   *
     99 - * Keys and tagging rules are organized as arrays and defined in config.h.
    100 + * Keys are organized as arrays and defined in config.h.
    101   *
    102   * To understand everything else, start reading main().
    103   */
    104 @@ -49,11 +48,10 @@
    105  #define CLEANMASK(mask)         (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
    106  #define INTERSECT(x,y,w,h,m)    (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \
    107                                 * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy)))
    108 -#define ISVISIBLE(C)            ((C->tags & C->mon->tagset[C->mon->seltags]))
    109 +#define ISVISIBLE(C)            1 /* FIXME: I am lazy and for now this isn't causing unexpected behavior on my end */
    110  #define MOUSEMASK               (BUTTONMASK|PointerMotionMask)
    111  #define WIDTH(X)                ((X)->w + 2 * (X)->bw)
    112  #define HEIGHT(X)               ((X)->h + 2 * (X)->bw)
    113 -#define TAGMASK                 ((1 << LENGTH(tags)) - 1)
    114  #define TEXTW(X)                (drw_fontset_getwidth(drw, (X)) + lrpad)
    115  
    116  /* enums */
    117 @@ -90,7 +88,6 @@ struct Client {
    118  	int oldx, oldy, oldw, oldh;
    119  	int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid;
    120  	int bw, oldbw;
    121 -	unsigned int tags;
    122  	int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
    123  	Client *next;
    124  	Client *snext;
    125 @@ -118,9 +115,7 @@ struct Monitor {
    126  	int by;               /* bar geometry */
    127  	int mx, my, mw, mh;   /* screen size */
    128  	int wx, wy, ww, wh;   /* window area  */
    129 -	unsigned int seltags;
    130  	unsigned int sellt;
    131 -	unsigned int tagset[2];
    132  	int showbar;
    133  	int topbar;
    134  	Client *clients;
    135 @@ -135,7 +130,6 @@ typedef struct {
    136  	const char *class;
    137  	const char *instance;
    138  	const char *title;
    139 -	unsigned int tags;
    140  	int isfloating;
    141  	int monitor;
    142  } Rule;
    143 @@ -205,13 +199,10 @@ static void setup(void);
    144  static void seturgent(Client *c, int urg);
    145  static void showhide(Client *c);
    146  static void spawn(const Arg *arg);
    147 -static void tag(const Arg *arg);
    148  static void tagmon(const Arg *arg);
    149  static void tile(Monitor *m);
    150  static void togglebar(const Arg *arg);
    151  static void togglefloating(const Arg *arg);
    152 -static void toggletag(const Arg *arg);
    153 -static void toggleview(const Arg *arg);
    154  static void unfocus(Client *c, int setfocus);
    155  static void unmanage(Client *c, int destroyed);
    156  static void unmapnotify(XEvent *e);
    157 @@ -225,7 +216,6 @@ static void updatestatus(void);
    158  static void updatetitle(Client *c);
    159  static void updatewindowtype(Client *c);
    160  static void updatewmhints(Client *c);
    161 -static void view(const Arg *arg);
    162  static Client *wintoclient(Window w);
    163  static Monitor *wintomon(Window w);
    164  static int xerror(Display *dpy, XErrorEvent *ee);
    165 @@ -270,9 +260,6 @@ static Window root, wmcheckwin;
    166  /* configuration, allows nested code to access above variables */
    167  #include "config.h"
    168  
    169 -/* compile-time check if all tags fit into an unsigned int bit array. */
    170 -struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
    171 -
    172  /* function implementations */
    173  void
    174  applyrules(Client *c)
    175 @@ -285,7 +272,6 @@ applyrules(Client *c)
    176  
    177  	/* rule matching */
    178  	c->isfloating = 0;
    179 -	c->tags = 0;
    180  	XGetClassHint(dpy, c->win, &ch);
    181  	class    = ch.res_class ? ch.res_class : broken;
    182  	instance = ch.res_name  ? ch.res_name  : broken;
    183 @@ -297,7 +283,6 @@ applyrules(Client *c)
    184  		&& (!r->instance || strstr(instance, r->instance)))
    185  		{
    186  			c->isfloating = r->isfloating;
    187 -			c->tags |= r->tags;
    188  			for (m = mons; m && m->num != r->monitor; m = m->next);
    189  			if (m)
    190  				c->mon = m;
    191 @@ -307,7 +292,6 @@ applyrules(Client *c)
    192  		XFree(ch.res_class);
    193  	if (ch.res_name)
    194  		XFree(ch.res_name);
    195 -	c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags];
    196  }
    197  
    198  int
    199 @@ -417,7 +401,7 @@ attachstack(Client *c)
    200  void
    201  buttonpress(XEvent *e)
    202  {
    203 -	unsigned int i, x, click;
    204 +	unsigned int i, click;
    205  	Arg arg = {0};
    206  	Client *c;
    207  	Monitor *m;
    208 @@ -431,14 +415,7 @@ buttonpress(XEvent *e)
    209  		focus(NULL);
    210  	}
    211  	if (ev->window == selmon->barwin) {
    212 -		i = x = 0;
    213 -		do
    214 -			x += TEXTW(tags[i]);
    215 -		while (ev->x >= x && ++i < LENGTH(tags));
    216 -		if (i < LENGTH(tags)) {
    217 -			click = ClkTagBar;
    218 -			arg.ui = 1 << i;
    219 -		} else if (ev->x < x + TEXTW(selmon->ltsymbol))
    220 +		if (ev->x < TEXTW(selmon->ltsymbol))
    221  			click = ClkLtSymbol;
    222  		else if (ev->x > selmon->ww - (int)TEXTW(stext))
    223  			click = ClkStatusText;
    224 @@ -470,12 +447,10 @@ checkotherwm(void)
    225  void
    226  cleanup(void)
    227  {
    228 -	Arg a = {.ui = ~0};
    229  	Layout foo = { "", NULL };
    230  	Monitor *m;
    231  	size_t i;
    232  
    233 -	view(&a);
    234  	selmon->lt[selmon->sellt] = &foo;
    235  	for (m = mons; m; m = m->next)
    236  		while (m->stack)
    237 @@ -612,8 +587,7 @@ configurerequest(XEvent *e)
    238  				c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* center in y direction */
    239  			if ((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight)))
    240  				configure(c);
    241 -			if (ISVISIBLE(c))
    242 -				XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
    243 +			XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
    244  		} else
    245  			configure(c);
    246  	} else {
    247 @@ -635,7 +609,6 @@ createmon(void)
    248  	Monitor *m;
    249  
    250  	m = ecalloc(1, sizeof(Monitor));
    251 -	m->tagset[0] = m->tagset[1] = 1;
    252  	m->mfact = mfact;
    253  	m->nmaster = nmaster;
    254  	m->showbar = showbar;
    255 @@ -700,35 +673,18 @@ drawbar(Monitor *m)
    256  	int x, w, tw = 0;
    257  	int boxs = drw->fonts->h / 9;
    258  	int boxw = drw->fonts->h / 6 + 2;
    259 -	unsigned int i, occ = 0, urg = 0;
    260 -	Client *c;
    261  
    262  	if (!m->showbar)
    263  		return;
    264  
    265 -	/* draw status first so it can be overdrawn by tags later */
    266 +	/* draw status first so it can be overdrawn later */
    267  	if (m == selmon) { /* status is only drawn on selected monitor */
    268  		drw_setscheme(drw, scheme[SchemeNorm]);
    269  		tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
    270  		drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0);
    271  	}
    272  
    273 -	for (c = m->clients; c; c = c->next) {
    274 -		occ |= c->tags;
    275 -		if (c->isurgent)
    276 -			urg |= c->tags;
    277 -	}
    278  	x = 0;
    279 -	for (i = 0; i < LENGTH(tags); i++) {
    280 -		w = TEXTW(tags[i]);
    281 -		drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
    282 -		drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i);
    283 -		if (occ & 1 << i)
    284 -			drw_rect(drw, x + boxs, boxs, boxw, boxw,
    285 -				m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
    286 -				urg & 1 << i);
    287 -		x += w;
    288 -	}
    289  	w = TEXTW(m->ltsymbol);
    290  	drw_setscheme(drw, scheme[SchemeNorm]);
    291  	x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
    292 @@ -851,8 +807,7 @@ focusstack(const Arg *arg)
    293  				c = i;
    294  		if (!c)
    295  			for (; i; i = i->next)
    296 -				if (ISVISIBLE(i))
    297 -					c = i;
    298 +				c = i;
    299  	}
    300  	if (c) {
    301  		focus(c);
    302 @@ -1046,7 +1001,6 @@ manage(Window w, XWindowAttributes *wa)
    303  	updatetitle(c);
    304  	if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) {
    305  		c->mon = t->mon;
    306 -		c->tags = t->tags;
    307  	} else {
    308  		c->mon = selmon;
    309  		applyrules(c);
    310 @@ -1116,8 +1070,7 @@ monocle(Monitor *m)
    311  	Client *c;
    312  
    313  	for (c = m->clients; c; c = c->next)
    314 -		if (ISVISIBLE(c))
    315 -			n++;
    316 +		n++;
    317  	if (n > 0) /* override layout symbol */
    318  		snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n);
    319  	for (c = nexttiled(m->clients); c; c = nexttiled(c->next))
    320 @@ -1204,7 +1157,7 @@ movemouse(const Arg *arg)
    321  Client *
    322  nexttiled(Client *c)
    323  {
    324 -	for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next);
    325 +	for (; c && c->isfloating; c = c->next);
    326  	return c;
    327  }
    328  
    329 @@ -1369,7 +1322,7 @@ restack(Monitor *m)
    330  		wc.stack_mode = Below;
    331  		wc.sibling = m->barwin;
    332  		for (c = m->stack; c; c = c->snext)
    333 -			if (!c->isfloating && ISVISIBLE(c)) {
    334 +			if (!c->isfloating) {
    335  				XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc);
    336  				wc.sibling = c->win;
    337  			}
    338 @@ -1425,7 +1378,6 @@ sendmon(Client *c, Monitor *m)
    339  	detach(c);
    340  	detachstack(c);
    341  	c->mon = m;
    342 -	c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
    343  	attach(c);
    344  	attachstack(c);
    345  	focus(NULL);
    346 @@ -1630,17 +1582,11 @@ showhide(Client *c)
    347  {
    348  	if (!c)
    349  		return;
    350 -	if (ISVISIBLE(c)) {
    351 -		/* show clients top down */
    352 -		XMoveWindow(dpy, c->win, c->x, c->y);
    353 -		if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen)
    354 -			resize(c, c->x, c->y, c->w, c->h, 0);
    355 -		showhide(c->snext);
    356 -	} else {
    357 -		/* hide clients bottom up */
    358 -		showhide(c->snext);
    359 -		XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y);
    360 -	}
    361 +	/* show clients top down */
    362 +	XMoveWindow(dpy, c->win, c->x, c->y);
    363 +	if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen)
    364 +		resize(c, c->x, c->y, c->w, c->h, 0);
    365 +	showhide(c->snext);
    366  }
    367  
    368  void
    369 @@ -1665,16 +1611,6 @@ spawn(const Arg *arg)
    370  	}
    371  }
    372  
    373 -void
    374 -tag(const Arg *arg)
    375 -{
    376 -	if (selmon->sel && arg->ui & TAGMASK) {
    377 -		selmon->sel->tags = arg->ui & TAGMASK;
    378 -		focus(NULL);
    379 -		arrange(selmon);
    380 -	}
    381 -}
    382 -
    383  void
    384  tagmon(const Arg *arg)
    385  {
    386 @@ -1734,33 +1670,6 @@ togglefloating(const Arg *arg)
    387  	arrange(selmon);
    388  }
    389  
    390 -void
    391 -toggletag(const Arg *arg)
    392 -{
    393 -	unsigned int newtags;
    394 -
    395 -	if (!selmon->sel)
    396 -		return;
    397 -	newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
    398 -	if (newtags) {
    399 -		selmon->sel->tags = newtags;
    400 -		focus(NULL);
    401 -		arrange(selmon);
    402 -	}
    403 -}
    404 -
    405 -void
    406 -toggleview(const Arg *arg)
    407 -{
    408 -	unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);
    409 -
    410 -	if (newtagset) {
    411 -		selmon->tagset[selmon->seltags] = newtagset;
    412 -		focus(NULL);
    413 -		arrange(selmon);
    414 -	}
    415 -}
    416 -
    417  void
    418  unfocus(Client *c, int setfocus)
    419  {
    420 @@ -2049,18 +1958,6 @@ updatewmhints(Client *c)
    421  	}
    422  }
    423  
    424 -void
    425 -view(const Arg *arg)
    426 -{
    427 -	if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
    428 -		return;
    429 -	selmon->seltags ^= 1; /* toggle sel tagset */
    430 -	if (arg->ui & TAGMASK)
    431 -		selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
    432 -	focus(NULL);
    433 -	arrange(selmon);
    434 -}
    435 -
    436  Client *
    437  wintoclient(Window w)
    438  {
    439 -- 
    440 2.49.0
    441