- Rewrote the joypad config dialog in plain gtkmm instead of libglade
- A bit of cleanup

git-svn-id: https://svn.code.sf.net/p/vbam/code/trunk@705 a31d4220-a93d-0410-bf67-fe4944624d44
This commit is contained in:
bgk 2008-09-07 08:18:54 +00:00
parent 0f7da3dfdd
commit 0cf6786458
7 changed files with 56 additions and 58 deletions

View File

@ -25,45 +25,34 @@
namespace VBA
{
const EKey JoypadConfigDialog::m_aeKeys[] =
{
KEY_UP,
KEY_DOWN,
KEY_LEFT,
KEY_RIGHT,
KEY_BUTTON_A,
KEY_BUTTON_B,
KEY_BUTTON_L,
KEY_BUTTON_R,
KEY_BUTTON_SELECT,
KEY_BUTTON_START,
KEY_BUTTON_SPEED,
KEY_BUTTON_CAPTURE
};
const JoypadConfigDialog::SJoypadKey JoypadConfigDialog::m_astKeys[] =
{
{ KEY_UP, "Up :" },
{ KEY_DOWN, "Down :" },
{ KEY_LEFT, "Left :" },
{ KEY_RIGHT, "Right :" },
{ KEY_BUTTON_A, "Button A :" },
{ KEY_BUTTON_B, "Button B :" },
{ KEY_BUTTON_L, "Button L :" },
{ KEY_BUTTON_R, "Button R :" },
{ KEY_BUTTON_SELECT, "Select :" },
{ KEY_BUTTON_START, "Start :" },
{ KEY_BUTTON_SPEED, "Speed :" },
{ KEY_BUTTON_CAPTURE, "Capture :" }
};
JoypadConfigDialog::JoypadConfigDialog(GtkDialog * _pstDialog,
const Glib::RefPtr<Gnome::Glade::Xml> & _poXml) :
Gtk::Dialog(_pstDialog),
JoypadConfigDialog::JoypadConfigDialog() :
Gtk::Dialog("Joypad config", true, true),
m_oTable(G_N_ELEMENTS(m_astKeys), 2, false),
m_ePad(PAD_MAIN)
{
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++)
for (guint i = 0; i < G_N_ELEMENTS(m_astKeys); i++)
{
Gtk::Entry * poEntry = m_oEntries[i];
Gtk::Label * poLabel = Gtk::manage( new Gtk::Label(m_astKeys[i].m_csKeyName, Gtk::ALIGN_RIGHT) );
Gtk::Entry * poEntry = Gtk::manage( new Gtk::Entry() );
m_oTable.attach(* poLabel, 0, 1, i, i + 1);
m_oTable.attach(* poEntry, 1, 2, i, i + 1);
m_oEntries.push_back(poEntry);
poEntry->signal_focus_in_event().connect(sigc::bind(
sigc::mem_fun(*this, &JoypadConfigDialog::bOnEntryFocusIn),
@ -71,9 +60,18 @@ JoypadConfigDialog::JoypadConfigDialog(GtkDialog * _pstDialog,
poEntry->signal_focus_out_event().connect(sigc::mem_fun(*this, &JoypadConfigDialog::bOnEntryFocusOut));
}
memset(&m_oPreviousEvent, 0, sizeof(m_oPreviousEvent));
Gtk::VBox* poVBox = get_vbox();
poVBox->pack_start(m_oTable);
m_oTable.set_border_width(5);
m_oTable.set_spacings(5);
m_poOkButton = add_button(Gtk::Stock::CLOSE, Gtk::RESPONSE_CLOSE);
show_all();
vEmptyEventQueue();
memset(&m_oPreviousEvent, 0, sizeof(m_oPreviousEvent));
m_oConfigSig = Glib::signal_idle().connect(sigc::mem_fun(*this, &JoypadConfigDialog::bOnConfigIdle),
Glib::PRIORITY_DEFAULT_IDLE);
@ -96,7 +94,7 @@ void JoypadConfigDialog::vUpdateEntries()
{
const char * csName = 0;
guint uiKeyval = inputGetKeymap(m_ePad, m_aeKeys[i]);
guint uiKeyval = inputGetKeymap(m_ePad, m_astKeys[i].m_eKeyFlag);
int dev = uiKeyval >> 16;
if (dev == 0)
{
@ -182,7 +180,7 @@ void JoypadConfigDialog::vOnInputEvent(const SDL_Event &event)
}
int code = inputGetEventCode(event);
inputSetKeymap(m_ePad, m_aeKeys[m_iCurrentEntry], code);
inputSetKeymap(m_ePad, m_astKeys[m_iCurrentEntry].m_eKeyFlag, code);
vUpdateEntries();
if (m_iCurrentEntry + 1 < (gint)m_oEntries.size())

View File

@ -33,8 +33,7 @@ namespace VBA
class JoypadConfigDialog : public Gtk::Dialog
{
public:
JoypadConfigDialog(GtkDialog * _pstDialog,
const Glib::RefPtr<Gnome::Glade::Xml> & _poXml);
JoypadConfigDialog();
virtual ~JoypadConfigDialog();
void vInitDialog(EPad _ePad);
@ -46,10 +45,17 @@ protected:
bool on_key_press_event(GdkEventKey * _pstEvent);
private:
struct SJoypadKey
{
const EKey m_eKeyFlag;
const char * m_csKeyName;
};
Gtk::Table m_oTable;
Gtk::Button * m_poOkButton;
std::vector<Gtk::Entry *> m_oEntries;
gint m_iCurrentEntry;
static const EKey m_aeKeys[];
static const SJoypadKey m_astKeys[];
sigc::connection m_oConfigSig;
SDL_Event m_oPreviousEvent;
EPad m_ePad;

View File

@ -61,7 +61,7 @@ using Gnome::Glade::Xml;
Window * Window::m_poInstance = NULL;
const Window::SJoypadKey Window::m_astJoypad[SDLBUTTONS_NUM] =
const Window::SJoypadKey Window::m_astJoypad[] =
{
{ "left", KEY_LEFT },
{ "right", KEY_RIGHT },
@ -1015,7 +1015,7 @@ void Window::vInitConfig()
snprintf(csPrefix, sizeof(csPrefix), "joypadSDL%d_", i);
std::string sPrefix(csPrefix);
for (int j = 0; j < SDLBUTTONS_NUM; j++)
for (guint j = 0; j < G_N_ELEMENTS(m_astJoypad); j++)
{
m_poInputConfig->vSetKey(sPrefix + m_astJoypad[j].m_csKey,
inputGetKeymap(PAD_DEFAULT, m_astJoypad[j].m_eKeyFlag));
@ -1220,7 +1220,7 @@ void Window::vLoadJoypadsFromConfig()
snprintf(csPrefix, sizeof(csPrefix), "joypadSDL%d_", i);
std::string sPrefix(csPrefix);
for (int j = 0; j < SDLBUTTONS_NUM; j++)
for (guint j = 0; j < G_N_ELEMENTS(m_astJoypad); j++)
{
inputSetKeymap((EPad)i, m_astJoypad[j].m_eKeyFlag,
m_poInputConfig->oGetKey<guint>(sPrefix + m_astJoypad[j].m_csKey));
@ -1236,7 +1236,7 @@ void Window::vSaveJoypadsToConfig()
snprintf(csPrefix, sizeof(csPrefix), "joypadSDL%d_", i);
std::string sPrefix(csPrefix);
for (int j = 0; j < SDLBUTTONS_NUM; j++)
for (guint j = 0; j < G_N_ELEMENTS(m_astJoypad); j++)
{
m_poInputConfig->vSetKey(sPrefix + m_astJoypad[j].m_csKey,
inputGetKeymap((EPad)i, m_astJoypad[j].m_eKeyFlag));

View File

@ -243,7 +243,7 @@ private:
const EKey m_eKeyFlag;
};
static const SJoypadKey m_astJoypad[SDLBUTTONS_NUM];
static const SJoypadKey m_astJoypad[];
Gtk::MenuItem * m_apoLoadGameItem[10];
Gtk::MenuItem * m_apoSaveGameItem[10];

View File

@ -863,17 +863,11 @@ void Window::vOnFilterIBToggled(Gtk::CheckMenuItem * _poCMI, int _iFilterIB)
void Window::vOnJoypadConfigure(EPad _eJoypad)
{
Glib::RefPtr<Xml> poXml;
poXml = Xml::create(PKGDATADIR "/vba.glade", "JoypadConfigDialog");
JoypadConfigDialog oDialog;
oDialog.set_transient_for(*this);
oDialog.vInitDialog(_eJoypad);
JoypadConfigDialog * poDialog = NULL;
poXml->get_widget_derived<JoypadConfigDialog>("JoypadConfigDialog", poDialog);
poDialog->set_transient_for(*this);
poDialog->vInitDialog(_eJoypad);
poDialog->run();
delete poDialog;
oDialog.run();
}
void Window::vOnJoypadToggled(Gtk::CheckMenuItem * _poCMI, EPad _eJoypad)

View File

@ -17,6 +17,8 @@
#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);

View File

@ -20,8 +20,6 @@
#include <SDL.h>
#define SDLBUTTONS_NUM 14
enum EKey {
KEY_LEFT,
KEY_RIGHT,