Allow to repeat keys

This commit is contained in:
Deve 2017-05-31 22:31:46 +02:00
parent d6e5e04666
commit 212411fb49
2 changed files with 39 additions and 2 deletions

View File

@ -263,9 +263,7 @@ public:
close(fd);
if (!device->m_xkb_keymap)
{
return;
}
device->m_xkb_state = xkb_state_new(device->m_xkb_keymap);
@ -394,6 +392,19 @@ public:
}
device->signalEvent(irrevent);
bool repeats = xkb_keymap_key_repeats(device->m_xkb_keymap, key + 8);
if (repeats && state == WL_KEYBOARD_KEY_STATE_PRESSED)
{
device->m_repeat_enabled = true;
device->m_repeat_time = os::Timer::getRealTime();
device->m_repeat_event = irrevent;
}
else
{
device->m_repeat_enabled = false;
}
}
static void keyboard_modifiers(void* data, wl_keyboard* keyboard,
@ -422,6 +433,10 @@ public:
static void keyboard_repeat_info(void* data, wl_keyboard* keyboard,
int32_t rate, int32_t delay)
{
CIrrDeviceWayland* device = static_cast<CIrrDeviceWayland*>(data);
device->m_repeat_rate = 1000 / rate;
device->m_repeat_delay = delay;
}
static void seat_capabilities(void* data, wl_seat* seat, uint32_t caps)
@ -644,6 +659,11 @@ CIrrDeviceWayland::CIrrDeviceWayland(const SIrrlichtCreationParameters& params)
m_xkb_ctrl_pressed = false;
m_xkb_shift_pressed = false;
m_repeat_enabled = false;
m_repeat_time = 0;
m_repeat_rate = 40;
m_repeat_delay = 400;
m_egl_context = NULL;
m_mouse_button_states = 0;
@ -895,6 +915,17 @@ bool CIrrDeviceWayland::run()
m_events.clear();
if (m_repeat_enabled && m_repeat_rate > 0)
{
uint32_t curr_time = os::Timer::getRealTime();
while (curr_time - m_repeat_time > m_repeat_delay + m_repeat_rate)
{
postEventFromUser(m_repeat_event);
m_repeat_time += m_repeat_rate;
}
}
if (!Close)
pollJoysticks();

View File

@ -183,6 +183,12 @@ namespace irr
bool m_xkb_alt_pressed;
bool m_xkb_ctrl_pressed;
bool m_xkb_shift_pressed;
bool m_repeat_enabled;
SEvent m_repeat_event;
uint32_t m_repeat_time;
uint32_t m_repeat_rate;
uint32_t m_repeat_delay;
uint32_t m_mouse_button_states;
unsigned int m_width;