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:
parent
734da261a8
commit
8d64d1e0c3
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user