]> mj.ucw.cz Git - teatimer.git/blobdiff - teatimer.c
Allow timeouts up to 99:99:99
[teatimer.git] / teatimer.c
index 9564b6240fdfff1406abf4c7fafb65864af36006..07ef8760de467580a2bb4267aa42a36684a008a0 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *     Trivial Tea Timer
  *
- *     (c) 2002, 2010 Martin Mares <mj@ucw.cz>
+ *     (c) 2002, 2010, 2013 Martin Mares <mj@ucw.cz>
  *
  *     GPL'ed
  */
@@ -18,7 +18,7 @@
 #define UNUSED __attribute__((unused))
 
 static guint second_timer;
-static char old_text[8];
+static char old_text[16];
 static GtkWidget *win, *hbox1, *timebox, *togglebutton1;
 static time_t alarm_time;
 static char *run_cmd;
@@ -48,7 +48,7 @@ it_tolls_for_thee(void)
 static gint
 on_second_timeout(gpointer data UNUSED)
 {
-  char buf[8];
+  char buf[16];
   time_t now = time(NULL);
   int delta = alarm_time - now;
   char *sign = "";
@@ -58,9 +58,12 @@ on_second_timeout(gpointer data UNUSED)
       sign = "-";
       delta = -delta;
     }
-  if (delta >= 6000)
-    delta = 5999;
-  sprintf(buf, "%s%02d:%02d", sign, delta/60, delta%60);
+  if (delta >= 100*60*60)
+    delta = 100*60*60 - 1;
+  if (delta < 60*60)
+    sprintf(buf, "%s%02d:%02d", sign, delta/60, delta%60);
+  else
+    sprintf(buf, "%s%02d:%02d:%02d", sign, delta/3600, (delta%3600)/60, delta%60);
   gtk_entry_set_text(GTK_ENTRY(timebox), buf);
   if (now >= alarm_time)
     it_tolls_for_thee();
@@ -83,28 +86,29 @@ static int
 parse_time(char *c)
 {
   int t = 0;
+  int parts = 0;
 
-  while (*c && *c != ':')
+  while (*c)
     {
-      if (*c >= '0' && *c <= '9')
-       t = 10*t + *c++ - '0';
-      else
+      parts++;
+      if (parts > 3)
        return -1;
-    }
-  if (*c)
-    {
       int m = 0;
-      c++;
-      while (*c)
+      while (*c >= '0' && *c <= '9')
+       m = 10*m + *c++ - '0';
+      t += m;
+      if (*c == ':')
        {
-         if (*c >= '0' && *c <= '9')
-           m = 10*m + *c++ - '0';
-         else
-           return -1;
+         c++;
+         t = 60*t;
        }
-      t = 60*t + m;
+      else if (*c)
+       return -1;
     }
-  if (t >= 6000)
+
+  if (!parts)
+    return -1;
+  if (t >= 100*60*60)
     return -1;
   return t;
 }
@@ -157,7 +161,7 @@ open_window(void)
   gtk_widget_show(hbox1);
   gtk_container_add(GTK_CONTAINER (win), hbox1);
 
-  timebox = gtk_entry_new_with_max_length(6);
+  timebox = gtk_entry_new_with_max_length(9);
   gtk_widget_show(timebox);
   gtk_box_pack_start(GTK_BOX(hbox1), timebox, TRUE, TRUE, 0);
   gtk_entry_set_text(GTK_ENTRY(timebox), "00:00");