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
qwaylandtextinput.cpp
Go to the documentation of this file.
1// Copyright (C) 2017-2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#include "qwaylandtextinput.h"
6
7#include <QtWaylandCompositor/QWaylandCompositor>
8#include <QtWaylandCompositor/private/qwaylandseat_p.h>
9
10#include "qwaylandsurface.h"
11#include "qwaylandview.h"
14
15#include <QGuiApplication>
16#include <QInputMethodEvent>
17
18#if QT_CONFIG(xkbcommon)
19#include <QtGui/private/qxkbcommon_p.h>
20#endif
21
23
27
29{
30 Qt::InputMethodQueries queries;
31
32 if (hints != other.hints)
33 queries |= Qt::ImHints;
34 if (cursorRectangle != other.cursorRectangle)
35 queries |= Qt::ImCursorRectangle;
36 if (surroundingText != other.surroundingText)
38 if (cursorPosition != other.cursorPosition)
40 if (anchorPosition != other.anchorPosition)
42 if (preferredLanguage != other.preferredLanguage)
43 queries |= Qt::ImPreferredLanguage;
44
45 return queries;
46}
47
49 Qt::InputMethodQueries queries;
50
51 if ((other.changedState & Qt::ImHints) && hints != other.hints) {
52 hints = other.hints;
53 queries |= Qt::ImHints;
54 }
55
56 if ((other.changedState & Qt::ImCursorRectangle) && cursorRectangle != other.cursorRectangle) {
57 cursorRectangle = other.cursorRectangle;
58 queries |= Qt::ImCursorRectangle;
59 }
60
61 if ((other.changedState & Qt::ImSurroundingText) && surroundingText != other.surroundingText) {
62 surroundingText = other.surroundingText;
64 }
65
66 if ((other.changedState & Qt::ImCursorPosition) && cursorPosition != other.cursorPosition) {
67 cursorPosition = other.cursorPosition;
69 }
70
71 if ((other.changedState & Qt::ImAnchorPosition) && anchorPosition != other.anchorPosition) {
72 anchorPosition = other.anchorPosition;
74 }
75
76 if ((other.changedState & Qt::ImPreferredLanguage) && preferredLanguage != other.preferredLanguage) {
77 preferredLanguage = other.preferredLanguage;
78 queries |= Qt::ImPreferredLanguage;
79 }
80
81 return queries;
82}
83
90
92{
94
95 if (!focusResource || !focusResource->handle)
96 return;
97
99
100 afterCommit.surroundingText = currentState->surroundingText;
101 afterCommit.cursorPosition = qMin(currentState->cursorPosition, currentState->anchorPosition);
102
103 // Remove selection
104 afterCommit.surroundingText.remove(afterCommit.cursorPosition, qAbs(currentState->cursorPosition - currentState->anchorPosition));
105
106 if (event->replacementLength() > 0 || event->replacementStart() != 0) {
107 // Remove replacement
108 afterCommit.cursorPosition = qBound(0, afterCommit.cursorPosition + event->replacementStart(), afterCommit.surroundingText.size());
109 afterCommit.surroundingText.remove(afterCommit.cursorPosition,
110 qMin(event->replacementLength(),
111 afterCommit.surroundingText.size() - afterCommit.cursorPosition));
112
113 if (event->replacementStart() <= 0 && (event->replacementLength() >= -event->replacementStart())) {
114 const int selectionStart = qMin(currentState->cursorPosition, currentState->anchorPosition);
115 const int selectionEnd = qMax(currentState->cursorPosition, currentState->anchorPosition);
116 const int before = QWaylandInputMethodEventBuilder::indexToWayland(currentState->surroundingText, -event->replacementStart(), selectionStart + event->replacementStart());
117 const int after = QWaylandInputMethodEventBuilder::indexToWayland(currentState->surroundingText, event->replacementLength() + event->replacementStart(), selectionEnd);
118 send_delete_surrounding_text(focusResource->handle, before, after);
119 } else {
120 // TODO: Implement this case
121 qWarning() << "Not yet supported case of replacement. Start:" << event->replacementStart() << "length:" << event->replacementLength();
122 }
123 }
124
125 // Insert commit string
126 afterCommit.surroundingText.insert(afterCommit.cursorPosition, event->commitString());
127 afterCommit.cursorPosition += event->commitString().size();
128 afterCommit.anchorPosition = afterCommit.cursorPosition;
129
130 for (const QInputMethodEvent::Attribute &attribute : event->attributes()) {
132 afterCommit.cursorPosition = attribute.start;
133 afterCommit.anchorPosition = attribute.length;
134 int cursor = QWaylandInputMethodEventBuilder::indexToWayland(afterCommit.surroundingText, qAbs(attribute.start - afterCommit.cursorPosition), qMin(attribute.start, afterCommit.cursorPosition));
135 int anchor = QWaylandInputMethodEventBuilder::indexToWayland(afterCommit.surroundingText, qAbs(attribute.length - afterCommit.cursorPosition), qMin(attribute.length, afterCommit.cursorPosition));
136 send_cursor_position(focusResource->handle,
137 attribute.start < afterCommit.cursorPosition ? -cursor : cursor,
138 attribute.length < afterCommit.cursorPosition ? -anchor : anchor);
139 }
140 }
141 send_commit_string(focusResource->handle, event->commitString());
142 for (const QInputMethodEvent::Attribute &attribute : event->attributes()) {
145 send_preedit_cursor(focusResource->handle, index);
146 } else if (attribute.type == QInputMethodEvent::TextFormat) {
149 // TODO add support for different stylesQWaylandTextInput
150 send_preedit_styling(focusResource->handle, start, length, preedit_style_default);
151 }
152 }
153 send_preedit_string(focusResource->handle, event->preeditString(), event->preeditString());
154
155 Qt::InputMethodQueries queries = currentState->updatedQueries(afterCommit);
156 currentState->surroundingText = afterCommit.surroundingText;
157 currentState->cursorPosition = afterCommit.cursorPosition;
158 currentState->anchorPosition = afterCommit.anchorPosition;
159
160 if (queries) {
161 qCDebug(qLcWaylandCompositorInputMethods) << "QInputMethod::update() after QInputMethodEvent" << queries;
162
163 emit q->updateInputMethod(queries);
164 }
165}
166
168{
169 if (!focusResource || !focusResource->handle)
170 return;
171
172 uint mods = 0;
173 const auto &qtMods = event->modifiers();
174 if (qtMods & Qt::ShiftModifier)
175 mods |= shiftModifierMask;
176 if (qtMods & Qt::ControlModifier)
177 mods |= controlModifierMask;
178 if (qtMods & Qt::AltModifier)
179 mods |= altModifierMask;
180 if (qtMods & Qt::MetaModifier)
181 mods |= metaModifierMask;
182
183#if QT_CONFIG(xkbcommon)
184 for (xkb_keysym_t keysym : QXkbCommon::toKeysym(event)) {
185 send_keysym(focusResource->handle, event->timestamp(), keysym,
186 event->type() == QEvent::KeyPress ? WL_KEYBOARD_KEY_STATE_PRESSED : WL_KEYBOARD_KEY_STATE_RELEASED,
187 mods);
188 }
189#else
191#endif
192}
193
195{
196 if (!focusResource || !focusResource->handle)
197 return;
198
199 QInputMethod *inputMethod = qApp->inputMethod();
200 const QRectF& keyboardRect = inputMethod->keyboardRectangle();
201 const QRectF& sceneInputRect = inputMethod->inputItemTransform().mapRect(inputMethod->inputItemRectangle());
202 const QRectF& localRect = sceneInputRect.intersected(keyboardRect).translated(-sceneInputRect.topLeft());
203
204 send_input_panel_state(focusResource->handle,
205 inputMethod->isVisible() ? input_panel_visibility_visible : input_panel_visibility_hidden,
206 localRect.x(), localRect.y(), localRect.width(), localRect.height());
207}
208
210{
211 if (!focusResource || !focusResource->handle)
212 return;
213
214 const Qt::LayoutDirection direction = qApp->inputMethod()->inputDirection();
215 send_text_direction(focusResource->handle,
216 (direction == Qt::LeftToRight) ? text_direction_ltr :
217 (direction == Qt::RightToLeft) ? text_direction_rtl : text_direction_auto);
218}
219
221{
222 if (!focusResource || !focusResource->handle)
223 return;
224
225 const QLocale locale = qApp->inputMethod()->locale();
226 send_language(focusResource->handle, locale.bcp47Name());
227}
228
230{
231 switch (property) {
232 case Qt::ImHints:
233 return QVariant(static_cast<int>(currentState->hints));
235 return currentState->cursorRectangle;
236 case Qt::ImFont:
237 // Not supported
238 return QVariant();
240 return currentState->cursorPosition;
242 return currentState->surroundingText;
244 return currentState->surroundingText.mid(qMin(currentState->cursorPosition, currentState->anchorPosition),
245 qAbs(currentState->anchorPosition - currentState->cursorPosition));
247 // Not supported
248 return QVariant();
250 return currentState->anchorPosition;
252 // We assume the surrounding text is our whole document for now
253 return currentState->cursorPosition;
255 if (argument.isValid())
256 return currentState->surroundingText.mid(currentState->cursorPosition, argument.toInt());
257 return currentState->surroundingText.mid(currentState->cursorPosition);
259 if (argument.isValid())
260 return currentState->surroundingText.left(currentState->cursorPosition).right(argument.toInt());
261 return currentState->surroundingText.left(currentState->cursorPosition);
263 return currentState->preferredLanguage;
264
265 default:
266 return QVariant();
267 }
268}
269
271{
273
274 if (focusResource && focus != surface) {
275 uint32_t serial = compositor->nextSerial();
276 send_leave(focusResource->handle, serial, focus->resource());
278 }
279
280 Resource *resource = surface ? resourceMap().value(surface->waylandClient()) : 0;
281
282 if (resource && (focus != surface || focusResource != resource)) {
283 uint32_t serial = compositor->nextSerial();
286 send_enter(resource->handle, serial, surface->resource());
287 focusResource = resource;
289 sendLocale();
292 if (inputPanelVisible && q->isSurfaceEnabled(surface))
293 qApp->inputMethod()->show();
294 }
295
296 focusResource = resource;
297 focus = surface;
298}
299
301{
302 send_modifiers_map(focusResource->handle, modifiersMap);
303}
304
305#if !QT_CONFIG(xkbcommon)
306#define XKB_MOD_NAME_SHIFT "Shift"
307#define XKB_MOD_NAME_CTRL "Control"
308#define XKB_MOD_NAME_ALT "Mod1"
309#define XKB_MOD_NAME_LOGO "Mod4"
310#endif
312{
317 send_modifiers_map(resource->handle, modifiers);
318}
319
321{
322 if (focusResource == resource)
323 focusResource = nullptr;
324}
325
327{
328 wl_resource_destroy(resource->handle);
329}
330
331void QWaylandTextInputPrivate::zwp_text_input_v2_enable(Resource *resource, wl_resource *surface)
332{
334
336 enabledSurfaces.insert(resource, s);
337
338 QWaylandInputMethodControl *control = s->inputMethodControl();
339 if (control)
340 control->updateTextInput();
341
342 emit q->surfaceEnabled(s);
343}
344
345void QWaylandTextInputPrivate::zwp_text_input_v2_disable(QtWaylandServer::zwp_text_input_v2::Resource *resource, wl_resource *)
346{
348
350 emit q->surfaceDisabled(s);
351}
352
354{
355 inputPanelVisible = true;
356
357 qApp->inputMethod()->show();
358}
359
361{
362 inputPanelVisible = false;
363
364 qApp->inputMethod()->hide();
365}
366
367void QWaylandTextInputPrivate::zwp_text_input_v2_set_cursor_rectangle(Resource *resource, int32_t x, int32_t y, int32_t width, int32_t height)
368{
369 if (resource != focusResource)
370 return;
371
372 pendingState->cursorRectangle = QRect(x, y, width, height);
373
374 pendingState->changedState |= Qt::ImCursorRectangle;
375}
376
377void QWaylandTextInputPrivate::zwp_text_input_v2_update_state(Resource *resource, uint32_t serial, uint32_t flags)
378{
380
381 qCDebug(qLcWaylandCompositorInputMethods) << "update_state" << serial << flags;
382
383 if (resource != focusResource)
384 return;
385
386 if (flags == update_state_reset || flags == update_state_enter) {
387 qCDebug(qLcWaylandCompositorInputMethods) << "QInputMethod::reset()";
388 qApp->inputMethod()->reset();
389 }
390
391 this->serial = serial;
392
393 Qt::InputMethodQueries queries;
394 if (flags == update_state_change) {
395 queries = currentState->mergeChanged(*pendingState);
396 } else {
397 queries = pendingState->updatedQueries(*currentState);
399 }
400
402
403 if (queries) {
404 qCDebug(qLcWaylandCompositorInputMethods) << "QInputMethod::update()" << queries;
405
406 emit q->updateInputMethod(queries);
407 }
408}
409
410void QWaylandTextInputPrivate::zwp_text_input_v2_set_content_type(Resource *resource, uint32_t hint, uint32_t purpose)
411{
412 if (resource != focusResource)
413 return;
414
415 pendingState->hints = Qt::ImhNone;
416
417 if ((hint & content_hint_auto_completion) == 0
418 && (hint & content_hint_auto_correction) == 0)
420 if ((hint & content_hint_auto_capitalization) == 0)
422 if ((hint & content_hint_lowercase) != 0)
424 if ((hint & content_hint_uppercase) != 0)
426 if ((hint & content_hint_hidden_text) != 0)
428 if ((hint & content_hint_sensitive_data) != 0)
430 if ((hint & content_hint_latin) != 0)
432 if ((hint & content_hint_multiline) != 0)
434
435 switch (purpose) {
436 case content_purpose_normal:
437 break;
438 case content_purpose_alpha:
440 break;
441 case content_purpose_digits:
443 break;
444 case content_purpose_number:
446 break;
447 case content_purpose_phone:
449 break;
450 case content_purpose_url:
452 break;
453 case content_purpose_email:
455 break;
456 case content_purpose_name:
457 case content_purpose_password:
458 break;
459 case content_purpose_date:
460 pendingState->hints |= Qt::ImhDate;
461 break;
462 case content_purpose_time:
463 pendingState->hints |= Qt::ImhTime;
464 break;
465 case content_purpose_datetime:
467 break;
468 case content_purpose_terminal:
469 default:
470 break;
471 }
472
473 pendingState->changedState |= Qt::ImHints;
474}
475
477{
478 if (resource != focusResource)
479 return;
480
481 pendingState->preferredLanguage = language;
482
483 pendingState->changedState |= Qt::ImPreferredLanguage;
484}
485
486void QWaylandTextInputPrivate::zwp_text_input_v2_set_surrounding_text(Resource *resource, const QString &text, int32_t cursor, int32_t anchor)
487{
488 if (resource != focusResource)
489 return;
490
491 pendingState->surroundingText = text;
494
496}
497
500{
501 connect(&d_func()->focusDestroyListener, &QWaylandDestroyListener::fired,
502 this, &QWaylandTextInput::focusSurfaceDestroyed);
503
505 this, &QWaylandTextInput::sendInputPanelState);
507 this, &QWaylandTextInput::sendInputPanelState);
509 this, &QWaylandTextInput::sendTextDirection);
511 this, &QWaylandTextInput::sendLocale);
512}
513
517
519{
521
522 d->sendInputMethodEvent(event);
523}
524
526{
528
529 d->sendKeyEvent(event);
530}
531
532void QWaylandTextInput::sendInputPanelState()
533{
535
536 d->sendInputPanelState();
537}
538
539void QWaylandTextInput::sendTextDirection()
540{
542
543 d->sendTextDirection();
544}
545
546void QWaylandTextInput::sendLocale()
547{
549
550 d->sendLocale();
551}
552
559
561{
562 const Q_D(QWaylandTextInput);
563
564 return d->focus;
565}
566
568{
570
571 d->setFocus(surface);
572}
573
574void QWaylandTextInput::focusSurfaceDestroyed(void *)
575{
577
578 d->focusDestroyListener.reset();
579
580 d->focus = nullptr;
581 d->focusResource = nullptr;
582}
583
585{
586 const Q_D(QWaylandTextInput);
587
588 return d->enabledSurfaces.values().contains(surface);
589}
590
591void QWaylandTextInput::add(::wl_client *client, uint32_t id, int version)
592{
594
595 d->add(client, id, version);
596}
597
598const wl_interface *QWaylandTextInput::interface()
599{
600 return QWaylandTextInputPrivate::interface();
601}
602
604{
605 return QWaylandTextInputPrivate::interfaceName();
606}
607
608
610{
612
613 const QList<QByteArray> modifiers = modifiersMap.split('\0');
614
615 int numModifiers = modifiers.size();
616 if (modifiers.last().isEmpty())
617 numModifiers--;
618
619 for (int i = 0; i < numModifiers; ++i) {
620 const auto modString = modifiers.at(i);
621 if (modString == XKB_MOD_NAME_SHIFT)
622 d->shiftModifierMask = 1 << i;
623 else if (modString == XKB_MOD_NAME_CTRL)
624 d->controlModifierMask = 1 << i;
625 else if (modString == XKB_MOD_NAME_ALT)
626 d->altModifierMask = 1 << i;
627 else if (modString == XKB_MOD_NAME_LOGO)
628 d->metaModifierMask = 1 << i;
629 else
630 qCDebug(qLcWaylandCompositorInputMethods) << "unsupported modifier name " << modString;
631 }
632 d->sendModifiersMap(modifiersMap);
633}
634
636
637#include "moc_qwaylandtextinput.cpp"
\inmodule QtCore
Definition qbytearray.h:57
@ KeyPress
Definition qcoreevent.h:64
T take(const Key &key)
Removes the item with the key from the hash and returns the value associated with it.
Definition qhash.h:985
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
Definition qhash.h:1303
The QInputMethodEvent class provides parameters for input method events.
Definition qevent.h:625
The QInputMethod class provides access to the active text input method.
QRectF keyboardRectangle
Virtual keyboard's geometry in window coordinates.
void inputDirectionChanged(Qt::LayoutDirection newDirection)
QRectF inputItemRectangle() const
QTransform inputItemTransform() const
Returns the transformation from input item coordinates to the window coordinates.
void visibleChanged()
void keyboardRectangleChanged()
void localeChanged()
bool isVisible() const
The QKeyEvent class describes a key event.
Definition qevent.h:424
\inmodule QtCore\reentrant
Definition qrect.h:484
constexpr QRectF translated(qreal dx, qreal dy) const noexcept
Returns a copy of the rectangle that is translated dx along the x axis and dy along the y axis,...
Definition qrect.h:762
QRectF intersected(const QRectF &other) const noexcept
Definition qrect.h:847
\inmodule QtCore\reentrant
Definition qrect.h:30
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
QRect mapRect(const QRect &) const
This is an overloaded member function, provided for convenience. It differs from the above function o...
\inmodule QtCore
Definition qvariant.h:65
\qmltype WaylandCompositor \instantiates QWaylandCompositor \inqmlmodule QtWayland....
void fired(void *data)
void listenForDestruction(struct wl_resource *resource)
static int indexFromWayland(const QString &text, int length, int base=0)
static int indexToWayland(const QString &text, int length, int base=0)
\inmodule QtWaylandCompositor
\qmltype WaylandSurface \instantiates QWaylandSurface \inqmlmodule QtWayland.Compositor
struct wl_resource * resource() const
Returns the Wayland resource corresponding to this QWaylandSurface.
::wl_client * waylandClient() const
Holds the wl_client using this QWaylandSurface.
static QWaylandSurface * fromResource(::wl_resource *resource)
Returns the QWaylandSurface corresponding to the Wayland resource resource.
Qt::InputMethodQueries updatedQueries(const QWaylandTextInputClientState &other) const
Qt::InputMethodQueries mergeChanged(const QWaylandTextInputClientState &other)
void zwp_text_input_v2_set_preferred_language(Resource *resource, const QString &language) override
QHash< Resource *, QWaylandSurface * > enabledSurfaces
void zwp_text_input_v2_enable(Resource *resource, wl_resource *surface) override
void zwp_text_input_v2_update_state(Resource *resource, uint32_t serial, uint32_t flags) override
void setFocus(QWaylandSurface *surface)
QWaylandTextInputPrivate(QWaylandCompositor *compositor)
void zwp_text_input_v2_bind_resource(Resource *resource) override
void zwp_text_input_v2_set_surrounding_text(Resource *resource, const QString &text, int32_t cursor, int32_t anchor) override
QWaylandCompositor * compositor
void zwp_text_input_v2_set_cursor_rectangle(Resource *resource, int32_t x, int32_t y, int32_t width, int32_t height) override
QWaylandDestroyListener focusDestroyListener
void sendKeyEvent(QKeyEvent *event)
std::unique_ptr< QWaylandTextInputClientState > pendingState
void zwp_text_input_v2_hide_input_panel(Resource *resource) override
void zwp_text_input_v2_set_content_type(Resource *resource, uint32_t hint, uint32_t purpose) override
void zwp_text_input_v2_disable(Resource *resource, wl_resource *surface) override
void zwp_text_input_v2_show_input_panel(Resource *resource) override
std::unique_ptr< QWaylandTextInputClientState > currentState
void zwp_text_input_v2_destroy_resource(Resource *resource) override
void sendModifiersMap(const QByteArray &modifiersMap)
QVariant inputMethodQuery(Qt::InputMethodQuery property, QVariant argument) const
void zwp_text_input_v2_destroy(Resource *resource) override
void sendInputMethodEvent(QInputMethodEvent *event)
void sendInputMethodEvent(QInputMethodEvent *event)
void sendModifiersMap(const QByteArray &modifiersMap)
static QByteArray interfaceName()
QVariant inputMethodQuery(Qt::InputMethodQuery property, QVariant argument) const
QWaylandTextInput(QWaylandObject *container, QWaylandCompositor *compositor)
void setFocus(QWaylandSurface *surface)
bool isSurfaceEnabled(QWaylandSurface *surface) const
void add(::wl_client *client, uint32_t id, int version)
QWaylandSurface * focus() const
static const struct wl_interface * interface()
void sendKeyEvent(QKeyEvent *event)
static QList< xkb_keysym_t > toKeysym(QKeyEvent *event)
EGLImageKHR int int EGLuint64KHR * modifiers
QString text
QCursor cursor
direction
Combined button and popup list for selecting options.
InputMethodQuery
@ ImMaximumTextLength
@ ImTextBeforeCursor
@ ImSurroundingText
@ ImCursorPosition
@ ImCurrentSelection
@ ImAbsolutePosition
@ ImPreferredLanguage
@ ImFont
@ ImAnchorPosition
@ ImCursorRectangle
@ ImHints
@ ImTextAfterCursor
LayoutDirection
@ LeftToRight
@ RightToLeft
@ ImhPreferUppercase
@ ImhUrlCharactersOnly
@ ImhPreferLowercase
@ ImhTime
@ ImhFormattedNumbersOnly
@ ImhNone
@ ImhMultiLine
@ ImhLatinOnly
@ ImhUppercaseOnly
@ ImhNoPredictiveText
@ ImhDigitsOnly
@ ImhSensitiveData
@ ImhLowercaseOnly
@ ImhEmailCharactersOnly
@ ImhHiddenText
@ ImhNoAutoUppercase
@ ImhDialableCharactersOnly
@ ImhDate
@ ShiftModifier
@ ControlModifier
@ MetaModifier
@ AltModifier
#define qApp
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
EGLOutputLayerEXT EGLint attribute
#define qWarning
Definition qlogging.h:166
#define qCDebug(category,...)
constexpr const T & qMin(const T &a, const T &b)
Definition qminmax.h:40
constexpr const T & qBound(const T &min, const T &val, const T &max)
Definition qminmax.h:44
constexpr const T & qMax(const T &a, const T &b)
Definition qminmax.h:42
constexpr T qAbs(const T &t)
Definition qnumeric.h:328
static QOpenGLCompositor * compositor
GLint GLint GLint GLint GLint x
[0]
GLint GLsizei GLsizei height
GLuint index
[2]
GLenum GLuint GLenum GLsizei length
GLint GLsizei width
GLbitfield flags
GLuint start
GLint y
struct _cl_event * event
GLdouble s
[6]
Definition qopenglext.h:235
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
static QT_BEGIN_NAMESPACE QVariant hint(QPlatformIntegration::StyleHint h)
#define emit
#define Q_UNUSED(x)
unsigned int uint
Definition qtypes.h:34
int keysym
Definition qvnc.cpp:139
#define XKB_MOD_NAME_ALT
#define XKB_MOD_NAME_SHIFT
#define XKB_MOD_NAME_LOGO
#define XKB_MOD_NAME_CTRL
const char property[13]
Definition qwizard.cpp:101
connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection)
QSharedPointer< T > other(t)
[5]
QDBusArgument argument