Compare commits
2 Commits
patch-move
...
patch-auto
Author | SHA1 | Date | |
---|---|---|---|
7b100d9bf0 | |||
60674bdb3f |
@ -60,7 +60,6 @@ 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 *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 const char *termcmd[] = { "st", NULL };
|
||||||
|
|
||||||
#include "movestack.c"
|
|
||||||
static Key keys[] = {
|
static Key keys[] = {
|
||||||
/* modifier key function argument */
|
/* modifier key function argument */
|
||||||
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
|
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
|
||||||
@ -72,8 +71,6 @@ static Key keys[] = {
|
|||||||
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
|
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
|
||||||
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
|
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
|
||||||
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
|
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
|
||||||
{ MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } },
|
|
||||||
{ MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } },
|
|
||||||
{ MODKEY, XK_Return, zoom, {0} },
|
{ MODKEY, XK_Return, zoom, {0} },
|
||||||
{ MODKEY, XK_Tab, view, {0} },
|
{ MODKEY, XK_Tab, view, {0} },
|
||||||
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
|
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
|
||||||
|
179
dwm-autostart-20210120-cb3f58a.diff
Normal file
179
dwm-autostart-20210120-cb3f58a.diff
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
From 37e970479dc5d40e57fc0cbfeaa5e39941483237 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gan Ainm <gan.ainm.riomhphost@gmail.com>
|
||||||
|
Date: Wed, 10 Jun 2020 10:59:02 +0000
|
||||||
|
Subject: [PATCH] dwm-xdgautostart-6.2.diff
|
||||||
|
|
||||||
|
===================================================================
|
||||||
|
---
|
||||||
|
dwm.1 | 23 +++++++++++++++++
|
||||||
|
dwm.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 105 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/dwm.1 b/dwm.1
|
||||||
|
index 13b3729..9533aa6 100644
|
||||||
|
--- a/dwm.1
|
||||||
|
+++ b/dwm.1
|
||||||
|
@@ -30,6 +30,14 @@ 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
|
||||||
|
@@ -152,6 +160,21 @@ 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.c b/dwm.c
|
||||||
|
index 4465af1..2156b49 100644
|
||||||
|
--- a/dwm.c
|
||||||
|
+++ b/dwm.c
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
#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>
|
||||||
|
@@ -193,6 +194,7 @@ 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);
|
||||||
|
@@ -235,7 +237,11 @@ 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 */
|
||||||
|
@@ -1380,6 +1386,83 @@ run(void)
|
||||||
|
handler[ev.type](&ev); /* call handler */
|
||||||
|
}
|
||||||
|
|
||||||
|
+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)
|
||||||
|
{
|
||||||
|
@@ -2142,6 +2223,7 @@ main(int argc, char *argv[])
|
||||||
|
die("pledge");
|
||||||
|
#endif /* __OpenBSD__ */
|
||||||
|
scan();
|
||||||
|
+ runautostart();
|
||||||
|
run();
|
||||||
|
cleanup();
|
||||||
|
XCloseDisplay(dpy);
|
||||||
|
--
|
||||||
|
2.27.0
|
||||||
|
|
@ -1,95 +0,0 @@
|
|||||||
From 9a4037dc0ef56f91c009317e78e9e3790dafbb58 Mon Sep 17 00:00:00 2001
|
|
||||||
From: BrunoCooper17 <BrunoCooper17@outlook.com>
|
|
||||||
Date: Mon, 15 Nov 2021 14:04:53 -0600
|
|
||||||
Subject: [PATCH] MoveStack patch
|
|
||||||
|
|
||||||
This plugin allows you to move clients around in the stack and swap them
|
|
||||||
with the master. It emulates the behavior off mod+shift+j and mod+shift+k
|
|
||||||
in Xmonad. movestack(+1) will swap the client with the current focus with
|
|
||||||
the next client. movestack(-1) will swap the client with the current focus
|
|
||||||
with the previous client.
|
|
||||||
---
|
|
||||||
config.def.h | 3 +++
|
|
||||||
movestack.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
2 files changed, 51 insertions(+)
|
|
||||||
create mode 100644 movestack.c
|
|
||||||
|
|
||||||
diff --git a/config.def.h b/config.def.h
|
|
||||||
index a2ac963..33efa5b 100644
|
|
||||||
--- a/config.def.h
|
|
||||||
+++ b/config.def.h
|
|
||||||
@@ -60,6 +60,7 @@ 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 };
|
|
||||||
|
|
||||||
+#include "movestack.c"
|
|
||||||
static Key keys[] = {
|
|
||||||
/* modifier key function argument */
|
|
||||||
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
|
|
||||||
@@ -71,6 +72,8 @@ static Key keys[] = {
|
|
||||||
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
|
|
||||||
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
|
|
||||||
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
|
|
||||||
+ { MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } },
|
|
||||||
+ { MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } },
|
|
||||||
{ MODKEY, XK_Return, zoom, {0} },
|
|
||||||
{ MODKEY, XK_Tab, view, {0} },
|
|
||||||
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
|
|
||||||
diff --git a/movestack.c b/movestack.c
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..520f4ae
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/movestack.c
|
|
||||||
@@ -0,0 +1,48 @@
|
|
||||||
+void
|
|
||||||
+movestack(const Arg *arg) {
|
|
||||||
+ Client *c = NULL, *p = NULL, *pc = NULL, *i;
|
|
||||||
+
|
|
||||||
+ if(arg->i > 0) {
|
|
||||||
+ /* find the client after selmon->sel */
|
|
||||||
+ for(c = selmon->sel->next; c && (!ISVISIBLE(c) || c->isfloating); c = c->next);
|
|
||||||
+ if(!c)
|
|
||||||
+ for(c = selmon->clients; c && (!ISVISIBLE(c) || c->isfloating); c = c->next);
|
|
||||||
+
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ /* find the client before selmon->sel */
|
|
||||||
+ for(i = selmon->clients; i != selmon->sel; i = i->next)
|
|
||||||
+ if(ISVISIBLE(i) && !i->isfloating)
|
|
||||||
+ c = i;
|
|
||||||
+ if(!c)
|
|
||||||
+ for(; i; i = i->next)
|
|
||||||
+ if(ISVISIBLE(i) && !i->isfloating)
|
|
||||||
+ c = i;
|
|
||||||
+ }
|
|
||||||
+ /* find the client before selmon->sel and c */
|
|
||||||
+ for(i = selmon->clients; i && (!p || !pc); i = i->next) {
|
|
||||||
+ if(i->next == selmon->sel)
|
|
||||||
+ p = i;
|
|
||||||
+ if(i->next == c)
|
|
||||||
+ pc = i;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* swap c and selmon->sel selmon->clients in the selmon->clients list */
|
|
||||||
+ if(c && c != selmon->sel) {
|
|
||||||
+ Client *temp = selmon->sel->next==c?selmon->sel:selmon->sel->next;
|
|
||||||
+ selmon->sel->next = c->next==selmon->sel?c:c->next;
|
|
||||||
+ c->next = temp;
|
|
||||||
+
|
|
||||||
+ if(p && p != c)
|
|
||||||
+ p->next = c;
|
|
||||||
+ if(pc && pc != selmon->sel)
|
|
||||||
+ pc->next = selmon->sel;
|
|
||||||
+
|
|
||||||
+ if(selmon->sel == selmon->clients)
|
|
||||||
+ selmon->clients = c;
|
|
||||||
+ else if(c == selmon->clients)
|
|
||||||
+ selmon->clients = selmon->sel;
|
|
||||||
+
|
|
||||||
+ arrange(selmon);
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
\ No newline at end of file
|
|
||||||
--
|
|
||||||
2.33.1
|
|
||||||
|
|
23
dwm.1
23
dwm.1
@ -30,6 +30,14 @@ top left corner. The tags which are applied to one or more windows are
|
|||||||
indicated with an empty square in the top left corner.
|
indicated with an empty square in the top left corner.
|
||||||
.P
|
.P
|
||||||
dwm draws a small border around windows to indicate the focus state.
|
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
|
.SH OPTIONS
|
||||||
.TP
|
.TP
|
||||||
.B \-v
|
.B \-v
|
||||||
@ -152,6 +160,21 @@ Toggles focused window between floating and tiled state.
|
|||||||
.TP
|
.TP
|
||||||
.B Mod1\-Button3
|
.B Mod1\-Button3
|
||||||
Resize focused window while dragging. Tiled windows will be toggled to the floating state.
|
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
|
.SH CUSTOMIZATION
|
||||||
dwm is customized by creating a custom config.h and (re)compiling the source
|
dwm is customized by creating a custom config.h and (re)compiling the source
|
||||||
code. This keeps it fast, secure and simple.
|
code. This keeps it fast, secure and simple.
|
||||||
|
84
dwm.c
84
dwm.c
@ -29,6 +29,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <X11/cursorfont.h>
|
#include <X11/cursorfont.h>
|
||||||
#include <X11/keysym.h>
|
#include <X11/keysym.h>
|
||||||
@ -194,6 +195,7 @@ static void resizeclient(Client *c, int x, int y, int w, int h);
|
|||||||
static void resizemouse(const Arg *arg);
|
static void resizemouse(const Arg *arg);
|
||||||
static void restack(Monitor *m);
|
static void restack(Monitor *m);
|
||||||
static void run(void);
|
static void run(void);
|
||||||
|
static void runautostart(void);
|
||||||
static void scan(void);
|
static void scan(void);
|
||||||
static int sendevent(Client *c, Atom proto);
|
static int sendevent(Client *c, Atom proto);
|
||||||
static void sendmon(Client *c, Monitor *m);
|
static void sendmon(Client *c, Monitor *m);
|
||||||
@ -236,7 +238,11 @@ static int xerrorstart(Display *dpy, XErrorEvent *ee);
|
|||||||
static void zoom(const Arg *arg);
|
static void zoom(const Arg *arg);
|
||||||
|
|
||||||
/* variables */
|
/* variables */
|
||||||
|
static const char autostartblocksh[] = "autostart_blocking.sh";
|
||||||
|
static const char autostartsh[] = "autostart.sh";
|
||||||
static const char broken[] = "broken";
|
static const char broken[] = "broken";
|
||||||
|
static const char dwmdir[] = "dwm";
|
||||||
|
static const char localshare[] = ".local/share";
|
||||||
static char stext[256];
|
static char stext[256];
|
||||||
static int screen;
|
static int screen;
|
||||||
static int sw, sh; /* X display screen geometry width, height */
|
static int sw, sh; /* X display screen geometry width, height */
|
||||||
@ -1384,6 +1390,83 @@ run(void)
|
|||||||
handler[ev.type](&ev); /* call handler */
|
handler[ev.type](&ev); /* call handler */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
void
|
||||||
scan(void)
|
scan(void)
|
||||||
{
|
{
|
||||||
@ -2148,6 +2231,7 @@ main(int argc, char *argv[])
|
|||||||
die("pledge");
|
die("pledge");
|
||||||
#endif /* __OpenBSD__ */
|
#endif /* __OpenBSD__ */
|
||||||
scan();
|
scan();
|
||||||
|
runautostart();
|
||||||
run();
|
run();
|
||||||
cleanup();
|
cleanup();
|
||||||
XCloseDisplay(dpy);
|
XCloseDisplay(dpy);
|
||||||
|
48
movestack.c
48
movestack.c
@ -1,48 +0,0 @@
|
|||||||
void
|
|
||||||
movestack(const Arg *arg) {
|
|
||||||
Client *c = NULL, *p = NULL, *pc = NULL, *i;
|
|
||||||
|
|
||||||
if(arg->i > 0) {
|
|
||||||
/* find the client after selmon->sel */
|
|
||||||
for(c = selmon->sel->next; c && (!ISVISIBLE(c) || c->isfloating); c = c->next);
|
|
||||||
if(!c)
|
|
||||||
for(c = selmon->clients; c && (!ISVISIBLE(c) || c->isfloating); c = c->next);
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* find the client before selmon->sel */
|
|
||||||
for(i = selmon->clients; i != selmon->sel; i = i->next)
|
|
||||||
if(ISVISIBLE(i) && !i->isfloating)
|
|
||||||
c = i;
|
|
||||||
if(!c)
|
|
||||||
for(; i; i = i->next)
|
|
||||||
if(ISVISIBLE(i) && !i->isfloating)
|
|
||||||
c = i;
|
|
||||||
}
|
|
||||||
/* find the client before selmon->sel and c */
|
|
||||||
for(i = selmon->clients; i && (!p || !pc); i = i->next) {
|
|
||||||
if(i->next == selmon->sel)
|
|
||||||
p = i;
|
|
||||||
if(i->next == c)
|
|
||||||
pc = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* swap c and selmon->sel selmon->clients in the selmon->clients list */
|
|
||||||
if(c && c != selmon->sel) {
|
|
||||||
Client *temp = selmon->sel->next==c?selmon->sel:selmon->sel->next;
|
|
||||||
selmon->sel->next = c->next==selmon->sel?c:c->next;
|
|
||||||
c->next = temp;
|
|
||||||
|
|
||||||
if(p && p != c)
|
|
||||||
p->next = c;
|
|
||||||
if(pc && pc != selmon->sel)
|
|
||||||
pc->next = selmon->sel;
|
|
||||||
|
|
||||||
if(selmon->sel == selmon->clients)
|
|
||||||
selmon->clients = c;
|
|
||||||
else if(c == selmon->clients)
|
|
||||||
selmon->clients = selmon->sel;
|
|
||||||
|
|
||||||
arrange(selmon);
|
|
||||||
}
|
|
||||||
}
|
|
Reference in New Issue
Block a user