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