From 8531dc3158ef80d85d239c3e50f882d37422e8a7 Mon Sep 17 00:00:00 2001 From: Sravan Balaji Date: Sun, 26 Jul 2020 00:20:17 -0400 Subject: [PATCH] Autostart Patch w/ Modifications - Add autostart patch - Include config directory in autostart search dirs - Sync cloud drives - Start compositor - Restore wallpaper - Start redshift for blue light filtering --- autostart.sh | 27 +++++++++++++++ dwm.1 | 24 +++++++++++++ dwm.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 autostart.sh diff --git a/autostart.sh b/autostart.sh new file mode 100644 index 0000000..a510c5d --- /dev/null +++ b/autostart.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +# Local cloud storage directory +local_clone_dir="$HOME/Cloud" + +# List of remotes as defined in rclone +declare -a remote_array=(\ + "OneDrive - Personal" \ + "Google Drive - Personal" \ +) + +# Mount Remotes +for i in "${remote_array[@]}" +do + local_path="$local_clone_dir"/"$i" + mkdir -p "$local_path" + rclone --vfs-cache-mode writes mount "$i": "$local_path" & +done + +# Start compositor using configuration file +picom --config ~/.config/picom/picom.conf & + +# Restore wallpaper +nitrogen --restore & + +# Blue light filter (Farmington Hills, MI) +redshift -l 42.48531:-83.37716 & \ No newline at end of file diff --git a/dwm.1 b/dwm.1 index ddc8321..d9d258f 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,22 @@ 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. $XDG_CONFIG_HOME/dwm" +.IP "3. $HOME/.local/share/dwm" +.IP "4. $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 664c527..9db00e5 100644 --- a/dwm.c +++ b/dwm.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -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 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); @@ -236,7 +238,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 */ @@ -1381,6 +1387,95 @@ run(void) handler[ev.type](&ev); /* call handler */ } +void +runautostart(void) +{ + char *pathpfx; + char *path; + char *xdgdatahome; + char *xdgconfighome; + 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 $XDG_CONFIG_HOME if it is set and not empty, + * otherwise use ~/.local/share/dwm as autostart script directory + */ + xdgdatahome = getenv("XDG_DATA_HOME"); + xdgconfighome = getenv("XDG_CONFIG_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 if (xdgconfighome != NULL && *xdgdatahome != '\0') { + /* space for path segments, separators and nul */ + pathpfx = ecalloc(1, strlen(xdgconfighome) + strlen(dwmdir) + 2); + + if (sprintf(pathpfx, "%s/%s", xdgconfighome, 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) { @@ -2145,6 +2240,7 @@ main(int argc, char *argv[]) die("pledge"); #endif /* __OpenBSD__ */ scan(); + runautostart(); run(); cleanup(); XCloseDisplay(dpy);