diff options
| author | Craig Jennings <craigmartinjennings@gmail.com> | 2023-07-23 12:05:15 -0500 |
|---|---|---|
| committer | Craig Jennings <craigmartinjennings@gmail.com> | 2023-07-23 12:05:15 -0500 |
| commit | f1f3dad880045cbf0b53e463ae0733ced6b237f4 (patch) | |
| tree | 8196a344c5d1f2383b95007c7843877929836d3c | |
| parent | 14dc7baf5b2f5319918897c974c5e2b0f99105c5 (diff) | |
added self-restart patch. DWM now restarts with super + shift + r
| -rw-r--r-- | config.def.h | 4 | ||||
| -rw-r--r-- | dwm-r1615-selfrestart.diff | 101 | ||||
| -rw-r--r-- | selfrestart.c | 65 | ||||
| -rw-r--r-- | todo.org | 2 |
4 files changed, 172 insertions, 0 deletions
diff --git a/config.def.h b/config.def.h index 81fc9ff..ba484f2 100644 --- a/config.def.h +++ b/config.def.h @@ -152,6 +152,8 @@ static const char *editorcmd[] = { "emacs", NULL }; static const char *browsercmd[] = { "firefox", NULL }; static const char *calccmd[] = { "gnome-calculator", NULL }; +#include "selfrestart.c" + static Key keys[] = { /* modifier key function argument */ { MODKEY, XK_p, spawn, {.v = dmenucmd } }, @@ -211,6 +213,8 @@ static Key keys[] = { TAGKEYS( XK_8, 7) TAGKEYS( XK_9, 8) { MODKEY|ShiftMask, XK_q, quit, {0} }, + { MODKEY|ShiftMask, XK_r, self_restart, {0} }, + }; /* Button definitions */ /* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ diff --git a/dwm-r1615-selfrestart.diff b/dwm-r1615-selfrestart.diff new file mode 100644 index 0000000..5d019b2 --- /dev/null +++ b/dwm-r1615-selfrestart.diff @@ -0,0 +1,101 @@ +# HG changeset patch +# User Barbu Paul - Gheorghe <barbu.paul.gheorghe@gmail.com> +# Date 1354650884 -7200 +# Node ID 6c472a21a5887c5295a331c48c4da188ec2c8413 +# Parent aaab44133a6830c9a00263731d098c01cc1d6fb5 +selfrestart now magically locates the current dwm (no need to hardcode a path) + +diff -r aaab44133a68 -r 6c472a21a588 config.def.h +--- a/config.def.h Tue Dec 04 21:54:44 2012 +0200 ++++ b/config.def.h Tue Dec 04 21:54:44 2012 +0200 +@@ -54,6 +54,8 @@ + static const char *termcmd[] = { "urxvtc", NULL }; + static const char *filemancmd[] = { "thunar", NULL }; + ++#include "selfrestart.c" ++ + static Key keys[] = { + /* modifier key function argument */ + { MODKEY, XK_r, spawn, {.v = dmenucmd } }, +@@ -89,6 +91,7 @@ + TAGKEYS( XK_7, 6) + TAGKEYS( XK_8, 7) + TAGKEYS( XK_9, 8) ++ { MODKEY|ShiftMask, XK_r, self_restart, {0} }, + { MODKEY|ShiftMask, XK_q, quit, {0} }, + }; + +@@ -108,4 +111,3 @@ + { ClkTagBar, MODKEY, Button1, tag, {0} }, + { ClkTagBar, MODKEY, Button3, toggletag, {0} }, + }; +- +diff -r aaab44133a68 -r 6c472a21a588 selfrestart.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/selfrestart.c Tue Dec 04 21:54:44 2012 +0200 +@@ -0,0 +1,65 @@ ++#include <unistd.h> ++#include <sys/types.h> ++#include <sys/stat.h> ++#include <stdio.h> ++#include <stdlib.h> ++ ++/** ++ * Magically finds the current's executable path ++ * ++ * I'm doing the do{}while(); trick because Linux (what I'm running) is not ++ * POSIX compilant and so lstat() cannot be trusted on /proc entries ++ * ++ * @return char* the path of the current executable ++ */ ++char *get_dwm_path(){ ++ struct stat s; ++ int r, length, rate = 42; ++ char *path = NULL; ++ ++ if(lstat("/proc/self/exe", &s) == -1){ ++ perror("lstat:"); ++ return NULL; ++ } ++ ++ length = s.st_size + 1 - rate; ++ ++ do{ ++ length+=rate; ++ ++ free(path); ++ path = malloc(sizeof(char) * length); ++ ++ if(path == NULL){ ++ perror("malloc:"); ++ return NULL; ++ } ++ ++ r = readlink("/proc/self/exe", path, length); ++ ++ if(r == -1){ ++ perror("readlink:"); ++ return NULL; ++ } ++ }while(r >= length); ++ ++ path[r] = '\0'; ++ ++ return path; ++} ++ ++/** ++ * self-restart ++ * ++ * Initially inspired by: Yu-Jie Lin ++ * https://sites.google.com/site/yjlnotes/notes/dwm ++ */ ++void self_restart(const Arg *arg) { ++ char *const argv[] = {get_dwm_path(), NULL}; ++ ++ if(argv[0] == NULL){ ++ return; ++ } ++ ++ execv(argv[0], argv); ++} diff --git a/selfrestart.c b/selfrestart.c new file mode 100644 index 0000000..d695d48 --- /dev/null +++ b/selfrestart.c @@ -0,0 +1,65 @@ +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <stdio.h> +#include <stdlib.h> + +/** + * Magically finds the current's executable path + * + * I'm doing the do{}while(); trick because Linux (what I'm running) is not + * POSIX compilant and so lstat() cannot be trusted on /proc entries + * + * @return char* the path of the current executable + */ +char *get_dwm_path(){ + struct stat s; + int r, length, rate = 42; + char *path = NULL; + + if(lstat("/proc/self/exe", &s) == -1){ + perror("lstat:"); + return NULL; + } + + length = s.st_size + 1 - rate; + + do{ + length+=rate; + + free(path); + path = malloc(sizeof(char) * length); + + if(path == NULL){ + perror("malloc:"); + return NULL; + } + + r = readlink("/proc/self/exe", path, length); + + if(r == -1){ + perror("readlink:"); + return NULL; + } + }while(r >= length); + + path[r] = '\0'; + + return path; +} + +/** + * self-restart + * + * Initially inspired by: Yu-Jie Lin + * https://sites.google.com/site/yjlnotes/notes/dwm + */ +void self_restart(const Arg *arg) { + char *const argv[] = {get_dwm_path(), NULL}; + + if(argv[0] == NULL){ + return; + } + + execv(argv[0], argv); +} @@ -26,5 +26,7 @@ and make it work for $EDITOR, $TERMINAL, and $BROWSER |------------------------------------------+------------------------------------------------------------| * Resolved +** DONE Added restart patch +DWM now restarts with super + shift + r ** DONE [#B] Add dwm-center to center certain windows when opened in floating * Reference |
