Added explicit timer functionality, no longer uses the ek timer functions
diff --git a/contiki/ctk/ctk.c b/contiki/ctk/ctk.c
index 22ed2a5..65b336e 100644
--- a/contiki/ctk/ctk.c
+++ b/contiki/ctk/ctk.c
@@ -32,7 +32,7 @@
  *
  * This file is part of the "ctk" console GUI toolkit for cc65
  *
- * $Id: ctk.c,v 1.22 2003/08/07 00:03:26 adamdunkels Exp $
+ * $Id: ctk.c,v 1.23 2003/08/09 13:34:16 adamdunkels Exp $
  *
  */
 
@@ -86,13 +86,11 @@
 #define ICONY_MAX    (height - 5)
 
 static void ctk_idle(void);
-static DISPATCHER_SIGHANDLER(ctk_sighandler, s, data);
 static struct dispatcher_proc p =
-  {DISPATCHER_PROC("CTK Contiki GUI", ctk_idle, ctk_sighandler, NULL)};
+  {DISPATCHER_PROC("CTK Contiki GUI", ctk_idle, NULL, NULL)};
 static ek_id_t ctkid;
 
 ek_signal_t ctk_signal_keypress,
-  ctk_signal_timer,
   ctk_signal_button_activate,
   ctk_signal_widget_activate,
   ctk_signal_button_hover,
@@ -117,6 +115,7 @@
 
 static unsigned short screensaver_timer;
 unsigned short ctk_screensaver_timeout = (5*60);
+static u16_t start, current;
 /*#define SCREENSAVER_TIMEOUT (5*60)*/
 
 #if CTK_CONF_MENUS
@@ -175,7 +174,6 @@
   desktop_window.active = NULL;
   
   ctk_signal_keypress = dispatcher_sigalloc();
-  ctk_signal_timer = dispatcher_sigalloc();
   
   ctk_signal_button_activate =
     ctk_signal_widget_activate = dispatcher_sigalloc();
@@ -199,8 +197,6 @@
   ctk_signal_screensaver_uninstall = dispatcher_sigalloc();
 #endif /* CTK_CONF_SCREENSAVER */
     
-  dispatcher_listen(ctk_signal_timer);
-  dispatcher_timer(ctk_signal_timer, NULL, CLK_TCK);
 
   mode = CTK_MODE_NORMAL;
 
@@ -208,6 +204,8 @@
   icony = ICONY_START;
 
   redraw = REDRAW_ALL;
+
+  start = ek_clock();
 }
 /*-----------------------------------------------------------------------------------*/
 /* void ctk_mode_set()
@@ -1017,12 +1015,32 @@
 #endif /* CTK_CONF_MENUS */
 /*-----------------------------------------------------------------------------------*/
 static void
+timer(void)
+{
+  if(mode == CTK_MODE_NORMAL) {
+    ++screensaver_timer;
+    if(screensaver_timer == ctk_screensaver_timeout) {
+#if CTK_CONF_SCREENSAVER
+      dispatcher_emit(ctk_signal_screensaver_start, NULL,
+		      DISPATCHER_BROADCAST);
+#ifdef CTK_SCREENSAVER_INIT
+      CTK_SCREENSAVER_INIT();
+#endif /* CTK_SCREENSAVER_INIT */
+      mode = CTK_MODE_SCREENSAVER;
+#endif /* CTK_CONF_SCREENSAVER */
+      screensaver_timer = 0;
+    }
+  }  
+}
+/*-----------------------------------------------------------------------------------*/
+static void
 ctk_idle(void)     
 {
   static ctk_arch_key_t c;
   static unsigned char i;
   register struct ctk_window *window;
   register struct ctk_widget *widget;
+  register struct ctk_widget **widgetptr;
 #if CTK_CONF_MOUSE_SUPPORT 
   static unsigned char mxc, myc, mouse_button_changed, mouse_moved,
     mouse_clicked;
@@ -1030,7 +1048,15 @@
   register struct ctk_menu *menu;
 
 #endif /* CTK_CONF_MOUSE_SUPPORT */
+
+
+  current = ek_clock();
   
+  if((current - start) >= CLK_TCK/2) {
+    timer();
+    start = current;
+  }    
+
 #if CTK_CONF_MENUS
   if(menus.open != NULL) {
     maxnitems = menus.open->nitems;
@@ -1118,6 +1144,8 @@
 	if(menus.open != NULL) {
 	  /* Do whatever needs to be done when a menu is open. */
 
+	  /* First check if the mouse pointer is in the currently open
+	     menu. */
 	  if(menus.open == &desktopmenu) {
 	    menux = width - CTK_CONF_MENUWIDTH;
 	  } else {
@@ -1128,6 +1156,8 @@
 	    }
 	  }
 
+	  /* Find out which of the menu items the mouse is pointing
+	     to. */
 	  if(mxc >= menux && mxc <= menux + CTK_CONF_MENUWIDTH) {
 	    if(myc <= menus.open->nitems) {
 	      menus.open->active = myc;
@@ -1341,8 +1371,15 @@
       }
 
       if(redraw & REDRAW_WIDGETS) {
-	for(i = 0; i < redraw_widgetptr; ++i) {
-	  ctk_widget_redraw(redraw_widgets[i]);	  
+	widgetptr = redraw_widgets;
+	for(i = 0; i < MAX_REDRAWWIDGETS; ++i) {
+	  /*	  if(redraw_widgets[i] != NULL) {
+	    ctk_widget_redraw(redraw_widgets[i]);
+	  }
+	  redraw_widgets[i] = NULL;*/
+	  ctk_widget_redraw(*widgetptr);
+	  *widgetptr = NULL;
+	  ++widgetptr;
 	}
 	redraw &= ~REDRAW_WIDGETS;
 	redraw_widgetptr = 0;
@@ -1451,8 +1488,14 @@
       ctk_window_redraw(&desktop_window);	
     }
   } else if(redraw & REDRAW_WIDGETS) {
-    for(i = 0; i < redraw_widgetptr; ++i) {
+    widgetptr = redraw_widgets;
+    /*    for(i = 0; i < redraw_widgetptr; ++i) {
       ctk_widget_redraw(redraw_widgets[i]);
+      }*/
+    for(i = 0; i < MAX_REDRAWWIDGETS; ++i) {
+      ctk_widget_redraw(*widgetptr);
+      *widgetptr = NULL;
+      ++widgetptr;
     }
   }    
   redraw = 0;
@@ -1460,6 +1503,7 @@
   
 }
 /*-----------------------------------------------------------------------------------*/
+#if 0
 static
 DISPATCHER_SIGHANDLER(ctk_sighandler, s, data)
 {
@@ -1483,5 +1527,6 @@
     dispatcher_timer(ctk_signal_timer, data, CLK_TCK);
   }
 }
+#endif /* 0 */
 /*-----------------------------------------------------------------------------------*/