]> mj.ucw.cz Git - osdd.git/commitdiff
More attributes and options
authorMartin Mares <mj@ucw.cz>
Sat, 17 Jul 2010 15:37:49 +0000 (17:37 +0200)
committerMartin Mares <mj@ucw.cz>
Sat, 17 Jul 2010 15:37:49 +0000 (17:37 +0200)
osdd.c

diff --git a/osdd.c b/osdd.c
index 800f6ab9467a61e81fde8f394a7cb8886e547233..4659493ad074cf00df8783d961c6b9ddcc401688 100644 (file)
--- a/osdd.c
+++ b/osdd.c
@@ -9,6 +9,7 @@
 #include <string.h>
 #include <inttypes.h>
 #include <poll.h>
+#include <getopt.h>
 #include <sys/time.h>
 #include <xosd.h>
 #include <X11/Xlib.h>
 #include "util.h"
 
 static xosd *osd;
-#define MAX_LINES 4
+
+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";
 
 typedef uint64_t timestamp_t;
 static timestamp_t now;
@@ -35,12 +40,14 @@ static void
 display_msg(struct msg *msg)
 {
   msg->min_light = msg->max_light = now + 1000;
+  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;
 
@@ -59,13 +66,27 @@ display_msg(struct msg *msg)
 
       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);
 
       line = nl;
     }
@@ -77,7 +98,8 @@ display_msg(struct msg *msg)
 static void
 hide_msg(struct msg *msg)
 {
-  xosd_scroll(osd, MAX_LINES);
+  for (int i=0; i<num_lines; i++)
+    xosd_display(osd, i, XOSD_string, "");
   xosd_hide(osd);
   free(msg);
 }
@@ -124,11 +146,66 @@ parse_input(unsigned char *buf, int len)
     }
 }
 
+/*** Options ***/
+
+static const char short_opts[] = "c:f:l:o:";
+
+static const struct option long_opts[] = {
+  { "color",   required_argument,      NULL,   'c' },
+  { "font",    required_argument,      NULL,   'f' },
+  { "lines",   required_argument,      NULL,   'l' },
+  { "outline-color", required_argument,        NULL,   'o' },
+  { NULL,      0,                      NULL,   0   },
+};
+
+static void NONRET
+usage(void)
+{
+  fprintf(stderr, "Usage: osdd <options>\n\n\
+Options:\n\
+-c, --color=<c>\t\tDefault color (#rgb, #rrggbb or a name from rgb.txt)\n\
+-f, --font=<f>\t\tFont to use for the OSD\n\
+-l, --lines=<n>\t\tNumber of lines of the OSD\n\
+-o, --outline-color=<c>\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 'f':
+       font_name = optarg;
+       break;
+      case 'l':
+       num_lines = atoi(optarg);
+       if (num_lines < 1)
+         usage();
+       break;
+      case 'o':
+       default_outline_color = optarg;
+       break;
+      default:
+       usage();
+      }
+
+  if (optind < argc)
+    usage();
+}
+
 /*** Main loop ***/
 
 int
-main(void)
+main(int argc, char **argv)
 {
+  parse_opts(argc, argv);
   XInitThreads();
 
   Display *dpy = XOpenDisplay(NULL);
@@ -144,12 +221,11 @@ main(void)
   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);
 
@@ -204,10 +280,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);
                }