]> mj.ucw.cz Git - osdd.git/blob - send.c
A bit of debugging and also setting of default durations
[osdd.git] / send.c
1 /*
2  *      On-screen Display Client -- Sending Messages
3  *
4  *      (c) 2010 Martin Mares <mj@ucw.cz>
5  */
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <X11/Xlib.h>
11 #include <X11/Xatom.h>
12
13 #include "util.h"
14 #include "send.h"
15
16 static Display *dpy;
17 static Atom pty;
18
19 #define MAX_MSG_SIZE 1024
20
21 struct osd_msg {
22   int cnt;
23   char buf[MAX_MSG_SIZE];
24 };
25
26 void
27 osd_init(void)
28 {
29   dpy = XOpenDisplay(NULL);
30   if (!dpy)
31     die("Cannot open display");
32
33   pty = XInternAtom(dpy, "OSD_QUEUE", False);
34   if (!pty)
35     die("Cannot intern OSD_QUEUE atom");
36 }
37
38 struct osd_msg *
39 osd_new_msg(void)
40 {
41   struct osd_msg *msg = xmalloc(sizeof(*msg));
42   msg->cnt = 0;
43   return msg;
44 }
45
46 void
47 osd_add_line(struct osd_msg *msg, char *key, char *val)
48 {
49   if (!key)
50     key = "";
51   msg->cnt += snprintf(msg->buf + msg->cnt, MAX_MSG_SIZE - msg->cnt - 1, "%s:%s\n", key, val);
52   if (msg->cnt > MAX_MSG_SIZE - 1)
53     die("OSD message too long (at most %d bytes)", MAX_MSG_SIZE);
54 }
55
56 void
57 osd_send(struct osd_msg *msg)
58 {
59   if (!dpy)
60     osd_init();
61
62   msg->buf[msg->cnt++] = '\n';
63   if (!XChangeProperty(dpy, DefaultRootWindow(dpy), pty, XA_STRING, 8, PropModeAppend, (unsigned char *) msg->buf, msg->cnt))
64     die("XChangeProperty failed");
65   XFlush(dpy);
66   free(msg);
67 }