From c56e756083531e1030a77a42c6733762f6cee5b5 Mon Sep 17 00:00:00 2001 From: Aaron Taylor Date: Thu, 2 Feb 2023 17:09:57 -0800 Subject: [PATCH] Added ability to give tags a text-based name at runtime. --- README | 15 ++++++++++----- config.def.h | 4 +++- config.h | 4 +++- dwm.c | 27 +++++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/README b/README index 5d8ecab..c6357e7 100644 --- a/README +++ b/README @@ -2,7 +2,11 @@ This git repository contains my personal branch of dwm-6.4. The changes made to stock dwm add the following abilities. - - + - Assign text names to tags at runtime. + + + - Layout menu popup presents available layouts. + - Select multiple tags for simultaneous display or window assignment. @@ -13,14 +17,15 @@ The changes made to stock dwm add the following abilities. - Center window names in status bar. -In addition to the usual dependencies for dwm (see the original README at the -bottom of this file), there are the following new dependencies. +In addition to the usual dependencies and installation tasks for dwm (see the +original README at the bottom of this file), there are the following new +dependencies/tasks. - xmenu from . This requires freetype2 and imlib2, available in FreeBSD's ports collection under `print/freetype2` - and `graphics/imlib2`. - + and `graphics/imlib2`. This is required for the layout menu popup. + - Customize (if needed) and install `layoutmenu.sh` somewhere in your `$PATH`. ================================================================================ ================================================================================ diff --git a/config.def.h b/config.def.h index bcc9748..9835e4d 100644 --- a/config.def.h +++ b/config.def.h @@ -20,7 +20,8 @@ static const char *colors[][3] = { }; /* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; +#define MAX_TAGLEN 16 +static char tags[][MAX_TAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; static const Rule rules[] = { /* xprop(1): @@ -86,6 +87,7 @@ static const Key keys[] = { { MODKEY, XK_period, focusmon, {.i = +1 } }, { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + { MODKEY, XK_n, nametag, {0} }, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) diff --git a/config.h b/config.h index bcc9748..9835e4d 100644 --- a/config.h +++ b/config.h @@ -20,7 +20,8 @@ static const char *colors[][3] = { }; /* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; +#define MAX_TAGLEN 16 +static char tags[][MAX_TAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; static const Rule rules[] = { /* xprop(1): @@ -86,6 +87,7 @@ static const Key keys[] = { { MODKEY, XK_period, focusmon, {.i = +1 } }, { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + { MODKEY, XK_n, nametag, {0} }, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) diff --git a/dwm.c b/dwm.c index a94b759..21393d8 100644 --- a/dwm.c +++ b/dwm.c @@ -185,6 +185,7 @@ static void maprequest(XEvent *e); static void monocle(Monitor *m); static void motionnotify(XEvent *e); static void movemouse(const Arg *arg); +static void nametag(const Arg *arg); static Client *nexttiled(Client *c); static void pop(Client *c); static void propertynotify(XEvent *e); @@ -1261,6 +1262,32 @@ movemouse(const Arg *arg) } } +void +nametag(const Arg *arg) { + char *p, name[MAX_TAGLEN]; + FILE *f; + int i; + + errno = 0; // popen(3p) says on failure it "may" set errno + if(!(f = popen("dmenu < /dev/null", "r"))) { + fprintf(stderr, "dwm: popen 'dmenu < /dev/null' failed%s%s\n", errno ? ": " : "", errno ? strerror(errno) : ""); + return; + } + if (!(p = fgets(name, MAX_TAGLEN, f)) && (i = errno) && ferror(f)) + fprintf(stderr, "dwm: fgets failed: %s\n", strerror(i)); + if (pclose(f) < 0) + fprintf(stderr, "dwm: pclose failed: %s\n", strerror(errno)); + if(!p) + return; + if((p = strchr(name, '\n'))) + *p = '\0'; + + for(i = 0; i < LENGTH(tags); i++) + if(selmon->tagset[selmon->seltags] & (1 << i)) + strcpy(tags[i], name); + drawbars(); +} + Client * nexttiled(Client *c) { -- 2.20.1