diff -Nurd /home/yannig/tmp/original/wormux/src/gui/button.cpp ./gui/button.cpp
--- /home/yannig/tmp/original/wormux/src/gui/button.cpp	2007-07-11 21:09:28.000000000 +0200
+++ ./gui/button.cpp	2007-07-16 16:30:24.000000000 +0200
@@ -55,8 +55,7 @@
 {
   if (!hidden)
     {
-      uint frame = Contains(mousePosition)?1:0;
-
+      uint frame = (is_selected || Contains(mousePosition) ? 1 : 0);
       image->SetCurrentFrame(frame);
 
       if (img_scale) {
diff -Nurd /home/yannig/tmp/original/wormux/src/gui/widget.cpp ./gui/widget.cpp
--- /home/yannig/tmp/original/wormux/src/gui/widget.cpp	2007-07-11 21:09:28.000000000 +0200
+++ ./gui/widget.cpp	2007-07-16 16:45:47.000000000 +0200
@@ -27,6 +27,7 @@
   Rectanglei(),
   ct(NULL),
   need_redrawing(true),
+  is_selected(false),
   have_focus(false)
 {
 }
@@ -35,6 +36,7 @@
   Rectanglei(rect),
   ct(NULL),
   need_redrawing(true),
+  is_selected(false),
   have_focus(false)
 {
 }
@@ -76,16 +78,13 @@
 		    const Point2i &lastMousePosition,
 		    Surface& surf)
 {
-  if (
-      need_redrawing
+  if (need_redrawing
       || (Contains(mousePosition) && mousePosition != lastMousePosition)
-      || (Contains(lastMousePosition) && !Contains(mousePosition))
-      )
-    {
+      || (Contains(lastMousePosition) && !Contains(mousePosition))) {
       if (ct != NULL) ct->Redraw(*this, surf);
-
-      Draw(mousePosition, surf);
-    }
+    printf("Need redrawing\n");
+    Draw(mousePosition, surf);
+  }
   need_redrawing = false;
 }
 
diff -Nurd /home/yannig/tmp/original/wormux/src/gui/widget.h ./gui/widget.h
--- /home/yannig/tmp/original/wormux/src/gui/widget.h	2007-07-11 21:09:28.000000000 +0200
+++ ./gui/widget.h	2007-07-16 16:23:58.000000000 +0200
@@ -38,6 +38,7 @@
  protected:
   Container * ct;
   bool need_redrawing;
+  bool is_selected;
   void StdSetSizePosition(const Rectanglei &rect);
 
  public:
@@ -57,6 +58,8 @@
   virtual void SendKey(SDL_keysym key);
   virtual Widget* Click(const Point2i &mousePosition, uint button);
   virtual Widget* ClickUp(const Point2i &mousePosition, uint button);
+  void Select() { is_selected = true; need_redrawing = true; }
+  void Unselect() { is_selected = false; need_redrawing = true; }
 
   void SetContainer(Container * _ct);
 
diff -Nurd /home/yannig/tmp/original/wormux/src/gui/widget_list.cpp ./gui/widget_list.cpp
--- /home/yannig/tmp/original/wormux/src/gui/widget_list.cpp	2007-07-11 21:09:28.000000000 +0200
+++ ./gui/widget_list.cpp	2007-07-16 16:53:50.000000000 +0200
@@ -26,11 +26,13 @@
 WidgetList::WidgetList()
 {
   last_clicked = NULL;
+  current_selected = NULL;
 }
 
 WidgetList::WidgetList(const Rectanglei &rect) : Widget(rect)
 {
   last_clicked = NULL;
+  current_selected = NULL;
 }
 
 WidgetList::~WidgetList()
@@ -145,3 +147,52 @@
     last_clicked->ForceRedraw();
   }
 }
+
+void WidgetList::SetFocusOnNextWidget()
+{
+  printf("Widget = %d\n", (int)current_selected);
+  if(current_selected != NULL)
+    current_selected->Unselect();
+  else {
+    current_selected = (*widget_list.begin());
+    current_selected->Select();
+    return;
+  }
+  bool select_next = false;
+  current_selected = NULL;
+  for(std::list<Widget*>::iterator w = widget_list.begin();  w != widget_list.end(); w++) {
+    if(current_selected == (*w))
+      select_next = true;
+    else if(select_next) {
+      current_selected = (*w);
+      select_next = false;
+      break;
+    }
+  }
+  if(select_next && widget_list.size() > 0)
+    current_selected = (*widget_list.begin());
+  if(current_selected != NULL)
+    current_selected->Select();
+}
+
+void WidgetList::SetFocusOnPreviousWidget()
+{
+  printf("Widget = %d\n", (int)current_selected);
+  if(current_selected != NULL)
+    current_selected->Unselect();
+  else {
+    current_selected = (*widget_list.begin());
+    current_selected->Select();
+    return;
+  }
+  Widget* previous_widget = (*widget_list.end());
+  for(std::list<Widget*>::iterator w=widget_list.begin(); w != widget_list.end(); w++) {
+    if(current_selected == (*w))
+      break;
+    previous_widget = (*w);
+  }
+  if(previous_widget != NULL && widget_list.size() > 0)
+    current_selected = previous_widget;
+  if(current_selected != NULL)
+    current_selected->Select();
+}
diff -Nurd /home/yannig/tmp/original/wormux/src/gui/widget_list.h ./gui/widget_list.h
--- /home/yannig/tmp/original/wormux/src/gui/widget_list.h	2007-07-11 21:09:28.000000000 +0200
+++ ./gui/widget_list.h	2007-07-16 16:07:51.000000000 +0200
@@ -36,6 +36,7 @@
 
   Point2i lastMousePosition;
   Widget* last_clicked;
+  Widget* current_selected;
 
 protected:
   std::list<Widget*> widget_list;
@@ -68,6 +69,8 @@
 
   // set focus on a widget
   void SetFocusOn(Widget*);
+  void SetFocusOnNextWidget();
+  void SetFocusOnPreviousWidget();
 };
 
 #endif // WIDGET_LIST_H
diff -Nurd /home/yannig/tmp/original/wormux/src/menu/menu.cpp ./menu/menu.cpp
--- /home/yannig/tmp/original/wormux/src/menu/menu.cpp	2007-07-12 01:47:39.000000000 +0200
+++ ./menu/menu.cpp	2007-07-16 16:27:24.000000000 +0200
@@ -114,6 +114,20 @@
   }
 }
 
+void Menu::key_up()
+{
+  printf("up\n");
+  widgets.SetFocusOnNextWidget();
+  RedrawMenu();
+}
+
+void Menu::key_down()
+{
+  printf("down\n");
+  widgets.SetFocusOnNextWidget();
+  RedrawMenu();
+}
+
 void Menu::DrawBackground()
 {
   background->ScaleSize(AppWormux::GetInstance()->video.window.GetSize());
@@ -160,6 +174,12 @@
 	  case SDLK_RETURN:
 	    key_ok();
 	    break;
+	  case SDLK_UP:
+	    key_up();
+	    break;
+	  case SDLK_DOWN:
+	    key_down();
+	    break;
 	  case SDLK_F10:
 	    AppWormux::GetInstance()->video.ToggleFullscreen();
 	    break;
diff -Nurd /home/yannig/tmp/original/wormux/src/menu/menu.h ./menu/menu.h
--- /home/yannig/tmp/original/wormux/src/menu/menu.h	2007-07-11 23:46:02.000000000 +0200
+++ ./menu/menu.h	2007-07-16 13:21:52.000000000 +0200
@@ -73,6 +73,8 @@
    virtual void mouse_cancel();
    virtual void key_ok();
    virtual void key_cancel();
+   virtual void key_up();
+   virtual void key_down();
    virtual bool signal_ok() = 0;
    virtual bool signal_cancel() = 0;
 
