Introduction
Introduction Statistics Contact Development Disclaimer Help
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
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.