diff options
Diffstat (limited to 'src/plugins/platforms/xcb/qxcbconnection.h')
-rw-r--r-- | src/plugins/platforms/xcb/qxcbconnection.h | 102 |
1 files changed, 46 insertions, 56 deletions
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h index 9966e06c7b..b0c36e61b0 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.h +++ b/src/plugins/platforms/xcb/qxcbconnection.h @@ -71,16 +71,6 @@ #include <QTabletEvent> #endif -#if QT_CONFIG(xinput2) -#include <X11/extensions/XI2.h> -#ifdef XIScrollClass -#define XCB_USE_XINPUT21 // XI 2.1 adds smooth scrolling support -#ifdef XI_TouchBeginMask -#define XCB_USE_XINPUT22 // XI 2.2 adds multi-point touch support -#endif -#endif -#endif // QT_CONFIG(xinput2) - struct xcb_randr_get_output_info_reply_t; QT_BEGIN_NAMESPACE @@ -93,6 +83,7 @@ Q_DECLARE_LOGGING_CATEGORY(lcQpaEvents) Q_DECLARE_LOGGING_CATEGORY(lcQpaXcb) Q_DECLARE_LOGGING_CATEGORY(lcQpaPeeker) Q_DECLARE_LOGGING_CATEGORY(lcQpaKeyboard) +Q_DECLARE_LOGGING_CATEGORY(lcQpaXDnd) class QXcbVirtualDesktop; class QXcbScreen; @@ -128,6 +119,7 @@ namespace QXcbAtom { WM_CLIENT_LEADER, WM_WINDOW_ROLE, SM_CLIENT_ID, + WM_CLIENT_MACHINE, // Clipboard CLIPBOARD, @@ -303,9 +295,12 @@ namespace QXcbAtom { _COMPIZ_TOOLKIT_ACTION, _GTK_LOAD_ICONTHEMES, - NPredefinedAtoms, + AT_SPI_BUS, + + EDID, + EDID_DATA, + XFree86_DDC_EDID1_RAWDATA, - _QT_SETTINGS_TIMESTAMP = NPredefinedAtoms, NAtoms }; } @@ -346,7 +341,7 @@ class QXcbWindowEventListener { public: virtual ~QXcbWindowEventListener() {} - virtual bool handleGenericEvent(xcb_generic_event_t *, long *) { return false; } + virtual bool handleNativeEvent(xcb_generic_event_t *) { return false; } virtual void handleExposeEvent(const xcb_expose_event_t *) {} virtual void handleClientMessageEvent(const xcb_client_message_event_t *) {} @@ -362,7 +357,7 @@ public: virtual void handleFocusInEvent(const xcb_focus_in_event_t *) {} virtual void handleFocusOutEvent(const xcb_focus_out_event_t *) {} virtual void handlePropertyNotifyEvent(const xcb_property_notify_event_t *) {} -#if QT_CONFIG(xinput2) +#if QT_CONFIG(xcb_xinput) virtual void handleXIMouseEvent(xcb_ge_event_t *, Qt::MouseEventSource = Qt::MouseEventNotSynthesized) {} virtual void handleXIEnterLeave(xcb_ge_event_t *) {} #endif @@ -388,9 +383,16 @@ class Q_XCB_EXPORT QXcbConnection : public QObject { Q_OBJECT public: - QXcbConnection(QXcbNativeInterface *nativeInterface, bool canGrabServer, xcb_visualid_t defaultVisualId, const char *displayName = 0); + explicit QXcbConnection(xcb_connection_t *c, int primaryScreenNumber, + QXcbNativeInterface *nativeInterface, bool canGrabServer, + xcb_visualid_t defaultVisualId, const QByteArray &displayName, + void *xlibDisplay = nullptr); + ~QXcbConnection(); + static QXcbConnection *create(QXcbNativeInterface *nativeInterface, bool canGrabServer, + xcb_visualid_t defaultVisualId, const char *displayName = nullptr); + QXcbConnection *connection() const { return const_cast<QXcbConnection *>(this); } bool isConnected() const; @@ -436,8 +438,7 @@ public: xcb_visualid_t defaultVisualId() const { return m_defaultVisualId; } #if QT_CONFIG(xcb_xlib) - void *xlib_display() const; - void *createVisualInfoForDefaultVisualId() const; + void *xlib_display() const { return m_xlib_display; } #endif void sync(); @@ -452,8 +453,8 @@ public: QXcbWindowEventListener *windowEventListenerFromId(xcb_window_t id); QXcbWindow *platformWindowFromId(xcb_window_t id); - template<typename T> - inline xcb_generic_event_t *checkEvent(T &checker); + template<typename Functor> + inline xcb_generic_event_t *checkEvent(Functor &&filter, bool removeFromQueue = true); typedef bool (*PeekFunc)(QXcbConnection *, xcb_generic_event_t *); void addPeekFunc(PeekFunc f); @@ -488,6 +489,7 @@ public: bool hasXInput2() const { return m_xi2Enabled; } bool hasShm() const { return has_shm; } bool hasShmFd() const { return has_shm_fd; } + bool hasXSync() const { return has_sync_extension; } bool threadedEventHandling() const { return m_reader->isRunning(); } @@ -520,10 +522,11 @@ public: QXcbNativeInterface *nativeInterface() const { return m_nativeInterface; } QXcbSystemTrayTracker *systemTrayTracker() const; - static bool xEmbedSystemTrayAvailable(); - static bool xEmbedSystemTrayVisualHasAlphaChannel(); -#if QT_CONFIG(xinput2) + Qt::MouseButtons queryMouseButtons() const; + Qt::KeyboardModifiers queryKeyboardModifiers() const; + +#if QT_CONFIG(xcb_xinput) void xi2SelectStateEvents(); void xi2SelectDeviceEvents(xcb_window_t window); void xi2SelectDeviceEventsCompatibility(xcb_window_t window); @@ -532,15 +535,11 @@ public: bool isAtLeastXI21() const { return m_xi2Enabled && m_xi2Minor >= 1; } bool isAtLeastXI22() const { return m_xi2Enabled && m_xi2Minor >= 2; } Qt::MouseButton xiToQtMouseButton(uint32_t b); -#ifdef XCB_USE_XINPUT21 void xi2UpdateScrollingDevices(); -#endif -#ifdef XCB_USE_XINPUT22 bool startSystemMoveResizeForTouchBegin(xcb_window_t window, const QPoint &point, int corner); void abortSystemMoveResizeForTouch(); bool isTouchScreen(int id); #endif -#endif QXcbEventReader *eventReader() const { return m_reader; } bool canGrab() const { return m_canGrabServer; } @@ -566,7 +565,7 @@ private: void initializeXinerama(); void initializeXShape(); void initializeXKB(); - void handleClientMessageEvent(const xcb_client_message_event_t *event); + void initializeXSync(); QXcbScreen* findScreenForCrtc(xcb_window_t rootWindow, xcb_randr_crtc_t crtc) const; QXcbScreen* findScreenForOutput(xcb_window_t rootWindow, xcb_randr_output_t output) const; QXcbVirtualDesktop* virtualDesktopForRootWindow(xcb_window_t rootWindow) const; @@ -581,7 +580,7 @@ private: bool compressEvent(xcb_generic_event_t *event, int currentIndex, QXcbEventArray *eventqueue) const; bool m_xi2Enabled = false; -#if QT_CONFIG(xinput2) +#if QT_CONFIG(xcb_xinput) int m_xi2Minor = -1; void initializeXInput2(); void xi2SetupDevice(void *info, bool removeExisting = true); @@ -609,10 +608,8 @@ private: void xi2HandleEvent(xcb_ge_event_t *event); void xi2HandleHierarchyEvent(void *event); void xi2HandleDeviceChangedEvent(void *event); - int m_xiOpCode, m_xiEventBase, m_xiErrorBase; -#ifdef XCB_USE_XINPUT22 + int m_xiOpCode; void xi2ProcessTouch(void *xiDevEvent, QXcbWindow *platformWindow); -#endif // XCB_USE_XINPUT22 #if QT_CONFIG(tabletevent) struct TabletData { int deviceId = 0; @@ -647,31 +644,28 @@ private: QPointF lastScrollPosition; }; QHash<int, ScrollingDevice> m_scrollingDevices; -#ifdef XCB_USE_XINPUT21 void xi2HandleScrollEvent(void *event, ScrollingDevice &scrollingDevice); void xi2UpdateScrollingDevice(ScrollingDevice &scrollingDevice); ScrollingDevice *scrollingDeviceForId(int id); -#endif static bool xi2GetValuatorValueIfSet(const void *event, int valuatorNum, double *value); - static void xi2PrepareXIGenericDeviceEvent(xcb_ge_event_t *event); #endif - xcb_connection_t *m_connection = nullptr; + xcb_connection_t *const m_connection; const xcb_setup_t *m_setup = nullptr; const bool m_canGrabServer; const xcb_visualid_t m_defaultVisualId; QList<QXcbVirtualDesktop *> m_virtualDesktops; QList<QXcbScreen *> m_screens; - int m_primaryScreenNumber = 0; + const int m_primaryScreenNumber; xcb_atom_t m_allAtoms[QXcbAtom::NAtoms]; xcb_timestamp_t m_time = XCB_CURRENT_TIME; xcb_timestamp_t m_netWmUserTime = XCB_CURRENT_TIME; - QByteArray m_displayName; + const QByteArray m_displayName; QXcbKeyboard *m_keyboard = nullptr; #ifndef QT_NO_CLIPBOARD @@ -684,13 +678,12 @@ private: QXcbNativeInterface *m_nativeInterface = nullptr; #if QT_CONFIG(xcb_xlib) - void *m_xlib_display = nullptr; + void *const m_xlib_display; #endif QXcbEventReader *m_reader = nullptr; -#if QT_CONFIG(xinput2) +#if QT_CONFIG(xcb_xinput) QHash<int, TouchDeviceData> m_touchDevices; -#ifdef XCB_USE_XINPUT22 struct StartSystemMoveResizeInfo { xcb_window_t window = XCB_NONE; uint16_t deviceid; @@ -698,7 +691,6 @@ private: int corner; } m_startSystemMoveResizeInfo; #endif -#endif WindowMapper m_mapper; QVector<PeekFunc> m_peekFuncs; @@ -706,6 +698,9 @@ private: uint32_t xfixes_first_event = 0; uint32_t xrandr_first_event = 0; uint32_t xkb_first_event = 0; +#if QT_CONFIG(xcb_xinput) + uint32_t xinput_first_event = 0; +#endif bool has_xfixes = false; bool has_xinerama_extension = false; @@ -716,6 +711,7 @@ private: bool has_render_extension = false; bool has_shm = false; bool has_shm_fd = false; + bool has_sync_extension = false; QPair<int, int> m_xrenderVersion; @@ -743,28 +739,29 @@ private: QByteArray m_xdgCurrentDesktop; }; -#if QT_CONFIG(xinput2) +#if QT_CONFIG(xcb_xinput) #if QT_CONFIG(tabletevent) Q_DECLARE_TYPEINFO(QXcbConnection::TabletData::ValuatorClassInfo, Q_PRIMITIVE_TYPE); Q_DECLARE_TYPEINFO(QXcbConnection::TabletData, Q_MOVABLE_TYPE); #endif #endif -template<typename T> -xcb_generic_event_t *QXcbConnection::checkEvent(T &checker) +template<typename Functor> +xcb_generic_event_t *QXcbConnection::checkEvent(Functor &&filter, bool removeFromQueue) { QXcbEventArray *eventqueue = m_reader->lock(); for (int i = 0; i < eventqueue->size(); ++i) { xcb_generic_event_t *event = eventqueue->at(i); - if (checker.checkEvent(event)) { - (*eventqueue)[i] = 0; + if (event && filter(event, event->response_type & ~0x80)) { + if (removeFromQueue) + (*eventqueue)[i] = nullptr; m_reader->unlock(); return event; } } m_reader->unlock(); - return 0; + return nullptr; } class QXcbConnectionGrabber @@ -793,18 +790,11 @@ struct QStdFreeDeleter { call##_reply(Q_XCB_REPLY_CONNECTION_ARG(__VA_ARGS__), call##_unchecked(__VA_ARGS__), nullptr) \ ) -template <typename T> -union q_padded_xcb_event { - T event; - char padding[32]; -}; - // The xcb_send_event() requires all events to have 32 bytes. It calls memcpy() on the // passed in event. If the passed in event is less than 32 bytes, memcpy() reaches into // unrelated memory. -#define Q_DECLARE_XCB_EVENT(event_var, event_type) \ - q_padded_xcb_event<event_type> store = {}; \ - auto &event_var = store.event; +template <typename T> +struct alignas(32) q_padded_xcb_event : T { }; QT_END_NAMESPACE |