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