shod

mouse-based window manager that can tile windows inside floating containers
Log | Files | Refs | README | LICENSE

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 }