102 const QList<QXcbVirtualDesktop *> &
virtualDesktops()
const {
return m_virtualDesktops; }
103 const QList<QXcbScreen *> &
screens()
const {
return m_screens; }
109 const xcb_format_t *formatForDepth(uint8_t
depth)
const;
115#if Q_BYTE_ORDER == Q_BIG_ENDIAN
116 return setup()->image_byte_order != XCB_IMAGE_ORDER_MSB_FIRST;
118 return setup()->image_byte_order != XCB_IMAGE_ORDER_LSB_FIRST;
124#ifndef QT_NO_CLIPBOARD
127#if QT_CONFIG(draganddrop)
128 QXcbDrag *drag()
const {
return m_drag; }
132 xcb_window_t rootWindow();
133 xcb_window_t clientLeader();
140 void handleXcbError(xcb_generic_error_t *
error);
141 void printXcbError(
const char *
message, xcb_generic_error_t *
error);
142 void handleXcbEvent(xcb_generic_event_t *
event);
144 xcb_generic_event_t *
event)
const;
147 void removeWindowEventListener(xcb_window_t
id);
149 QXcbWindow *platformWindowFromId(xcb_window_t
id);
151 inline xcb_timestamp_t
time()
const {
return m_time; }
152 inline void setTime(xcb_timestamp_t
t) {
if (timeGreaterThan(
t, m_time)) m_time =
t; }
155 inline void setNetWmUserTime(xcb_timestamp_t
t) {
if (timeGreaterThan(
t, m_netWmUserTime)) m_netWmUserTime =
t; }
157 xcb_timestamp_t getTimestamp();
158 xcb_window_t selectionOwner(xcb_atom_t atom)
const;
159 xcb_window_t qtSelectionOwner();
167 void setFocusWindow(
QWindow *);
179 QString windowManagerName()
const;
189 void xi2SelectStateEvents();
190 void xi2SelectDeviceEvents(xcb_window_t
window);
191 bool xi2SetMouseGrabEnabled(xcb_window_t
w,
bool grab);
194 void xi2UpdateScrollingDevices();
195 bool isTouchScreen(
int id);
197 bool startSystemMoveResizeForTouch(xcb_window_t
window,
int edges);
198 void abortSystemMoveResize(xcb_window_t
window);
199 bool isDuringSystemMoveResize()
const;
200 void setDuringSystemMoveResize(
bool during);
202 bool canGrab()
const {
return m_canGrabServer; }
207 void processXcbEvents(QEventLoop::ProcessEventsFlags
flags);
215 void xrandrSelectEvents();
216 QXcbScreen* findScreenForCrtc(xcb_window_t rootWindow, xcb_randr_crtc_t crtc)
const;
217 QXcbScreen* findScreenForOutput(xcb_window_t rootWindow, xcb_randr_output_t
output)
const;
219 void updateScreens(
const xcb_randr_notify_event_t *
event);
220 bool checkOutputIsPrimary(xcb_window_t rootWindow, xcb_randr_output_t
output);
221 void updateScreen(
QXcbScreen *
screen,
const xcb_randr_output_change_t &outputChange);
223 const xcb_randr_output_change_t &outputChange,
224 xcb_randr_get_output_info_reply_t *outputInfo);
226 void initializeScreens(
bool initialized);
227 void initializeScreensWithoutXRandR(xcb_screen_iterator_t *
it,
int screenNumber,
QXcbScreen **primaryScreen);
228 void initializeScreensFromOutput(xcb_screen_iterator_t *
it,
int screenNumber,
QXcbScreen **primaryScreen);
230 void updateScreen_monitor(
QXcbScreen *
screen, xcb_randr_monitor_info_t *monitorInfo, xcb_timestamp_t timestamp = XCB_NONE);
232 xcb_randr_monitor_info_t *monitorInfo, xcb_timestamp_t timestamp = XCB_NONE);
234 QXcbScreen* findScreenForMonitorInfo(
const QList<QPlatformScreen *> &screens, xcb_randr_monitor_info_t *monitorInfo);
235 void initializeScreensFromMonitor(xcb_screen_iterator_t *
it,
int screenNumber,
QXcbScreen **primaryScreen,
bool initialized);
237 bool compressEvent(xcb_generic_event_t *
event)
const;
238 inline bool timeGreaterThan(xcb_timestamp_t
a, xcb_timestamp_t
b)
const
239 {
return static_cast<int32_t
>(
a -
b) > 0 ||
b == XCB_CURRENT_TIME; }
241 void xi2SetupSlavePointerDevice(
void *
info,
bool removeExisting =
true,
QPointingDevice *master =
nullptr);
242 void xi2SetupDevices();
244 struct TouchDeviceData {
246 QHash<int, QWindowSystemInterface::TouchPoint> touchPoints;
247 QHash<int, QPointF> pointPressedPosition;
254 QList<ValuatorClassInfo> valuatorInfo;
258 QPointF firstPressedNormalPosition;
260 bool providesTouchOrientation =
false;
263 TouchDeviceData *touchDeviceForId(
int id);
264 void xi2HandleEvent(xcb_ge_event_t *
event);
265 void xi2HandleGesturePinchEvent(
void *
event);
266 void xi2HandleGestureSwipeEvent(
void *
event);
267 void xi2HandleHierarchyEvent(
void *
event);
268 void xi2HandleDeviceChangedEvent(
void *
event);
269 void xi2ProcessTouch(
void *xiDevEvent,
QXcbWindow *platformWindow);
270#if QT_CONFIG(tabletevent)
277 Qt::MouseButtons buttons;
279 bool inProximity =
false;
280 struct ValuatorClassInfo {
286 QHash<int, ValuatorClassInfo> valuatorInfo;
289 friend class QTypeInfo<TabletData::ValuatorClassInfo>;
290 bool xi2HandleTabletEvent(const void *event, TabletData *tabletData);
291 void xi2ReportTabletEvent(const void *event, TabletData *tabletData);
292 QList<TabletData> m_tabletData;
293 TabletData *tabletDataForDevice(int id);
295 void xi2HandleScrollEvent(void *event, const QPointingDevice *scrollingDevice);
296 void xi2UpdateScrollingDevice(QInputDevice *scrollingDevice);
299 static bool xi2GetValuatorValueIfSet(const void *event, int valuatorNum, double *value);
301 QHash<int, TouchDeviceData> m_touchDevices;
303 struct StartSystemMoveResizeInfo {
304 xcb_window_t
window = XCB_NONE;
308 } m_startSystemMoveResizeInfo;
309 bool m_duringSystemMoveResize;
311 const bool m_canGrabServer;
312 const xcb_visualid_t m_defaultVisualId;
314 QList<QXcbVirtualDesktop *> m_virtualDesktops;
315 QList<QXcbScreen *> m_screens;
317 xcb_timestamp_t m_time = XCB_CURRENT_TIME;
318 xcb_timestamp_t m_netWmUserTime = XCB_CURRENT_TIME;
321#ifndef QT_NO_CLIPBOARD
324#if QT_CONFIG(draganddrop)
327 QScopedPointer<QXcbWMSupport> m_wmSupport;
334 Qt::MouseButtons m_buttonState;
341#if QT_CONFIG(gestures)
342 qreal m_lastPinchScale = 0;
345 xcb_window_t m_clientLeader = 0;
349 mutable bool m_glIntegrationInitialized =
false;
350 bool m_xiGrab =
false;
351 QList<int> m_xiMasterPointerIds;
352 QList<int> m_xiSlavePointerIds;
354 xcb_window_t m_qtSelectionOwner = 0;