GTK : The joypad config dialog now works for Joystick events too. Joystick support is now almost complete.
This commit is contained in:
parent
b41de462b4
commit
81bee10766
|
@ -71,10 +71,18 @@ JoypadConfigDialog::JoypadConfigDialog(GtkDialog * _pstDialog,
|
||||||
}
|
}
|
||||||
|
|
||||||
vUpdateEntries();
|
vUpdateEntries();
|
||||||
|
|
||||||
|
vEmptyEventQueue();
|
||||||
|
|
||||||
|
memset(&m_oPreviousEvent, 0, sizeof(m_oPreviousEvent));
|
||||||
|
|
||||||
|
m_oConfigSig = Glib::signal_idle().connect(sigc::mem_fun(*this, &JoypadConfigDialog::bOnConfigIdle),
|
||||||
|
Glib::PRIORITY_DEFAULT_IDLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
JoypadConfigDialog::~JoypadConfigDialog()
|
JoypadConfigDialog::~JoypadConfigDialog()
|
||||||
{
|
{
|
||||||
|
m_oConfigSig.disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
void JoypadConfigDialog::vUpdateEntries()
|
void JoypadConfigDialog::vUpdateEntries()
|
||||||
|
@ -104,8 +112,9 @@ void JoypadConfigDialog::vUpdateEntries()
|
||||||
else if (what < 0x20)
|
else if (what < 0x20)
|
||||||
{
|
{
|
||||||
// joystick axis
|
// joystick axis
|
||||||
|
int dir = what & 1;
|
||||||
what >>= 1;
|
what >>= 1;
|
||||||
os << " Axis " << what;
|
os << " Axis " << what << (dir?'-':'+');
|
||||||
}
|
}
|
||||||
else if (what < 0x30)
|
else if (what < 0x30)
|
||||||
{
|
{
|
||||||
|
@ -132,80 +141,48 @@ void JoypadConfigDialog::vUpdateEntries()
|
||||||
bool JoypadConfigDialog::bOnEntryFocusIn(GdkEventFocus * _pstEvent,
|
bool JoypadConfigDialog::bOnEntryFocusIn(GdkEventFocus * _pstEvent,
|
||||||
guint _uiEntry)
|
guint _uiEntry)
|
||||||
{
|
{
|
||||||
m_uiCurrentEntry = _uiEntry;
|
m_iCurrentEntry = _uiEntry;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool JoypadConfigDialog::bOnEntryFocusOut(GdkEventFocus * _pstEvent)
|
bool JoypadConfigDialog::bOnEntryFocusOut(GdkEventFocus * _pstEvent)
|
||||||
{
|
{
|
||||||
|
m_iCurrentEntry = -1;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool JoypadConfigDialog::on_key_press_event(GdkEventKey * _pstEvent)
|
bool JoypadConfigDialog::on_key_press_event(GdkEventKey * _pstEvent)
|
||||||
{
|
{
|
||||||
// Forward the keyboard event to the input module by faking a SDL event
|
if (m_iCurrentEntry < 0)
|
||||||
|
{
|
||||||
|
return Gtk::Window::on_key_press_event(_pstEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Forward the keyboard event by faking a SDL event
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
event.type = SDL_KEYDOWN;
|
event.type = SDL_KEYDOWN;
|
||||||
event.key.keysym.sym = (SDLKey)_pstEvent->keyval;
|
event.key.keysym.sym = (SDLKey)_pstEvent->keyval;
|
||||||
vOnInputEvent(event);
|
vOnInputEvent(event);
|
||||||
/* 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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void JoypadConfigDialog::vOnInputEvent(const SDL_Event &event)
|
void JoypadConfigDialog::vOnInputEvent(const SDL_Event &event)
|
||||||
{
|
{
|
||||||
|
if (m_iCurrentEntry < 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int code = inputGetEventCode(event);
|
int code = inputGetEventCode(event);
|
||||||
inputSetKeymap(PAD_MAIN, m_aeKeys[m_uiCurrentEntry], code);
|
inputSetKeymap(PAD_MAIN, m_aeKeys[m_iCurrentEntry], code);
|
||||||
vUpdateEntries();
|
vUpdateEntries();
|
||||||
|
|
||||||
if (m_uiCurrentEntry + 1 < m_oEntries.size())
|
if (m_iCurrentEntry + 1 < (gint)m_oEntries.size())
|
||||||
{
|
{
|
||||||
m_oEntries[m_uiCurrentEntry + 1]->grab_focus();
|
m_oEntries[m_iCurrentEntry + 1]->grab_focus();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -213,4 +190,40 @@ void JoypadConfigDialog::vOnInputEvent(const SDL_Event &event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool JoypadConfigDialog::bOnConfigIdle()
|
||||||
|
{
|
||||||
|
SDL_Event event;
|
||||||
|
while(SDL_PollEvent(&event))
|
||||||
|
{
|
||||||
|
switch(event.type)
|
||||||
|
{
|
||||||
|
case SDL_JOYAXISMOTION:
|
||||||
|
if (event.jaxis.which != m_oPreviousEvent.jaxis.which ||
|
||||||
|
event.jaxis.axis != m_oPreviousEvent.jaxis.axis ||
|
||||||
|
(event.jaxis.value > 0 && m_oPreviousEvent.jaxis.value < 0) ||
|
||||||
|
(event.jaxis.value < 0 && m_oPreviousEvent.jaxis.value > 0))
|
||||||
|
{
|
||||||
|
vOnInputEvent(event);
|
||||||
|
m_oPreviousEvent = event;
|
||||||
|
}
|
||||||
|
vEmptyEventQueue();
|
||||||
|
break;
|
||||||
|
case SDL_JOYHATMOTION:
|
||||||
|
case SDL_JOYBUTTONUP:
|
||||||
|
vOnInputEvent(event);
|
||||||
|
vEmptyEventQueue();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void JoypadConfigDialog::vEmptyEventQueue()
|
||||||
|
{
|
||||||
|
// Empty the SDL event queue
|
||||||
|
SDL_Event event;
|
||||||
|
while(SDL_PollEvent(&event));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace VBA
|
} // namespace VBA
|
||||||
|
|
|
@ -47,10 +47,14 @@ protected:
|
||||||
private:
|
private:
|
||||||
Gtk::Button * m_poOkButton;
|
Gtk::Button * m_poOkButton;
|
||||||
std::vector<Gtk::Entry *> m_oEntries;
|
std::vector<Gtk::Entry *> m_oEntries;
|
||||||
guint m_uiCurrentEntry;
|
gint m_iCurrentEntry;
|
||||||
static const EKey m_aeKeys[];
|
static const EKey m_aeKeys[];
|
||||||
|
sigc::connection m_oConfigSig;
|
||||||
|
SDL_Event m_oPreviousEvent;
|
||||||
|
|
||||||
void vUpdateEntries();
|
void vUpdateEntries();
|
||||||
|
bool bOnConfigIdle();
|
||||||
|
void vEmptyEventQueue();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace VBA
|
} // namespace VBA
|
||||||
|
|
Loading…
Reference in New Issue