moving around some event handler code

creating inputcommon


git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1766 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
nakeee
2009-01-04 19:54:56 +00:00
parent b7f1e937bb
commit 90560511c9
11 changed files with 33 additions and 23 deletions

View File

@ -0,0 +1,309 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
// Copyright (C) 2007-2008 Laurent Gomila (laurent.gom@gmail.com)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it freely,
// subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented;
// you must not claim that you wrote the original software.
// If you use this software in a product, an acknowledgment
// in the product documentation would be appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such,
// and must not be misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source distribution.
//
////////////////////////////////////////////////////////////
#ifndef SFML_EVENT_HPP
#define SFML_EVENT_HPP
////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
//#include <SFML/Config.hpp>
namespace sf
{
////////////////////////////////////////////////////////////
/// Definition of key codes for keyboard events
////////////////////////////////////////////////////////////
namespace Key
{
enum Code
{
A = 'a',
B = 'b',
C = 'c',
D = 'd',
E = 'e',
F = 'f',
G = 'g',
H = 'h',
I = 'i',
J = 'j',
K = 'k',
L = 'l',
M = 'm',
N = 'n',
O = 'o',
P = 'p',
Q = 'q',
R = 'r',
S = 's',
T = 't',
U = 'u',
V = 'v',
W = 'w',
X = 'x',
Y = 'y',
Z = 'z',
Num0 = '0',
Num1 = '1',
Num2 = '2',
Num3 = '3',
Num4 = '4',
Num5 = '5',
Num6 = '6',
Num7 = '7',
Num8 = '8',
Num9 = '9',
Escape = 256,
LControl,
LShift,
LAlt,
LSystem, ///< OS specific key (left side) : windows (Win and Linux), apple (MacOS), ...
RControl,
RShift,
RAlt,
RSystem, ///< OS specific key (right side) : windows (Win and Linux), apple (MacOS), ...
Menu,
LBracket, ///< [
RBracket, ///< ]
SemiColon, ///< ;
Comma, ///< ,
Period, ///< .
Quote, ///< '
Slash, ///< /
BackSlash,
Tilde, ///< ~
Equal, ///< =
Dash, ///< -
Space,
Return,
Back,
Tab,
PageUp,
PageDown,
End,
Home,
Insert,
Delete,
Add, ///< +
Subtract, ///< -
Multiply, ///< *
Divide, ///< /
Left, ///< Left arrow
Right, ///< Right arrow
Up, ///< Up arrow
Down, ///< Down arrow
Numpad0,
Numpad1,
Numpad2,
Numpad3,
Numpad4,
Numpad5,
Numpad6,
Numpad7,
Numpad8,
Numpad9,
F1,
F2,
F3,
F4,
F5,
F6,
F7,
F8,
F9,
F10,
F11,
F12,
F13,
F14,
F15,
Pause,
Count // For internal use
};
}
////////////////////////////////////////////////////////////
/// Definition of button codes for mouse events
////////////////////////////////////////////////////////////
namespace Mouse
{
enum Button
{
Left,
Right,
Middle,
XButton1,
XButton2,
Count // For internal use
};
}
////////////////////////////////////////////////////////////
/// Definition of joystick axis for joystick events
////////////////////////////////////////////////////////////
namespace Joy
{
enum Axis
{
AxisX,
AxisY,
AxisZ,
AxisR,
AxisU,
AxisV,
AxisPOV,
Count // For internal use
};
}
////////////////////////////////////////////////////////////
/// Event defines a system event and its parameters
////////////////////////////////////////////////////////////
class Event
{
public :
////////////////////////////////////////////////////////////
/// Keyboard event parameters
////////////////////////////////////////////////////////////
struct KeyEvent
{
Key::Code Code;
bool Alt;
bool Control;
bool Shift;
};
////////////////////////////////////////////////////////////
/// Text event parameters
////////////////////////////////////////////////////////////
struct TextEvent
{
unsigned short Unicode;
};
////////////////////////////////////////////////////////////
/// Mouse move event parameters
////////////////////////////////////////////////////////////
struct MouseMoveEvent
{
unsigned int X;
unsigned int Y;
};
////////////////////////////////////////////////////////////
/// Mouse buttons events parameters
////////////////////////////////////////////////////////////
struct MouseButtonEvent
{
Mouse::Button Button;
};
////////////////////////////////////////////////////////////
/// Mouse wheel events parameters
////////////////////////////////////////////////////////////
struct MouseWheelEvent
{
int Delta;
};
////////////////////////////////////////////////////////////
/// Joystick axis move event parameters
////////////////////////////////////////////////////////////
struct JoyMoveEvent
{
unsigned int JoystickId;
Joy::Axis Axis;
float Position;
};
////////////////////////////////////////////////////////////
/// Joystick buttons events parameters
////////////////////////////////////////////////////////////
struct JoyButtonEvent
{
unsigned int JoystickId;
unsigned int Button;
};
////////////////////////////////////////////////////////////
/// Size events parameters
////////////////////////////////////////////////////////////
struct SizeEvent
{
unsigned int Width;
unsigned int Height;
};
////////////////////////////////////////////////////////////
/// Enumeration of the different types of events
////////////////////////////////////////////////////////////
enum EventType
{
Closed,
Resized,
LostFocus,
GainedFocus,
TextEntered,
KeyPressed,
KeyReleased,
MouseWheelMoved,
MouseButtonPressed,
MouseButtonReleased,
MouseMoved,
JoyButtonPressed,
JoyButtonReleased,
JoyMoved
};
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
EventType Type; ///< Type of the event
union
{
KeyEvent Key;
TextEvent Text;
MouseMoveEvent MouseMove;
MouseButtonEvent MouseButton;
MouseWheelEvent MouseWheel;
JoyMoveEvent JoyMove;
JoyButtonEvent JoyButton;
SizeEvent Size;
};
};
} // namespace sf
#endif // SFML_EVENT_HPP

View File

@ -0,0 +1,259 @@
#include "EventHandler.h"
#if defined HAVE_WX && HAVE_WX
#include <wx/wx.h>
#endif
bool EventHandler::RegisterEventListener(listenFuncPtr func, Keys key) {
if (key.inputType == KeyboardInput) {
if (keys[key.keyCode][key.mods])
return false;
keys[key.keyCode][key.mods] = func;
} else if (key.inputType == MouseInput) {
if (mouse[key.mouseButton])
return false;
mouse[key.mouseButton] = func;
}
return true;
}
bool EventHandler::RemoveEventListener(Keys key) {
if (key.inputType == KeyboardInput) {
if (! keys[key.keyCode][key.mods])
return false;
keys[key.keyCode][key.mods] = NULL;
} else if (key.inputType == MouseInput) {
if (! mouse[key.mouseButton])
return false;
mouse[key.mouseButton] = NULL;
}
return true;
}
void EventHandler::Update() {
for (unsigned int i = 0; i < eventQueue.size();i++) {
sf::Event ev = eventQueue.front();
eventQueue.pop();
keys[ev.Key.Code][ev.Key.Alt+2*ev.Key.Shift+4*ev.Key.Control](ev);
}
}
bool EventHandler::addEvent(sf::Event *ev) {
eventQueue.push(*ev);
return true;
}
bool EventHandler::TestEvent (Keys k, sf::Event e)
{
//Mouse event
if (k.inputType==MouseInput && k.eventType==e.Type && k.mouseButton==e.MouseButton.Button)
{
return (true);
}
//Keyboard event
if (k.inputType==KeyboardInput && k.eventType==e.Type && k.keyCode==e.Key.Code)
{
return (true);
}
return (false);
}
#if defined HAVE_WX && HAVE_WX
// Taken from wxw source code
sf::Key::Code EventHandler::wxCharCodeToSF(int id)
{
sf::Key::Code sfKey;
switch (id) {
// case WXK_CANCEL: sfKey = sf::Key::Cancel; break;
// case WXK_BACK: sfKey = sf::Key::BackSpace; break;
case WXK_TAB: sfKey = sf::Key::Tab; break;
// case WXK_CLEAR: sfKey = sf::Key::Clear; break;
case WXK_RETURN: sfKey = sf::Key::Return; break;
case WXK_SHIFT: sfKey = sf::Key::LShift; break;
case WXK_CONTROL: sfKey = sf::Key::LControl; break;
case WXK_ALT: sfKey = sf::Key::LAlt; break;
// case WXK_CAPITAL: sfKey = sf::Key::Caps_Lock; break;
case WXK_MENU : sfKey = sf::Key::Menu; break;
case WXK_PAUSE: sfKey = sf::Key::Pause; break;
case WXK_ESCAPE: sfKey = sf::Key::Escape; break;
case WXK_SPACE: sfKey = sf::Key::Space; break;
case WXK_PAGEUP: sfKey = sf::Key::PageUp; break;
case WXK_PAGEDOWN: sfKey = sf::Key::PageDown; break;
case WXK_END: sfKey = sf::Key::End; break;
case WXK_HOME : sfKey = sf::Key::Home; break;
case WXK_LEFT : sfKey = sf::Key::Left; break;
case WXK_UP: sfKey = sf::Key::Up; break;
case WXK_RIGHT: sfKey = sf::Key::Right; break;
case WXK_DOWN : sfKey = sf::Key::Down; break;
// case WXK_SELECT: sfKey = sf::Key::Select; break;
// case WXK_PRINT: sfKey = sf::Key::Print; break;
// case WXK_EXECUTE: sfKey = sf::Key::Execute; break;
case WXK_INSERT: sfKey = sf::Key::Insert; break;
case WXK_DELETE: sfKey = sf::Key::Delete; break;
// case WXK_HELP : sfKey = sf::Key::Help; break;
case WXK_NUMPAD0: sfKey = sf::Key::Numpad0; break;
case WXK_NUMPAD_INSERT: sfKey = sf::Key::Insert; break;
case WXK_NUMPAD1: sfKey = sf::Key::Numpad1; break;
case WXK_NUMPAD_END: sfKey = sf::Key::End; break;
case WXK_NUMPAD2: sfKey = sf::Key::Numpad2; break;
case WXK_NUMPAD_DOWN: sfKey = sf::Key::Down; break;
case WXK_NUMPAD3: sfKey = sf::Key::Numpad3; break;
case WXK_NUMPAD_PAGEDOWN: sfKey = sf::Key::PageDown; break;
case WXK_NUMPAD4: sfKey = sf::Key::Numpad4; break;
case WXK_NUMPAD_LEFT: sfKey = sf::Key::Left; break;
case WXK_NUMPAD5: sfKey = sf::Key::Numpad5; break;
case WXK_NUMPAD6: sfKey = sf::Key::Numpad6; break;
case WXK_NUMPAD_RIGHT: sfKey = sf::Key::Right; break;
case WXK_NUMPAD7: sfKey = sf::Key::Numpad7; break;
case WXK_NUMPAD_HOME: sfKey = sf::Key::Home; break;
case WXK_NUMPAD8: sfKey = sf::Key::Numpad8; break;
case WXK_NUMPAD_UP: sfKey = sf::Key::Up; break;
case WXK_NUMPAD9: sfKey = sf::Key::Numpad9; break;
case WXK_NUMPAD_PAGEUP: sfKey = sf::Key::PageUp; break;
// case WXK_NUMPAD_DECIMAL: sfKey = sf::Key::Decimal; break;
case WXK_NUMPAD_DELETE: sfKey = sf::Key::Delete; break;
case WXK_NUMPAD_MULTIPLY: sfKey = sf::Key::Multiply; break;
case WXK_NUMPAD_ADD: sfKey = sf::Key::Add; break;
case WXK_NUMPAD_SUBTRACT: sfKey = sf::Key::Subtract; break;
case WXK_NUMPAD_DIVIDE: sfKey = sf::Key::Divide; break;
case WXK_NUMPAD_ENTER: sfKey = sf::Key::Return; break;
// case WXK_NUMPAD_SEPARATOR:sfKey = sf::Key::Separator; break;
case WXK_F1: sfKey = sf::Key::F1; break;
case WXK_F2: sfKey = sf::Key::F2; break;
case WXK_F3: sfKey = sf::Key::F3; break;
case WXK_F4: sfKey = sf::Key::F4; break;
case WXK_F5: sfKey = sf::Key::F5; break;
case WXK_F6: sfKey = sf::Key::F6; break;
case WXK_F7: sfKey = sf::Key::F7; break;
case WXK_F8: sfKey = sf::Key::F8; break;
case WXK_F9: sfKey = sf::Key::F9; break;
case WXK_F10: sfKey = sf::Key::F10; break;
case WXK_F11: sfKey = sf::Key::F11; break;
case WXK_F12: sfKey = sf::Key::F12; break;
case WXK_F13: sfKey = sf::Key::F13; break;
case WXK_F14: sfKey = sf::Key::F14; break;
case WXK_F15: sfKey = sf::Key::F15; break;
// case WXK_NUMLOCK: sfKey = sf::Key::Num_Lock; break;
// case WXK_SCROLL: sfKey = sf::Key::Scroll_Lock; break;
default:
if ((id >= 'a' && id <= 'z') ||
(id >= '0' && id <= '9'))
sfKey = (sf::Key::Code)id;
else
sfKey = sf::Key::Count; // Invalid key
}
return sfKey;
}
#endif
void EventHandler::SFKeyToString(sf::Key::Code keycode, char *keyStr) {
switch (keycode) {
/* case sf::Key::A = 'a': sprintf(keyStr, "UP"); break;
case sf::Key::B = 'b': sprintf(keyStr, "UP"); break;
case sf::Key::C = 'c': sprintf(keyStr, "UP"); break;
case sf::Key::D = 'd': sprintf(keyStr, "UP"); break;
case sf::Key::E = 'e': sprintf(keyStr, "UP"); break;
case sf::Key::F = 'f': sprintf(keyStr, "UP"); break;
case sf::Key::G = 'g': sprintf(keyStr, "UP"); break;
case sf::Key::H = 'h': sprintf(keyStr, "UP"); break;
case sf::Key::I = 'i': sprintf(keyStr, "UP"); break;
case sf::Key::J = 'j': sprintf(keyStr, "UP"); break;
case sf::Key::K = 'k': sprintf(keyStr, "UP"); break;
case sf::Key::L = 'l': sprintf(keyStr, "UP"); break;
case sf::Key::M = 'm': sprintf(keyStr, "UP"); break;
case sf::Key::N = 'n': sprintf(keyStr, "UP"); break;
case sf::Key::O = 'o': sprintf(keyStr, "UP"); break;
case sf::Key::P = 'p': sprintf(keyStr, "UP"); break;
case sf::Key::Q = 'q': sprintf(keyStr, "UP"); break;
case sf::Key::R = 'r': sprintf(keyStr, "UP"); break;
case sf::Key::S = 's': sprintf(keyStr, "UP"); break;
case sf::Key::T = 't': sprintf(keyStr, "UP"); break;
case sf::Key::U = 'u': sprintf(keyStr, "UP"); break;
case sf::Key::V = 'v': sprintf(keyStr, "UP"); break;
case sf::Key::W = 'w': sprintf(keyStr, "UP"); break;
case sf::Key::X = 'x': sprintf(keyStr, "UP"); break;
case sf::Key::Y = 'y': sprintf(keyStr, "UP"); break;
case sf::Key::Z = 'z': sprintf(keyStr, "UP"); break;
case sf::Key::Num0 = '0': sprintf(keyStr, "UP"); break;
case sf::Key::Num1 = '1': sprintf(keyStr, "UP"); break;
case sf::Key::Num2 = '2': sprintf(keyStr, "UP"); break;
case sf::Key::Num3 = '3': sprintf(keyStr, "UP"); break;
case sf::Key::Num4 = '4': sprintf(keyStr, "UP"); break;
case sf::Key::Num5 = '5': sprintf(keyStr, "UP"); break;
case sf::Key::Num6 = '6': sprintf(keyStr, "UP"); break;
case sf::Key::Num7 = '7': sprintf(keyStr, "UP"); break;
case sf::Key::Num8 = '8': sprintf(keyStr, "UP"); break;
case sf::Key::Num9 = '9': sprintf(keyStr, "UP"); break;*/
case sf::Key::Escape: sprintf(keyStr, "Escape"); break;
case sf::Key::LControl: sprintf(keyStr, "LControl"); break;
case sf::Key::LShift: sprintf(keyStr, "LShift"); break;
case sf::Key::LAlt: sprintf(keyStr, "LAlt"); break;
case sf::Key::LSystem: sprintf(keyStr, "LSystem"); break;
case sf::Key::RControl: sprintf(keyStr, "RControl"); break;
case sf::Key::RShift: sprintf(keyStr, "RShift"); break;
case sf::Key::RAlt: sprintf(keyStr, "RAlt"); break;
case sf::Key::RSystem: sprintf(keyStr, "RSystem"); break;
case sf::Key::Menu: sprintf(keyStr, "Menu"); break;
case sf::Key::LBracket: sprintf(keyStr, "LBracket"); break;
case sf::Key::RBracket: sprintf(keyStr, "RBracket"); break;
case sf::Key::SemiColon: sprintf(keyStr, ";"); break;
case sf::Key::Comma: sprintf(keyStr, ","); break;
case sf::Key::Period: sprintf(keyStr, "."); break;
case sf::Key::Quote: sprintf(keyStr, "\'"); break;
case sf::Key::Slash: sprintf(keyStr, "/"); break;
case sf::Key::BackSlash: sprintf(keyStr, "\\"); break;
case sf::Key::Tilde: sprintf(keyStr, "~"); break;
case sf::Key::Equal: sprintf(keyStr, "="); break;
case sf::Key::Dash: sprintf(keyStr, "-"); break;
case sf::Key::Space: sprintf(keyStr, "Space"); break;
case sf::Key::Return: sprintf(keyStr, "Return"); break;
case sf::Key::Back: sprintf(keyStr, "Back"); break;
case sf::Key::Tab: sprintf(keyStr, "Tab"); break;
case sf::Key::PageUp: sprintf(keyStr, "Page Up"); break;
case sf::Key::PageDown: sprintf(keyStr, "Page Down"); break;
case sf::Key::End: sprintf(keyStr, "End"); break;
case sf::Key::Home: sprintf(keyStr, "Home"); break;
case sf::Key::Insert: sprintf(keyStr, "Insert"); break;
case sf::Key::Delete: sprintf(keyStr, "Delete"); break;
case sf::Key::Add: sprintf(keyStr, "+"); break;
case sf::Key::Subtract: sprintf(keyStr, "-"); break;
case sf::Key::Multiply: sprintf(keyStr, "*"); break;
case sf::Key::Divide: sprintf(keyStr, "/"); break;
case sf::Key::Left: sprintf(keyStr, "Left"); break;
case sf::Key::Right: sprintf(keyStr, "Right"); break;
case sf::Key::Up: sprintf(keyStr, "UP"); break;
case sf::Key::Down: sprintf(keyStr, "Down"); break;
case sf::Key::Numpad0: sprintf(keyStr, "NP 0"); break;
case sf::Key::Numpad1: sprintf(keyStr, "NP 1"); break;
case sf::Key::Numpad2: sprintf(keyStr, "NP 2"); break;
case sf::Key::Numpad3: sprintf(keyStr, "NP 3"); break;
case sf::Key::Numpad4: sprintf(keyStr, "NP 4"); break;
case sf::Key::Numpad5: sprintf(keyStr, "NP 5"); break;
case sf::Key::Numpad6: sprintf(keyStr, "NP 6"); break;
case sf::Key::Numpad7: sprintf(keyStr, "NP 7"); break;
case sf::Key::Numpad8: sprintf(keyStr, "NP 8"); break;
case sf::Key::Numpad9: sprintf(keyStr, "NP 9"); break;
case sf::Key::F1: sprintf(keyStr, "F1"); break;
case sf::Key::F2: sprintf(keyStr, "F2"); break;
case sf::Key::F3: sprintf(keyStr, "F3"); break;
case sf::Key::F4: sprintf(keyStr, "F4"); break;
case sf::Key::F5: sprintf(keyStr, "F5"); break;
case sf::Key::F6: sprintf(keyStr, "F6"); break;
case sf::Key::F7: sprintf(keyStr, "F7"); break;
case sf::Key::F8: sprintf(keyStr, "F8"); break;
case sf::Key::F9: sprintf(keyStr, "F9"); break;
case sf::Key::F10: sprintf(keyStr, "F10"); break;
case sf::Key::F11: sprintf(keyStr, "F11"); break;
case sf::Key::F12: sprintf(keyStr, "F12"); break;
case sf::Key::F13: sprintf(keyStr, "F13"); break;
case sf::Key::F14: sprintf(keyStr, "F14"); break;
case sf::Key::F15: sprintf(keyStr, "F15"); break;
case sf::Key::Pause: sprintf(keyStr, "Paues"); break;
default: sprintf(keyStr, "%c", keycode);
}
}

View File

@ -0,0 +1,49 @@
#ifndef EVENTHANDER_H
#define EVENTHANDER_H 1
#include "Common.h"
#include <queue>
#include "Event.hpp"
typedef bool (*listenFuncPtr) (sf::Event);
enum InputType
{
KeyboardInput,
MouseInput,
JoystickInput
};
enum Modifiers {
UseAlt = 1,
UseShift = 2,
UseCtrl = 4
};
struct Keys
{
InputType inputType;
sf::Event::EventType eventType;
sf::Key::Code keyCode;
int mods;
sf::Mouse::Button mouseButton;
};
class EventHandler {
private:
listenFuncPtr keys[sf::Key::Count][8];
listenFuncPtr mouse[sf::Mouse::Count];
listenFuncPtr joys[sf::Joy::Count];
std::queue<sf::Event> eventQueue;
public:
bool RegisterEventListener(listenFuncPtr func, Keys key);
bool RemoveEventListener(Keys key);
void Update();
bool addEvent(sf::Event *e);
static bool TestEvent (Keys k, sf::Event e);
#if defined HAVE_WX && HAVE_WX
static sf::Key::Code wxCharCodeToSF(int id);
#endif
static void SFKeyToString(sf::Key::Code keycode, char *keyStr);
};
#endif

View File

@ -0,0 +1,12 @@
# -*- python -*-
Import('env')
files = [
'EventHandler.cpp',
'InputCommon.cpp',
]
env_inputcommon = env.Clone()
env_inputcommon.Append(CXXFLAGS = [ '-fPIC' ])
env_inputcommon.StaticLibrary("inputcommon", files)