Index: /branches/gui/src/lib/event/event_handler.cc
===================================================================
--- /branches/gui/src/lib/event/event_handler.cc	(revision 7894)
+++ /branches/gui/src/lib/event/event_handler.cc	(revision 7895)
@@ -42,5 +42,6 @@
 
   /* now initialize them all to zero */
-  this->withUNICODE(false);
+  for (unsigned int i = 0; i < ES_NUMBER; i++)
+    this->bUNICODE[i] = false;
   this->grabEvents(false);
 
@@ -87,4 +88,14 @@
   this->keyMapper.loadKeyBindings();
 }
+
+/**
+ * @param state: to which the event handler shall change
+ */
+void EventHandler::setState(elState state)
+{
+  this->state = state;
+  SDL_EnableUNICODE(this->bUNICODE[state]);
+};
+
 
 /**
@@ -144,20 +155,8 @@
   {
     for(unsigned int i = 0; i < ES_NUMBER; i++)
-    {
-      if( !likely(this->listeners[i][eventType].empty()))
-      {
-        PRINTF(2)("'%s' of class '%s' tried to subscribe to event %i @ state %i but this event has already been subscribed\n", el->getName(), el->getClassName(), eventType, state);
-      }
       this->listeners[i][eventType].push_back(el);
-    }
-  }
-  else
-  {
-    if( likely(!this->listeners[state][eventType].empty()))
-    {
-      PRINTF(2)("%s of class %s tried to subscribe to event %i @ state %i but this event has already been subscribed\n", el->getName(), el->getClassName(), eventType, state);
-    }
+  }
+  else
     this->listeners[state][eventType].push_back(el);
-  }
 }
 
@@ -178,7 +177,7 @@
     {
       std::vector<EventListener*>::iterator listener =
-         std::find(this->listeners[i][eventType].begin(),
-                   this->listeners[i][eventType].end(),
-                   el);
+        std::find(this->listeners[i][eventType].begin(),
+                  this->listeners[i][eventType].end(),
+                  el);
       if (listener != this->listeners[i][eventType].end())
         this->listeners[i][eventType].erase(listener);
@@ -187,7 +186,7 @@
   {
     std::vector<EventListener*>::iterator listener =
-        std::find(this->listeners[state][eventType].begin(),
-                  this->listeners[state][eventType].end(),
-                  el);
+      std::find(this->listeners[state][eventType].begin(),
+                this->listeners[state][eventType].end(),
+                el);
     if (listener != this->listeners[state][eventType].end())
       this->listeners[state][eventType].erase(listener);
@@ -261,8 +260,9 @@
 
 
-void EventHandler::withUNICODE(bool enableUNICODE)
-{
-  SDL_EnableUNICODE(enableUNICODE);
-  this->bUNICODE = enableUNICODE;
+void EventHandler::withUNICODE(elState state, bool enableUNICODE)
+{
+  this->bUNICODE[state] = enableUNICODE;
+  if (this->state == state)
+    SDL_EnableUNICODE(enableUNICODE);
 }
 
@@ -283,8 +283,8 @@
 
 /**
- *  core function of event handler: receives all events from SDL
-
-   The event from the SDL framework are collected here and distributed to all listeners.
-*/
+ *  @brief core function of event handler: receives all events from SDL
+ *
+ * The event from the SDL framework are collected here and distributed to all listeners.
+ */
 void EventHandler::process()
 {
@@ -299,5 +299,5 @@
         ev.bPressed = true;
         ev.type = event.key.keysym.sym;
-        if (unlikely(this->bUNICODE))
+        if (unlikely(this->bUNICODE[this->state]))
           ev.x = event.key.keysym.unicode;
         break;
@@ -305,5 +305,5 @@
         ev.bPressed = false;
         ev.type = event.key.keysym.sym;
-        if (unlikely(this->bUNICODE))
+        if (unlikely(this->bUNICODE[this->state]))
           ev.x = event.key.keysym.unicode;
         break;
@@ -358,12 +358,14 @@
     /* small debug routine: shows all events dispatched by the event handler */
     PRINT(4)("\n==========================| EventHandler::process () |===\n");
-    PRINT(4)("=  Got Event nr %i, for state %i", ev.type, this->state);
-
-
-    for (unsigned int i = 0; i < this->listeners[this->state][ev.type].size(); i++)
+    PRINT(4)("=  Got Event nr %i, for state %i\n", ev.type, this->state);
+
+    /// setting a temporary state in case of an EventListener's process changes the state.
+    elState currentState = this->state;
+    for (unsigned int i = 0; i < this->listeners[currentState][ev.type].size(); i++)
     {
       PRINT(4)("=  Event dispatcher msg: This event has been consumed\n");
+      PRINT(4)("=  Got Event nr %i, for state %i %s::%s\n", ev.type, currentState, this->listeners[this->state][ev.type][i]->getClassName(), this->listeners[currentState][ev.type][i]->getName());
       PRINT(4)("=======================================================\n");
-      listeners[this->state][ev.type][i]->process(ev);
+      this->listeners[currentState][ev.type][i]->process(ev);
     }
     /*    else
@@ -375,5 +377,9 @@
 }
 
-
+/**
+ * @brief An eventFilter.
+ * @param event the Event to be filtered.
+ * @returns 0 on filtered Event. 1 Otherwise.
+ */
 int EventHandler::eventFilter(const SDL_Event *event)
 {
@@ -400,5 +406,5 @@
 
 /**
- * outputs some nice information about the EventHandler
+ * @brief outputs some nice information about the EventHandler
  */
 void EventHandler::debug() const
@@ -408,7 +414,9 @@
   PRINT(0)("===============================\n");
   for(int i = 0; i < ES_NUMBER; ++i)
+  {
     for(int j = 0; j < EV_NUMBER; ++j)
       for (unsigned int evl = 0; evl < this->listeners[i][j].size(); evl++)
         PRINT(0)("Event %d of State %d subscribed to %s (%p)\n", j, i, this->listeners[i][j][evl]->getName(), this->listeners[i][j][evl]);
+  }
   PRINT(0)("============================EH=\n");
 }
Index: /branches/gui/src/lib/event/event_handler.h
===================================================================
--- /branches/gui/src/lib/event/event_handler.h	(revision 7894)
+++ /branches/gui/src/lib/event/event_handler.h	(revision 7895)
@@ -26,6 +26,5 @@
   void init();
 
-  /** @param state: to which the event handler shall change */
-  inline void setState(elState state) { this->state = state; };
+  void setState(elState state);
   /** @returns the current state */
   inline elState getState() const { return this->state; };
@@ -42,5 +41,5 @@
 
 
-  void withUNICODE(bool enableUNICODE);
+  void withUNICODE(elState state, bool enableUNICODE);
   void grabEvents(bool grabEvents);
   bool grabbedEvents() const { return this->eventsGrabbed; };
@@ -62,5 +61,5 @@
   KeyMapper                    keyMapper;                       //!< reference to the key mapper.
 
-  bool                         bUNICODE;                        //!< If unicode should be enabled.
+  bool                         bUNICODE[ES_NUMBER];             //!< If unicode should be enabled.
   bool                         eventsGrabbed;                   //!< If the events should be grabbed
 };
Index: /branches/gui/src/lib/gui/gl_gui/glgui_handler.cc
===================================================================
--- /branches/gui/src/lib/gui/gl_gui/glgui_handler.cc	(revision 7894)
+++ /branches/gui/src/lib/gui/gl_gui/glgui_handler.cc	(revision 7895)
@@ -37,4 +37,6 @@
 
 
+    EventHandler::getInstance()->withUNICODE(ES_MENU, true );
+
     this->cursor = NULL;
     for (unsigned int i = 0; i < EV_NUMBER; i++)
@@ -42,5 +44,4 @@
       this->subscribeEvent(ES_MENU, i);
     }
-
   }
 
@@ -79,4 +80,6 @@
     EventHandler::getInstance()->pushState(ES_MENU);
 
+
+
   }
 
@@ -84,4 +87,5 @@
   {
     EventHandler::getInstance()->popState();
+
 
   }
Index: /branches/gui/src/lib/gui/gl_gui/glgui_inputline.cc
===================================================================
--- /branches/gui/src/lib/gui/gl_gui/glgui_inputline.cc	(revision 7894)
+++ /branches/gui/src/lib/gui/gl_gui/glgui_inputline.cc	(revision 7895)
@@ -36,6 +36,6 @@
   {}
 
-  float GLGuiInputLine::repeatDelay = 1.0;
-  float GLGuiInputLine::repeatRate = .1;
+  float GLGuiInputLine::repeatDelay = 0.3f;
+  float GLGuiInputLine::repeatRate  = 0.01f;
 
 
@@ -97,4 +97,6 @@
       else if (likely(event.type < 127))
       {
+        this->delayNext = GLGuiInputLine::repeatDelay;
+
         this->appendCharacter(event.x);
         this->pressedKey = event.type;
@@ -102,5 +104,4 @@
         return true;
       }
-      this->delayNext = this->repeatDelay;
     }
     else // if(!event.bPressed)
@@ -113,10 +114,4 @@
         return true;
       }
-    }
-
-    if (likely(event.type < 127))
-    {
-      this->appendCharacter(event.type);
-      return true;
     }
 
@@ -135,4 +130,21 @@
     if (this->delayNext > 0.0)
       this->delayNext -= dt;
+        else if (this->pressedKey != SDLK_FIRST )
+    {
+      this->delayNext = GLGuiInputLine::repeatRate;
+      switch (this->pressedKey)
+      {
+        case SDLK_BACKSPACE:
+          this->removeCharacters(1);
+          break;
+        default:
+        {
+          if (likely(this->pressedKey < 127))
+            this->appendCharacter(this->pressedKeyName);
+        }
+      }
+    }
+
+
   }
 
Index: /branches/gui/src/lib/shell/shell.cc
===================================================================
--- /branches/gui/src/lib/shell/shell.cc	(revision 7894)
+++ /branches/gui/src/lib/shell/shell.cc	(revision 7895)
@@ -70,4 +70,5 @@
     this->subscribeEvent(ES_SHELL, SDLK_PAGEDOWN);
     this->subscribeEvent(ES_SHELL, EV_VIDEO_RESIZE);
+    EventHandler::getInstance()->withUNICODE(ES_SHELL, true);
 
     // BUFFER
@@ -83,5 +84,5 @@
     this->textSize = 15;
     this->lineSpacing = 0;
-    this->bActive = true;
+    this->bActive = false;
     this->fontFile = SHELL_DEFAULT_FONT;
 
@@ -121,5 +122,4 @@
 
     EventHandler::getInstance()->pushState(ES_SHELL);
-    EventHandler::getInstance()->withUNICODE(true);
 
     this->setRelCoorSoft2D(0, 0, 5);
@@ -152,5 +152,4 @@
     this->deactivate2D();
 
-    EventHandler::getInstance()->withUNICODE(false);
     EventHandler::getInstance()->popState();
 
Index: /branches/gui/src/story_entities/simple_game_menu.cc
===================================================================
--- /branches/gui/src/story_entities/simple_game_menu.cc	(revision 7894)
+++ /branches/gui/src/story_entities/simple_game_menu.cc	(revision 7895)
@@ -84,4 +84,5 @@
 
   OrxGui::GLGuiHandler::getInstance()->activateCursor();
+  OrxGui::GLGuiHandler::getInstance()->activate();
   /////
   if (root != NULL)
