dwm-r1615-selfrestart.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-r1615-selfrestart.diff (2817B)
---
1 # HG changeset patch
2 # User Barbu Paul - Gheorghe <barbu.paul.gheorghe@gmail.com>
3 # Date 1354650884 -7200
4 # Node ID 6c472a21a5887c5295a331c48c4da188ec2c8413
5 # Parent aaab44133a6830c9a00263731d098c01cc1d6fb5
6 selfrestart now magically locates the current dwm (no need to hardcode a path)
7
8 diff -r aaab44133a68 -r 6c472a21a588 config.def.h
9 --- a/config.def.h Tue Dec 04 21:54:44 2012 +0200
10 +++ b/config.def.h Tue Dec 04 21:54:44 2012 +0200
11 @@ -54,6 +54,8 @@
12 static const char *termcmd[] = { "urxvtc", NULL };
13 static const char *filemancmd[] = { "thunar", NULL };
14
15 +#include "selfrestart.c"
16 +
17 static Key keys[] = {
18 /* modifier key function argument */
19 { MODKEY, XK_r, spawn, {.v = dmenucmd } },
20 @@ -89,6 +91,7 @@
21 TAGKEYS( XK_7, 6)
22 TAGKEYS( XK_8, 7)
23 TAGKEYS( XK_9, 8)
24 + { MODKEY|ShiftMask, XK_r, self_restart, {0} },
25 { MODKEY|ShiftMask, XK_q, quit, {0} },
26 };
27
28 @@ -108,4 +111,3 @@
29 { ClkTagBar, MODKEY, Button1, tag, {0} },
30 { ClkTagBar, MODKEY, Button3, toggletag, {0} },
31 };
32 -
33 diff -r aaab44133a68 -r 6c472a21a588 selfrestart.c
34 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
35 +++ b/selfrestart.c Tue Dec 04 21:54:44 2012 +0200
36 @@ -0,0 +1,65 @@
37 +#include <unistd.h>
38 +#include <sys/types.h>
39 +#include <sys/stat.h>
40 +#include <stdio.h>
41 +#include <stdlib.h>
42 +
43 +/**
44 + * Magically finds the current's executable path
45 + *
46 + * I'm doing the do{}while(); trick because Linux (what I'm running) is not
47 + * POSIX compilant and so lstat() cannot be trusted on /proc entries
48 + *
49 + * @return char* the path of the current executable
50 + */
51 +char *get_dwm_path(){
52 + struct stat s;
53 + int r, length, rate = 42;
54 + char *path = NULL;
55 +
56 + if(lstat("/proc/self/exe", &s) == -1){
57 + perror("lstat:");
58 + return NULL;
59 + }
60 +
61 + length = s.st_size + 1 - rate;
62 +
63 + do{
64 + length+=rate;
65 +
66 + free(path);
67 + path = malloc(sizeof(char) * length);
68 +
69 + if(path == NULL){
70 + perror("malloc:");
71 + return NULL;
72 + }
73 +
74 + r = readlink("/proc/self/exe", path, length);
75 +
76 + if(r == -1){
77 + perror("readlink:");
78 + return NULL;
79 + }
80 + }while(r >= length);
81 +
82 + path[r] = '\0';
83 +
84 + return path;
85 +}
86 +
87 +/**
88 + * self-restart
89 + *
90 + * Initially inspired by: Yu-Jie Lin
91 + * https://sites.google.com/site/yjlnotes/notes/dwm
92 + */
93 +void self_restart(const Arg *arg) {
94 + char *const argv[] = {get_dwm_path(), NULL};
95 +
96 + if(argv[0] == NULL){
97 + return;
98 + }
99 +
100 + execv(argv[0], argv);
101 +}