diff options
author | Gatis Paeglis <gatis.paeglis@qt.io> | 2017-06-06 11:33:39 +0200 |
---|---|---|
committer | Gatis Paeglis <gatis.paeglis@qt.io> | 2017-07-13 11:31:01 +0000 |
commit | ac4e848c9802377b7c4ff673180f28b9ca76b746 (patch) | |
tree | ece68afcc85cd1282079241f8e4e677d8eee5739 /src/plugins/platforms/xcb/qxcbconnection_xi2.cpp | |
parent | f69d30804d4bef729d602a8ec41c7d26689772e2 (diff) |
xcb: fix logic in QXcbConnection::initializeXInput2()
Things that were broken:
- The return values of XIQueryVersion interpreted wrongly. BadRequest
means no XI2 support on the server. Nesting more XIQueryVersion
calls to check for lower minor version of XI2 in this case does not
make sense. On Success, server's supported X Input version is returned.
Server's supported version can be lower than the version we have announced
to support. In this case Qt client will be limited by X server's supported
version (which is ok, as we do check the available version at runtime via
QXcbConnection::isAtLeastXI2*).
- The code was _always_ announcing to X server that we support XI 2.2,
by ignoring what actually is supported in the specific build (see
XCB_USE_XINPUT ifdefs).
- qCDebug messages and logging categories were wrong too.
Change-Id: Ia84457f125474aa851b7a91ed19fc5b904ac359e
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/plugins/platforms/xcb/qxcbconnection_xi2.cpp')
-rw-r--r-- | src/plugins/platforms/xcb/qxcbconnection_xi2.cpp | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp index 61a48cfc9b..1deab2a6c5 100644 --- a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp @@ -57,29 +57,39 @@ void QXcbConnection::initializeXInput2() const_cast<QLoggingCategory&>(lcQpaXInput()).setEnabled(QtDebugMsg, true); if (qEnvironmentVariableIsSet("QT_XCB_DEBUG_XINPUT_DEVICES")) const_cast<QLoggingCategory&>(lcQpaXInputDevices()).setEnabled(QtDebugMsg, true); + Display *xDisplay = static_cast<Display *>(m_xlib_display); if (XQueryExtension(xDisplay, "XInputExtension", &m_xiOpCode, &m_xiEventBase, &m_xiErrorBase)) { int xiMajor = 2; - // try 2.2 first, needed for TouchBegin/Update/End - if (XIQueryVersion(xDisplay, &xiMajor, &m_xi2Minor) == BadRequest) { - m_xi2Minor = 1; // for smooth scrolling 2.1 is enough - if (XIQueryVersion(xDisplay, &xiMajor, &m_xi2Minor) == BadRequest) { - m_xi2Minor = 0; // for tablet support 2.0 is enough - m_xi2Enabled = XIQueryVersion(xDisplay, &xiMajor, &m_xi2Minor) != BadRequest; - } else - m_xi2Enabled = true; - } else +#if defined(XCB_USE_XINPUT22) + m_xi2Minor = 2; // for touch support 2.2 is enough +#elif defined(XCB_USE_XINPUT21) + m_xi2Minor = 1; // for smooth scrolling 2.1 is enough +#else + m_xi2Minor = 0; // for tablet support 2.0 is enough +#endif + qCDebug(lcQpaXInput, "Plugin build with support for XInput 2 version up " + "to %d.%d", xiMajor, m_xi2Minor); + + switch (XIQueryVersion(xDisplay, &xiMajor, &m_xi2Minor)) { + case Success: + // Server's supported version can be lower than the version we have + // announced to support. In this case Qt client will be limited by + // X server's supported version. + qCDebug(lcQpaXInput, "Using XInput version %d.%d", xiMajor, m_xi2Minor); m_xi2Enabled = true; - if (m_xi2Enabled) { #ifdef XCB_USE_XINPUT22 - qCDebug(lcQpaXInputDevices, "XInput version %d.%d is available and Qt supports 2.2 or greater", xiMajor, m_xi2Minor); m_startSystemResizeInfo.window = XCB_NONE; -#else - qCDebug(lcQpaXInputDevices, "XInput version %d.%d is available and Qt supports 2.0", xiMajor, m_xi2Minor); #endif + xi2SetupDevices(); + break; + case BadRequest: // Must be an X server with XInput 1 + qCDebug(lcQpaXInput, "X server does not support XInput 2"); + break; + default: // BadValue + qCDebug(lcQpaXInput, "Internal error"); + break; } - - xi2SetupDevices(); } } @@ -91,9 +101,6 @@ void QXcbConnection::xi2SetupDevices() m_scrollingDevices.clear(); m_touchDevices.clear(); - if (!m_xi2Enabled) - return; - Display *xDisplay = static_cast<Display *>(m_xlib_display); int deviceCount = 0; XIDeviceInfo *devices = XIQueryDevice(xDisplay, XIAllDevices, &deviceCount); |