37static const int COMPOSITE_MAX_MAJOR = 0;
38static const int COMPOSITE_MAX_MINOR = 4;
39static const int DAMAGE_MAX_MAJOR = 1;
40static const int DAMAGE_MIN_MAJOR = 1;
41static const int SYNC_MAX_MAJOR = 3;
42static const int SYNC_MAX_MINOR = 0;
43static const int RANDR_MAX_MAJOR = 1;
44static const int RANDR_MAX_MINOR = 4;
45static const int RENDER_MAX_MAJOR = 0;
46static const int RENDER_MAX_MINOR = 11;
47static const int XFIXES_MAX_MAJOR = 5;
48static const int XFIXES_MAX_MINOR = 0;
54 return QList<QByteArray>({QByteArrayLiteral(
"QueryVersion"),
55 QByteArrayLiteral(
"Rectangles"),
56 QByteArrayLiteral(
"Mask"),
57 QByteArrayLiteral(
"Combine"),
58 QByteArrayLiteral(
"Offset"),
59 QByteArrayLiteral(
"Extents"),
60 QByteArrayLiteral(
"Input"),
61 QByteArrayLiteral(
"InputSelected"),
62 QByteArrayLiteral(
"GetRectangles")});
69 return QList<QByteArray>({QByteArrayLiteral(
"QueryVersion"),
71 QByteArrayLiteral(
"SetScreenConfig"),
73 QByteArrayLiteral(
"SelectInput"),
74 QByteArrayLiteral(
"GetScreenInfo"),
75 QByteArrayLiteral(
"GetScreenSizeRange"),
76 QByteArrayLiteral(
"SetScreenSize"),
77 QByteArrayLiteral(
"GetScreenResources"),
78 QByteArrayLiteral(
"GetOutputInfo"),
79 QByteArrayLiteral(
"ListOutputProperties"),
80 QByteArrayLiteral(
"QueryOutputProperty"),
81 QByteArrayLiteral(
"ConfigureOutputProperty"),
82 QByteArrayLiteral(
"ChangeOutputProperty"),
83 QByteArrayLiteral(
"DeleteOutputProperty"),
84 QByteArrayLiteral(
"GetOutputproperty"),
85 QByteArrayLiteral(
"CreateMode"),
86 QByteArrayLiteral(
"DestroyMode"),
87 QByteArrayLiteral(
"AddOutputMode"),
88 QByteArrayLiteral(
"DeleteOutputMode"),
89 QByteArrayLiteral(
"GetCrtcInfo"),
90 QByteArrayLiteral(
"SetCrtcConfig"),
91 QByteArrayLiteral(
"GetCrtcGammaSize"),
92 QByteArrayLiteral(
"GetCrtcGamma"),
93 QByteArrayLiteral(
"SetCrtcGamma"),
94 QByteArrayLiteral(
"GetScreenResourcesCurrent"),
95 QByteArrayLiteral(
"SetCrtcTransform"),
96 QByteArrayLiteral(
"GetCrtcTransform"),
97 QByteArrayLiteral(
"GetPanning"),
98 QByteArrayLiteral(
"SetPanning"),
99 QByteArrayLiteral(
"SetOutputPrimary"),
100 QByteArrayLiteral(
"GetOutputPrimary"),
101 QByteArrayLiteral(
"GetProviders"),
102 QByteArrayLiteral(
"GetProviderInfo"),
103 QByteArrayLiteral(
"SetProviderOffloadSink"),
104 QByteArrayLiteral(
"SetProviderOutputSource"),
105 QByteArrayLiteral(
"ListProviderProperties"),
106 QByteArrayLiteral(
"QueryProviderProperty"),
107 QByteArrayLiteral(
"ConfigureProviderroperty"),
108 QByteArrayLiteral(
"ChangeProviderProperty"),
109 QByteArrayLiteral(
"DeleteProviderProperty"),
110 QByteArrayLiteral(
"GetProviderProperty")});
117 return QList<QByteArray>({QByteArrayLiteral(
"BadOutput"),
118 QByteArrayLiteral(
"BadCrtc"),
119 QByteArrayLiteral(
"BadMode"),
120 QByteArrayLiteral(
"BadProvider")});
127 return QList<QByteArray>({QByteArrayLiteral(
"QueryVersion"),
128 QByteArrayLiteral(
"Create"),
129 QByteArrayLiteral(
"Destroy"),
130 QByteArrayLiteral(
"Subtract"),
131 QByteArrayLiteral(
"Add")});
138 return QList<QByteArray>({QByteArrayLiteral(
"BadDamage")});
145 return QList<QByteArray>({QByteArrayLiteral(
"QueryVersion"),
146 QByteArrayLiteral(
"RedirectWindow"),
147 QByteArrayLiteral(
"RedirectSubwindows"),
148 QByteArrayLiteral(
"UnredirectWindow"),
149 QByteArrayLiteral(
"UnredirectSubwindows"),
150 QByteArrayLiteral(
"CreateRegionFromBorderClip"),
151 QByteArrayLiteral(
"NameWindowPixmap"),
152 QByteArrayLiteral(
"GetOverlayWindow"),
153 QByteArrayLiteral(
"ReleaseOverlayWindow")});
160 return QList<QByteArray>({QByteArrayLiteral(
"QueryVersion"),
161 QByteArrayLiteral(
"ChangeSaveSet"),
162 QByteArrayLiteral(
"SelectSelectionInput"),
163 QByteArrayLiteral(
"SelectCursorInput"),
164 QByteArrayLiteral(
"GetCursorImage"),
165 QByteArrayLiteral(
"CreateRegion"),
166 QByteArrayLiteral(
"CreateRegionFromBitmap"),
167 QByteArrayLiteral(
"CreateRegionFromWindow"),
168 QByteArrayLiteral(
"CreateRegionFromGc"),
169 QByteArrayLiteral(
"CreateRegionFromPicture"),
170 QByteArrayLiteral(
"DestroyRegion"),
171 QByteArrayLiteral(
"SetRegion"),
172 QByteArrayLiteral(
"CopyRegion"),
173 QByteArrayLiteral(
"UnionRegion"),
174 QByteArrayLiteral(
"IntersectRegion"),
175 QByteArrayLiteral(
"SubtractRegion"),
176 QByteArrayLiteral(
"InvertRegion"),
177 QByteArrayLiteral(
"TranslateRegion"),
178 QByteArrayLiteral(
"RegionExtents"),
179 QByteArrayLiteral(
"FetchRegion"),
180 QByteArrayLiteral(
"SetGcClipRegion"),
181 QByteArrayLiteral(
"SetWindowShapeRegion"),
182 QByteArrayLiteral(
"SetPictureClipRegion"),
183 QByteArrayLiteral(
"SetCursorName"),
184 QByteArrayLiteral(
"GetCursorName"),
185 QByteArrayLiteral(
"GetCursorImageAndName"),
186 QByteArrayLiteral(
"ChangeCursor"),
187 QByteArrayLiteral(
"ChangeCursorByName"),
188 QByteArrayLiteral(
"ExpandRegion"),
189 QByteArrayLiteral(
"HideCursor"),
190 QByteArrayLiteral(
"ShowCursor"),
191 QByteArrayLiteral(
"CreatePointerBarrier"),
192 QByteArrayLiteral(
"DeletePointerBarrier")});
199 return QList<QByteArray>({QByteArrayLiteral(
"BadRegion")});
206 return QList<QByteArray>({QByteArrayLiteral(
"QueryVersion"),
207 QByteArrayLiteral(
"QueryPictFormats"),
208 QByteArrayLiteral(
"QueryPictIndexValues"),
209 QByteArrayLiteral(
"CreatePicture"),
210 QByteArrayLiteral(
"ChangePicture"),
211 QByteArrayLiteral(
"SetPictureClipRectangles"),
212 QByteArrayLiteral(
"FreePicture"),
213 QByteArrayLiteral(
"Composite"),
214 QByteArrayLiteral(
"Trapezoids"),
215 QByteArrayLiteral(
"Triangles"),
216 QByteArrayLiteral(
"TriStrip"),
217 QByteArrayLiteral(
"TriFan"),
218 QByteArrayLiteral(
"CreateGlyphSet"),
219 QByteArrayLiteral(
"ReferenceGlyphSet"),
220 QByteArrayLiteral(
"FreeGlyphSet"),
221 QByteArrayLiteral(
"AddGlyphs"),
222 QByteArrayLiteral(
"FreeGlyphs"),
223 QByteArrayLiteral(
"CompositeGlyphs8"),
224 QByteArrayLiteral(
"CompositeGlyphs16"),
225 QByteArrayLiteral(
"CompositeGlyphs32"),
226 QByteArrayLiteral(
"FillRectangles"),
227 QByteArrayLiteral(
"CreateCursor"),
228 QByteArrayLiteral(
"SetPictureTransform"),
229 QByteArrayLiteral(
"QueryFilters"),
230 QByteArrayLiteral(
"SetPictureFilter"),
231 QByteArrayLiteral(
"CreateAnimCursor"),
232 QByteArrayLiteral(
"AddTraps"),
233 QByteArrayLiteral(
"CreateSolidFill"),
234 QByteArrayLiteral(
"CreateLinearGradient"),
235 QByteArrayLiteral(
"CreateRadialGradient"),
236 QByteArrayLiteral(
"CreateConicalGradient")});
243 return QList<QByteArray>({QByteArrayLiteral(
"Initialize"),
244 QByteArrayLiteral(
"ListSystemCounters"),
245 QByteArrayLiteral(
"CreateCounter"),
246 QByteArrayLiteral(
"DestroyCounter"),
247 QByteArrayLiteral(
"QueryCounter"),
248 QByteArrayLiteral(
"Await"),
249 QByteArrayLiteral(
"ChangeCounter"),
250 QByteArrayLiteral(
"SetCounter"),
251 QByteArrayLiteral(
"CreateAlarm"),
252 QByteArrayLiteral(
"ChangeAlarm"),
253 QByteArrayLiteral(
"DestroyAlarm"),
254 QByteArrayLiteral(
"QueryAlarm"),
255 QByteArrayLiteral(
"SetPriority"),
256 QByteArrayLiteral(
"GetPriority"),
257 QByteArrayLiteral(
"CreateFence"),
258 QByteArrayLiteral(
"TriggerFence"),
259 QByteArrayLiteral(
"ResetFence"),
260 QByteArrayLiteral(
"DestroyFence"),
261 QByteArrayLiteral(
"QueryFence"),
262 QByteArrayLiteral(
"AwaitFence")});
265static QList<QByteArray> glxOpCodes()
267 return QList<QByteArray>{
268 QByteArrayLiteral(
""),
269 QByteArrayLiteral(
"Render"),
270 QByteArrayLiteral(
"RenderLarge"),
271 QByteArrayLiteral(
"CreateContext"),
272 QByteArrayLiteral(
"DestroyContext"),
273 QByteArrayLiteral(
"MakeCurrent"),
274 QByteArrayLiteral(
"IsDirect"),
275 QByteArrayLiteral(
"QueryVersion"),
276 QByteArrayLiteral(
"WaitGL"),
277 QByteArrayLiteral(
"WaitX"),
278 QByteArrayLiteral(
"CopyContext"),
279 QByteArrayLiteral(
"SwapBuffers"),
280 QByteArrayLiteral(
"UseXFont"),
281 QByteArrayLiteral(
"CreateGLXPixmap"),
282 QByteArrayLiteral(
"GetVisualConfigs"),
283 QByteArrayLiteral(
"DestroyGLXPixmap"),
284 QByteArrayLiteral(
"VendorPrivate"),
285 QByteArrayLiteral(
"VendorPrivateWithReply"),
286 QByteArrayLiteral(
"QueryExtensionsString"),
287 QByteArrayLiteral(
"QueryServerString"),
288 QByteArrayLiteral(
"ClientInfo"),
289 QByteArrayLiteral(
"GetFBConfigs"),
290 QByteArrayLiteral(
"CreatePixmap"),
291 QByteArrayLiteral(
"DestroyPixmap"),
292 QByteArrayLiteral(
"CreateNewContext"),
293 QByteArrayLiteral(
"QueryContext"),
294 QByteArrayLiteral(
"MakeContextCurrent"),
295 QByteArrayLiteral(
"CreatePbuffer"),
296 QByteArrayLiteral(
"DestroyPbuffer"),
297 QByteArrayLiteral(
"GetDrawableAttributes"),
298 QByteArrayLiteral(
"ChangeDrawableAttributes"),
299 QByteArrayLiteral(
"CreateWindow"),
300 QByteArrayLiteral(
"DeleteWindow"),
301 QByteArrayLiteral(
"SetClientInfoARB"),
302 QByteArrayLiteral(
"CreateContextAttribsARB"),
303 QByteArrayLiteral(
"SetClientInfo2ARB")
309static QList<QByteArray> glxErrorCodes()
311 return QList<QByteArray>{
312 QByteArrayLiteral(
"BadContext"),
313 QByteArrayLiteral(
"BadContextState"),
314 QByteArrayLiteral(
"BadDrawable"),
315 QByteArrayLiteral(
"BadPixmap"),
316 QByteArrayLiteral(
"BadContextTag"),
317 QByteArrayLiteral(
"BadCurrentWindow"),
318 QByteArrayLiteral(
"BadRenderRequest"),
319 QByteArrayLiteral(
"BadLargeRequest"),
320 QByteArrayLiteral(
"UnsupportedPrivateRequest"),
321 QByteArrayLiteral(
"BadFBConfig"),
322 QByteArrayLiteral(
"BadPbuffer"),
323 QByteArrayLiteral(
"BadCurrentDrawable"),
324 QByteArrayLiteral(
"BadWindow"),
325 QByteArrayLiteral(
"GLXBadProfileARB")};
337template<
typename reply,
typename T,
typename F>
338void Extensions::initVersion(T cookie, F f,
ExtensionData *dataToFill)
344Extensions *Extensions::s_self =
nullptr;
360Extensions::Extensions()
365Extensions::~Extensions()
369void Extensions::init()
373 xcb_prefetch_extension_data(c, &xcb_shape_id);
374 xcb_prefetch_extension_data(c, &xcb_randr_id);
375 xcb_prefetch_extension_data(c, &xcb_damage_id);
376 xcb_prefetch_extension_data(c, &xcb_composite_id);
377 xcb_prefetch_extension_data(c, &xcb_xfixes_id);
378 xcb_prefetch_extension_data(c, &xcb_render_id);
379 xcb_prefetch_extension_data(c, &xcb_sync_id);
380 xcb_prefetch_extension_data(c, &xcb_glx_id);
382 m_shape.
name = QByteArray(
"SHAPE");
383 m_randr.
name = QByteArray(
"RANDR");
384 m_damage.
name = QByteArray(
"DAMAGE");
385 m_composite.
name = QByteArray(
"Composite");
386 m_fixes.
name = QByteArray(
"XFIXES");
387 m_render.
name = QByteArray(
"RENDER");
388 m_sync.
name = QByteArray(
"SYNC");
389 m_glx.
name = QByteArray(
"GLX");
405 extensionQueryReply(xcb_get_extension_data(c, &xcb_shape_id), &m_shape);
406 extensionQueryReply(xcb_get_extension_data(c, &xcb_randr_id), &m_randr);
407 extensionQueryReply(xcb_get_extension_data(c, &xcb_damage_id), &m_damage);
408 extensionQueryReply(xcb_get_extension_data(c, &xcb_composite_id), &m_composite);
409 extensionQueryReply(xcb_get_extension_data(c, &xcb_xfixes_id), &m_fixes);
410 extensionQueryReply(xcb_get_extension_data(c, &xcb_render_id), &m_render);
411 extensionQueryReply(xcb_get_extension_data(c, &xcb_sync_id), &m_sync);
412 extensionQueryReply(xcb_get_extension_data(c, &xcb_glx_id), &m_glx);
415 xcb_shape_query_version_cookie_t shapeVersion;
416 xcb_randr_query_version_cookie_t randrVersion;
417 xcb_damage_query_version_cookie_t damageVersion;
418 xcb_composite_query_version_cookie_t compositeVersion;
419 xcb_xfixes_query_version_cookie_t xfixesVersion;
420 xcb_render_query_version_cookie_t renderVersion;
421 xcb_sync_initialize_cookie_t syncVersion;
423 shapeVersion = xcb_shape_query_version_unchecked(c);
426 randrVersion = xcb_randr_query_version_unchecked(c, RANDR_MAX_MAJOR, RANDR_MAX_MINOR);
430 damageVersion = xcb_damage_query_version_unchecked(c, DAMAGE_MAX_MAJOR, DAMAGE_MIN_MAJOR);
433 compositeVersion = xcb_composite_query_version_unchecked(c, COMPOSITE_MAX_MAJOR, COMPOSITE_MAX_MINOR);
436 xfixesVersion = xcb_xfixes_query_version_unchecked(c, XFIXES_MAX_MAJOR, XFIXES_MAX_MINOR);
439 renderVersion = xcb_render_query_version_unchecked(c, RENDER_MAX_MAJOR, RENDER_MAX_MINOR);
442 syncVersion = xcb_sync_initialize(c, SYNC_MAX_MAJOR, SYNC_MAX_MINOR);
446 initVersion<xcb_shape_query_version_reply_t>(shapeVersion, &xcb_shape_query_version_reply, &m_shape);
449 initVersion<xcb_randr_query_version_reply_t>(randrVersion, &xcb_randr_query_version_reply, &m_randr);
452 initVersion<xcb_damage_query_version_reply_t>(damageVersion, &xcb_damage_query_version_reply, &m_damage);
455 initVersion<xcb_composite_query_version_reply_t>(compositeVersion, &xcb_composite_query_version_reply, &m_composite);
458 initVersion<xcb_xfixes_query_version_reply_t>(xfixesVersion, &xcb_xfixes_query_version_reply, &m_fixes);
461 initVersion<xcb_render_query_version_reply_t>(renderVersion, &xcb_render_query_version_reply, &m_render);
464 initVersion<xcb_sync_initialize_reply_t>(syncVersion, &xcb_sync_initialize_reply, &m_sync);
466 qCDebug(KWIN_CORE) <<
"Extensions: shape: 0x" << QString::number(m_shape.
version, 16)
467 <<
" composite: 0x" << QString::number(m_composite.
version, 16)
468 <<
" render: 0x" << QString::number(m_render.
version, 16)
469 <<
" fixes: 0x" << QString::number(m_fixes.
version, 16)
470 <<
" randr: 0x" << QString::number(m_randr.
version, 16)
471 <<
" sync: 0x" << QString::number(m_sync.
version, 16)
472 <<
" damage: 0x " << QString::number(m_damage.
version, 16);
475void Extensions::extensionQueryReply(
const xcb_query_extension_reply_t *extension, ExtensionData *dataToFill)
480 dataToFill->present = extension->present;
481 dataToFill->eventBase = extension->first_event;
482 dataToFill->errorBase = extension->first_error;
483 dataToFill->majorOpcode = extension->major_opcode;
488 return m_damage.
eventBase + XCB_DAMAGE_NOTIFY;
501 return extents->bounding_shaped > 0;
506 return m_composite.
version >= 0x03;
511 return m_fixes.
version >= 0x30;
516 return m_fixes.
eventBase + XCB_XFIXES_CURSOR_NOTIFY;
521 return m_fixes.
eventBase + XCB_XFIXES_SELECTION_NOTIFY;
526 return m_shape.
version >= 0x11;
531 return m_randr.
eventBase + XCB_RANDR_SCREEN_CHANGE_NOTIFY;
536 return m_shape.
eventBase + XCB_SHAPE_NOTIFY;
541 return m_sync.
eventBase + XCB_SYNC_ALARM_NOTIFY;
563 , m_segment(XCB_NONE)
565 , m_pixmapFormat(XCB_IMAGE_FORMAT_XY_BITMAP)
580 const xcb_query_extension_reply_t *ext = xcb_get_extension_data(
connection(), &xcb_shm_id);
581 if (!ext || !ext->present) {
582 qCDebug(KWIN_CORE) <<
"SHM extension not available";
586 xcb_shm_query_version_unchecked(
connection()),
nullptr));
588 qCDebug(KWIN_CORE) <<
"Failed to get SHM extension version information";
591 m_pixmapFormat =
version->pixmap_format;
592 const int MAXSIZE = 4096 * 2048 * 4;
593 m_shmId = shmget(IPC_PRIVATE, MAXSIZE, IPC_CREAT | 0600);
595 qCDebug(KWIN_CORE) <<
"Failed to allocate SHM segment";
598 m_buffer = shmat(m_shmId,
nullptr, 0 );
599 if (-1 ==
reinterpret_cast<long>(m_buffer)) {
600 qCDebug(KWIN_CORE) <<
"Failed to attach SHM segment";
601 shmctl(m_shmId, IPC_RMID,
nullptr);
604 shmctl(m_shmId, IPC_RMID,
nullptr);
607 const xcb_void_cookie_t cookie = xcb_shm_attach_checked(
connection(), m_segment, m_shmId,
false);
608 UniqueCPtr<xcb_generic_error_t> error(xcb_request_check(
connection(), cookie));
610 qCDebug(KWIN_CORE) <<
"xcb_shm_attach error: " << error->error_code;
621 if (!qFuzzyIsNull(std::fmod(kwinApp()->xwaylandScale() * value, 1))) {
622 qCDebug(KWIN_CORE) <<
"precision lost! floating value sent to X" << kwinApp()->xwaylandScale() * value;
624 return std::round(kwinApp()->xwaylandScale() * value);
634 return value / kwinApp()->xwaylandScale();
647static qreal nativeFloor(qreal value)
649 return std::floor(value * kwinApp()->xwaylandScale()) / kwinApp()->xwaylandScale();
652QRectF nativeFloor(
const QRectF &rect)
656 return output->mapToGlobal(QRectF(nativeFloor(outputRect.left()), nativeFloor(outputRect.top()),
657 nativeFloor(outputRect.width()), nativeFloor(outputRect.height())));