-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutil.c
74 lines (64 loc) · 1.5 KB
/
util.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <dirent.h>
#include <err.h>
#include <errno.h>
#include <limits.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <X11/X.h>
#include <X11/extensions/Xfixes.h>
#include "X11/Xlib.h"
#include "config.h"
#include "util.h"
void
die(const char *fmt,...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
if (fmt[0] && fmt[strlen(fmt) - 1] == ':') {
fputc(' ', stderr);
perror(NULL);
} else {
fputc('\n', stderr);
}
exit(1);
}
void*
ecalloc(size_t nmemb, size_t size)
{
void *p;
if (!(p = calloc(nmemb, size)))
die("ecalloc(): %s\n", strerror(errno));
return p;
}
char*
get_utf_prop(context ctx, Atom atom)
{
char *result = NULL;
char *out = NULL;
size_t ressize, restail;
int resbits;
XEvent ev;
Atom fmtid = XInternAtom(ctx.dpy, "UTF8_STRING", False);
Atom propid = XInternAtom(ctx.dpy, "XSEL_DATA", False);
Atom incrid = XInternAtom(ctx.dpy, "INCR", False);
XConvertSelection(ctx.dpy, atom, fmtid, propid, ctx.win, CurrentTime);
do {
XNextEvent(ctx.dpy, &ev);
} while (ev.type != SelectionNotify || ev.xselection.selection != atom);
if (ev.xselection.property) {
XGetWindowProperty(ctx.dpy, ctx.win, propid, 0, LONG_MAX / 4,
False, AnyPropertyType, &fmtid, &resbits,
&ressize, &restail, (unsigned char**)&result);
if (fmtid == incrid) {
die("%s: buffer too large. INCR reading isn't implemented\n",
__func__, strerror(errno));
}
out = strndup(result, ressize);
XFree(result);
}
return out;
}