2008-12-29 14:30:38 +00:00
# include "EventHandler.h"
2009-01-03 23:33:45 +00:00
# if defined HAVE_WX && HAVE_WX
2008-12-29 20:12:19 +00:00
# include <wx/wx.h>
2009-01-03 23:33:45 +00:00
# endif
2008-12-29 20:12:19 +00:00
2009-01-05 13:39:54 +00:00
EventHandler * EventHandler : : m_Instance = 0 ;
2009-01-04 22:58:20 +00:00
EventHandler : : EventHandler ( ) {
2009-01-05 17:46:36 +00:00
for ( int i = 0 ; i < NUMKEYS ; i + + )
2009-01-05 22:51:35 +00:00
for ( int j = 0 ; j < NUMMODS ; j + + )
keys [ i ] [ j ] = NULL ;
2009-01-05 17:46:36 +00:00
// memset(keys, sizeof(listenFuncPtr) * NUMKEYS*NUMMODS, 0);
2009-01-04 22:58:20 +00:00
memset ( mouse , sizeof ( listenFuncPtr ) * ( sf : : Mouse : : Count + 1 ) , 0 ) ;
memset ( joys , sizeof ( listenFuncPtr ) * ( sf : : Joy : : Count + 1 ) , 0 ) ;
2009-01-05 17:46:36 +00:00
2009-01-04 22:58:20 +00:00
}
2009-01-04 21:07:22 +00:00
2009-01-05 13:39:54 +00:00
EventHandler : : ~ EventHandler ( ) {
}
2009-01-05 17:46:36 +00:00
EventHandler * EventHandler : : GetInstance ( ) {
2009-01-05 23:34:53 +00:00
fprintf ( stderr , " handler instance %p \n " , m_Instance ) ;
2009-01-05 22:51:35 +00:00
2009-01-05 23:34:53 +00:00
if ( ! m_Instance )
m_Instance = new EventHandler ( ) ;
return m_Instance ;
2009-01-05 13:39:54 +00:00
}
void EventHandler : : Destroy ( ) {
2009-01-05 17:46:36 +00:00
if ( m_Instance )
delete m_Instance ;
2009-01-05 22:51:35 +00:00
fprintf ( stderr , " deleting instance %p \n " , m_Instance ) ;
2009-01-05 17:46:36 +00:00
m_Instance = 0 ;
2009-01-05 13:39:54 +00:00
}
2009-01-04 22:58:20 +00:00
bool EventHandler : : RegisterEventListener ( listenFuncPtr func , Keys key ) {
if ( key . inputType = = KeyboardInput ) {
2009-01-05 22:51:35 +00:00
fprintf ( stderr , " Registering %d:%d %p \n " , key . keyCode , key . mods , func ) ;
2009-01-05 17:46:36 +00:00
if ( key . keyCode = = sf : : Key : : Count | | key . mods > = NUMMODS | |
2009-01-05 22:51:35 +00:00
key . keyCode > = NUMKEYS )
2009-01-04 22:58:20 +00:00
return false ;
2009-01-05 22:51:35 +00:00
if ( keys [ key . keyCode ] [ key . mods ] & & keys [ key . keyCode ] [ key . mods ] ! = func )
return false
;
2009-01-04 22:58:20 +00:00
keys [ key . keyCode ] [ key . mods ] = func ;
} else if ( key . inputType = = MouseInput ) {
if ( mouse [ key . mouseButton ] )
return false ;
mouse [ key . mouseButton ] = func ;
}
2008-12-30 10:35:52 +00:00
return true ;
}
2009-01-04 22:58:20 +00:00
bool EventHandler : : RemoveEventListener ( Keys key ) {
if ( key . inputType = = KeyboardInput ) {
2009-01-05 17:46:36 +00:00
if ( ( key . keyCode = = sf : : Key : : Count | | key . keyCode > = NUMKEYS
| | key . mods > = NUMMODS ) & & ! keys [ key . keyCode ] [ key . mods ] )
2009-01-04 22:58:20 +00:00
return false ;
keys [ key . keyCode ] [ key . mods ] = NULL ;
} else if ( key . inputType = = MouseInput ) {
if ( ! mouse [ key . mouseButton ] )
return false ;
mouse [ key . mouseButton ] = NULL ;
2009-01-02 14:10:52 +00:00
}
2009-01-04 22:58:20 +00:00
2009-01-02 14:10:52 +00:00
return true ;
}
2009-01-04 22:58:20 +00:00
void EventHandler : : Update ( ) {
for ( unsigned int i = 0 ; i < eventQueue . size ( ) ; i + + ) {
sf : : Event ev = eventQueue . front ( ) ;
eventQueue . pop ( ) ;
2009-01-05 22:51:35 +00:00
fprintf ( stderr , " Updating event type %d code %d mod %d func %p \n " , ev . Type , ev . Key . Code , ev . Key . Alt + 2 * ev . Key . Shift + 4 * ev . Key . Control , keys [ ev . Key . Code ] [ ev . Key . Alt + 2 * ev . Key . Shift + 4 * ev . Key . Control ] ) ;
if ( keys [ ev . Key . Code ] [ ev . Key . Alt + 2 * ev . Key . Shift + 4 * ev . Key . Control ] )
keys [ ev . Key . Code ] [ ev . Key . Alt + 2 * ev . Key . Shift + 4 * ev . Key . Control ] ( ev ) ;
2008-12-30 10:35:52 +00:00
}
}
2009-01-04 22:58:20 +00:00
bool EventHandler : : addEvent ( sf : : Event * ev ) {
2008-12-30 10:35:52 +00:00
eventQueue . push ( * ev ) ;
2009-01-05 22:51:35 +00:00
fprintf ( stderr , " Got event type %d code %d \n " , ev - > Type , ev - > Key . Code ) ;
2008-12-30 10:35:52 +00:00
return true ;
}
2008-12-29 20:12:19 +00:00
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 ) ;
}
2009-01-03 23:33:45 +00:00
# if defined HAVE_WX && HAVE_WX
2008-12-29 20:12:19 +00:00
// Taken from wxw source code
2009-01-02 14:10:52 +00:00
sf : : Key : : Code EventHandler : : wxCharCodeToSF ( int id )
2008-12-29 20:12:19 +00:00
{
2009-01-02 14:10:52 +00:00
sf : : Key : : Code sfKey ;
2008-12-29 20:12:19 +00:00
switch ( id ) {
2009-01-01 10:52:20 +00:00
// 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;
2009-01-02 14:10:52 +00:00
default :
2009-01-05 17:46:36 +00:00
// To lower (will tolower work on windows?)
if ( id > = ' A ' & & id < = ' Z ' )
id = id - ' A ' + ' a ' ;
2009-01-02 14:10:52 +00:00
if ( ( id > = ' a ' & & id < = ' z ' ) | |
2009-01-05 17:46:36 +00:00
( id > = ' 0 ' & & id < = ' 9 ' ) )
sfKey = ( sf : : Key : : Code ) id ;
else
2009-01-02 14:10:52 +00:00
sfKey = sf : : Key : : Count ; // Invalid key
2009-01-05 17:46:36 +00:00
2008-12-29 20:12:19 +00:00
}
2009-01-05 17:46:36 +00:00
2008-12-29 20:12:19 +00:00
return sfKey ;
}
2009-01-03 23:33:45 +00:00
# endif
2008-12-29 20:12:19 +00:00
2009-01-04 22:58:20 +00:00
void EventHandler : : SFKeyToString ( sf : : Key : : Code keycode , char * keyStr ) {
2008-12-29 20:12:19 +00:00
switch ( keycode ) {
2008-12-29 20:36:17 +00:00
/* 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 ; */
2009-01-01 10:52:20 +00:00
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 ;
2009-01-04 22:58:20 +00:00
default :
if ( keycode > sf : : Key : : Escape )
sprintf ( keyStr , " Invalid Key " ) ;
else
sprintf ( keyStr , " %c " , keycode ) ;
break ;
2008-12-29 20:12:19 +00:00
}
}
2009-01-05 13:39:54 +00:00
class EventHandlerCleaner
{
public :
~ EventHandlerCleaner ( )
{
EventHandler : : Destroy ( ) ;
}
} EventHandlerCleanerInst ;