[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Pingus-CVS] r3120 - trunk/pingus/src/input,
grumbel at BerliOS <=