dwm-autostart-20210120-cb3f58a.diff - sites - public wiki contents of suckless.… | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
dwm-autostart-20210120-cb3f58a.diff (5257B) | |
--- | |
1 From 37e970479dc5d40e57fc0cbfeaa5e39941483237 Mon Sep 17 00:00:00 2001 | |
2 From: Gan Ainm <[email protected]> | |
3 Date: Wed, 10 Jun 2020 10:59:02 +0000 | |
4 Subject: [PATCH] dwm-xdgautostart-6.2.diff | |
5 | |
6 =================================================================== | |
7 --- | |
8 dwm.1 | 23 +++++++++++++++++ | |
9 dwm.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |
10 2 files changed, 105 insertions(+) | |
11 | |
12 diff --git a/dwm.1 b/dwm.1 | |
13 index 13b3729..9533aa6 100644 | |
14 --- a/dwm.1 | |
15 +++ b/dwm.1 | |
16 @@ -30,6 +30,14 @@ top left corner. The tags which are applied to one o… | |
17 indicated with an empty square in the top left corner. | |
18 .P | |
19 dwm draws a small border around windows to indicate the focus state. | |
20 +.P | |
21 +On start, dwm can start additional programs that may be specified in tw… | |
22 +shell scripts (see the FILES section below), autostart_blocking.sh and | |
23 +autostart.sh. The former is executed first and dwm will wait for its | |
24 +termination before starting. The latter is executed in the background … | |
25 +dwm enters its handler loop. | |
26 +.P | |
27 +Either of these files may be omitted. | |
28 .SH OPTIONS | |
29 .TP | |
30 .B \-v | |
31 @@ -152,6 +160,21 @@ Toggles focused window between floating and tiled s… | |
32 .TP | |
33 .B Mod1\-Button3 | |
34 Resize focused window while dragging. Tiled windows will be toggled to … | |
35 +.SH FILES | |
36 +The files containing programs to be started along with dwm are searched… | |
37 +the following directories: | |
38 +.IP "1. $XDG_DATA_HOME/dwm" | |
39 +.IP "2. $HOME/.local/share/dwm" | |
40 +.IP "3. $HOME/.dwm" | |
41 +.P | |
42 +The first existing directory is scanned for any of the autostart files … | |
43 +.TP 15 | |
44 +autostart.sh | |
45 +This file is started as a shell background process before dwm enters it… | |
46 +loop. | |
47 +.TP 15 | |
48 +autostart_blocking.sh | |
49 +This file is started before any autostart.sh; dwm waits for its termina… | |
50 .SH CUSTOMIZATION | |
51 dwm is customized by creating a custom config.h and (re)compiling the s… | |
52 code. This keeps it fast, secure and simple. | |
53 diff --git a/dwm.c b/dwm.c | |
54 index 4465af1..2156b49 100644 | |
55 --- a/dwm.c | |
56 +++ b/dwm.c | |
57 @@ -29,6 +29,7 @@ | |
58 #include <string.h> | |
59 #include <unistd.h> | |
60 #include <sys/types.h> | |
61 +#include <sys/stat.h> | |
62 #include <sys/wait.h> | |
63 #include <X11/cursorfont.h> | |
64 #include <X11/keysym.h> | |
65 @@ -193,6 +194,7 @@ static void resizeclient(Client *c, int x, int y, in… | |
66 static void resizemouse(const Arg *arg); | |
67 static void restack(Monitor *m); | |
68 static void run(void); | |
69 +static void runautostart(void); | |
70 static void scan(void); | |
71 static int sendevent(Client *c, Atom proto); | |
72 static void sendmon(Client *c, Monitor *m); | |
73 @@ -235,7 +237,11 @@ static int xerrorstart(Display *dpy, XErrorEvent *e… | |
74 static void zoom(const Arg *arg); | |
75 | |
76 /* variables */ | |
77 +static const char autostartblocksh[] = "autostart_blocking.sh"; | |
78 +static const char autostartsh[] = "autostart.sh"; | |
79 static const char broken[] = "broken"; | |
80 +static const char dwmdir[] = "dwm"; | |
81 +static const char localshare[] = ".local/share"; | |
82 static char stext[256]; | |
83 static int screen; | |
84 static int sw, sh; /* X display screen geometry width, height… | |
85 @@ -1380,6 +1386,83 @@ run(void) | |
86 handler[ev.type](&ev); /* call handler */ | |
87 } | |
88 | |
89 +void | |
90 +runautostart(void) | |
91 +{ | |
92 + char *pathpfx; | |
93 + char *path; | |
94 + char *xdgdatahome; | |
95 + char *home; | |
96 + struct stat sb; | |
97 + | |
98 + if ((home = getenv("HOME")) == NULL) | |
99 + /* this is almost impossible */ | |
100 + return; | |
101 + | |
102 + /* if $XDG_DATA_HOME is set and not empty, use $XDG_DATA_HOME/d… | |
103 + * otherwise use ~/.local/share/dwm as autostart script directo… | |
104 + */ | |
105 + xdgdatahome = getenv("XDG_DATA_HOME"); | |
106 + if (xdgdatahome != NULL && *xdgdatahome != '\0') { | |
107 + /* space for path segments, separators and nul */ | |
108 + pathpfx = ecalloc(1, strlen(xdgdatahome) + strlen(dwmdi… | |
109 + | |
110 + if (sprintf(pathpfx, "%s/%s", xdgdatahome, dwmdir) <= 0… | |
111 + free(pathpfx); | |
112 + return; | |
113 + } | |
114 + } else { | |
115 + /* space for path segments, separators and nul */ | |
116 + pathpfx = ecalloc(1, strlen(home) + strlen(localshare) | |
117 + + strlen(dwmdir) + 3); | |
118 + | |
119 + if (sprintf(pathpfx, "%s/%s/%s", home, localshare, dwmd… | |
120 + free(pathpfx); | |
121 + return; | |
122 + } | |
123 + } | |
124 + | |
125 + /* check if the autostart script directory exists */ | |
126 + if (! (stat(pathpfx, &sb) == 0 && S_ISDIR(sb.st_mode))) { | |
127 + /* the XDG conformant path does not exist or is no dire… | |
128 + * so we try ~/.dwm instead | |
129 + */ | |
130 + char *pathpfx_new = realloc(pathpfx, strlen(home) + str… | |
131 + if(pathpfx_new == NULL) { | |
132 + free(pathpfx); | |
133 + return; | |
134 + } | |
135 + pathpfx = pathpfx_new; | |
136 + | |
137 + if (sprintf(pathpfx, "%s/.%s", home, dwmdir) <= 0) { | |
138 + free(pathpfx); | |
139 + return; | |
140 + } | |
141 + } | |
142 + | |
143 + /* try the blocking script first */ | |
144 + path = ecalloc(1, strlen(pathpfx) + strlen(autostartblocksh) + … | |
145 + if (sprintf(path, "%s/%s", pathpfx, autostartblocksh) <= 0) { | |
146 + free(path); | |
147 + free(pathpfx); | |
148 + } | |
149 + | |
150 + if (access(path, X_OK) == 0) | |
151 + system(path); | |
152 + | |
153 + /* now the non-blocking script */ | |
154 + if (sprintf(path, "%s/%s", pathpfx, autostartsh) <= 0) { | |
155 + free(path); | |
156 + free(pathpfx); | |
157 + } | |
158 + | |
159 + if (access(path, X_OK) == 0) | |
160 + system(strcat(path, " &")); | |
161 + | |
162 + free(pathpfx); | |
163 + free(path); | |
164 +} | |
165 + | |
166 void | |
167 scan(void) | |
168 { | |
169 @@ -2142,6 +2223,7 @@ main(int argc, char *argv[]) | |
170 die("pledge"); | |
171 #endif /* __OpenBSD__ */ | |
172 scan(); | |
173 + runautostart(); | |
174 run(); | |
175 cleanup(); | |
176 XCloseDisplay(dpy); | |
177 -- | |
178 2.27.0 | |
179 |