summaryrefslogtreecommitdiff
path: root/dwm-6.2
diff options
context:
space:
mode:
Diffstat (limited to 'dwm-6.2')
-rw-r--r--dwm-6.2/config.def.h5
-rw-r--r--dwm-6.2/config.def.h.orig141
-rw-r--r--dwm-6.2/config.h9
-rw-r--r--dwm-6.2/drw.obin0 -> 10528 bytes
-rwxr-xr-xdwm-6.2/dwmbin0 -> 71928 bytes
-rw-r--r--dwm-6.2/dwm-cool-autostart-6.2.diff116
-rw-r--r--dwm-6.2/dwm.123
-rw-r--r--dwm-6.2/dwm.1.orig199
-rw-r--r--dwm-6.2/dwm.c142
-rw-r--r--dwm-6.2/dwm.c.orig105
-rw-r--r--dwm-6.2/dwm.obin0 -> 62608 bytes
-rw-r--r--dwm-6.2/sarc-autostart.diff (renamed from dwm-6.2/dwm-autostart-20210120-cb3f58a.diff)0
-rw-r--r--dwm-6.2/util.obin0 -> 2256 bytes
13 files changed, 545 insertions, 195 deletions
diff --git a/dwm-6.2/config.def.h b/dwm-6.2/config.def.h
index cab05db..48474eb 100644
--- a/dwm-6.2/config.def.h
+++ b/dwm-6.2/config.def.h
@@ -20,6 +20,11 @@ static const char *colors[][3] = {
[SchemeSel] = { col_gray4, col_cyan, col_cyan },
};
+static const char *const autostart[] = {
+ "st", NULL,
+ NULL /* terminate */
+};
+
/* tagging */
static const char *tags[] = { "/", "dev", "web", "etc", };
diff --git a/dwm-6.2/config.def.h.orig b/dwm-6.2/config.def.h.orig
new file mode 100644
index 0000000..cab05db
--- /dev/null
+++ b/dwm-6.2/config.def.h.orig
@@ -0,0 +1,141 @@
+#include "../themes/theme.h"
+
+/* See LICENSE file for copyright and license details. */
+
+/* appearance */
+static const unsigned int borderpx = 1; /* border pixel of windows */
+static const unsigned int snap = 32; /* snap pixel */
+static const unsigned int gappih = 12; /* horiz inner gap between windows */
+static const unsigned int gappiv = 15; /* vert inner gap between windows */
+static const unsigned int gappoh = 20; /* horiz outer gap between windows and screen edge */
+static const unsigned int gappov = 12; /* vert outer gap between windows and screen edge */
+static const int smartgaps = 0; /* 1 means no outer gap when there is only one window */
+static const int showbar = 1; /* 0 means no bar */
+static const int topbar = 1; /* 0 means bottom bar */
+static const char *fonts[] = { "Source Code Pro:size=9" };
+static const char dmenufont[] = "Source Code Pro:size=9";
+static const char *colors[][3] = {
+ /* fg bg border */
+ [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
+ [SchemeSel] = { col_gray4, col_cyan, col_cyan },
+};
+
+/* tagging */
+static const char *tags[] = { "/", "dev", "web", "etc", };
+
+static const Rule rules[] = {
+ /* xprop(1):
+ * WM_CLASS(STRING) = instance, class
+ * WM_NAME(STRING) = title
+ */
+ /* class instance title tags mask isfloating monitor */
+ { "Gimp", NULL, NULL, 0, 1, -1 },
+ { "Firefox", NULL, NULL, 1 << 8, 0, -1 },
+};
+
+/* layout(s) */
+static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
+static const int nmaster = 1; /* number of clients in master area */
+static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
+
+static const Layout layouts[] = {
+ /* symbol arrange function */
+ { "[]=", tile }, /* first entry is default */
+ { "><>", NULL }, /* no layout function means floating behavior */
+ { "[M]", monocle },
+};
+
+/* key definitions */
+#define MODKEY Mod1Mask
+#define TAGKEYS(KEY,TAG) \
+ { MODKEY, KEY, view, {.ui = 1 << TAG} }, \
+ { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
+ { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \
+ { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} },
+
+/* helper for spawning shell commands in the pre dwm-5.0 fashion */
+#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
+
+/* commands */
+static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
+static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
+static const char *termcmd[] = { "st", NULL };
+
+static Key keys[] = {
+ /* modifier key function argument */
+ { MODKEY, XK_d, spawn, {.v = dmenucmd } },
+ { MODKEY, XK_Return, spawn, {.v = termcmd } },
+ { MODKEY, XK_b, togglebar, {0} },
+ { MODKEY, XK_j, focusstack, {.i = +1 } },
+ { MODKEY, XK_k, focusstack, {.i = -1 } },
+/* { MODKEY, XK_i, incnmaster, {.i = +1 } },
+ { MODKEY, XK_d, incnmaster, {.i = -1 } },
+*/ { MODKEY, XK_h, setmfact, {.f = -0.05} },
+ { MODKEY, XK_l, setmfact, {.f = +0.05} },
+ { MODKEY|Mod4Mask, XK_h, incrgaps, {.i = +1 } },
+ { MODKEY|Mod4Mask, XK_l, incrgaps, {.i = -1 } },
+ { MODKEY|Mod4Mask|ShiftMask, XK_h, incrogaps, {.i = +1 } },
+ { MODKEY|Mod4Mask|ShiftMask, XK_l, incrogaps, {.i = -1 } },
+ { MODKEY|Mod4Mask|ControlMask, XK_h, incrigaps, {.i = +1 } },
+ { MODKEY|Mod4Mask|ControlMask, XK_l, incrigaps, {.i = -1 } },
+ { MODKEY|Mod4Mask, XK_0, togglegaps, {0} },
+ { MODKEY|Mod4Mask|ShiftMask, XK_0, defaultgaps, {0} },
+ { MODKEY, XK_y, incrihgaps, {.i = +1 } },
+ { MODKEY, XK_o, incrihgaps, {.i = -1 } },
+ { MODKEY|ControlMask, XK_y, incrivgaps, {.i = +1 } },
+ { MODKEY|ControlMask, XK_o, incrivgaps, {.i = -1 } },
+ { MODKEY|Mod4Mask, XK_y, incrohgaps, {.i = +1 } },
+ { MODKEY|Mod4Mask, XK_o, incrohgaps, {.i = -1 } },
+ { MODKEY|ShiftMask, XK_y, incrovgaps, {.i = +1 } },
+ { MODKEY|ShiftMask, XK_o, incrovgaps, {.i = -1 } },
+ { MODKEY|ShiftMask, XK_Return, zoom, {0} },
+ { MODKEY, XK_Tab, view, {0} },
+ { MODKEY, XK_x, killclient, {0} },
+ { MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
+ /*{ MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, */
+ { MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
+ { MODKEY, XK_space, setlayout, {0} },
+ { MODKEY|ShiftMask, XK_space, togglefloating, {0} },
+ { MODKEY, XK_0, view, {.ui = ~0 } },
+ { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
+ { MODKEY, XK_comma, focusmon, {.i = -1 } },
+ { MODKEY, XK_period, focusmon, {.i = +1 } },
+ { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
+ { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
+ // Custom keybinds
+ { MODKEY, XK_f, spawn, SHCMD("surf_run") },
+ { MODKEY|ShiftMask, XK_f, spawn, SHCMD("chromium") },
+ { MODKEY|ShiftMask, XK_b, spawn, SHCMD("brighter") },
+ { MODKEY|ShiftMask, XK_l, spawn, SHCMD("darker") },
+ { MODKEY|ShiftMask, XK_u, spawn, SHCMD("vol_up") },
+ { MODKEY|ShiftMask, XK_d, spawn, SHCMD("vol_down") },
+ { MODKEY|ShiftMask, XK_m, spawn, SHCMD("mute") },
+ TAGKEYS( XK_1, 0)
+ TAGKEYS( XK_2, 1)
+ TAGKEYS( XK_3, 2)
+ TAGKEYS( XK_4, 3)
+ TAGKEYS( XK_5, 4)
+ TAGKEYS( XK_6, 5)
+ TAGKEYS( XK_7, 6)
+ TAGKEYS( XK_8, 7)
+ TAGKEYS( XK_9, 8)
+ { MODKEY|ShiftMask, XK_q, quit, {0} },
+};
+
+/* button definitions */
+/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
+static Button buttons[] = {
+ /* click event mask button function argument */
+ { ClkLtSymbol, 0, Button1, setlayout, {0} },
+ { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
+ { ClkWinTitle, 0, Button2, zoom, {0} },
+ { ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
+ { ClkClientWin, MODKEY, Button1, movemouse, {0} },
+ { ClkClientWin, MODKEY, Button2, togglefloating, {0} },
+ { ClkClientWin, MODKEY, Button3, resizemouse, {0} },
+ { ClkTagBar, 0, Button1, view, {0} },
+ { ClkTagBar, 0, Button3, toggleview, {0} },
+ { ClkTagBar, MODKEY, Button1, tag, {0} },
+ { ClkTagBar, MODKEY, Button3, toggletag, {0} },
+};
+
diff --git a/dwm-6.2/config.h b/dwm-6.2/config.h
index 8a40171..bc651af 100644
--- a/dwm-6.2/config.h
+++ b/dwm-6.2/config.h
@@ -20,6 +20,15 @@ static const char *colors[][3] = {
[SchemeSel] = { col_gray4, col_cyan, col_cyan },
};
+static const char *const autostart[] = {
+ "st", NULL,
+ "picom", NULL,
+ "fehbg", NULL,
+ "dunst", NULL,
+ "dwmblocks", NULL,
+ NULL /* terminate */
+};
+
/* tagging */
static const char *tags[] = { "/", "dev", "web", "etc", };
diff --git a/dwm-6.2/drw.o b/dwm-6.2/drw.o
new file mode 100644
index 0000000..ecc65b6
--- /dev/null
+++ b/dwm-6.2/drw.o
Binary files differ
diff --git a/dwm-6.2/dwm b/dwm-6.2/dwm
new file mode 100755
index 0000000..d5fcebd
--- /dev/null
+++ b/dwm-6.2/dwm
Binary files differ
diff --git a/dwm-6.2/dwm-cool-autostart-6.2.diff b/dwm-6.2/dwm-cool-autostart-6.2.diff
new file mode 100644
index 0000000..84a93ea
--- /dev/null
+++ b/dwm-6.2/dwm-cool-autostart-6.2.diff
@@ -0,0 +1,116 @@
+diff --git a/config.def.h b/config.def.h
+index 1c0b587..ed056a4 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -18,6 +18,11 @@ static const char *colors[][3] = {
+ [SchemeSel] = { col_gray4, col_cyan, col_cyan },
+ };
+
++static const char *const autostart[] = {
++ "st", NULL,
++ NULL /* terminate */
++};
++
+ /* tagging */
+ static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
+
+diff --git a/dwm.c b/dwm.c
+index 9fd0286..1facd56 100644
+--- a/dwm.c
++++ b/dwm.c
+@@ -234,6 +234,7 @@ static int xerror(Display *dpy, XErrorEvent *ee);
+ static int xerrordummy(Display *dpy, XErrorEvent *ee);
+ static int xerrorstart(Display *dpy, XErrorEvent *ee);
+ static void zoom(const Arg *arg);
++static void autostart_exec(void);
+
+ /* variables */
+ static const char broken[] = "broken";
+@@ -275,6 +276,34 @@ static Window root, wmcheckwin;
+ /* compile-time check if all tags fit into an unsigned int bit array. */
+ struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
+
++/* dwm will keep pid's of processes from autostart array and kill them at quit */
++static pid_t *autostart_pids;
++static size_t autostart_len;
++
++/* execute command from autostart array */
++static void
++autostart_exec() {
++ const char *const *p;
++ size_t i = 0;
++
++ /* count entries */
++ for (p = autostart; *p; autostart_len++, p++)
++ while (*++p);
++
++ autostart_pids = malloc(autostart_len * sizeof(pid_t));
++ for (p = autostart; *p; i++, p++) {
++ if ((autostart_pids[i] = fork()) == 0) {
++ setsid();
++ execvp(*p, (char *const *)p);
++ fprintf(stderr, "dwm: execvp %s\n", *p);
++ perror(" failed");
++ _exit(EXIT_FAILURE);
++ }
++ /* skip arguments */
++ while (*++p);
++ }
++}
++
+ /* function implementations */
+ void
+ applyrules(Client *c)
+@@ -1249,6 +1278,16 @@ propertynotify(XEvent *e)
+ void
+ quit(const Arg *arg)
+ {
++ size_t i;
++
++ /* kill child processes */
++ for (i = 0; i < autostart_len; i++) {
++ if (0 < autostart_pids[i]) {
++ kill(autostart_pids[i], SIGTERM);
++ waitpid(autostart_pids[i], NULL, 0);
++ }
++ }
++
+ running = 0;
+ }
+
+@@ -1632,9 +1671,25 @@ showhide(Client *c)
+ void
+ sigchld(int unused)
+ {
++ pid_t pid;
++
+ if (signal(SIGCHLD, sigchld) == SIG_ERR)
+ die("can't install SIGCHLD handler:");
+- while (0 < waitpid(-1, NULL, WNOHANG));
++ while (0 < (pid = waitpid(-1, NULL, WNOHANG))) {
++ pid_t *p, *lim;
++
++ if (!(p = autostart_pids))
++ continue;
++ lim = &p[autostart_len];
++
++ for (; p < lim; p++) {
++ if (*p == pid) {
++ *p = -1;
++ break;
++ }
++ }
++
++ }
+ }
+
+ void
+@@ -2139,6 +2194,7 @@ main(int argc, char *argv[])
+ if (!(dpy = XOpenDisplay(NULL)))
+ die("dwm: cannot open display");
+ checkotherwm();
++ autostart_exec();
+ setup();
+ #ifdef __OpenBSD__
+ if (pledge("stdio rpath proc exec", NULL) == -1)
+
diff --git a/dwm-6.2/dwm.1 b/dwm-6.2/dwm.1
index 9533aa6..13b3729 100644
--- a/dwm-6.2/dwm.1
+++ b/dwm-6.2/dwm.1
@@ -30,14 +30,6 @@ top left corner. The tags which are applied to one or more windows are
indicated with an empty square in the top left corner.
.P
dwm draws a small border around windows to indicate the focus state.
-.P
-On start, dwm can start additional programs that may be specified in two special
-shell scripts (see the FILES section below), autostart_blocking.sh and
-autostart.sh. The former is executed first and dwm will wait for its
-termination before starting. The latter is executed in the background before
-dwm enters its handler loop.
-.P
-Either of these files may be omitted.
.SH OPTIONS
.TP
.B \-v
@@ -160,21 +152,6 @@ Toggles focused window between floating and tiled state.
.TP
.B Mod1\-Button3
Resize focused window while dragging. Tiled windows will be toggled to the floating state.
-.SH FILES
-The files containing programs to be started along with dwm are searched for in
-the following directories:
-.IP "1. $XDG_DATA_HOME/dwm"
-.IP "2. $HOME/.local/share/dwm"
-.IP "3. $HOME/.dwm"
-.P
-The first existing directory is scanned for any of the autostart files below.
-.TP 15
-autostart.sh
-This file is started as a shell background process before dwm enters its handler
-loop.
-.TP 15
-autostart_blocking.sh
-This file is started before any autostart.sh; dwm waits for its termination.
.SH CUSTOMIZATION
dwm is customized by creating a custom config.h and (re)compiling the source
code. This keeps it fast, secure and simple.
diff --git a/dwm-6.2/dwm.1.orig b/dwm-6.2/dwm.1.orig
new file mode 100644
index 0000000..9533aa6
--- /dev/null
+++ b/dwm-6.2/dwm.1.orig
@@ -0,0 +1,199 @@
+.TH DWM 1 dwm\-VERSION
+.SH NAME
+dwm \- dynamic window manager
+.SH SYNOPSIS
+.B dwm
+.RB [ \-v ]
+.SH DESCRIPTION
+dwm is a dynamic window manager for X. It manages windows in tiled, monocle
+and floating layouts. Either layout can be applied dynamically, optimising the
+environment for the application in use and the task performed.
+.P
+In tiled layouts windows are managed in a master and stacking area. The master
+area on the left contains one window by default, and the stacking area on the
+right contains all other windows. The number of master area windows can be
+adjusted from zero to an arbitrary number. In monocle layout all windows are
+maximised to the screen size. In floating layout windows can be resized and
+moved freely. Dialog windows are always managed floating, regardless of the
+layout applied.
+.P
+Windows are grouped by tags. Each window can be tagged with one or multiple
+tags. Selecting certain tags displays all windows with these tags.
+.P
+Each screen contains a small status bar which displays all available tags, the
+layout, the title of the focused window, and the text read from the root window
+name property, if the screen is focused. A floating window is indicated with an
+empty square and a maximised floating window is indicated with a filled square
+before the windows title. The selected tags are indicated with a different
+color. The tags of the focused window are indicated with a filled square in the
+top left corner. The tags which are applied to one or more windows are
+indicated with an empty square in the top left corner.
+.P
+dwm draws a small border around windows to indicate the focus state.
+.P
+On start, dwm can start additional programs that may be specified in two special
+shell scripts (see the FILES section below), autostart_blocking.sh and
+autostart.sh. The former is executed first and dwm will wait for its
+termination before starting. The latter is executed in the background before
+dwm enters its handler loop.
+.P
+Either of these files may be omitted.
+.SH OPTIONS
+.TP
+.B \-v
+prints version information to standard output, then exits.
+.SH USAGE
+.SS Status bar
+.TP
+.B X root window name
+is read and displayed in the status text area. It can be set with the
+.BR xsetroot (1)
+command.
+.TP
+.B Button1
+click on a tag label to display all windows with that tag, click on the layout
+label toggles between tiled and floating layout.
+.TP
+.B Button3
+click on a tag label adds/removes all windows with that tag to/from the view.
+.TP
+.B Mod1\-Button1
+click on a tag label applies that tag to the focused window.
+.TP
+.B Mod1\-Button3
+click on a tag label adds/removes that tag to/from the focused window.
+.SS Keyboard commands
+.TP
+.B Mod1\-Shift\-Return
+Start
+.BR st(1).
+.TP
+.B Mod1\-p
+Spawn
+.BR dmenu(1)
+for launching other programs.
+.TP
+.B Mod1\-,
+Focus previous screen, if any.
+.TP
+.B Mod1\-.
+Focus next screen, if any.
+.TP
+.B Mod1\-Shift\-,
+Send focused window to previous screen, if any.
+.TP
+.B Mod1\-Shift\-.
+Send focused window to next screen, if any.
+.TP
+.B Mod1\-b
+Toggles bar on and off.
+.TP
+.B Mod1\-t
+Sets tiled layout.
+.TP
+.B Mod1\-f
+Sets floating layout.
+.TP
+.B Mod1\-m
+Sets monocle layout.
+.TP
+.B Mod1\-space
+Toggles between current and previous layout.
+.TP
+.B Mod1\-j
+Focus next window.
+.TP
+.B Mod1\-k
+Focus previous window.
+.TP
+.B Mod1\-i
+Increase number of windows in master area.
+.TP
+.B Mod1\-d
+Decrease number of windows in master area.
+.TP
+.B Mod1\-l
+Increase master area size.
+.TP
+.B Mod1\-h
+Decrease master area size.
+.TP
+.B Mod1\-Return
+Zooms/cycles focused window to/from master area (tiled layouts only).
+.TP
+.B Mod1\-Shift\-c
+Close focused window.
+.TP
+.B Mod1\-Shift\-space
+Toggle focused window between tiled and floating state.
+.TP
+.B Mod1\-Tab
+Toggles to the previously selected tags.
+.TP
+.B Mod1\-Shift\-[1..n]
+Apply nth tag to focused window.
+.TP
+.B Mod1\-Shift\-0
+Apply all tags to focused window.
+.TP
+.B Mod1\-Control\-Shift\-[1..n]
+Add/remove nth tag to/from focused window.
+.TP
+.B Mod1\-[1..n]
+View all windows with nth tag.
+.TP
+.B Mod1\-0
+View all windows with any tag.
+.TP
+.B Mod1\-Control\-[1..n]
+Add/remove all windows with nth tag to/from the view.
+.TP
+.B Mod1\-Shift\-q
+Quit dwm.
+.SS Mouse commands
+.TP
+.B Mod1\-Button1
+Move focused window while dragging. Tiled windows will be toggled to the floating state.
+.TP
+.B Mod1\-Button2
+Toggles focused window between floating and tiled state.
+.TP
+.B Mod1\-Button3
+Resize focused window while dragging. Tiled windows will be toggled to the floating state.
+.SH FILES
+The files containing programs to be started along with dwm are searched for in
+the following directories:
+.IP "1. $XDG_DATA_HOME/dwm"
+.IP "2. $HOME/.local/share/dwm"
+.IP "3. $HOME/.dwm"
+.P
+The first existing directory is scanned for any of the autostart files below.
+.TP 15
+autostart.sh
+This file is started as a shell background process before dwm enters its handler
+loop.
+.TP 15
+autostart_blocking.sh
+This file is started before any autostart.sh; dwm waits for its termination.
+.SH CUSTOMIZATION
+dwm is customized by creating a custom config.h and (re)compiling the source
+code. This keeps it fast, secure and simple.
+.SH SEE ALSO
+.BR dmenu (1),
+.BR st (1)
+.SH ISSUES
+Java applications which use the XToolkit/XAWT backend may draw grey windows
+only. The XToolkit/XAWT backend breaks ICCCM-compliance in recent JDK 1.5 and early
+JDK 1.6 versions, because it assumes a reparenting window manager. Possible workarounds
+are using JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or setting the
+environment variable
+.BR AWT_TOOLKIT=MToolkit
+(to use the older Motif backend instead) or running
+.B xprop -root -f _NET_WM_NAME 32a -set _NET_WM_NAME LG3D
+or
+.B wmname LG3D
+(to pretend that a non-reparenting window manager is running that the
+XToolkit/XAWT backend can recognize) or when using OpenJDK setting the environment variable
+.BR _JAVA_AWT_WM_NONREPARENTING=1 .
+.SH BUGS
+Send all bug reports with a patch to hackers@suckless.org.
diff --git a/dwm-6.2/dwm.c b/dwm-6.2/dwm.c
index f788759..af6b7f8 100644
--- a/dwm-6.2/dwm.c
+++ b/dwm-6.2/dwm.c
@@ -29,7 +29,6 @@
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
-#include <sys/stat.h>
#include <sys/wait.h>
#include <X11/cursorfont.h>
#include <X11/keysym.h>
@@ -199,7 +198,6 @@ static void resizeclient(Client *c, int x, int y, int w, int h);
static void resizemouse(const Arg *arg);
static void restack(Monitor *m);
static void run(void);
-static void runautostart(void);
static void scan(void);
static int sendevent(Client *c, Atom proto);
static void sendmon(Client *c, Monitor *m);
@@ -250,13 +248,10 @@ static int xerror(Display *dpy, XErrorEvent *ee);
static int xerrordummy(Display *dpy, XErrorEvent *ee);
static int xerrorstart(Display *dpy, XErrorEvent *ee);
static void zoom(const Arg *arg);
+static void autostart_exec(void);
/* variables */
-static const char autostartblocksh[] = "autostart_blocking.sh";
-static const char autostartsh[] = "autostart.sh";
static const char broken[] = "broken";
-static const char dwmdir[] = "dwm";
-static const char localshare[] = ".local/share";
static char stext[256];
static int screen;
static int sw, sh; /* X display screen geometry width, height */
@@ -296,6 +291,34 @@ static Window root, wmcheckwin;
/* compile-time check if all tags fit into an unsigned int bit array. */
struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
+/* dwm will keep pid's of processes from autostart array and kill them at quit */
+static pid_t *autostart_pids;
+static size_t autostart_len;
+
+/* execute command from autostart array */
+static void
+autostart_exec() {
+ const char *const *p;
+ size_t i = 0;
+
+ /* count entries */
+ for (p = autostart; *p; autostart_len++, p++)
+ while (*++p);
+
+ autostart_pids = malloc(autostart_len * sizeof(pid_t));
+ for (p = autostart; *p; i++, p++) {
+ if ((autostart_pids[i] = fork()) == 0) {
+ setsid();
+ execvp(*p, (char *const *)p);
+ fprintf(stderr, "dwm: execvp %s\n", *p);
+ perror(" failed");
+ _exit(EXIT_FAILURE);
+ }
+ /* skip arguments */
+ while (*++p);
+ }
+}
+
/* function implementations */
void
applyrules(Client *c)
@@ -1288,6 +1311,16 @@ propertynotify(XEvent *e)
void
quit(const Arg *arg)
{
+ size_t i;
+
+ /* kill child processes */
+ for (i = 0; i < autostart_len; i++) {
+ if (0 < autostart_pids[i]) {
+ kill(autostart_pids[i], SIGTERM);
+ waitpid(autostart_pids[i], NULL, 0);
+ }
+ }
+
running = 0;
}
@@ -1421,83 +1454,6 @@ run(void)
}
void
-runautostart(void)
-{
- char *pathpfx;
- char *path;
- char *xdgdatahome;
- char *home;
- struct stat sb;
-
- if ((home = getenv("HOME")) == NULL)
- /* this is almost impossible */
- return;
-
- /* if $XDG_DATA_HOME is set and not empty, use $XDG_DATA_HOME/dwm,
- * otherwise use ~/.local/share/dwm as autostart script directory
- */
- xdgdatahome = getenv("XDG_DATA_HOME");
- if (xdgdatahome != NULL && *xdgdatahome != '\0') {
- /* space for path segments, separators and nul */
- pathpfx = ecalloc(1, strlen(xdgdatahome) + strlen(dwmdir) + 2);
-
- if (sprintf(pathpfx, "%s/%s", xdgdatahome, dwmdir) <= 0) {
- free(pathpfx);
- return;
- }
- } else {
- /* space for path segments, separators and nul */
- pathpfx = ecalloc(1, strlen(home) + strlen(localshare)
- + strlen(dwmdir) + 3);
-
- if (sprintf(pathpfx, "%s/%s/%s", home, localshare, dwmdir) < 0) {
- free(pathpfx);
- return;
- }
- }
-
- /* check if the autostart script directory exists */
- if (! (stat(pathpfx, &sb) == 0 && S_ISDIR(sb.st_mode))) {
- /* the XDG conformant path does not exist or is no directory
- * so we try ~/.dwm instead
- */
- char *pathpfx_new = realloc(pathpfx, strlen(home) + strlen(dwmdir) + 3);
- if(pathpfx_new == NULL) {
- free(pathpfx);
- return;
- }
- pathpfx = pathpfx_new;
-
- if (sprintf(pathpfx, "%s/.%s", home, dwmdir) <= 0) {
- free(pathpfx);
- return;
- }
- }
-
- /* try the blocking script first */
- path = ecalloc(1, strlen(pathpfx) + strlen(autostartblocksh) + 2);
- if (sprintf(path, "%s/%s", pathpfx, autostartblocksh) <= 0) {
- free(path);
- free(pathpfx);
- }
-
- if (access(path, X_OK) == 0)
- system(path);
-
- /* now the non-blocking script */
- if (sprintf(path, "%s/%s", pathpfx, autostartsh) <= 0) {
- free(path);
- free(pathpfx);
- }
-
- if (access(path, X_OK) == 0)
- system(strcat(path, " &"));
-
- free(pathpfx);
- free(path);
-}
-
-void
scan(void)
{
unsigned int i, num;
@@ -1853,9 +1809,25 @@ showhide(Client *c)
void
sigchld(int unused)
{
+ pid_t pid;
+
if (signal(SIGCHLD, sigchld) == SIG_ERR)
die("can't install SIGCHLD handler:");
- while (0 < waitpid(-1, NULL, WNOHANG));
+ while (0 < (pid = waitpid(-1, NULL, WNOHANG))) {
+ pid_t *p, *lim;
+
+ if (!(p = autostart_pids))
+ continue;
+ lim = &p[autostart_len];
+
+ for (; p < lim; p++) {
+ if (*p == pid) {
+ *p = -1;
+ break;
+ }
+ }
+
+ }
}
void
@@ -2364,13 +2336,13 @@ main(int argc, char *argv[])
if (!(dpy = XOpenDisplay(NULL)))
die("dwm: cannot open display");
checkotherwm();
+ autostart_exec();
setup();
#ifdef __OpenBSD__
if (pledge("stdio rpath proc exec", NULL) == -1)
die("pledge");
#endif /* __OpenBSD__ */
scan();
- runautostart();
run();
cleanup();
XCloseDisplay(dpy);
diff --git a/dwm-6.2/dwm.c.orig b/dwm-6.2/dwm.c.orig
index 520b818..0dfbe8b 100644
--- a/dwm-6.2/dwm.c.orig
+++ b/dwm-6.2/dwm.c.orig
@@ -29,7 +29,6 @@
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
-#include <sys/stat.h>
#include <sys/wait.h>
#include <X11/cursorfont.h>
#include <X11/keysym.h>
@@ -152,6 +151,7 @@ static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interac
static void arrange(Monitor *m);
static void arrangemon(Monitor *m);
static void attach(Client *c);
+static void attachabove(Client *c);
static void attachstack(Client *c);
static void buttonpress(XEvent *e);
static void checkotherwm(void);
@@ -198,7 +198,6 @@ static void resizeclient(Client *c, int x, int y, int w, int h);
static void resizemouse(const Arg *arg);
static void restack(Monitor *m);
static void run(void);
-static void runautostart(void);
static void scan(void);
static int sendevent(Client *c, Atom proto);
static void sendmon(Client *c, Monitor *m);
@@ -251,11 +250,7 @@ static int xerrorstart(Display *dpy, XErrorEvent *ee);
static void zoom(const Arg *arg);
/* variables */
-static const char autostartblocksh[] = "autostart_blocking.sh";
-static const char autostartsh[] = "autostart.sh";
static const char broken[] = "broken";
-static const char dwmdir[] = "dwm";
-static const char localshare[] = ".local/share";
static char stext[256];
static int screen;
static int sw, sh; /* X display screen geometry width, height */
@@ -428,6 +423,20 @@ attach(Client *c)
}
void
+attachabove(Client *c)
+{
+ if (c->mon->sel == NULL || c->mon->sel == c->mon->clients || c->mon->sel->isfloating) {
+ attach(c);
+ return;
+ }
+
+ Client *at;
+ for (at = c->mon->clients; at->next != c->mon->sel; at = at->next);
+ c->next = at->next;
+ at->next = c;
+}
+
+void
attachstack(Client *c)
{
c->snext = c->mon->stack;
@@ -1087,7 +1096,7 @@ manage(Window w, XWindowAttributes *wa)
c->isfloating = c->oldstate = trans != None || c->isfixed;
if (c->isfloating)
XRaiseWindow(dpy, c->win);
- attach(c);
+ attachabove(c);
attachstack(c);
XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
(unsigned char *) &(c->win), 1);
@@ -1406,83 +1415,6 @@ run(void)
}
void
-runautostart(void)
-{
- char *pathpfx;
- char *path;
- char *xdgdatahome;
- char *home;
- struct stat sb;
-
- if ((home = getenv("HOME")) == NULL)
- /* this is almost impossible */
- return;
-
- /* if $XDG_DATA_HOME is set and not empty, use $XDG_DATA_HOME/dwm,
- * otherwise use ~/.local/share/dwm as autostart script directory
- */
- xdgdatahome = getenv("XDG_DATA_HOME");
- if (xdgdatahome != NULL && *xdgdatahome != '\0') {
- /* space for path segments, separators and nul */
- pathpfx = ecalloc(1, strlen(xdgdatahome) + strlen(dwmdir) + 2);
-
- if (sprintf(pathpfx, "%s/%s", xdgdatahome, dwmdir) <= 0) {
- free(pathpfx);
- return;
- }
- } else {
- /* space for path segments, separators and nul */
- pathpfx = ecalloc(1, strlen(home) + strlen(localshare)
- + strlen(dwmdir) + 3);
-
- if (sprintf(pathpfx, "%s/%s/%s", home, localshare, dwmdir) < 0) {
- free(pathpfx);
- return;
- }
- }
-
- /* check if the autostart script directory exists */
- if (! (stat(pathpfx, &sb) == 0 && S_ISDIR(sb.st_mode))) {
- /* the XDG conformant path does not exist or is no directory
- * so we try ~/.dwm instead
- */
- char *pathpfx_new = realloc(pathpfx, strlen(home) + strlen(dwmdir) + 3);
- if(pathpfx_new == NULL) {
- free(pathpfx);
- return;
- }
- pathpfx = pathpfx_new;
-
- if (sprintf(pathpfx, "%s/.%s", home, dwmdir) <= 0) {
- free(pathpfx);
- return;
- }
- }
-
- /* try the blocking script first */
- path = ecalloc(1, strlen(pathpfx) + strlen(autostartblocksh) + 2);
- if (sprintf(path, "%s/%s", pathpfx, autostartblocksh) <= 0) {
- free(path);
- free(pathpfx);
- }
-
- if (access(path, X_OK) == 0)
- system(path);
-
- /* now the non-blocking script */
- if (sprintf(path, "%s/%s", pathpfx, autostartsh) <= 0) {
- free(path);
- free(pathpfx);
- }
-
- if (access(path, X_OK) == 0)
- system(strcat(path, " &"));
-
- free(pathpfx);
- free(path);
-}
-
-void
scan(void)
{
unsigned int i, num;
@@ -1519,7 +1451,7 @@ sendmon(Client *c, Monitor *m)
detachstack(c);
c->mon = m;
c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
- attach(c);
+ attachabove(c);
attachstack(c);
focus(NULL);
arrange(NULL);
@@ -2110,7 +2042,7 @@ updategeom(void)
m->clients = c->next;
detachstack(c);
c->mon = mons;
- attach(c);
+ attachabove(c);
attachstack(c);
}
if (m == selmon)
@@ -2355,7 +2287,6 @@ main(int argc, char *argv[])
die("pledge");
#endif /* __OpenBSD__ */
scan();
- runautostart();
run();
cleanup();
XCloseDisplay(dpy);
diff --git a/dwm-6.2/dwm.o b/dwm-6.2/dwm.o
new file mode 100644
index 0000000..5297ba6
--- /dev/null
+++ b/dwm-6.2/dwm.o
Binary files differ
diff --git a/dwm-6.2/dwm-autostart-20210120-cb3f58a.diff b/dwm-6.2/sarc-autostart.diff
index efee676..efee676 100644
--- a/dwm-6.2/dwm-autostart-20210120-cb3f58a.diff
+++ b/dwm-6.2/sarc-autostart.diff
diff --git a/dwm-6.2/util.o b/dwm-6.2/util.o
new file mode 100644
index 0000000..3b48c2f
--- /dev/null
+++ b/dwm-6.2/util.o
Binary files differ