sites

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

dwm-autostarttags-6.4.diff (3605B)


      1 From c5a1d2e5f899a0d12833eef20f540d0869db462d Mon Sep 17 00:00:00 2001
      2 From: cwills <cwills.dev@gmail.com>
      3 Date: Sun, 3 Dec 2023 21:41:29 -0500
      4 Subject: [PATCH] spawn cmds on specific tags at startup
      5 
      6 ---
      7  config.def.h | 13 +++++++++++++
      8  dwm.c        | 48 ++++++++++++++++++++++++++++++++++++++++++++++--
      9  2 files changed, 59 insertions(+), 2 deletions(-)
     10 
     11 diff --git a/config.def.h b/config.def.h
     12 index 9efa774..4aac448 100644
     13 --- a/config.def.h
     14 +++ b/config.def.h
     15 @@ -60,6 +60,19 @@ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn()
     16  static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
     17  static const char *termcmd[]  = { "st", NULL };
     18  
     19 +static const char *termcmd2[] = { "xterm", NULL };
     20 +static const char *browsercmd[] = {"librewolf", NULL};
     21 +static const char *keepassxccmd[] = {"keepassxc", NULL};
     22 +static const char *emacscmd[] = {"emacs", NULL};
     23 +
     24 +Autostarttag autostarttaglist[] = {
     25 +	{.cmd = browsercmd, .tags = 1 << 0 },
     26 +	{.cmd = keepassxccmd, .tags = 1 << 4 },
     27 +	{.cmd = emacscmd, .tags = 1 << 7 },
     28 +	{.cmd = termcmd2, .tags = 1 << 8 },
     29 +	{.cmd = NULL, .tags = 0 },
     30 +};
     31 +
     32  static const Key keys[] = {
     33  	/* modifier                     key        function        argument */
     34  	{ MODKEY,                       XK_p,      spawn,          {.v = dmenucmd } },
     35 diff --git a/dwm.c b/dwm.c
     36 index f1d86b2..000ff46 100644
     37 --- a/dwm.c
     38 +++ b/dwm.c
     39 @@ -141,6 +141,11 @@ typedef struct {
     40  	int monitor;
     41  } Rule;
     42  
     43 +typedef struct {
     44 +	const char **cmd;
     45 +	unsigned int tags;
     46 +} Autostarttag;
     47 +
     48  /* function declarations */
     49  static void applyrules(Client *c);
     50  static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact);
     51 @@ -206,6 +211,8 @@ static void setup(void);
     52  static void seturgent(Client *c, int urg);
     53  static void showhide(Client *c);
     54  static void spawn(const Arg *arg);
     55 +static void autostarttagsspawner(void);
     56 +static void applyautostarttags(Client *c);
     57  static void tag(const Arg *arg);
     58  static void tagmon(const Arg *arg);
     59  static void tile(Monitor *m);
     60 @@ -267,6 +274,9 @@ static Display *dpy;
     61  static Drw *drw;
     62  static Monitor *mons, *selmon;
     63  static Window root, wmcheckwin;
     64 +static unsigned int autostarttags = 0;
     65 +static int autostartcomplete = 0;
     66 +static int autostartcmdscomplete = 0;
     67  
     68  /* configuration, allows nested code to access above variables */
     69  #include "config.h"
     70 @@ -1050,7 +1060,11 @@ manage(Window w, XWindowAttributes *wa)
     71  		c->tags = t->tags;
     72  	} else {
     73  		c->mon = selmon;
     74 -		applyrules(c);
     75 +		if (autostarttags) {
     76 +			applyautostarttags(c);
     77 +		} else {
     78 +			applyrules(c);
     79 +		}
     80  	}
     81  
     82  	if (c->x + WIDTH(c) > c->mon->wx + c->mon->ww)
     83 @@ -1385,9 +1399,12 @@ run(void)
     84  	XEvent ev;
     85  	/* main event loop */
     86  	XSync(dpy, False);
     87 -	while (running && !XNextEvent(dpy, &ev))
     88 +	while (running && !XNextEvent(dpy, &ev)){
     89 +		if (!(autostartcomplete || autostarttags))
     90 +			autostarttagsspawner();
     91  		if (handler[ev.type])
     92  			handler[ev.type](&ev); /* call handler */
     93 +	}
     94  }
     95  
     96  void
     97 @@ -1676,6 +1693,33 @@ tag(const Arg *arg)
     98  	}
     99  }
    100  
    101 +void
    102 +autostarttagsspawner(void)
    103 +{
    104 +	int i;
    105 +	Arg arg;
    106 +
    107 +	for (i = autostartcmdscomplete; i < LENGTH(autostarttaglist) ; i++){
    108 +		autostartcmdscomplete += 1;
    109 +		autostarttags = autostarttaglist[i].tags;
    110 +		arg.v = autostarttaglist[i].cmd ;
    111 +		spawn(&arg);
    112 +		return;
    113 +	}
    114 +	autostartcomplete = 1;
    115 +	return;
    116 +}
    117 +
    118 +void
    119 +applyautostarttags(Client *c)
    120 +{
    121 +	if (!c)
    122 +		return;
    123 +	c->tags = autostarttags;
    124 +	autostarttags = 0;
    125 +	return;
    126 +}
    127 +
    128  void
    129  tagmon(const Arg *arg)
    130  {
    131 -- 
    132 2.30.2
    133