Apply selfrestart patch (r1615)
This commit is contained in:
parent
b254f8ee58
commit
86026a91fe
@ -62,6 +62,8 @@ 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 "selfrestart.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 } },
|
||||||
@ -100,6 +102,7 @@ static Key keys[] = {
|
|||||||
TAGKEYS( XK_7, 6)
|
TAGKEYS( XK_7, 6)
|
||||||
TAGKEYS( XK_8, 7)
|
TAGKEYS( XK_8, 7)
|
||||||
TAGKEYS( XK_9, 8)
|
TAGKEYS( XK_9, 8)
|
||||||
|
{ MODKEY|ShiftMask, XK_r, self_restart, {0} },
|
||||||
{ MODKEY|ShiftMask, XK_q, quit, {0} },
|
{ MODKEY|ShiftMask, XK_q, quit, {0} },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
65
selfrestart.c
Normal file
65
selfrestart.c
Normal file
@ -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);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user