xcb: Update mouse buttons from MotionNotify events
We don't receive ButtonRelease event after closing a popup by clicking outside of the client area. Thus the internal state of mouse buttons in the xcb plugin becomes outdated until we receive ButtonRelease event. This commit updates the internal state of mouse buttons from MotionNotify events. So when a user will move a mouse on the client area, the xcb plugin will send a mouse event with updated buttons to Qt Gui and QGuiApplication will detect the following mouse events correctly. Task-number: QTBUG-32609 Task-number: QTBUG-35065 Task-number: QTBUG-43776 Task-number: QTBUG-44166 Task-number: QTBUG-44231 Change-Id: Ica334dfbf04f7ef81db86b25262328fe5da11808 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com> Reviewed-by: Gatis Paeglis <gatis.paeglis@digia.com>
This commit is contained in:
parent
de98302f70
commit
76de1ac0a4
@ -818,6 +818,15 @@ void QXcbConnection::handleButtonRelease(xcb_generic_event_t *ev)
|
|||||||
qCDebug(lcQpaXInput, "xcb: released mouse button %d, button state %X", event->detail, static_cast<unsigned int>(m_buttons));
|
qCDebug(lcQpaXInput, "xcb: released mouse button %d, button state %X", event->detail, static_cast<unsigned int>(m_buttons));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QXcbConnection::handleMotionNotify(xcb_generic_event_t *ev)
|
||||||
|
{
|
||||||
|
xcb_motion_notify_event_t *event = (xcb_motion_notify_event_t *)ev;
|
||||||
|
|
||||||
|
m_buttons = (m_buttons & ~0x7) | translateMouseButtons(event->state);
|
||||||
|
if (Q_UNLIKELY(lcQpaXInput().isDebugEnabled()))
|
||||||
|
qDebug("xcb: moved mouse to %4d, %4d; button state %X", event->event_x, event->event_y, static_cast<unsigned int>(m_buttons));
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef QT_NO_XKB
|
#ifndef QT_NO_XKB
|
||||||
namespace {
|
namespace {
|
||||||
typedef union {
|
typedef union {
|
||||||
@ -868,11 +877,8 @@ void QXcbConnection::handleXcbEvent(xcb_generic_event_t *event)
|
|||||||
handleButtonRelease(event);
|
handleButtonRelease(event);
|
||||||
HANDLE_PLATFORM_WINDOW_EVENT(xcb_button_release_event_t, event, handleButtonReleaseEvent);
|
HANDLE_PLATFORM_WINDOW_EVENT(xcb_button_release_event_t, event, handleButtonReleaseEvent);
|
||||||
case XCB_MOTION_NOTIFY:
|
case XCB_MOTION_NOTIFY:
|
||||||
if (Q_UNLIKELY(lcQpaXInput().isDebugEnabled())) {
|
|
||||||
xcb_motion_notify_event_t *mev = (xcb_motion_notify_event_t *)event;
|
|
||||||
qDebug("xcb: moved mouse to %4d, %4d; button state %X", mev->event_x, mev->event_y, static_cast<unsigned int>(m_buttons));
|
|
||||||
}
|
|
||||||
m_keyboard->updateXKBStateFromCore(((xcb_motion_notify_event_t *)event)->state);
|
m_keyboard->updateXKBStateFromCore(((xcb_motion_notify_event_t *)event)->state);
|
||||||
|
handleMotionNotify(event);
|
||||||
HANDLE_PLATFORM_WINDOW_EVENT(xcb_motion_notify_event_t, event, handleMotionNotifyEvent);
|
HANDLE_PLATFORM_WINDOW_EVENT(xcb_motion_notify_event_t, event, handleMotionNotifyEvent);
|
||||||
case XCB_CONFIGURE_NOTIFY:
|
case XCB_CONFIGURE_NOTIFY:
|
||||||
HANDLE_PLATFORM_WINDOW_EVENT(xcb_configure_notify_event_t, event, handleConfigureNotifyEvent);
|
HANDLE_PLATFORM_WINDOW_EVENT(xcb_configure_notify_event_t, event, handleConfigureNotifyEvent);
|
||||||
|
@ -496,6 +496,7 @@ private:
|
|||||||
void updateScreens();
|
void updateScreens();
|
||||||
void handleButtonPress(xcb_generic_event_t *event);
|
void handleButtonPress(xcb_generic_event_t *event);
|
||||||
void handleButtonRelease(xcb_generic_event_t *event);
|
void handleButtonRelease(xcb_generic_event_t *event);
|
||||||
|
void handleMotionNotify(xcb_generic_event_t *event);
|
||||||
|
|
||||||
bool m_xi2Enabled;
|
bool m_xi2Enabled;
|
||||||
int m_xi2Minor;
|
int m_xi2Minor;
|
||||||
|
Loading…
Reference in New Issue
Block a user