diff --git a/src/gtk/system.cpp b/src/gtk/system.cpp index 8578b5cd..462d4e9e 100644 --- a/src/gtk/system.cpp +++ b/src/gtk/system.cpp @@ -82,8 +82,7 @@ bool systemReadJoypads() u32 systemReadJoypad(int joy) { - //return inputReadJoypad(joy); - return GUI()->uiReadJoypad(); + return inputReadJoypad(joy); } void systemShowSpeed(int _iSpeed) diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 8efdf12b..52c1930a 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -31,7 +31,6 @@ #include "../dmg/gbPrinter.h" #include "../Sound.h" #include "../Util.h" -#include "../sdl/inputSDL.h" #include "tools.h" #include "intl.h" @@ -61,6 +60,24 @@ using Gnome::Glade::Xml; Window * Window::m_poInstance = NULL; +const Window::SJoypadKey Window::m_astJoypad[SDLBUTTONS_NUM] = +{ + { "left", KEY_LEFT }, + { "right", KEY_RIGHT }, + { "up", KEY_UP }, + { "down", KEY_DOWN }, + { "A", KEY_BUTTON_A }, + { "B", KEY_BUTTON_B }, + { "select", KEY_BUTTON_SELECT }, + { "start", KEY_BUTTON_START }, + { "L", KEY_BUTTON_L }, + { "R", KEY_BUTTON_R }, + { "speed", KEY_BUTTON_SPEED }, + { "capture", KEY_BUTTON_CAPTURE }, + { "speed", KEY_BUTTON_SPEED }, + { "capture", KEY_BUTTON_CAPTURE } +}; + Window::Window(GtkWindow * _pstWindow, const Glib::RefPtr & _poXml) : Gtk::Window (_pstWindow), m_iGBScreenWidth (160), @@ -89,8 +106,8 @@ Window::Window(GtkWindow * _pstWindow, const Glib::RefPtr & _poXml) : m_iFilter2xMax (LastFilter), m_iFilterIBMin (FirstFilterIB), m_iFilterIBMax (LastFilterIB), - m_iJoypadMin (1), - m_iJoypadMax (4), + m_iJoypadMin (PAD_1), + m_iJoypadMax (PAD_4), m_iVideoOutputMin (OutputCairo), m_iVideoOutputMax (OutputXvideo), m_bFullscreen (false) @@ -100,8 +117,6 @@ Window::Window(GtkWindow * _pstWindow, const Glib::RefPtr & _poXml) : m_iScreenWidth = m_iGBAScreenWidth; m_iScreenHeight = m_iGBAScreenHeight; m_eCartridge = CartridgeNone; - m_uiJoypadState = 0; - m_uiAutofireState = 0; vInitSDL(); vInitSystem(); @@ -697,7 +712,7 @@ Window::Window(GtkWindow * _pstWindow, const Glib::RefPtr & _poXml) : poMI->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &Window::vOnJoypadConfigure), 4)); - int iDefaultJoypad = m_poInputConfig->oGetKey("active_joypad"); + /*int iDefaultJoypad = m_poInputConfig->oGetKey("active_joypad"); for (int i = m_iJoypadMin; i <= m_iJoypadMax; i++) { char csName[20]; @@ -712,11 +727,11 @@ Window::Window(GtkWindow * _pstWindow, const Glib::RefPtr & _poXml) : poCMI->signal_toggled().connect(sigc::bind( sigc::mem_fun(*this, &Window::vOnJoypadToggled), poCMI, i)); - } + }*/ // Autofire menu // - struct + /*struct { const char * m_csName; const char * m_csKey; @@ -737,7 +752,7 @@ Window::Window(GtkWindow * _pstWindow, const Glib::RefPtr & _poXml) : poCMI->signal_toggled().connect(sigc::bind( sigc::mem_fun(*this, &Window::vOnAutofireToggled), poCMI, astAutofire[i].m_eKeyFlag)); - } + }*/ // Fullscreen menu // @@ -991,27 +1006,19 @@ void Window::vInitConfig() // Input section // - JoypadConfig oJoypadConfig; - oJoypadConfig.vSetDefault(); m_poInputConfig = m_oConfig.poAddSection("Input"); m_poInputConfig->vSetKey("active_joypad", m_iJoypadMin ); for (int i = m_iJoypadMin; i <= m_iJoypadMax; i++) { char csPrefix[20]; - snprintf(csPrefix, sizeof(csPrefix), "joypad%d_", i); + snprintf(csPrefix, sizeof(csPrefix), "joypadSDL%d_", i); std::string sPrefix(csPrefix); - m_poInputConfig->vSetKey(sPrefix + "up", oJoypadConfig.m_uiUp ); - m_poInputConfig->vSetKey(sPrefix + "down", oJoypadConfig.m_uiDown ); - m_poInputConfig->vSetKey(sPrefix + "left", oJoypadConfig.m_uiLeft ); - m_poInputConfig->vSetKey(sPrefix + "right", oJoypadConfig.m_uiRight ); - m_poInputConfig->vSetKey(sPrefix + "A", oJoypadConfig.m_uiA ); - m_poInputConfig->vSetKey(sPrefix + "B", oJoypadConfig.m_uiB ); - m_poInputConfig->vSetKey(sPrefix + "L", oJoypadConfig.m_uiL ); - m_poInputConfig->vSetKey(sPrefix + "R", oJoypadConfig.m_uiR ); - m_poInputConfig->vSetKey(sPrefix + "select", oJoypadConfig.m_uiSelect ); - m_poInputConfig->vSetKey(sPrefix + "start", oJoypadConfig.m_uiStart ); - m_poInputConfig->vSetKey(sPrefix + "speed", oJoypadConfig.m_uiSpeed ); - m_poInputConfig->vSetKey(sPrefix + "capture", oJoypadConfig.m_uiCapture ); + + for (int j = 0; j < SDLBUTTONS_NUM; j++) + { + m_poInputConfig->vSetKey(sPrefix + m_astJoypad[j].m_csKey, + inputGetKeymap(PAD_DEFAULT, m_astJoypad[j].m_eKeyFlag)); + } } m_poInputConfig->vSetKey("autofire_A", false ); m_poInputConfig->vSetKey("autofire_B", false ); @@ -1206,29 +1213,17 @@ void Window::vHistoryAdd(const std::string & _rsFile) void Window::vLoadJoypadsFromConfig() { - m_oJoypads.clear(); - for (int i = m_iJoypadMin; i <= m_iJoypadMax; i++) { char csPrefix[20]; - snprintf(csPrefix, sizeof(csPrefix), "joypad%d_", i); + snprintf(csPrefix, sizeof(csPrefix), "joypadSDL%d_", i); std::string sPrefix(csPrefix); - JoypadConfig oJoypadConfig; - oJoypadConfig.m_uiUp = m_poInputConfig->oGetKey(sPrefix + "up"); - oJoypadConfig.m_uiDown = m_poInputConfig->oGetKey(sPrefix + "down"); - oJoypadConfig.m_uiLeft = m_poInputConfig->oGetKey(sPrefix + "left"); - oJoypadConfig.m_uiRight = m_poInputConfig->oGetKey(sPrefix + "right"); - oJoypadConfig.m_uiA = m_poInputConfig->oGetKey(sPrefix + "A"); - oJoypadConfig.m_uiB = m_poInputConfig->oGetKey(sPrefix + "B"); - oJoypadConfig.m_uiL = m_poInputConfig->oGetKey(sPrefix + "L"); - oJoypadConfig.m_uiR = m_poInputConfig->oGetKey(sPrefix + "R"); - oJoypadConfig.m_uiSelect = m_poInputConfig->oGetKey(sPrefix + "select"); - oJoypadConfig.m_uiStart = m_poInputConfig->oGetKey(sPrefix + "start"); - oJoypadConfig.m_uiSpeed = m_poInputConfig->oGetKey(sPrefix + "speed"); - oJoypadConfig.m_uiCapture = m_poInputConfig->oGetKey(sPrefix + "capture"); - - m_oJoypads.push_back(oJoypadConfig); + for (int j = 0; j < SDLBUTTONS_NUM; j++) + { + inputSetKeymap((EPad)i, m_astJoypad[j].m_eKeyFlag, + m_poInputConfig->oGetKey(sPrefix + m_astJoypad[j].m_csKey)); + } } } @@ -1236,22 +1231,15 @@ void Window::vSaveJoypadsToConfig() { for (int i = m_iJoypadMin; i <= m_iJoypadMax; i++) { - char csPrefix[20]; - snprintf(csPrefix, sizeof(csPrefix), "joypad%d_", i); - std::string sPrefix(csPrefix); + char csPrefix[20]; + snprintf(csPrefix, sizeof(csPrefix), "joypadSDL%d_", i); + std::string sPrefix(csPrefix); - m_poInputConfig->vSetKey(sPrefix + "up", m_oJoypads[i - 1].m_uiUp ); - m_poInputConfig->vSetKey(sPrefix + "down", m_oJoypads[i - 1].m_uiDown ); - m_poInputConfig->vSetKey(sPrefix + "left", m_oJoypads[i - 1].m_uiLeft ); - m_poInputConfig->vSetKey(sPrefix + "right", m_oJoypads[i - 1].m_uiRight ); - m_poInputConfig->vSetKey(sPrefix + "A", m_oJoypads[i - 1].m_uiA ); - m_poInputConfig->vSetKey(sPrefix + "B", m_oJoypads[i - 1].m_uiB ); - m_poInputConfig->vSetKey(sPrefix + "L", m_oJoypads[i - 1].m_uiL ); - m_poInputConfig->vSetKey(sPrefix + "R", m_oJoypads[i - 1].m_uiR ); - m_poInputConfig->vSetKey(sPrefix + "select", m_oJoypads[i - 1].m_uiSelect ); - m_poInputConfig->vSetKey(sPrefix + "start", m_oJoypads[i - 1].m_uiStart ); - m_poInputConfig->vSetKey(sPrefix + "speed", m_oJoypads[i - 1].m_uiSpeed ); - m_poInputConfig->vSetKey(sPrefix + "capture", m_oJoypads[i - 1].m_uiCapture ); + for (int j = 0; j < SDLBUTTONS_NUM; j++) + { + m_poInputConfig->vSetKey(sPrefix + m_astJoypad[j].m_csKey, + inputGetKeymap((EPad)i, m_astJoypad[j].m_eKeyFlag)); + } } } @@ -1551,23 +1539,6 @@ void Window::vCaptureScreen(int _iNum) g_free(csFile); } -u32 Window::uiReadJoypad() -{ - u32 uiJoypad = m_uiJoypadState; - - if (m_uiAutofireState != 0) - { - uiJoypad &= ~m_uiAutofireState; - if (m_bAutofireToggle) - { - uiJoypad |= m_uiAutofireState; - } - m_bAutofireToggle = ! m_bAutofireToggle; - } - - return uiJoypad; -} - void Window::vCreateFileOpenDialog() { if (m_poFileOpenDialog != NULL) diff --git a/src/gtk/window.h b/src/gtk/window.h index ca2cfddb..61b422be 100644 --- a/src/gtk/window.h +++ b/src/gtk/window.h @@ -31,12 +31,12 @@ #include #include "../System.h" +#include "../sdl/inputSDL.h" #include "configfile.h" #include "screenarea.h" #include "filters.h" -#include "input.h" -#include "joypadconfig.h" +//#include "joypadconfig.h" namespace VBA { @@ -72,7 +72,6 @@ public: void vComputeFrameskip(int _iRate); void vShowSpeed(int _iSpeed); void vCaptureScreen(int _iNum); - u32 uiReadJoypad(); inline ECartridge eGetCartridge() const { return m_eCartridge; } @@ -206,8 +205,8 @@ private: const int m_iFilter2xMax; const int m_iFilterIBMin; const int m_iFilterIBMax; - const int m_iJoypadMin; - const int m_iJoypadMax; + const EPad m_iJoypadMin; + const EPad m_iJoypadMax; const int m_iVideoOutputMin; const int m_iVideoOutputMax; @@ -239,6 +238,14 @@ private: time_t m_uiTime; }; + struct SJoypadKey + { + const char * m_csKey; + const EKey m_eKeyFlag; + }; + + static const SJoypadKey m_astJoypad[SDLBUTTONS_NUM]; + Gtk::MenuItem * m_apoLoadGameItem[10]; Gtk::MenuItem * m_apoSaveGameItem[10]; SGameSlot m_astGameSlot[10]; @@ -251,9 +258,6 @@ private: sigc::connection m_oEmuSig; - std::vector m_oJoypads; - Keymap m_oKeymap; - int m_bFullscreen; int m_iScreenWidth; int m_iScreenHeight; @@ -261,9 +265,6 @@ private: std::string m_sRomFile; ECartridge m_eCartridge; EmulatedSystem m_stEmulator; - u32 m_uiJoypadState; - u32 m_uiAutofireState; - bool m_bAutofireToggle; bool m_bPaused; bool m_bWasEmulating; bool m_bAutoFrameskip; diff --git a/src/gtk/windowcallbacks.cpp b/src/gtk/windowcallbacks.cpp index 664fe6fb..e1378fb3 100644 --- a/src/gtk/windowcallbacks.cpp +++ b/src/gtk/windowcallbacks.cpp @@ -861,7 +861,7 @@ void Window::vOnFilterIBToggled(Gtk::CheckMenuItem * _poCMI, int _iFilterIB) void Window::vOnJoypadConfigure(int _iJoypad) { - Glib::RefPtr poXml; +/* Glib::RefPtr poXml; poXml = Xml::create(PKGDATADIR "/vba.glade", "JoypadConfigDialog"); JoypadConfigDialog * poDialog = NULL; @@ -878,24 +878,24 @@ void Window::vOnJoypadConfigure(int _iJoypad) } } - delete poDialog; + delete poDialog;*/ } void Window::vOnJoypadToggled(Gtk::CheckMenuItem * _poCMI, int _iJoypad) { - if (! _poCMI->get_active()) +/* if (! _poCMI->get_active()) { return; } m_oKeymap = m_oJoypads[_iJoypad - 1].oCreateKeymap(); - m_poInputConfig->vSetKey("active_joypad", _iJoypad); + m_poInputConfig->vSetKey("active_joypad", _iJoypad);*/ } void Window::vOnAutofireToggled(Gtk::CheckMenuItem * _poCMI, u32 _uiKeyFlag) { - if (_poCMI->get_active()) +/* if (_poCMI->get_active()) { m_uiAutofireState |= _uiKeyFlag; } @@ -921,7 +921,7 @@ void Window::vOnAutofireToggled(Gtk::CheckMenuItem * _poCMI, u32 _uiKeyFlag) { sKey = "autofire_R"; } - m_poInputConfig->vSetKey(sKey, _poCMI->get_active()); + m_poInputConfig->vSetKey(sKey, _poCMI->get_active());*/ } #ifndef NO_DEBUGGER @@ -1168,8 +1168,6 @@ bool Window::on_focus_out_event(GdkEventFocus * _pstEvent) bool Window::on_key_press_event(GdkEventKey * _pstEvent) { - EKey eKey; - // The menu accelerators are disabled when it is hidden if (_pstEvent->keyval == GDK_F11 && !m_poMenuBar->is_visible()) { @@ -1183,58 +1181,7 @@ bool Window::on_key_press_event(GdkEventKey * _pstEvent) event.key.keysym.sym = (SDLKey)_pstEvent->keyval; inputProcessSDLEvent(event); - if ((_pstEvent->state & Gtk::AccelGroup::get_default_mod_mask()) - || (eKey = m_oKeymap[_pstEvent->hardware_keycode]) == KeyNone) - { - return Gtk::Window::on_key_press_event(_pstEvent); - } - - switch (eKey) - { - case KeyA: - m_uiJoypadState |= KeyFlagA; - break; - case KeyB: - m_uiJoypadState |= KeyFlagB; - break; - case KeySelect: - m_uiJoypadState |= KeyFlagSelect; - break; - case KeyStart: - m_uiJoypadState |= KeyFlagStart; - break; - case KeyRight: - m_uiJoypadState |= KeyFlagRight; - m_uiJoypadState &= ~KeyFlagLeft; - break; - case KeyLeft: - m_uiJoypadState |= KeyFlagLeft; - m_uiJoypadState &= ~KeyFlagRight; - break; - case KeyUp: - m_uiJoypadState |= KeyFlagUp; - m_uiJoypadState &= ~KeyFlagDown; - break; - case KeyDown: - m_uiJoypadState |= KeyFlagDown; - m_uiJoypadState &= ~KeyFlagUp; - break; - case KeyR: - m_uiJoypadState |= KeyFlagR; - break; - case KeyL: - m_uiJoypadState |= KeyFlagL; - break; - case KeySpeed: - m_uiJoypadState |= KeyFlagSpeed; - break; - case KeyCapture: - m_uiJoypadState |= KeyFlagCapture; - break; - case KeyNone: - break; - } - return true; + return Gtk::Window::on_key_press_event(_pstEvent); } bool Window::on_key_release_event(GdkEventKey * _pstEvent) @@ -1245,56 +1192,8 @@ bool Window::on_key_release_event(GdkEventKey * _pstEvent) event.key.keysym.sym = (SDLKey)_pstEvent->keyval; inputProcessSDLEvent(event); - EKey eKey; - if ((_pstEvent->state & Gtk::AccelGroup::get_default_mod_mask()) - || (eKey = m_oKeymap[_pstEvent->hardware_keycode]) == KeyNone) - { - return Gtk::Window::on_key_release_event(_pstEvent); - } - - switch (eKey) - { - case KeyA: - m_uiJoypadState &= ~KeyFlagA; - break; - case KeyB: - m_uiJoypadState &= ~KeyFlagB; - break; - case KeySelect: - m_uiJoypadState &= ~KeyFlagSelect; - break; - case KeyStart: - m_uiJoypadState &= ~KeyFlagStart; - break; - case KeyRight: - m_uiJoypadState &= ~KeyFlagRight; - break; - case KeyLeft: - m_uiJoypadState &= ~KeyFlagLeft; - break; - case KeyUp: - m_uiJoypadState &= ~KeyFlagUp; - break; - case KeyDown: - m_uiJoypadState &= ~KeyFlagDown; - break; - case KeyR: - m_uiJoypadState &= ~KeyFlagR; - break; - case KeyL: - m_uiJoypadState &= ~KeyFlagL; - break; - case KeySpeed: - m_uiJoypadState &= ~KeyFlagSpeed; - break; - case KeyCapture: - m_uiJoypadState &= ~KeyFlagCapture; - break; - case KeyNone: - break; - } - return true; + return Gtk::Window::on_key_release_event(_pstEvent); } bool Window::on_window_state_event(GdkEventWindowState* _pstEvent) diff --git a/src/sdl/inputSDL.cpp b/src/sdl/inputSDL.cpp index 06576d4c..e7e93811 100644 --- a/src/sdl/inputSDL.cpp +++ b/src/sdl/inputSDL.cpp @@ -17,8 +17,6 @@ #include "inputSDL.h" -#define SDLBUTTONS_NUM 14 - static void sdlUpdateKey(uint32_t key, bool down); static void sdlUpdateJoyButton(int which, int button, bool pressed); static void sdlUpdateJoyHat(int which, int hat, int value); @@ -138,6 +136,11 @@ uint32_t inputGetEventCode(const SDL_Event &event) } } +uint32_t inputGetKeymap(EPad pad, EKey key) +{ + return joypad[pad][key]; +} + void inputSetKeymap(EPad pad, EKey key, uint32_t code) { joypad[pad][key] = code; diff --git a/src/sdl/inputSDL.h b/src/sdl/inputSDL.h index 25ac196e..754725f3 100644 --- a/src/sdl/inputSDL.h +++ b/src/sdl/inputSDL.h @@ -20,6 +20,8 @@ #include +#define SDLBUTTONS_NUM 14 + enum EKey { KEY_LEFT, KEY_RIGHT, @@ -54,12 +56,20 @@ void inputInitJoysticks(); /** * Define which key controls an emulated joypad button - * @param joy Emulated joypad index (there may be up to 4 joypads for the SGB) + * @param pad Emulated joypad index (there may be up to 4 joypads for the SGB) * @param key Emulated joypad button * @param code Code defining an actual joypad / keyboard button */ void inputSetKeymap(EPad pad, EKey key, uint32_t code); +/** + * Get which key is associated to which emulated joypad button + * @param pad Emulated joypad index (there may be up to 4 joypads for the SGB) + * @param key Emulated joypad button + * @retunr Code defining an actual joypad / keyboard button + */ +uint32_t inputGetKeymap(EPad pad, EKey key); + /** * Define which keys control motion detection emulation * @param key Emulated joypad button