X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=osdd.c;h=ba279b292816f88fffdb26fe45d666c26f077664;hb=1337d17e08a02478b2a54228bddf7a6c9f6354f2;hp=800f6ab9467a61e81fde8f394a7cb8886e547233;hpb=66ea7419541d01ea378523d106e8946b667cbe61;p=osdd.git diff --git a/osdd.c b/osdd.c index 800f6ab..ba279b2 100644 --- a/osdd.c +++ b/osdd.c @@ -7,22 +7,98 @@ #include #include #include -#include +#include #include -#include +#include +#include #include #include #include -#define DEBUG -#include "util.h" +#undef DEBUG +#include "osd.h" static xosd *osd; -#define MAX_LINES 4 -typedef uint64_t timestamp_t; static timestamp_t now; +/*** Options ***/ + +static int num_lines = 4; +static char *font_name = "-bitstream-bitstream vera sans-bold-r-normal-*-*-320-*-*-p-*-*"; +static char *default_color = "green"; +static char *default_outline_color = "black"; +static int default_duration = 1000; +static int default_min_duration = 250; +static int debug_mode; + +static const char short_opts[] = "c:d:Df:l:m:o:"; + +static const struct option long_opts[] = { + { "color", required_argument, NULL, 'c' }, + { "debug", no_argument, NULL, 'D' }, + { "duration", required_argument, NULL, 'd' }, + { "font", required_argument, NULL, 'f' }, + { "lines", required_argument, NULL, 'l' }, + { "min-duration", required_argument, NULL, 'm' }, + { "outline-color", required_argument, NULL, 'o' }, + { NULL, 0, NULL, 0 }, +}; + +static void NONRET +usage(void) +{ + fprintf(stderr, "Usage: osdd \n\n\ +Options:\n\ +-c, --color=\t\tDefault color (#rgb, #rrggbb or a name from rgb.txt)\n\ +-D, --debug\t\tDebugging mode (do not detach from the terminal)\n\ +-d, --duration=\tDefault message duration in milliseconds\n\ +-f, --font=\t\tFont to use for the OSD\n\ +-l, --lines=\t\tNumber of lines of the OSD\n\ +-m, --min-duration=\tDefault minimum message duration in milliseconds\n\ +-o, --outline-color=\tDefault outline color\n\ +"); + exit(1); +} + +static void +parse_opts(int argc, char **argv) +{ + int opt; + while ((opt = getopt_long(argc, argv, short_opts, long_opts, NULL)) >= 0) + switch (opt) + { + case 'c': + default_color = optarg; + break; + case 'd': + default_duration = atoi(optarg); + break; + case 'D': + debug_mode = 1; + break; + case 'f': + font_name = optarg; + break; + case 'l': + num_lines = atoi(optarg); + if (num_lines < 1) + usage(); + break; + case 'm': + default_min_duration = atoi(optarg); + break; + case 'o': + default_outline_color = optarg; + break; + default: + usage(); + } + + if (optind < argc) + usage(); +} + /*** Displaying of messages ***/ struct msg { @@ -34,13 +110,17 @@ struct msg { static void display_msg(struct msg *msg) { - msg->min_light = msg->max_light = now + 1000; + DBG("## Displaying message\n"); + msg->min_light = now + default_min_duration; + msg->max_light = now + default_duration; + xosd_set_colour(osd, default_color); + xosd_set_outline_colour(osd, default_outline_color); char *line = msg->text; int row = 0; while (*line) { - // The parser it destructive, but it does not harm, since we display each message only once. + // The parser it destructive, but it does not do any harm, since we display each message only once. char *nl = strchr(line, '\n'); *nl++ = 0; @@ -56,16 +136,33 @@ display_msg(struct msg *msg) key = ""; val = line; } + DBG("\t%s:%s\n", key, val); if (!key[0]) { - if (row < MAX_LINES) + if (row < num_lines) xosd_display(osd, row++, XOSD_string, val); } + else if (!strcmp(key, "percentage") || !strcmp(key, "percent")) + { + if (row < num_lines) + xosd_display(osd, row++, XOSD_percentage, atoi(val)); + } + else if (!strcmp(key, "slider")) + { + if (row < num_lines) + xosd_display(osd, row++, XOSD_slider, atoi(val)); + } else if (!strcmp(key, "duration")) msg->max_light = now + atoi(val); else if (!strcmp(key, "min-duration")) msg->min_light = now + atoi(val); + else if (!strcmp(key, "color")) + xosd_set_colour(osd, val); + else if (!strcmp(key, "outline-color")) + xosd_set_outline_colour(osd, val); + else + xosd_display(osd, (row < num_lines ? row++ : num_lines-1), XOSD_string, "PARSE ERROR"); line = nl; } @@ -77,7 +174,9 @@ display_msg(struct msg *msg) static void hide_msg(struct msg *msg) { - xosd_scroll(osd, MAX_LINES); + DBG("## Hiding message\n"); + for (int i=0; i 0) + return 0; + setsid(); + } + XSelectInput(dpy, win, PropertyChangeMask); XDeleteProperty(dpy, win, pty); XFlush(dpy); - osd = xosd_create(4); + osd = xosd_create(num_lines); if (!osd) die("Cannot initialize OSD"); - xosd_set_font(osd, "-bitstream-bitstream vera sans-bold-r-normal-*-*-320-*-*-p-*-*"); + xosd_set_font(osd, font_name); xosd_set_outline_offset(osd, 2); - xosd_set_outline_colour(osd, "black"); xosd_set_pos(osd, XOSD_middle); xosd_set_align(osd, XOSD_center); @@ -160,9 +270,7 @@ main(void) for (;;) { - struct timeval tv; - gettimeofday(&tv, NULL); - now = (timestamp_t) tv.tv_sec * 1000 + tv.tv_usec / 1000; + now = get_current_time(); timestamp_t wait_until = now - 1; if (!current_msg && first_msg) @@ -185,7 +293,7 @@ main(void) } } - DBG("Waiting for %d ms\n", (int)(wait_until - now)); + DBG("... waiting for %d ms\n", (int)(wait_until - now)); poll(&pfd, 1, wait_until - now); if (pfd.revents & POLLIN) { @@ -204,10 +312,7 @@ main(void) unsigned char *pty_buf = NULL; XGetWindowProperty(dpy, win, pty, 0, 4096, True, XA_STRING, &pty_type, &pty_fmt, &pty_items, &pty_remains, &pty_buf); if (pty_type == XA_STRING && pty_fmt == 8 && pty_items) - { - DBG("Received: <%.*s>\n", (int) pty_items, pty_buf); - parse_input(pty_buf, pty_items); - } + parse_input(pty_buf, pty_items); if (pty_buf) XFree(pty_buf); }