pingus-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Pingus-CVS] r3120 - trunk/pingus/src/input


From: grumbel at BerliOS
Subject: [Pingus-CVS] r3120 - trunk/pingus/src/input
Date: Tue, 11 Sep 2007 16:57:59 +0200

Author: grumbel
Date: 2007-09-11 16:57:58 +0200 (Tue, 11 Sep 2007)
New Revision: 3120

Modified:
   trunk/pingus/src/input/control.hpp
   trunk/pingus/src/input/controller.cpp
   trunk/pingus/src/input/controller.hpp
   trunk/pingus/src/input/controller_description.cpp
   trunk/pingus/src/input/controller_description.hpp
   trunk/pingus/src/input/core_driver.cpp
   trunk/pingus/src/input/core_driver.hpp
   trunk/pingus/src/input/driver.hpp
   trunk/pingus/src/input/event.hpp
   trunk/pingus/src/input/manager.cpp
   trunk/pingus/src/input/manager.hpp
   trunk/pingus/src/input/sdl_driver.cpp
   trunk/pingus/src/input/sdl_driver.hpp
   trunk/pingus/src/input/usbmouse_driver.hpp
   trunk/pingus/src/input/wiimote_driver.hpp
   trunk/pingus/src/input/xinput_driver.hpp
Log:
- added keyboard support

Modified: trunk/pingus/src/input/control.hpp
===================================================================
--- trunk/pingus/src/input/control.hpp  2007-09-10 08:05:47 UTC (rev 3119)
+++ trunk/pingus/src/input/control.hpp  2007-09-11 14:57:58 UTC (rev 3120)
@@ -364,6 +364,62 @@
   }
 };
 
+class Keyboard : public Control
+{
+protected:
+  unsigned short chr;
+
+public:
+  Keyboard(Control* parent)
+    : Control(parent)
+  {}
+
+  void send_char(unsigned short c) { chr = c; notify_parent(); }
+  unsigned char get_char() { return chr; }
+};
+
+class KeyboardGroup : public Keyboard
+{
+private:
+  std::vector<Keyboard*> keyboards;
+
+public:
+  KeyboardGroup(Control* parent)
+    : Keyboard(parent)
+  {}
+
+  void update(float delta) {
+  }
+
+  void update(Control* p) {
+    chr = dynamic_cast<Keyboard*>(p)->get_char();
+    notify_parent();
+  }
+
+  void add_keyboard(Keyboard* keyboard)
+  {
+    keyboards.push_back(keyboard);
+  }
+};
+
+class ControllerKeyboard : public KeyboardGroup
+{
+private:
+  Controller* controller;
+  int id;
+
+public:
+  ControllerKeyboard(Controller* controller_, int id_)
+    : KeyboardGroup(0),
+      controller(controller_),
+      id(id_)
+  {}
+  
+  virtual void notify_parent() {
+    controller->add_keyboard_event(chr);
+  }
+};
+
 } // namespace Input
 
 #endif

Modified: trunk/pingus/src/input/controller.cpp
===================================================================
--- trunk/pingus/src/input/controller.cpp       2007-09-10 08:05:47 UTC (rev 
3119)
+++ trunk/pingus/src/input/controller.cpp       2007-09-11 14:57:58 UTC (rev 
3120)
@@ -64,6 +64,12 @@
     {
       add_scroller(*i, new ControllerScroller(this, *i));
     }
+
+  const std::vector<int>& keyboard_lst = desc.get_keyboards();
+  for(std::vector<int>::const_iterator i = keyboard_lst.begin(); i != 
keyboard_lst.end(); ++i)
+    {
+      add_keyboard(*i, new ControllerKeyboard(this, *i));
+    }
 }
 
 ControllerScroller*
@@ -94,7 +100,26 @@
     return 0;
 }
 
+ControllerKeyboard*
+Controller::get_keyboard(int id)
+{
+  if (id >= 0 && id < int(keyboards.size()))
+    return keyboards[id];
+  else
+    return 0;
+}
+
 void
+Controller::add_keyboard(int id, ControllerKeyboard* keyboard) 
+{
+  if (int(keyboards.size())-1 < id)
+    keyboards.resize(id+1);
+   
+  assert(keyboards[id] == 0);
+  keyboards[id] = keyboard;
+}
+
+void
 Controller::add_pointer(int id, ControllerPointer* pointer) 
 {
   if (int(pointers.size())-1 < id)
@@ -186,6 +211,12 @@
   events.push_back(makeScrollerEvent((EventName)id, xrel, yrel));
 }
 
+void
+Controller::add_keyboard_event(unsigned short key)
+{
+  events.push_back(makeKeyboardEvent(key));
+}
+
 std::vector<Event>
 Controller::poll_events()
 {

Modified: trunk/pingus/src/input/controller.hpp
===================================================================
--- trunk/pingus/src/input/controller.hpp       2007-09-10 08:05:47 UTC (rev 
3119)
+++ trunk/pingus/src/input/controller.hpp       2007-09-11 14:57:58 UTC (rev 
3120)
@@ -31,6 +31,7 @@
 class ControllerAxis;
 class ControllerPointer;
 class ControllerScroller;
+class ControllerKeyboard;
 
 class Controller
 {
@@ -46,6 +47,7 @@
   std::vector<ControllerAxis*>     axes;
   std::vector<ControllerPointer*>  pointers;
   std::vector<ControllerScroller*> scrollers;
+  std::vector<ControllerKeyboard*> keyboards;
   
   std::vector<Event> events;
 public:
@@ -58,16 +60,19 @@
   ControllerButton*   get_button(int id);
   ControllerPointer*  get_pointer(int id);
   ControllerScroller* get_scroller(int id);
+  ControllerKeyboard* get_keyboard(int id);
 
   void add_axis_event(int id, float pos);
   void add_button_event(int id, ButtonState state);
   void add_pointer_event(int id, float x, float y);
   void add_scroller_event(int id, float xrel, float yrel);
+  void add_keyboard_event(unsigned short key);
 
   void add_axis(int id, ControllerAxis* axis);
   void add_button(int id, ControllerButton* button); 
   void add_pointer(int id, ControllerPointer* pointer);
   void add_scroller(int id, ControllerScroller* scroller);
+  void add_keyboard(int id, ControllerKeyboard* keyboard);
   
   void update(float delta);
 private:

Modified: trunk/pingus/src/input/controller_description.cpp
===================================================================
--- trunk/pingus/src/input/controller_description.cpp   2007-09-10 08:05:47 UTC 
(rev 3119)
+++ trunk/pingus/src/input/controller_description.cpp   2007-09-11 14:57:58 UTC 
(rev 3120)
@@ -89,6 +89,19 @@
   id_to_event[event.id]    = event;
 }
 
+void
+ControllerDescription::add_keyboard  (const std::string& name, int id)
+{
+  InputEventDefinition event;
+
+  event.type = KEYBOARD_EVENT_TYPE;
+  event.name = name;
+  event.id   = id;
+
+  str_to_event[event.name] = event;
+  id_to_event[event.id]    = event;
+}
+
 const InputEventDefinition&
 ControllerDescription::get_definition(int id) const
 {
@@ -146,6 +159,13 @@
 {
   return map2vector(id_to_event, SCROLLER_EVENT_TYPE);  
 }
+
+std::vector<int>
+ControllerDescription::get_keyboards() const
+{
+  return map2vector(id_to_event, KEYBOARD_EVENT_TYPE);  
+}
+
 
 } // namespace Input
 

Modified: trunk/pingus/src/input/controller_description.hpp
===================================================================
--- trunk/pingus/src/input/controller_description.hpp   2007-09-10 08:05:47 UTC 
(rev 3119)
+++ trunk/pingus/src/input/controller_description.hpp   2007-09-11 14:57:58 UTC 
(rev 3120)
@@ -53,6 +53,7 @@
   void add_axis    (const std::string& name, int id); 
   void add_scroller(const std::string& name, int id); 
   void add_pointer (const std::string& name, int id); 
+  void add_keyboard(const std::string& name, int id); 
 
   const InputEventDefinition& get_definition(int id) const;
   const InputEventDefinition& get_definition(const std::string& name) const;
@@ -61,6 +62,7 @@
   std::vector<int> get_axes() const;
   std::vector<int> get_pointers() const;
   std::vector<int> get_scrollers() const;
+  std::vector<int> get_keyboards() const;
 };
 
 } // namespace Input

Modified: trunk/pingus/src/input/core_driver.cpp
===================================================================
--- trunk/pingus/src/input/core_driver.cpp      2007-09-10 08:05:47 UTC (rev 
3119)
+++ trunk/pingus/src/input/core_driver.cpp      2007-09-11 14:57:58 UTC (rev 
3120)
@@ -356,6 +356,12 @@
     }
 }
 
+Keyboard*
+CoreDriver::create_keyboard(const FileReader& reader, Control* parent)
+{
+  return 0;
+}
+
 } // namespace Input
 
 /* EOF */

Modified: trunk/pingus/src/input/core_driver.hpp
===================================================================
--- trunk/pingus/src/input/core_driver.hpp      2007-09-10 08:05:47 UTC (rev 
3119)
+++ trunk/pingus/src/input/core_driver.hpp      2007-09-11 14:57:58 UTC (rev 
3120)
@@ -49,6 +49,7 @@
   Axis*     create_axis    (const FileReader& reader, Control* parent);
   Scroller* create_scroller(const FileReader& reader, Control* parent);
   Pointer*  create_pointer (const FileReader& reader, Control* parent);
+  Keyboard* create_keyboard(const FileReader& reader, Control* parent);
 };
 
 } // namespace Input

Modified: trunk/pingus/src/input/driver.hpp
===================================================================
--- trunk/pingus/src/input/driver.hpp   2007-09-10 08:05:47 UTC (rev 3119)
+++ trunk/pingus/src/input/driver.hpp   2007-09-11 14:57:58 UTC (rev 3120)
@@ -38,6 +38,7 @@
   virtual Axis*     create_axis    (const FileReader& reader, Control* parent) 
=0;
   virtual Scroller* create_scroller(const FileReader& reader, Control* parent) 
=0;
   virtual Pointer*  create_pointer (const FileReader& reader, Control* parent) 
=0;
+  virtual Keyboard* create_keyboard(const FileReader& reader, Control* parent) 
=0;
 };
 
 } // namespace Input

Modified: trunk/pingus/src/input/event.hpp
===================================================================
--- trunk/pingus/src/input/event.hpp    2007-09-10 08:05:47 UTC (rev 3119)
+++ trunk/pingus/src/input/event.hpp    2007-09-11 14:57:58 UTC (rev 3120)
@@ -61,6 +61,8 @@
   // Scroller
   STANDARD_SCROLLER,
 
+  STANDARD_KEYBOARD,
+
   // Axis
   ACTION_AXIS,
 };

Modified: trunk/pingus/src/input/manager.cpp
===================================================================
--- trunk/pingus/src/input/manager.cpp  2007-09-10 08:05:47 UTC (rev 3119)
+++ trunk/pingus/src/input/manager.cpp  2007-09-11 14:57:58 UTC (rev 3120)
@@ -39,6 +39,8 @@
 {
   desc.add_axis("action-axis",  ACTION_AXIS);
 
+  desc.add_keyboard("standard-keyboard",  STANDARD_KEYBOARD);
+
   desc.add_pointer("standard-pointer",   STANDARD_POINTER);
   desc.add_scroller("standard-scroller", STANDARD_SCROLLER);
 
@@ -150,6 +152,20 @@
                     std::cout << "Manager: axis: Couldn't create axis " << 
j->get_name() << std::endl;
                 }
             }
+          else if (StringUtil::has_suffix(i->get_name(), "keyboard"))
+            {
+              const std::vector<FileReader>& keyboards = i->get_sections();
+              for(std::vector<FileReader>::const_iterator j = 
keyboards.begin(); j != keyboards.end(); ++j)
+                {
+                  int id = desc.get_definition(i->get_name()).id;
+                  ControllerKeyboard* ctrl_keyboard = 
controller->get_keyboard(id);
+                  Keyboard* keyboard = create_keyboard(*j, ctrl_keyboard);
+                  if (keyboard)
+                    ctrl_keyboard->add_keyboard(keyboard);
+                  else
+                    std::cout << "Manager: keyboard: Couldn't create keyboard 
" << j->get_name() << std::endl;
+                }              
+            }
           else
             {
               PingusError::raise(std::string("Manager: Unkown Element in 
Controller Config: ") 
@@ -291,6 +307,23 @@
       return 0;
     }
 }
+
+Keyboard*
+Manager::create_keyboard(const FileReader& reader, Control* parent)
+{
+  std::string driver = get_driver_part(reader.get_name());
+                  
+  Driver* drv = load_driver(driver);
+  if (drv)
+    {
+      return drv->create_keyboard(reader, parent);
+    }
+  else
+    {
+      std::cout << "Manager: Error: Couldn't find driver: '" << driver << "'" 
<< std::endl;
+      return 0;
+    }  
+}
 
 } // namespace Input
 

Modified: trunk/pingus/src/input/manager.hpp
===================================================================
--- trunk/pingus/src/input/manager.hpp  2007-09-10 08:05:47 UTC (rev 3119)
+++ trunk/pingus/src/input/manager.hpp  2007-09-11 14:57:58 UTC (rev 3120)
@@ -47,6 +47,7 @@
   Axis*     create_axis    (const FileReader& reader, Control* parent);
   Pointer*  create_pointer (const FileReader& reader, Control* parent);
   Scroller* create_scroller(const FileReader& reader, Control* parent);
+  Keyboard* create_keyboard(const FileReader& reader, Control* parent);
 
 private:
   Driver* load_driver(const std::string& name);

Modified: trunk/pingus/src/input/sdl_driver.cpp
===================================================================
--- trunk/pingus/src/input/sdl_driver.cpp       2007-09-10 08:05:47 UTC (rev 
3119)
+++ trunk/pingus/src/input/sdl_driver.cpp       2007-09-11 14:57:58 UTC (rev 
3120)
@@ -26,6 +26,7 @@
 namespace Input {
 
 SDLDriver::SDLDriver()
+  : keyboard_binding(0)
 {
   for (int i = 0; i < SDLK_LAST; ++i) {
     char* key_name = SDL_GetKeyName(static_cast<SDLKey>(i));
@@ -41,6 +42,12 @@
   
 }
 
+Keyboard*
+SDLDriver::create_keyboard(const FileReader& reader, Control* parent)
+{
+  return (keyboard_binding = new Keyboard(parent));
+}
+
 Button*
 SDLDriver::create_button(const FileReader& reader, Control* parent)
 {
@@ -238,6 +245,9 @@
             break;
 
           case SDL_KEYDOWN:
+            if (keyboard_binding)
+              keyboard_binding->send_char(event.key.keysym.unicode);
+            
           case SDL_KEYUP:
             if (event.key.state == SDL_PRESSED)
               global_event.on_button_press(event.key);

Modified: trunk/pingus/src/input/sdl_driver.hpp
===================================================================
--- trunk/pingus/src/input/sdl_driver.hpp       2007-09-10 08:05:47 UTC (rev 
3119)
+++ trunk/pingus/src/input/sdl_driver.hpp       2007-09-11 14:57:58 UTC (rev 
3120)
@@ -78,6 +78,7 @@
   std::vector<MouseButtonBinding>    mouse_button_bindings;
   std::vector<JoystickButtonBinding> joystick_button_bindings;
   std::vector<JoystickAxisBinding>   joystick_axis_bindings;
+  Keyboard* keyboard_binding;
 
   typedef std::map<std::string, SDLKey> String2Key;
   String2Key string2key;
@@ -95,6 +96,7 @@
   Axis*     create_axis    (const FileReader& reader, Control* parent);
   Scroller* create_scroller(const FileReader& reader, Control* parent);
   Pointer*  create_pointer (const FileReader& reader, Control* parent);
+  Keyboard* create_keyboard(const FileReader& reader, Control* parent);
 
   void update(float delta);
   std::string get_name() const { return "sdl"; }

Modified: trunk/pingus/src/input/usbmouse_driver.hpp
===================================================================
--- trunk/pingus/src/input/usbmouse_driver.hpp  2007-09-10 08:05:47 UTC (rev 
3119)
+++ trunk/pingus/src/input/usbmouse_driver.hpp  2007-09-11 14:57:58 UTC (rev 
3120)
@@ -49,7 +49,7 @@
   Axis*     create_axis    (const FileReader& reader, Control* parent) { 
return 0; } 
   Scroller* create_scroller(const FileReader& reader, Control* parent);
   Pointer*  create_pointer (const FileReader& reader, Control* parent);
-
+  Keyboard*  create_keyboard(const FileReader& reader, Control* parent) { 
return 0; }
 private:
   USBMouse* get_mouse(const std::string& device);
 };

Modified: trunk/pingus/src/input/wiimote_driver.hpp
===================================================================
--- trunk/pingus/src/input/wiimote_driver.hpp   2007-09-10 08:05:47 UTC (rev 
3119)
+++ trunk/pingus/src/input/wiimote_driver.hpp   2007-09-11 14:57:58 UTC (rev 
3120)
@@ -55,6 +55,7 @@
   Axis*     create_axis    (const FileReader& reader, Control* parent);
   Scroller* create_scroller(const FileReader& reader, Control* parent);
   Pointer*  create_pointer (const FileReader& reader, Control* parent);
+  Keyboard* create_keyboard(const FileReader& reader, Control* parent) { 
return 0; }
 };
 
 } // namespace Input

Modified: trunk/pingus/src/input/xinput_driver.hpp
===================================================================
--- trunk/pingus/src/input/xinput_driver.hpp    2007-09-10 08:05:47 UTC (rev 
3119)
+++ trunk/pingus/src/input/xinput_driver.hpp    2007-09-11 14:57:58 UTC (rev 
3120)
@@ -66,6 +66,7 @@
   Axis*     create_axis    (const FileReader& reader, Control* parent);
   Scroller* create_scroller(const FileReader& reader, Control* parent);
   Pointer*  create_pointer (const FileReader& reader, Control* parent);
+  Keyboard* create_keyboard(const FileReader& reader, Control* parent) { 
return 0; }
 };
 
 } // namespace Input





reply via email to

[Prev in Thread] Current Thread [Next in Thread]