95 QXcbConnection(QXcbNativeInterface *nativeInterface,
bool canGrabServer, xcb_visualid_t defaultVisualId,
const char *displayName =
nullptr);
98 QXcbConnection *connection()
const {
return const_cast<QXcbConnection *>(
this); }
99 QXcbEventQueue *eventQueue()
const {
return m_eventQueue; }
101 const QList<QXcbVirtualDesktop *> &virtualDesktops()
const {
return m_virtualDesktops; }
102 const QList<QXcbScreen *> &screens()
const {
return m_screens; }
103 QXcbVirtualDesktop *primaryVirtualDesktop()
const {
104 return m_virtualDesktops.value(primaryScreenNumber());
106 QXcbScreen *primaryScreen()
const;
108 const xcb_format_t *formatForDepth(uint8_t depth)
const;
110 bool imageNeedsEndianSwap()
const
114#if Q_BYTE_ORDER == Q_BIG_ENDIAN
115 return setup()->image_byte_order != XCB_IMAGE_ORDER_MSB_FIRST;
117 return setup()->image_byte_order != XCB_IMAGE_ORDER_LSB_FIRST;
121 QXcbKeyboard *keyboard()
const {
return m_keyboard; }
123#ifndef QT_NO_CLIPBOARD
124 QXcbClipboard *clipboard()
const {
return m_clipboard; }
126#if QT_CONFIG(draganddrop)
127 QXcbDrag *drag()
const {
return m_drag; }
130 QXcbWMSupport *wmSupport()
const {
return m_wmSupport.data(); }
131 xcb_window_t rootWindow();
132 xcb_window_t clientLeader();
134 bool hasDefaultVisualId()
const {
return m_defaultVisualId != UINT_MAX; }
135 xcb_visualid_t defaultVisualId()
const {
return m_defaultVisualId; }
139 void handleXcbError(xcb_generic_error_t *error);
140 void printXcbError(
const char *message, xcb_generic_error_t *error);
141 void handleXcbEvent(xcb_generic_event_t *event);
142 void printXcbEvent(
const QLoggingCategory &log,
const char *message,
143 xcb_generic_event_t *event)
const;
145 void addWindowEventListener(xcb_window_t id, QXcbWindowEventListener *eventListener);
146 void removeWindowEventListener(xcb_window_t id);
147 QXcbWindowEventListener *windowEventListenerFromId(xcb_window_t id);
148 QXcbWindow *platformWindowFromId(xcb_window_t id);
150 inline xcb_timestamp_t time()
const {
return m_time; }
151 inline void setTime(xcb_timestamp_t t) {
if (timeGreaterThan(t, m_time)) m_time = t; }
153 inline xcb_timestamp_t netWmUserTime()
const {
return m_netWmUserTime; }
154 inline void setNetWmUserTime(xcb_timestamp_t t) {
if (timeGreaterThan(t, m_netWmUserTime)) m_netWmUserTime = t; }
156 xcb_timestamp_t getTimestamp();
157 xcb_window_t selectionOwner(xcb_atom_t atom)
const;
158 xcb_window_t qtSelectionOwner();
160 void setButtonState(Qt::MouseButton button,
bool down);
161 Qt::MouseButtons buttonState()
const {
return m_buttonState; }
162 Qt::MouseButton button()
const {
return m_button; }
163 Qt::MouseButton translateMouseButton(xcb_button_t s);
165 QXcbWindow *focusWindow()
const {
return m_focusWindow; }
166 void setFocusWindow(QWindow *);
167 QXcbWindow *mouseGrabber()
const {
return m_mouseGrabber; }
168 void setMouseGrabber(QXcbWindow *);
169 QXcbWindow *mousePressWindow()
const {
return m_mousePressWindow; }
170 void setMousePressWindow(QXcbWindow *);
172 QByteArray startupId()
const;
173 void setStartupId(
const QByteArray &nextId);
178 QString windowManagerName()
const;
180 QXcbNativeInterface *nativeInterface()
const {
return m_nativeInterface; }
182 QXcbSystemTrayTracker *systemTrayTracker()
const;
184 Qt::MouseButtons queryMouseButtons()
const;
186 bool isUserInputEvent(xcb_generic_event_t *event)
const;
188 void xi2SelectStateEvents();
189 void xi2SelectDeviceEvents(xcb_window_t window);
190 bool xi2SetMouseGrabEnabled(xcb_window_t w,
bool grab);
192 Qt::MouseButton xiToQtMouseButton(uint32_t b);
193 void xi2UpdateScrollingDevices();
194 bool isTouchScreen(
int id);
196 bool startSystemMoveResizeForTouch(xcb_window_t window,
int edges);
197 void abortSystemMoveResize(xcb_window_t window);
198 bool isDuringSystemMoveResize()
const;
199 void setDuringSystemMoveResize(
bool during);
201 bool canGrab()
const {
return m_canGrabServer; }
203 QXcbGlIntegration *glIntegration()
const;
205 void flush() { xcb_flush(xcb_connection()); }
206 void processXcbEvents(QEventLoop::ProcessEventsFlags flags);
208 QTimer &focusInTimer() {
return m_focusInTimer; }
211 bool event(QEvent *e) override;
214 void xrandrSelectEvents();
215 QXcbScreen* findScreenForCrtc(xcb_window_t rootWindow, xcb_randr_crtc_t crtc)
const;
216 QXcbScreen* findScreenForOutput(xcb_window_t rootWindow, xcb_randr_output_t output)
const;
217 QXcbVirtualDesktop* virtualDesktopForRootWindow(xcb_window_t rootWindow)
const;
218 void updateScreens(
const xcb_randr_notify_event_t *event);
219 bool checkOutputIsPrimary(xcb_window_t rootWindow, xcb_randr_output_t output);
220 void updateScreen(QXcbScreen *screen,
const xcb_randr_output_change_t &outputChange);
221 QXcbScreen *createScreen(QXcbVirtualDesktop *virtualDesktop,
222 const xcb_randr_output_change_t &outputChange,
223 xcb_randr_get_output_info_reply_t *outputInfo);
224 void destroyScreen(QXcbScreen *screen);
225 void initializeScreens(
bool initialized);
226 void initializeScreensWithoutXRandR(xcb_screen_iterator_t *it,
int screenNumber, QXcbScreen **primaryScreen);
227 void initializeScreensFromOutput(xcb_screen_iterator_t *it,
int screenNumber, QXcbScreen **primaryScreen);
229 QXcbVirtualDesktop* virtualDesktopForNumber(
int n)
const;
230 QXcbScreen* findScreenForMonitorInfo(
const QList<QPlatformScreen *> &screens, xcb_randr_monitor_info_t *monitorInfo);
231 void initializeScreensFromMonitor(xcb_screen_iterator_t *it,
int screenNumber, QXcbScreen **primaryScreen,
bool initialized);
233 bool compressEvent(xcb_generic_event_t *event)
const;
234 inline bool timeGreaterThan(xcb_timestamp_t a, xcb_timestamp_t b)
const
235 {
return static_cast<int32_t>(a - b) > 0 || b == XCB_CURRENT_TIME; }
237 void xi2SetupSlavePointerDevice(
void *info,
bool removeExisting =
true, QPointingDevice *master =
nullptr);
238 void xi2SetupDevices();
240 struct TouchDeviceData {
241 QPointingDevice *qtTouchDevice =
nullptr;
242 QHash<
int, QWindowSystemInterface::TouchPoint> touchPoints;
243 QHash<
int, QPointF> pointPressedPosition;
244 struct ValuatorClassInfo {
248 QXcbAtom::Atom label;
250 QList<ValuatorClassInfo> valuatorInfo;
253 QPointF firstPressedPosition;
254 QPointF firstPressedNormalPosition;
256 bool providesTouchOrientation =
false;
258 TouchDeviceData *populateTouchDevices(
void *info, QXcbScrollingDevicePrivate *scrollingDeviceP,
bool *used =
nullptr);
259 TouchDeviceData *touchDeviceForId(
int id);
260 void xi2HandleEvent(xcb_ge_event_t *event);
261 void xi2HandleGesturePinchEvent(
void *event);
262 void xi2HandleGestureSwipeEvent(
void *event);
263 void xi2HandleHierarchyEvent(
void *event);
264 void xi2HandleDeviceChangedEvent(
void *event);
265 void xi2ProcessTouch(
void *xiDevEvent, QXcbWindow *platformWindow);
266#if QT_CONFIG(tabletevent)
271 QPointingDevice::PointerType pointerType = QPointingDevice::PointerType::Unknown;
272 QInputDevice::DeviceType tool = QInputDevice::DeviceType::Stylus;
273 Qt::MouseButtons buttons;
275 bool inProximity =
false;
276 struct ValuatorClassInfo {
282 QHash<
int, ValuatorClassInfo> valuatorInfo;
284 friend class QTypeInfo<TabletData>;
285 friend class QTypeInfo<TabletData::ValuatorClassInfo>;
286 bool xi2HandleTabletEvent(
const void *event, TabletData *tabletData);
287 void xi2ReportTabletEvent(
const void *event, TabletData *tabletData);
288 QList<TabletData> m_tabletData;
289 TabletData *tabletDataForDevice(
int id);
291 void xi2HandleScrollEvent(
void *event,
const QPointingDevice *scrollingDevice);
292 void xi2UpdateScrollingDevice(QInputDevice *scrollingDevice);
293 QXcbScrollingDevice *scrollingDeviceForId(
int id);
295 static bool xi2GetValuatorValueIfSet(
const void *event,
int valuatorNum,
double *value);
297 QHash<
int, TouchDeviceData> m_touchDevices;
299 struct StartSystemMoveResizeInfo {
300 xcb_window_t window = XCB_NONE;
304 } m_startSystemMoveResizeInfo;
305 bool m_duringSystemMoveResize;
307 const bool m_canGrabServer;
308 const xcb_visualid_t m_defaultVisualId;
310 QList<QXcbVirtualDesktop *> m_virtualDesktops;
311 QList<QXcbScreen *> m_screens;
313 xcb_timestamp_t m_time = XCB_CURRENT_TIME;
314 xcb_timestamp_t m_netWmUserTime = XCB_CURRENT_TIME;
316 QXcbKeyboard *m_keyboard =
nullptr;
317#ifndef QT_NO_CLIPBOARD
318 QXcbClipboard *m_clipboard =
nullptr;
320#if QT_CONFIG(draganddrop)
321 QXcbDrag *m_drag =
nullptr;
323 QScopedPointer<QXcbWMSupport> m_wmSupport;
324 QXcbNativeInterface *m_nativeInterface =
nullptr;
326 QXcbEventQueue *m_eventQueue =
nullptr;
328 WindowMapper m_mapper;
330 Qt::MouseButtons m_buttonState;
331 Qt::MouseButton m_button = Qt::NoButton;
333 QXcbWindow *m_focusWindow =
nullptr;
334 QXcbWindow *m_mouseGrabber =
nullptr;
335 QXcbWindow *m_mousePressWindow =
nullptr;
337#if QT_CONFIG(gestures)
338 qreal m_lastPinchScale = 0;
341 xcb_window_t m_clientLeader = 0;
342 QByteArray m_startupId;
343 QXcbSystemTrayTracker *m_systemTrayTracker =
nullptr;
344 mutable QXcbGlIntegration *m_glIntegration =
nullptr;
345 mutable bool m_glIntegrationInitialized =
false;
346 bool m_xiGrab =
false;
347 QList<
int> m_xiMasterPointerIds;
348 QList<
int> m_xiSlavePointerIds;
350 xcb_window_t m_qtSelectionOwner = 0;
352 friend class QXcbEventQueue;
354 QTimer m_focusInTimer;