Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qxcbintegration.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qxcbintegration.h"
5#include "qxcbconnection.h"
6#include "qxcbscreen.h"
7#include "qxcbwindow.h"
8#include "qxcbcursor.h"
9#include "qxcbkeyboard.h"
10#include "qxcbbackingstore.h"
11#include "qxcbnativeinterface.h"
12#include "qxcbclipboard.h"
13#include "qxcbeventqueue.h"
14#include "qxcbeventdispatcher.h"
15#if QT_CONFIG(draganddrop)
16#include "qxcbdrag.h"
17#endif
18#include "qxcbglintegration.h"
19
20#ifndef QT_NO_SESSIONMANAGER
21#include "qxcbsessionmanager.h"
22#endif
23#include "qxcbxsettings.h"
24
25#include <xcb/xcb.h>
26
27#include <QtGui/private/qgenericunixfontdatabase_p.h>
28#include <QtGui/private/qgenericunixservices_p.h>
29
30#include <stdio.h>
31
32#include <QtGui/private/qguiapplication_p.h>
33
34#if QT_CONFIG(xcb_xlib)
35#define register /* C++17 deprecated register */
36#include <X11/Xlib.h>
37#undef register
38#endif
39#if QT_CONFIG(xcb_native_painting)
40#include "qxcbnativepainting.h"
41#include "qpixmap_x11_p.h"
42#include "qbackingstore_x11_p.h"
43#endif
44
45#include <qpa/qplatforminputcontextfactory_p.h>
46#include <private/qgenericunixthemes_p.h>
47#include <qpa/qplatforminputcontext.h>
48
49#include <QtGui/QOpenGLContext>
50#include <QtGui/QScreen>
51#include <QtGui/QOffscreenSurface>
52#if QT_CONFIG(accessibility)
53#include <qpa/qplatformaccessibility.h>
54#if QT_CONFIG(accessibility_atspi_bridge)
55#include <QtGui/private/qspiaccessiblebridge_p.h>
56#endif
57#endif
58
59#include <QtCore/QFileInfo>
60
61#if QT_CONFIG(vulkan)
62#include "qxcbvulkaninstance.h"
63#include "qxcbvulkanwindow.h"
64#endif
65
67
68using namespace Qt::StringLiterals;
69
70// Find out if our parent process is gdb by looking at the 'exe' symlink under /proc,.
71// or, for older Linuxes, read out 'cmdline'.
73{
74#if defined(QT_DEBUG) && defined(Q_OS_LINUX)
75 const QString parentProc = "/proc/"_L1 + QString::number(getppid());
76 const QFileInfo parentProcExe(parentProc + "/exe"_L1);
77 if (parentProcExe.isSymLink())
78 return parentProcExe.symLinkTarget().endsWith("/gdb"_L1);
79 QFile f(parentProc + "/cmdline"_L1);
80 if (!f.open(QIODevice::ReadOnly))
81 return false;
83 char c;
84 while (f.getChar(&c) && c) {
85 if (c == '/')
86 s.clear();
87 else
88 s += c;
89 }
90 return s == "gdb";
91#else
92 return false;
93#endif
94}
95
97{
98public:
100};
101
102
103QXcbIntegration *QXcbIntegration::m_instance = nullptr;
104
105QXcbIntegration::QXcbIntegration(const QStringList &parameters, int &argc, char **argv)
106 : m_services(new QXcbUnixServices)
107 , m_instanceName(nullptr)
108 , m_canGrab(true)
109 , m_defaultVisualId(UINT_MAX)
110{
111 Q_UNUSED(parameters);
112
113 m_instance = this;
114 qApp->setAttribute(Qt::AA_CompressHighFrequencyEvents, true);
115
116 qRegisterMetaType<QXcbWindow*>();
117#if QT_CONFIG(xcb_xlib)
118 XInitThreads();
119#endif
120 m_nativeInterface.reset(new QXcbNativeInterface);
121
122 // Parse arguments
123 const char *displayName = nullptr;
124 bool noGrabArg = false;
125 bool doGrabArg = false;
126 if (argc) {
127 int j = 1;
128 for (int i = 1; i < argc; i++) {
129 QByteArray arg(argv[i]);
130 if (arg.startsWith("--"))
131 arg.remove(0, 1);
132 if (arg == "-display" && i < argc - 1)
133 displayName = argv[++i];
134 else if (arg == "-name" && i < argc - 1)
135 m_instanceName = argv[++i];
136 else if (arg == "-nograb")
137 noGrabArg = true;
138 else if (arg == "-dograb")
139 doGrabArg = true;
140 else if (arg == "-visual" && i < argc - 1) {
141 bool ok = false;
142 m_defaultVisualId = QByteArray(argv[++i]).toUInt(&ok, 0);
143 if (!ok)
144 m_defaultVisualId = UINT_MAX;
145 }
146 else
147 argv[j++] = argv[i];
148 }
149 argc = j;
150 } // argc
151
152 bool underDebugger = runningUnderDebugger();
153 if (noGrabArg && doGrabArg && underDebugger) {
154 qWarning("Both -nograb and -dograb command line arguments specified. Please pick one. -nograb takes precedence");
155 doGrabArg = false;
156 }
157
158#if defined(QT_DEBUG)
159 if (!noGrabArg && !doGrabArg && underDebugger) {
160 qCDebug(lcQpaXcb, "Qt: gdb: -nograb added to command-line options.\n"
161 "\t Use the -dograb option to enforce grabbing.");
162 }
163#endif
164 m_canGrab = (!underDebugger && !noGrabArg) || (underDebugger && doGrabArg);
165
166 static bool canNotGrabEnv = qEnvironmentVariableIsSet("QT_XCB_NO_GRAB_SERVER");
167 if (canNotGrabEnv)
168 m_canGrab = false;
169
170 m_connection = new QXcbConnection(m_nativeInterface.data(), m_canGrab, m_defaultVisualId, displayName);
171 if (!m_connection->isConnected()) {
172 delete m_connection;
173 m_connection = nullptr;
174 return;
175 }
176
177 m_fontDatabase.reset(new QGenericUnixFontDatabase());
178
179#if QT_CONFIG(xcb_native_painting)
180 if (nativePaintingEnabled()) {
181 qCDebug(lcQpaXcb, "QXCB USING NATIVE PAINTING");
183 }
184#endif
185}
186
188{
189 delete m_connection;
190 m_connection = nullptr;
191 m_instance = nullptr;
192}
193
195{
196#if QT_CONFIG(xcb_native_painting)
198 return new QX11PlatformPixmap(type);
199#endif
200
202}
203
205{
206 QXcbGlIntegration *glIntegration = nullptr;
207 const bool isTrayIconWindow = QXcbWindow::isTrayIconWindow(window);
208 if (window->type() != Qt::Desktop && !isTrayIconWindow) {
209 if (window->supportsOpenGL()) {
210 glIntegration = connection()->glIntegration();
211 if (glIntegration) {
212 QXcbWindow *xcbWindow = glIntegration->createWindow(window);
213 xcbWindow->create();
214 return xcbWindow;
215 }
216#if QT_CONFIG(vulkan)
217 } else if (window->surfaceType() == QSurface::VulkanSurface) {
218 QXcbWindow *xcbWindow = new QXcbVulkanWindow(window);
219 xcbWindow->create();
220 return xcbWindow;
221#endif
222 }
223 }
224
225 Q_ASSERT(window->type() == Qt::Desktop || isTrayIconWindow || !window->supportsOpenGL()
226 || (!glIntegration && window->surfaceType() == QSurface::RasterGLSurface)); // for VNC
227 QXcbWindow *xcbWindow = new QXcbWindow(window);
228 xcbWindow->create();
229 return xcbWindow;
230}
231
233{
234 return new QXcbForeignWindow(window, nativeHandle);
235}
236
237#ifndef QT_NO_OPENGL
239{
240 QXcbGlIntegration *glIntegration = m_connection->glIntegration();
241 if (!glIntegration) {
242 qWarning("QXcbIntegration: Cannot create platform OpenGL context, neither GLX nor EGL are enabled");
243 return nullptr;
244 }
245 return glIntegration->createPlatformOpenGLContext(context);
246}
247
248# if QT_CONFIG(xcb_glx_plugin)
249QOpenGLContext *QXcbIntegration::createOpenGLContext(GLXContext context, void *visualInfo, QOpenGLContext *shareContext) const
250{
251 using namespace QNativeInterface::Private;
252 if (auto *glxIntegration = dynamic_cast<QGLXIntegration*>(m_connection->glIntegration()))
253 return glxIntegration->createOpenGLContext(context, visualInfo, shareContext);
254 else
255 return nullptr;
256}
257# endif
258
259#if QT_CONFIG(egl)
260QOpenGLContext *QXcbIntegration::createOpenGLContext(EGLContext context, EGLDisplay display, QOpenGLContext *shareContext) const
261{
262 using namespace QNativeInterface::Private;
263 if (auto *eglIntegration = dynamic_cast<QEGLIntegration*>(m_connection->glIntegration()))
264 return eglIntegration->createOpenGLContext(context, display, shareContext);
265 else
266 return nullptr;
267}
268#endif
269
270#endif // QT_NO_OPENGL
271
273{
274 QPlatformBackingStore *backingStore = nullptr;
275
276 const bool isTrayIconWindow = QXcbWindow::isTrayIconWindow(window);
277 if (isTrayIconWindow) {
278 backingStore = new QXcbSystemTrayBackingStore(window);
279#if QT_CONFIG(xcb_native_painting)
280 } else if (nativePaintingEnabled()) {
281 backingStore = new QXcbNativeBackingStore(window);
282#endif
283 } else {
284 backingStore = new QXcbBackingStore(window);
285 }
286 Q_ASSERT(backingStore);
287 return backingStore;
288}
289
291{
292 QXcbScreen *screen = static_cast<QXcbScreen *>(surface->screen()->handle());
293 QXcbGlIntegration *glIntegration = screen->connection()->glIntegration();
294 if (!glIntegration) {
295 qWarning("QXcbIntegration: Cannot create platform offscreen surface, neither GLX nor EGL are enabled");
296 return nullptr;
297 }
298 return glIntegration->createPlatformOffscreenSurface(surface);
299}
300
302{
303 switch (cap) {
304 case OpenGL:
305 case ThreadedOpenGL:
306 {
307 if (const auto *integration = connection()->glIntegration())
308 return cap != ThreadedOpenGL || integration->supportsThreadedOpenGL();
309 return false;
310 }
311
312 case ThreadedPixmaps:
313 case WindowMasks:
314 case MultipleWindows:
315 case ForeignWindows:
316 case SyncState:
317 case RasterGLSurface:
318 return true;
319
321 {
322 return m_connection->glIntegration()
324 }
325
327 }
328}
329
334
335using namespace Qt::Literals::StringLiterals;
336static const auto xsNetCursorBlink = "Net/CursorBlink"_ba;
337static const auto xsNetCursorBlinkTime = "Net/CursorBlinkTime"_ba;
338static const auto xsNetDoubleClickTime = "Net/DoubleClickTime"_ba;
339static const auto xsNetDoubleClickDistance = "Net/DoubleClickDistance"_ba;
340static const auto xsNetDndDragThreshold = "Net/DndDragThreshold"_ba;
341
343{
344 const auto defaultInputContext = "compose"_L1;
345 // Perform everything that may potentially need the event dispatcher (timers, socket
346 // notifiers) here instead of the constructor.
348 if (icStrs.isEmpty())
349 icStrs = { defaultInputContext };
350 m_inputContext.reset(QPlatformInputContextFactory::create(icStrs));
351 if (!m_inputContext && !icStrs.contains(defaultInputContext)
352 && icStrs != QStringList{"none"_L1})
353 m_inputContext.reset(QPlatformInputContextFactory::create(defaultInputContext));
354
356
357 auto notifyThemeChanged = [](QXcbVirtualDesktop *, const QByteArray &, const QVariant &, void *) {
359 };
360
361 auto *xsettings = connection()->primaryScreen()->xSettings();
362 xsettings->registerCallbackForProperty(xsNetCursorBlink, notifyThemeChanged, this);
363 xsettings->registerCallbackForProperty(xsNetCursorBlinkTime, notifyThemeChanged, this);
364 xsettings->registerCallbackForProperty(xsNetDoubleClickTime, notifyThemeChanged, this);
365 xsettings->registerCallbackForProperty(xsNetDoubleClickDistance, notifyThemeChanged, this);
366 xsettings->registerCallbackForProperty(xsNetDndDragThreshold, notifyThemeChanged, this);
367}
368
374
376{
377 return m_fontDatabase.data();
378}
379
381{
382 return m_nativeInterface.data();
383}
384
385#ifndef QT_NO_CLIPBOARD
387{
388 return m_connection->clipboard();
389}
390#endif
391
392#if QT_CONFIG(draganddrop)
393#include <private/qsimpledrag_p.h>
394QPlatformDrag *QXcbIntegration::drag() const
395{
396 static const bool useSimpleDrag = qEnvironmentVariableIsSet("QT_XCB_USE_SIMPLE_DRAG");
397 if (Q_UNLIKELY(useSimpleDrag)) { // This is useful for testing purposes
398 static QSimpleDrag *simpleDrag = nullptr;
399 if (!simpleDrag)
400 simpleDrag = new QSimpleDrag();
401 return simpleDrag;
402 }
403
404 return m_connection->drag();
405}
406#endif
407
409{
410 return m_inputContext.data();
411}
412
413#if QT_CONFIG(accessibility)
414QPlatformAccessibility *QXcbIntegration::accessibility() const
415{
416#if !defined(QT_NO_ACCESSIBILITY_ATSPI_BRIDGE)
417 if (!m_accessibility) {
419 "Initializing accessibility without event-dispatcher!");
420 m_accessibility.reset(new QSpiAccessibleBridge());
421 }
422#endif
423
424 return m_accessibility.data();
425}
426#endif
427
429{
430 return m_services.data();
431}
432
434{
435 return m_connection->keyboard();
436}
437
442
447
448#define RETURN_VALID_XSETTINGS(key) { \
449 auto value = connection()->primaryScreen()->xSettings()->setting(key); \
450 if (value.isValid()) return value; \
451}
452
454{
455 switch (hint) {
457 bool ok = false;
458 // If cursor blinking is off, returns 0 to keep the cursor awlays display.
459 if (connection()->primaryScreen()->xSettings()->setting(xsNetCursorBlink).toInt(&ok) == 0 && ok)
460 return 0;
461
463 break;
464 }
467 break;
470 break;
480 // TODO using various xcb, gnome or KDE settings
481 break; // Not implemented, use defaults
485 // The default (in QPlatformTheme::defaultThemeHint) is 10 pixels, but
486 // on a high-resolution screen it makes sense to increase it.
487 qreal dpi = 100;
488 if (const QXcbScreen *screen = connection()->primaryScreen()) {
489 if (screen->logicalDpi().first > dpi)
490 dpi = screen->logicalDpi().first;
491 if (screen->logicalDpi().second > dpi)
492 dpi = screen->logicalDpi().second;
493 }
494 return (hint == QPlatformIntegration::FlickStartDistance ? qreal(15) : qreal(10)) * dpi / qreal(100);
495 }
497 // X11 always has support for windows, but the
498 // window manager could prevent it (e.g. matchbox)
499 return false;
501 return false;
502 default:
503 break;
504 }
506}
507
509{
512 if (!arguments.isEmpty() && !arguments.front().isEmpty()) {
514 const int lastSlashPos = result.lastIndexOf(u'/');
515 if (lastSlashPos != -1)
516 result.remove(0, lastSlashPos + 1);
517 }
518 return result;
519}
520
521static const char resourceNameVar[] = "RESOURCE_NAME";
522
524{
525 if (m_wmClass.isEmpty()) {
526 // Instance name according to ICCCM 4.1.2.5
528 if (m_instanceName)
529 name = QString::fromLocal8Bit(m_instanceName);
532 if (name.isEmpty())
534
535 // Note: QCoreApplication::applicationName() cannot be called from the QGuiApplication constructor,
536 // hence this delayed initialization.
538 if (className.isEmpty()) {
540 if (!className.isEmpty() && className.at(0).isLower())
541 className[0] = className.at(0).toUpper();
542 }
543
544 if (!name.isEmpty() && !className.isEmpty())
545 m_wmClass = std::move(name).toLocal8Bit() + '\0' + std::move(className).toLocal8Bit() + '\0';
546 }
547 return m_wmClass;
548}
549
550#if QT_CONFIG(xcb_sm)
552{
553 return new QXcbSessionManager(id, key);
554}
555#endif
556
558{
559 m_connection->sync();
560}
561
562// For QApplication::beep()
564{
566 if (!priScreen)
567 return;
568 QPlatformScreen *screen = priScreen->handle();
569 if (!screen)
570 return;
571 xcb_connection_t *connection = static_cast<QXcbScreen *>(screen)->xcb_connection();
572 xcb_bell(connection, 0);
573 xcb_flush(connection);
574}
575
577{
578#if QT_CONFIG(xcb_native_painting)
579 static bool enabled = qEnvironmentVariableIsSet("QT_XCB_NATIVE_PAINTING");
580 return enabled;
581#else
582 return false;
583#endif
584}
585
586#if QT_CONFIG(vulkan)
587QPlatformVulkanInstance *QXcbIntegration::createPlatformVulkanInstance(QVulkanInstance *instance) const
588{
589 return new QXcbVulkanInstance(instance);
590}
591#endif
592
594{
595 auto unixServices = dynamic_cast<QGenericUnixServices *>(services());
596 unixServices->setApplicationBadge(number);
597}
598
603
\inmodule QtCore
Definition qbytearray.h:57
bool isEmpty() const noexcept
Returns true if the byte array has size 0; otherwise returns false.
Definition qbytearray.h:107
static QAbstractEventDispatcher * eventDispatcher()
Returns a pointer to the event dispatcher object for the main thread.
static QStringList arguments()
QString applicationName
the name of this application
\inmodule QtCore
Definition qfile.h:93
void setApplicationBadge(qint64 number)
static QPlatformTheme * createUnixTheme(const QString &name)
Creates a UNIX theme according to the detected desktop environment.
static QStringList themeNames()
QScreen * primaryScreen
the primary (or default) screen of the application.
bool isEmpty() const noexcept
Definition qlist.h:401
reference front()
Definition qlist.h:687
\inmodule QtGui
QScreen * screen() const
Returns the screen to which the offscreen surface is connected.
\inmodule QtGui
The QPlatformBackingStore class provides the drawing area for top-level windows.
The QPlatformClipboard class provides an abstraction for the system clipboard.
The QPlatformDrag class provides an abstraction for drag.
The QPlatformFontDatabase class makes it possible to customize how fonts are discovered and how they ...
static QPlatformInputContext * create()
The QPlatformInputContext class abstracts the input method dependent data and composing state.
virtual QPlatformPixmap * createPlatformPixmap(QPlatformPixmap::PixelType type) const
Factory function for QPlatformPixmap.
virtual QPlatformSessionManager * createPlatformSessionManager(const QString &id, const QString &key) const
virtual QVariant styleHint(StyleHint hint) const
virtual bool hasCapability(Capability cap) const
Capability
Capabilities are used to determine specific features of a platform integration.
The QPlatformNativeInterface class provides an abstraction for retrieving native resource handles.
The QPlatformOpenGLContext class provides an abstraction for native GL contexts.
The QPlatformPixmap class provides an abstraction for native pixmaps.
The QPlatformScreen class provides an abstraction for visual displays.
The QPlatformServices provides the backend for desktop-related functionality.
The QPlatformTheme class allows customizing the UI based on themes.
The QPlatformVulkanInstance class provides an abstraction for Vulkan instances.
The QPlatformWindow class provides an abstraction for top-level windows.
T * data() const noexcept
Returns the value of the pointer referenced by this object.
void reset(T *other=nullptr) noexcept(noexcept(Cleanup::cleanup(std::declval< T * >())))
Deletes the existing object it is pointing to (if any), and sets its pointer to other.
The QScreen class is used to query screen properties. \inmodule QtGui.
Definition qscreen.h:32
QPlatformScreen * handle() const
Get the platform screen handle.
Definition qscreen.cpp:83
QSimpleDrag implements QBasicDrag for Drag and Drop operations within the Qt Application itself.
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
static QString fromLocal8Bit(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5949
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:8084
@ RasterGLSurface
Definition qsurface.h:33
@ VulkanSurface
Definition qsurface.h:35
\inmodule QtCore
Definition qvariant.h:65
The QVulkanInstance class represents a native Vulkan instance, enabling Vulkan rendering onto a QSurf...
static void handleThemeChange(QWindow *window=nullptr)
\inmodule QtGui
Definition qwindow.h:63
QXcbKeyboard * keyboard() const
QXcbGlIntegration * glIntegration() const
QXcbScreen * primaryScreen() const
QXcbClipboard * clipboard() const
static QAbstractEventDispatcher * createEventDispatcher(QXcbConnection *connection)
virtual bool supportsSwitchableWidgetComposition() const
virtual QPlatformOpenGLContext * createPlatformOpenGLContext(QOpenGLContext *context) const =0
virtual QXcbWindow * createWindow(QWindow *window) const =0
virtual QPlatformOffscreenSurface * createPlatformOffscreenSurface(QOffscreenSurface *surface) const =0
QPlatformServices * services() const override
bool hasCapability(Capability cap) const override
QByteArray wmClass() const
QPlatformKeyMapper * keyMapper() const override
Accessor for the platform integration's key mapper.
QPlatformWindow * createForeignWindow(QWindow *window, WId nativeHandle) const override
void initialize() override
Performs initialization steps that depend on having an event dispatcher available.
QPlatformNativeInterface * nativeInterface() const override
bool nativePaintingEnabled() const
QPlatformOpenGLContext * createPlatformOpenGLContext(QOpenGLContext *context) const override
Factory function for QPlatformOpenGLContext.
void sync() override
QPlatformTheme * createPlatformTheme(const QString &name) const override
void beep() const override
QPlatformFontDatabase * fontDatabase() const override
Accessor for the platform integration's fontdatabase.
void setApplicationBadge(qint64 number) override
QPlatformPixmap * createPlatformPixmap(QPlatformPixmap::PixelType type) const override
Factory function for QPlatformPixmap.
QStringList themeNames() const override
QPlatformWindow * createPlatformWindow(QWindow *window) const override
Factory function for QPlatformWindow.
QVariant styleHint(StyleHint hint) const override
QPlatformBackingStore * createPlatformBackingStore(QWindow *window) const override
Factory function for QPlatformBackingStore.
static QXcbIntegration * instance()
QPlatformClipboard * clipboard() const override
Accessor for the platform integration's clipboard.
QXcbIntegration(const QStringList &parameters, int &argc, char **argv)
QXcbConnection * connection() const
QAbstractEventDispatcher * createEventDispatcher() const override
Factory function for the GUI event dispatcher.
QPlatformOffscreenSurface * createPlatformOffscreenSurface(QOffscreenSurface *surface) const override
Factory function for QOffscreenSurface.
void moveToScreen(QWindow *window, int screen)
QPlatformInputContext * inputContext() const override
Returns the platforms input context.
QXcbXSettings * xSettings() const
QString portalWindowIdentifier(QWindow *window) override
static bool isTrayIconWindow(QWindow *window)
Definition qxcbwindow.h:149
void registerCallbackForProperty(const QByteArray &property, PropertyChangeFunc func, void *handle)
QList< QVariant > arguments
struct wl_display * display
Definition linuxdmabuf.h:41
Combined button and popup list for selecting options.
@ AA_CompressHighFrequencyEvents
Definition qnamespace.h:460
@ Desktop
Definition qnamespace.h:215
static void * context
static QString displayName(CGDirectDisplayID displayID)
#define Q_UNLIKELY(x)
#define qApp
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
typedef EGLDisplay(EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC)(EGLenum platform
QPlatformFontDatabase QGenericUnixFontDatabase
#define qWarning
Definition qlogging.h:166
#define qCDebug(category,...)
GLuint64 key
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLfloat GLfloat f
GLenum type
GLuint name
GLdouble s
[6]
Definition qopenglext.h:235
const GLubyte * c
GLuint64EXT * result
[6]
GLenum cap
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define Q_ASSERT_X(cond, x, msg)
Definition qrandom.cpp:48
SSL_CTX int void * arg
static QT_BEGIN_NAMESPACE QVariant hint(QPlatformIntegration::StyleHint h)
QScreen * screen
[1]
Definition main.cpp:29
Q_CORE_EXPORT QByteArray qgetenv(const char *varName)
Q_CORE_EXPORT bool qEnvironmentVariableIsSet(const char *varName) noexcept
#define Q_UNUSED(x)
long long qint64
Definition qtypes.h:60
double qreal
Definition qtypes.h:187
static int toInt(const QChar &qc, int R)
#define enabled
const char className[16]
[1]
Definition qwizard.cpp:100
static const auto xsNetCursorBlink
static const auto xsNetDndDragThreshold
static QString argv0BaseName()
static const auto xsNetDoubleClickTime
static const auto xsNetCursorBlinkTime
static bool runningUnderDebugger()
static const auto xsNetDoubleClickDistance
#define RETURN_VALID_XSETTINGS(key)
static const char resourceNameVar[]
void qt_xcb_native_x11_info_init(QXcbConnection *conn)
QObject::connect nullptr
aWidget window() -> setWindowTitle("New Window Title")
[2]