diff --git a/contiki/ctk/ctk.c b/contiki/ctk/ctk.c
index 61cd3e6..76a1a62 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.26 2003/08/12 21:12:59 adamdunkels Exp $
+ * $Id: ctk.c,v 1.27 2003/08/15 18:49:22 adamdunkels Exp $
  *
  */
 
@@ -294,7 +294,7 @@
 void
 ctk_window_close(struct ctk_window *w)
 {
-  struct ctk_window *w2;
+  static struct ctk_window *w2;
 
   if(w == NULL) {
     return;
@@ -407,7 +407,7 @@
 do_redraw_all(unsigned char clipy1, unsigned char clipy2)
 {
   struct ctk_window *w;
-  struct ctk_widget *widget;
+  static struct ctk_widget *widget;
 
   if(mode != CTK_MODE_NORMAL &&
      mode != CTK_MODE_WINDOWMOVE) {
@@ -931,7 +931,7 @@
 activate_menu(void)
 {
   struct ctk_window *w;
-    
+  
   lastmenu = menus.open;
   if(menus.open == &desktopmenu) {
     for(w = windows; w != NULL; w = w->next) {
@@ -1009,6 +1009,20 @@
 }
 /*-----------------------------------------------------------------------------------*/
 static void
+unfocus_widget(CC_REGISTER_ARG struct ctk_widget *w)
+{
+  if(w != NULL) {
+    redraw |= REDRAW_WIDGETS;
+    add_redrawwidget(w);
+    if(CTK_WIDGET_TYPE(w) == CTK_WIDGET_TEXTENTRY) {
+      ((struct ctk_textentry *)w)->state =
+	CTK_TEXTENTRY_NORMAL;
+    }
+    w->window->focused = NULL;
+  }
+}
+/*-----------------------------------------------------------------------------------*/
+static void
 ctk_idle(void)     
 {
   static ctk_arch_key_t c;
@@ -1071,7 +1085,7 @@
 #if CTK_CONF_MOUSE_SUPPORT
        || mouse_moved || mouse_button_changed
 #endif /* CTK_CONF_MOUSE_SUPPORT */
-       ) {
+       ) {      
       dispatcher_emit(ctk_signal_screensaver_stop, NULL,
 		      DISPATCHER_BROADCAST);
       mode = CTK_MODE_NORMAL;
@@ -1091,17 +1105,21 @@
 	/* Here we should do whatever needs to be done when the mouse
 	   moves around and clicks in the menubar. */
 	if(mouse_clicked) {
+	  static unsigned char titlelen;
+	  
 	  /* Find out which menu that the mouse pointer is in. Start
 	     with the ->next menu after the desktop menu. We assume
 	     that the menus start one character from the left screen
 	     side and that the desktop menu is farthest to the
 	     right. */
 	  menux = 1;
-	  for(menu = menus.menus->next; menu != NULL; menu = menu->next) {
-	    if(mxc >= menux && mxc <= menux + menu->titlelen) {
+	  for(menu = menus.menus->next;
+	      menu != NULL; menu = menu->next) {
+	    titlelen = menu->titlelen;
+	    if(mxc >= menux && mxc <= menux + titlelen) {
 	      break;
 	    }
-	    menux += menu->titlelen;
+	    menux += titlelen;
 	  }
 	  
 	  /* Also check desktop menu. */
@@ -1117,6 +1135,8 @@
 	--myc;
 
 	if(menus.open != NULL) {
+	  static unsigned char nitems;
+	  
 	  /* Do whatever needs to be done when a menu is open. */
 
 	  /* First check if the mouse pointer is in the currently open
@@ -1131,19 +1151,20 @@
 	    }
 	  }
 
+	  nitems = menus.open->nitems;
 	  /* 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) {
+	  if(mxc >= menux && mxc <= menux + CTK_CONF_MENUWIDTH) {    
+	    if(myc <= nitems) {
 	      menus.open->active = myc;
 	    } else {
-	      menus.open->active = menus.open->nitems - 1;
+	      menus.open->active = nitems - 1;
 	    }
 	  }
 	  
 	  if(mouse_clicked) {
 	    if(mxc >= menux && mxc <= menux + CTK_CONF_MENUWIDTH &&
-	       myc <= menus.open->nitems) {
+	       myc <= nitems) {
 	      redraw |= activate_menu();
 	    } else {
 	      lastmenu = menus.open;
@@ -1160,7 +1181,9 @@
 	  if(dialog != NULL) {
 	    window = dialog;
 	  } else {	  	 	  
-	    for(window = windows; window != NULL; window = window->next) {
+	    for(window = windows; window != NULL;
+		window = window->next) {
+	      
 	      /* Check if the mouse is within the window. */
 	      if(mxc >= window->x &&
 		 mxc <= window->x + window->w &&
@@ -1186,9 +1209,10 @@
 	  if(windows != NULL &&
 	     window != windows &&
 	     windows->focused != NULL){	  
-	    add_redrawwidget(windows->focused);
+	    /*add_redrawwidget(windows->focused);
 	    windows->focused = NULL;
-	    redraw |= REDRAW_WIDGETS;
+	    redraw |= REDRAW_WIDGETS;*/
+	    unfocus_widget(windows->focused);
 	  }
 
 	  if(window != NULL) {
@@ -1214,6 +1238,7 @@
 		 activated. */
 	      for(widget = window->active; widget != NULL;
 		  widget = widget->next) {
+		
 		if(mxc >= widget->x &&
 		   mxc <= widget->x + widget->w &&
 		   (myc == widget->y ||
@@ -1221,27 +1246,36 @@
 		      /*widget->type == CTK_WIDGET_TEXTMAP ||*/
 		      widget->type == CTK_WIDGET_ICON) &&
 		     (myc >= widget->y &&
-		      myc <= widget->y + ((struct ctk_bitmap *)widget)->h)))) {
+		      myc <= widget->y +
+		      ((struct ctk_bitmap *)widget)->h)))) {
 		  break;
 		}
 	      }
 	    
-	    
+
+	      /* if the mouse is moved in the focused window, we emit
+		 a ctk_signal_pointer_move signal to the owner of the
+		 window. */
 	      if(mouse_moved &&
 		 (window != &desktop_window ||
 		  windows == NULL)) {
+
 		dispatcher_emit(ctk_signal_pointer_move, NULL,
 				window->owner);
-	       
+
+		/* If there was a focused widget that is not below the
+		   mouse pointer, we remove focus from the widget and
+		   redraw it. */
 		if(window->focused != NULL &&
 		   widget != window->focused) {
-		  add_redrawwidget(window->focused);
+		  /*		  add_redrawwidget(window->focused);
 		  if(CTK_WIDGET_TYPE(window->focused) ==
 		     CTK_WIDGET_TEXTENTRY) {
 		    ((struct ctk_textentry *)(window->focused))->state =
 		      CTK_TEXTENTRY_NORMAL;
 		  }
-		  window->focused = NULL;
+		  window->focused = NULL;*/
+		  unfocus_widget(window->focused);
 		}
 		redraw |= REDRAW_WIDGETS;
 		if(widget != NULL) {
@@ -1325,13 +1359,14 @@
 	     widget != NULL) {
 	    redraw |= activate(widget);
 	  } else {
-	    add_redrawwidget(widget);
 	    if(widget != NULL &&
 	       widget->type == CTK_WIDGET_TEXTENTRY) {
 	      widget->widget.textentry.state = CTK_TEXTENTRY_EDIT;
 	      textentry_input(c, (struct ctk_textentry *)widget);
+	      add_redrawwidget(widget);
 	    } else {
-	      window->focused = NULL;
+	      /*	      window->focused = NULL;*/
+	      unfocus_widget(window->focused);
 	      dispatcher_emit(ctk_signal_keypress, (void *)c,
 			      window->owner);
 	    }
@@ -1343,10 +1378,6 @@
       if(redraw & REDRAW_WIDGETS) {
 	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;
@@ -1427,17 +1458,12 @@
 	}
 	redraw = REDRAW_ALL;
 	break;
-      case CH_ENTER:
-      case CH_ESC:
+      default:
 	mode = CTK_MODE_NORMAL;
 	redraw = REDRAW_ALL;
 	break;
       }
     }
-    /*    if(redraw & REDRAW_ALL) {
-      do_redraw_all(1, height);
-    }
-    redraw = 0;*/
 #endif /* CTK_CONF_WINDOWMOVE */
   }
 
@@ -1459,9 +1485,6 @@
     }
   } else if(redraw & REDRAW_WIDGETS) {
     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;
@@ -1473,30 +1496,3 @@
   
 }
 /*-----------------------------------------------------------------------------------*/
-#if 0
-static
-DISPATCHER_SIGHANDLER(ctk_sighandler, s, data)
-{
-  DISPATCHER_SIGHANDLER_ARGS(s, data);
-  
-  if(s == ctk_signal_timer) {
-    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;
-      }
-    }
-    dispatcher_timer(ctk_signal_timer, data, CLK_TCK);
-  }
-}
-#endif /* 0 */
-/*-----------------------------------------------------------------------------------*/
-
