xutil.c (4073B)
1 #include <err.h> 2 #include <errno.h> 3 #include <fcntl.h> 4 #include <stdlib.h> 5 #include <string.h> 6 7 #include "xutil.h" 8 9 #include <X11/extensions/Xrender.h> 10 11 Visual *visual; 12 Colormap colormap; 13 unsigned int depth; 14 XrmDatabase xdb = NULL; 15 Display *dpy; 16 Window root; 17 Atom atoms[NATOMS]; 18 int screen; 19 20 int 21 max(int x, int y) 22 { 23 return x > y ? x : y; 24 } 25 26 int 27 min(int x, int y) 28 { 29 return x < y ? x : y; 30 } 31 32 void * 33 emalloc(size_t size) 34 { 35 void *p; 36 37 if ((p = malloc(size)) == NULL) 38 err(1, "malloc"); 39 return p; 40 } 41 42 void * 43 ecalloc(size_t nmemb, size_t size) 44 { 45 void *p; 46 if ((p = calloc(nmemb, size)) == NULL) 47 err(1, "calloc"); 48 return p; 49 } 50 51 char * 52 estrndup(const char *s, size_t maxlen) 53 { 54 char *p; 55 56 if ((p = strndup(s, maxlen)) == NULL) 57 err(1, "strndup"); 58 return p; 59 } 60 61 char * 62 getresource(XrmDatabase xdb, XrmClass *class, XrmName *name) 63 { 64 XrmRepresentation tmp; 65 XrmValue xval; 66 67 if (xdb == NULL) 68 return NULL; 69 if (XrmQGetResource(xdb, name, class, &tmp, &xval)) 70 return xval.addr; 71 return NULL; 72 } 73 74 unsigned long 75 getwinsprop(Window win, Atom prop, Window **wins) 76 { 77 unsigned char *list; 78 unsigned long len; 79 unsigned long dl; /* dummy variable */ 80 int di; /* dummy variable */ 81 Atom da; /* dummy variable */ 82 83 list = NULL; 84 if (XGetWindowProperty(dpy, win, prop, 0L, 1024, False, XA_WINDOW, 85 &da, &di, &len, &dl, &list) != Success || list == NULL) { 86 *wins = NULL; 87 return 0; 88 } 89 *wins = (Window *)list; 90 return len; 91 } 92 93 Window 94 getwinprop(Window win, Atom prop) 95 { 96 Window *wins; 97 Window ret = None; 98 99 getwinsprop(win, prop, &wins); 100 if (wins != NULL) 101 ret = *wins; 102 XFree(wins); 103 return ret; 104 } 105 106 unsigned long 107 getcardsprop(Window win, Atom prop, Atom **array) 108 { 109 unsigned char *p; 110 unsigned long len; 111 unsigned long dl; 112 int di; 113 Atom da; 114 115 p = NULL; 116 if (XGetWindowProperty(dpy, win, prop, 0L, 1024, False, XA_CARDINAL, &da, &di, &len, &dl, &p) != Success || p == NULL) { 117 *array = NULL; 118 XFree(p); 119 return 0; 120 } 121 *array = (Atom *)p; 122 return len; 123 } 124 125 Atom 126 getcardprop(Window win, Atom prop) 127 { 128 unsigned long *array; 129 Atom card = None; 130 131 getcardsprop(win, prop, &array); 132 if (array != NULL) 133 card = *array; 134 XFree(array); 135 return card; 136 } 137 138 unsigned long 139 getatomsprop(Window win, Atom prop, Atom **atoms) 140 { 141 unsigned char *p; 142 unsigned long len; 143 unsigned long dl; /* dummy variable */ 144 int di; /* dummy variable */ 145 Atom da; /* dummy variable */ 146 147 p = NULL; 148 if (XGetWindowProperty(dpy, win, prop, 0L, 1024, False, XA_ATOM, &da, &di, &len, &dl, &p) != Success || p == NULL) { 149 *atoms = NULL; 150 XFree(p); 151 return 0; 152 } 153 *atoms = (Atom *)p; 154 return len; 155 } 156 157 Atom 158 getatomprop(Window win, Atom prop) 159 { 160 Atom *atoms; 161 Atom atom = None; 162 163 getatomsprop(win, prop, &atoms); 164 if (atoms != NULL) 165 atom = *atoms; 166 XFree(atoms); 167 return atom; 168 } 169 170 void 171 initatoms(void) 172 { 173 static char *atomnames[NATOMS] = { 174 #define X(atom) [atom] = #atom, 175 ATOMS 176 #undef X 177 }; 178 XInternAtoms(dpy, atomnames, NATOMS, False, atoms); 179 } 180 181 void 182 xinit(void) 183 { 184 int fd; 185 186 if ((dpy = XOpenDisplay(NULL)) == NULL) 187 errx(1, "could not open display"); 188 screen = DefaultScreen(dpy); 189 root = RootWindow(dpy, screen); 190 fd = XConnectionNumber(dpy); 191 while (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) { 192 if (errno == EINTR) 193 continue; 194 err(EXIT_FAILURE, "fcntl"); 195 } 196 } 197 198 void 199 xinitvisual(void) 200 { 201 XVisualInfo tpl = { 202 .screen = screen, 203 .depth = 32, 204 .class = TrueColor 205 }; 206 XVisualInfo *infos; 207 XRenderPictFormat *fmt; 208 long masks = VisualScreenMask | VisualDepthMask | VisualClassMask; 209 int nitems; 210 int i; 211 212 visual = NULL; 213 if ((infos = XGetVisualInfo(dpy, masks, &tpl, &nitems)) != NULL) { 214 for (i = 0; i < nitems; i++) { 215 fmt = XRenderFindVisualFormat(dpy, infos[i].visual); 216 if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) { 217 depth = infos[i].depth; 218 visual = infos[i].visual; 219 colormap = XCreateColormap(dpy, root, visual, AllocNone); 220 break; 221 } 222 } 223 XFree(infos); 224 } 225 if (visual == NULL) { 226 depth = DefaultDepth(dpy, screen); 227 visual = DefaultVisual(dpy, screen); 228 colormap = DefaultColormap(dpy, screen); 229 } 230 }