Apply selfrestart patch (r1615)
This commit is contained in:
		@@ -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 *termcmd[]  = { "st", NULL };
 | 
			
		||||
 | 
			
		||||
#include "selfrestart.c"
 | 
			
		||||
 | 
			
		||||
static Key keys[] = {
 | 
			
		||||
	/* modifier                     key        function        argument */
 | 
			
		||||
	{ MODKEY,                       XK_p,      spawn,          {.v = dmenucmd } },
 | 
			
		||||
@@ -100,6 +102,7 @@ static Key keys[] = {
 | 
			
		||||
	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} },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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);
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user