xcb: Do not eat events with different keyboard state

Change-Id: Iac8dc7b369eb7c2fbe0cf27baa34a40278088219
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
Reviewed-by: Gatis Paeglis <gatis.paeglis@qt.io>
This commit is contained in:
Albert Astals Cid 2016-05-31 01:13:03 +02:00 committed by Gatis Paeglis
parent 734da261a8
commit 8d64d1e0c3

View File

@ -1393,10 +1393,11 @@ void QXcbKeyboard::resolveMaskConflicts()
class KeyChecker class KeyChecker
{ {
public: public:
KeyChecker(xcb_window_t window, xcb_keycode_t code, xcb_timestamp_t time) KeyChecker(xcb_window_t window, xcb_keycode_t code, xcb_timestamp_t time, quint16 state)
: m_window(window) : m_window(window)
, m_code(code) , m_code(code)
, m_time(time) , m_time(time)
, m_state(state)
, m_error(false) , m_error(false)
, m_release(true) , m_release(true)
{ {
@ -1413,7 +1414,7 @@ public:
xcb_key_press_event_t *event = (xcb_key_press_event_t *)ev; xcb_key_press_event_t *event = (xcb_key_press_event_t *)ev;
if (event->event != m_window || event->detail != m_code) { if (event->event != m_window || event->detail != m_code || event->state != m_state) {
m_error = true; m_error = true;
return false; return false;
} }
@ -1441,6 +1442,7 @@ private:
xcb_window_t m_window; xcb_window_t m_window;
xcb_keycode_t m_code; xcb_keycode_t m_code;
xcb_timestamp_t m_time; xcb_timestamp_t m_time;
quint16 m_state;
bool m_error; bool m_error;
bool m_release; bool m_release;
@ -1505,7 +1507,7 @@ void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type,
} }
} else { } else {
// look ahead for auto-repeat // look ahead for auto-repeat
KeyChecker checker(source->xcb_window(), code, time); KeyChecker checker(source->xcb_window(), code, time, state);
xcb_generic_event_t *event = connection()->checkEvent(checker); xcb_generic_event_t *event = connection()->checkEvent(checker);
if (event) { if (event) {
isAutoRepeat = true; isAutoRepeat = true;