rlm@1: // VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. rlm@1: // Copyright (C) 1999-2003 Forgotten rlm@1: // Copyright (C) 2004 Forgotten and the VBA development team rlm@1: rlm@1: // This program is free software; you can redistribute it and/or modify rlm@1: // it under the terms of the GNU General Public License as published by rlm@1: // the Free Software Foundation; either version 2, or(at your option) rlm@1: // any later version. rlm@1: // rlm@1: // This program is distributed in the hope that it will be useful, rlm@1: // but WITHOUT ANY WARRANTY; without even the implied warranty of rlm@1: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the rlm@1: // GNU General Public License for more details. rlm@1: // rlm@1: // You should have received a copy of the GNU General Public License rlm@1: // along with this program; if not, write to the Free Software Foundation, rlm@1: // Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. rlm@1: rlm@1: #include "joypadconfig.h" rlm@1: rlm@1: #include rlm@1: rlm@1: #include "intl.h" rlm@1: rlm@1: namespace VBA rlm@1: { rlm@1: rlm@1: guint * JoypadConfig::puiAt(int _iIndex) rlm@1: { rlm@1: guint * puiMember; rlm@1: rlm@1: switch (_iIndex) rlm@1: { rlm@1: case 0: rlm@1: puiMember = &m_uiUp; rlm@1: break; rlm@1: case 1: rlm@1: puiMember = &m_uiDown; rlm@1: break; rlm@1: case 2: rlm@1: puiMember = &m_uiLeft; rlm@1: break; rlm@1: case 3: rlm@1: puiMember = &m_uiRight; rlm@1: break; rlm@1: case 4: rlm@1: puiMember = &m_uiA; rlm@1: break; rlm@1: case 5: rlm@1: puiMember = &m_uiB; rlm@1: break; rlm@1: case 6: rlm@1: puiMember = &m_uiL; rlm@1: break; rlm@1: case 7: rlm@1: puiMember = &m_uiR; rlm@1: break; rlm@1: case 8: rlm@1: puiMember = &m_uiSelect; rlm@1: break; rlm@1: case 9: rlm@1: puiMember = &m_uiStart; rlm@1: break; rlm@1: case 10: rlm@1: puiMember = &m_uiSpeed; rlm@1: break; rlm@1: case 11: rlm@1: puiMember = &m_uiCapture; rlm@1: break; rlm@1: default: rlm@1: puiMember = NULL; rlm@1: } rlm@1: rlm@1: return puiMember; rlm@1: } rlm@1: rlm@1: int JoypadConfig::iFind(guint _uiKeycode) rlm@1: { rlm@1: for (guint i = 0; i < 12; i++) rlm@1: { rlm@1: if (*puiAt(i) == _uiKeycode) rlm@1: { rlm@1: return i; rlm@1: } rlm@1: } rlm@1: rlm@1: return -1; rlm@1: } rlm@1: rlm@1: void JoypadConfig::vSetDefault() rlm@1: { rlm@1: guint auiKeyval[] = rlm@1: { rlm@1: GDK_Up, GDK_Down, GDK_Left, GDK_Right, rlm@1: GDK_z, GDK_x, GDK_a, GDK_s, rlm@1: GDK_BackSpace, GDK_Return, rlm@1: GDK_space, GDK_F12 rlm@1: }; rlm@1: rlm@1: for (guint i = 0; i < G_N_ELEMENTS(auiKeyval); i++) rlm@1: { rlm@1: GdkKeymapKey * pstKeys; rlm@1: int iKeys; rlm@1: rlm@1: if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), rlm@1: auiKeyval[i], rlm@1: &pstKeys, rlm@1: &iKeys)) rlm@1: { rlm@1: *puiAt(i) = pstKeys[0].keycode; rlm@1: g_free(pstKeys); rlm@1: } rlm@1: else rlm@1: { rlm@1: *puiAt(i) = 0; rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: Keymap * JoypadConfig::poCreateKeymap() const rlm@1: { rlm@1: Keymap * poKeymap = new Keymap(); rlm@1: rlm@1: poKeymap->vRegister(m_uiUp, KeyUp ); rlm@1: poKeymap->vRegister(m_uiDown, KeyDown ); rlm@1: poKeymap->vRegister(m_uiLeft, KeyLeft ); rlm@1: poKeymap->vRegister(m_uiRight, KeyRight ); rlm@1: poKeymap->vRegister(m_uiA, KeyA ); rlm@1: poKeymap->vRegister(m_uiB, KeyB ); rlm@1: poKeymap->vRegister(m_uiL, KeyL ); rlm@1: poKeymap->vRegister(m_uiR, KeyR ); rlm@1: poKeymap->vRegister(m_uiSelect, KeySelect ); rlm@1: poKeymap->vRegister(m_uiStart, KeyStart ); rlm@1: poKeymap->vRegister(m_uiSpeed, KeySpeed ); rlm@1: poKeymap->vRegister(m_uiCapture, KeyCapture ); rlm@1: rlm@1: return poKeymap; rlm@1: } rlm@1: rlm@1: JoypadConfigDialog::JoypadConfigDialog(GtkDialog * _pstDialog, rlm@1: const Glib::RefPtr & _poXml) : rlm@1: Gtk::Dialog(_pstDialog) rlm@1: { rlm@1: m_puiCurrentKeyCode = NULL; rlm@1: rlm@1: memset(&m_oConfig, 0, sizeof(m_oConfig)); rlm@1: rlm@1: m_poOkButton = dynamic_cast(_poXml->get_widget("JoypadOkButton")); rlm@1: rlm@1: m_oEntries.push_back(dynamic_cast(_poXml->get_widget("JoypadUpEntry"))); rlm@1: m_oEntries.push_back(dynamic_cast(_poXml->get_widget("JoypadDownEntry"))); rlm@1: m_oEntries.push_back(dynamic_cast(_poXml->get_widget("JoypadLeftEntry"))); rlm@1: m_oEntries.push_back(dynamic_cast(_poXml->get_widget("JoypadRightEntry"))); rlm@1: m_oEntries.push_back(dynamic_cast(_poXml->get_widget("JoypadAEntry"))); rlm@1: m_oEntries.push_back(dynamic_cast(_poXml->get_widget("JoypadBEntry"))); rlm@1: m_oEntries.push_back(dynamic_cast(_poXml->get_widget("JoypadLEntry"))); rlm@1: m_oEntries.push_back(dynamic_cast(_poXml->get_widget("JoypadREntry"))); rlm@1: m_oEntries.push_back(dynamic_cast(_poXml->get_widget("JoypadSelectEntry"))); rlm@1: m_oEntries.push_back(dynamic_cast(_poXml->get_widget("JoypadStartEntry"))); rlm@1: m_oEntries.push_back(dynamic_cast(_poXml->get_widget("JoypadSpeedEntry"))); rlm@1: m_oEntries.push_back(dynamic_cast(_poXml->get_widget("JoypadCaptureEntry"))); rlm@1: rlm@1: for (guint i = 0; i < m_oEntries.size(); i++) rlm@1: { rlm@1: Gtk::Entry * poEntry = m_oEntries[i]; rlm@1: rlm@1: poEntry->signal_focus_in_event().connect(SigC::bind( rlm@1: SigC::slot(*this, &JoypadConfigDialog::bOnEntryFocusIn), rlm@1: i)); rlm@1: poEntry->signal_focus_out_event().connect(SigC::slot(*this, &JoypadConfigDialog::bOnEntryFocusOut)); rlm@1: } rlm@1: rlm@1: vUpdateEntries(); rlm@1: } rlm@1: rlm@1: JoypadConfigDialog::~JoypadConfigDialog() rlm@1: { rlm@1: } rlm@1: rlm@1: void JoypadConfigDialog::vSetConfig(const JoypadConfig & _roConfig) rlm@1: { rlm@1: m_oConfig = _roConfig; rlm@1: vUpdateEntries(); rlm@1: } rlm@1: rlm@1: void JoypadConfigDialog::vUpdateEntries() rlm@1: { rlm@1: for (guint i = 0; i < m_oEntries.size(); i++) rlm@1: { rlm@1: guint uiKeyval = 0; rlm@1: gdk_keymap_translate_keyboard_state(gdk_keymap_get_default(), rlm@1: *m_oConfig.puiAt(i), rlm@1: (GdkModifierType)0, rlm@1: 0, rlm@1: &uiKeyval, rlm@1: NULL, rlm@1: NULL, rlm@1: NULL); rlm@1: const char * csName = gdk_keyval_name(uiKeyval); rlm@1: if (csName == NULL) rlm@1: { rlm@1: m_oEntries[i]->set_text(_("")); rlm@1: } rlm@1: else rlm@1: { rlm@1: m_oEntries[i]->set_text(csName); rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: bool JoypadConfigDialog::bOnEntryFocusIn(GdkEventFocus * _pstEvent, rlm@1: guint _uiEntry) rlm@1: { rlm@1: m_uiCurrentEntry = _uiEntry; rlm@1: m_puiCurrentKeyCode = m_oConfig.puiAt(_uiEntry); rlm@1: rlm@1: return false; rlm@1: } rlm@1: rlm@1: bool JoypadConfigDialog::bOnEntryFocusOut(GdkEventFocus * _pstEvent) rlm@1: { rlm@1: m_puiCurrentKeyCode = NULL; rlm@1: rlm@1: return false; rlm@1: } rlm@1: rlm@1: bool JoypadConfigDialog::on_key_press_event(GdkEventKey * _pstEvent) rlm@1: { rlm@1: if (m_puiCurrentKeyCode == NULL) rlm@1: { rlm@1: return Gtk::Dialog::on_key_press_event(_pstEvent); rlm@1: } rlm@1: rlm@1: *m_puiCurrentKeyCode = 0; rlm@1: int iFound = m_oConfig.iFind(_pstEvent->hardware_keycode); rlm@1: if (iFound >= 0) rlm@1: { rlm@1: *m_oConfig.puiAt(iFound) = 0; rlm@1: m_oEntries[iFound]->set_text(_("")); rlm@1: } rlm@1: rlm@1: *m_puiCurrentKeyCode = _pstEvent->hardware_keycode; rlm@1: rlm@1: guint uiKeyval = 0; rlm@1: gdk_keymap_translate_keyboard_state(gdk_keymap_get_default(), rlm@1: _pstEvent->hardware_keycode, rlm@1: (GdkModifierType)0, rlm@1: 0, rlm@1: &uiKeyval, rlm@1: NULL, rlm@1: NULL, rlm@1: NULL); rlm@1: rlm@1: const char * csName = gdk_keyval_name(uiKeyval); rlm@1: if (csName == NULL) rlm@1: { rlm@1: m_oEntries[m_uiCurrentEntry]->set_text(_("")); rlm@1: } rlm@1: else rlm@1: { rlm@1: m_oEntries[m_uiCurrentEntry]->set_text(csName); rlm@1: } rlm@1: rlm@1: if (m_uiCurrentEntry + 1 < m_oEntries.size()) rlm@1: { rlm@1: m_oEntries[m_uiCurrentEntry + 1]->grab_focus(); rlm@1: } rlm@1: else rlm@1: { rlm@1: m_poOkButton->grab_focus(); rlm@1: } rlm@1: rlm@1: return true; rlm@1: } rlm@1: rlm@1: } // namespace VBA