Mercurial > dwm-meillo
annotate util.c @ 11:ea9c08ec4b48
added gridsel to gridwm
author | Anselm R. Garbe <garbeam@wmii.de> |
---|---|
date | Tue, 11 Jul 2006 13:21:57 +0200 |
parents | d567f430a81d |
children | 5c078b66347b |
rev | line source |
---|---|
2 | 1 /* |
2 * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> | |
3 * See LICENSE file for license details. | |
4 */ | |
5 | |
6 #include <stdarg.h> | |
7 #include <stdio.h> | |
8 #include <stdlib.h> | |
3
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
9 #include <string.h> |
5 | 10 #include <sys/types.h> |
11 #include <sys/wait.h> | |
12 #include <unistd.h> | |
11 | 13 #include <X11/Xatom.h> |
5 | 14 |
15 #include "util.h" | |
2 | 16 |
6 | 17 static char *shell = NULL; |
18 | |
2 | 19 void |
20 error(char *errstr, ...) { | |
21 va_list ap; | |
22 va_start(ap, errstr); | |
23 vfprintf(stderr, errstr, ap); | |
24 va_end(ap); | |
25 exit(1); | |
26 } | |
27 | |
3
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
28 static void |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
29 bad_malloc(unsigned int size) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
30 { |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
31 fprintf(stderr, "fatal: could not malloc() %d bytes\n", |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
32 (int) size); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
33 exit(1); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
34 } |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
35 |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
36 void * |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
37 emallocz(unsigned int size) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
38 { |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
39 void *res = calloc(1, size); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
40 if(!res) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
41 bad_malloc(size); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
42 return res; |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
43 } |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
44 |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
45 void * |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
46 emalloc(unsigned int size) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
47 { |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
48 void *res = malloc(size); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
49 if(!res) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
50 bad_malloc(size); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
51 return res; |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
52 } |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
53 |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
54 void * |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
55 erealloc(void *ptr, unsigned int size) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
56 { |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
57 void *res = realloc(ptr, size); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
58 if(!res) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
59 bad_malloc(size); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
60 return res; |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
61 } |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
62 |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
63 char * |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
64 estrdup(const char *str) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
65 { |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
66 void *res = strdup(str); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
67 if(!res) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
68 bad_malloc(strlen(str)); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
69 return res; |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
70 } |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
71 |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
72 void |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
73 failed_assert(char *a, char *file, int line) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
74 { |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
75 fprintf(stderr, "Assertion \"%s\" failed at %s:%d\n", a, file, line); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
76 abort(); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
77 } |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
78 |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
79 void |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
80 swap(void **p1, void **p2) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
81 { |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
82 void *tmp = *p1; |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
83 *p1 = *p2; |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
84 *p2 = tmp; |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
85 } |
5 | 86 |
87 void | |
6 | 88 spawn(Display *dpy, const char *cmd) |
5 | 89 { |
6 | 90 if(!shell && !(shell = getenv("SHELL"))) |
91 shell = "/bin/sh"; | |
92 | |
93 if(!cmd) | |
5 | 94 return; |
95 if(fork() == 0) { | |
96 if(fork() == 0) { | |
97 if(dpy) | |
98 close(ConnectionNumber(dpy)); | |
9
d567f430a81d
fixed several stuff (gridwm gets better and better)
Anselm R. Garbe <garbeam@wmii.de>
parents:
6
diff
changeset
|
99 setsid(); |
d567f430a81d
fixed several stuff (gridwm gets better and better)
Anselm R. Garbe <garbeam@wmii.de>
parents:
6
diff
changeset
|
100 fprintf(stderr, "gridwm: execlp %s %s -c %s", shell, shell, cmd); |
d567f430a81d
fixed several stuff (gridwm gets better and better)
Anselm R. Garbe <garbeam@wmii.de>
parents:
6
diff
changeset
|
101 execlp(shell, shell, "-c", cmd, NULL); |
d567f430a81d
fixed several stuff (gridwm gets better and better)
Anselm R. Garbe <garbeam@wmii.de>
parents:
6
diff
changeset
|
102 fprintf(stderr, "gridwm: execlp %s", cmd); |
5 | 103 perror(" failed"); |
104 } | |
105 exit (0); | |
106 } | |
107 wait(0); | |
108 } | |
6 | 109 |
110 void | |
111 pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd) | |
112 { | |
113 unsigned int l, n; | |
114 int pfd[2]; | |
115 | |
116 if(!shell && !(shell = getenv("SHELL"))) | |
117 shell = "/bin/sh"; | |
118 | |
119 if(!cmd) | |
120 return; | |
121 | |
122 if(pipe(pfd) == -1) { | |
123 perror("pipe"); | |
124 exit(1); | |
125 } | |
126 | |
127 if(fork() == 0) { | |
128 if(dpy) | |
129 close(ConnectionNumber(dpy)); | |
9
d567f430a81d
fixed several stuff (gridwm gets better and better)
Anselm R. Garbe <garbeam@wmii.de>
parents:
6
diff
changeset
|
130 setsid(); |
6 | 131 dup2(pfd[1], STDOUT_FILENO); |
132 close(pfd[0]); | |
133 close(pfd[1]); | |
9
d567f430a81d
fixed several stuff (gridwm gets better and better)
Anselm R. Garbe <garbeam@wmii.de>
parents:
6
diff
changeset
|
134 execlp(shell, shell, "-c", cmd, NULL); |
d567f430a81d
fixed several stuff (gridwm gets better and better)
Anselm R. Garbe <garbeam@wmii.de>
parents:
6
diff
changeset
|
135 fprintf(stderr, "gridwm: execlp %s", cmd); |
6 | 136 perror(" failed"); |
137 } | |
138 else { | |
139 n = 0; | |
140 close(pfd[1]); | |
141 while(l > n) { | |
142 if((l = read(pfd[0], buf + n, len - n)) < 1) | |
143 break; | |
144 n += l; | |
145 } | |
146 close(pfd[0]); | |
147 buf[n - 1] = 0; | |
148 } | |
149 wait(0); | |
150 } | |
11 | 151 |
152 | |
153 unsigned char * | |
154 getselection(unsigned long offset, unsigned long *len, unsigned long *remain) | |
155 { | |
156 Display *dpy; | |
157 Atom xa_clip_string; | |
158 Window w; | |
159 XEvent ev; | |
160 Atom typeret; | |
161 int format; | |
162 unsigned char *data; | |
163 unsigned char *result = NULL; | |
164 | |
165 dpy = XOpenDisplay(0); | |
166 if(!dpy) | |
167 return NULL; | |
168 xa_clip_string = XInternAtom(dpy, "_SEL_STRING", False); | |
169 w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 10, 10, 200, 200, | |
170 1, CopyFromParent, CopyFromParent); | |
171 XConvertSelection(dpy, XA_PRIMARY, XA_STRING, xa_clip_string, | |
172 w, CurrentTime); | |
173 XFlush(dpy); | |
174 XNextEvent(dpy, &ev); | |
175 if(ev.type == SelectionNotify && ev.xselection.property != None) { | |
176 XGetWindowProperty(dpy, w, ev.xselection.property, offset, 4096L, False, | |
177 AnyPropertyType, &typeret, &format, len, remain, &data); | |
178 if(*len) { | |
179 result = emalloc(sizeof(unsigned char) * *len); | |
180 memcpy(result, data, *len); | |
181 } | |
182 XDeleteProperty(dpy, w, ev.xselection.property); | |
183 } | |
184 XDestroyWindow(dpy, w); | |
185 XCloseDisplay(dpy); | |
186 return result; | |
187 } |