]> mj.ucw.cz Git - misc.git/blob - xclipcat.c
Merge branch 'master' of git+ssh://git.ucw.cz/home/mj/GIT/misc
[misc.git] / xclipcat.c
1 /*
2  *  Print contents of primary X selection. Inspired by the `xclip' utility by Kim Saunders.
3  */
4
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <X11/Xlib.h>
8 #include <X11/Xatom.h>
9
10 static Display *dpy;
11 static Window win;
12
13 static void die(char *msg)
14 {
15   fprintf(stderr, "xclipcat: %s\n", msg);
16   exit(1);
17 }
18
19 int main(void)
20 {
21   /* Create display and window */
22   if (!(dpy = XOpenDisplay(NULL)))
23     die("Cannot open display");
24   win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, 1, 1, 0, 0, 0);
25
26   /* Select which events we want to listen to */
27   XSelectInput(dpy, win, PropertyChangeMask);
28
29   /* Atoms we will need */
30   Atom pty = XInternAtom(dpy, "XCLIPCAT_CONTENTS", False);
31   Atom incr = XInternAtom(dpy, "INCR", False);
32
33   /* Request the selection */
34   XConvertSelection(dpy, XA_PRIMARY, XA_STRING, pty, win, CurrentTime);
35
36   /* Wait for the right event */
37   XEvent ev;
38   do
39     XNextEvent(dpy, &ev);
40   while (ev.type != SelectionNotify);
41
42   /* Read type and length of our property */
43   Atom pty_type;
44   int pty_format;
45   unsigned long pty_items, pty_size;
46   unsigned char *buf;
47   XGetWindowProperty(dpy, win, pty, 0, 0, False, AnyPropertyType, &pty_type, &pty_format, &pty_items, &pty_size, &buf);
48   XFree(buf);
49
50   /* Check type and format */
51   if (pty_type == incr)
52     die("Incremental transfer not supported yet");
53   if (pty_format != 8)
54     die("Unrecognized property format");
55
56   /* Read the contents of the property */
57   XGetWindowProperty(dpy, win, pty, 0, pty_size, False, AnyPropertyType, &pty_type, &pty_format, &pty_items, &pty_size, &buf);
58
59   /* Print the contents */
60   for (unsigned int i=0; i<pty_items; i++)
61     putchar(buf[i]);
62   putchar('\n');
63
64   /* Free the buffer and delete the property (just for completeness) */
65   XFree(buf);
66   XDeleteProperty(dpy, win, pty);
67
68   return 0;
69 }