20#include <QGuiApplication>
23#include <sys/keycodes.h>
25using namespace std::chrono_literals;
29static int qtKey(
int virtualKey, QChar::Category category)
31 if (Q_UNLIKELY(category == QChar::Other_NotAssigned))
33 else if (category == QChar::Other_PrivateUse)
36 return QChar::toUpper(virtualKey);
41 if (Q_UNLIKELY(category == QChar::Other_NotAssigned)) {
43 }
else if (category == QChar::Other_PrivateUse) {
44 return keyStringForPrivateUseQnxKey(sym);
46 return QStringView{QChar::fromUcs4(sym)}.toString();
52 if (cap >= 0x20 && cap <= 0x0ff) {
53 if (modifiers & KEYMOD_CTRL)
54 return QChar((
int)(key & 0x3f));
63 screen_get_event_property_pv(event,
64 screen_traits<T>::propertyName,
65 reinterpret_cast<
void**>(&t));
66 screen_traits<T>::destroy(t);
72 int objectType = SCREEN_OBJECT_TYPE_CONTEXT;
73 screen_get_event_property_iv(event, SCREEN_PROPERTY_OBJECT_TYPE, &objectType);
75 case SCREEN_OBJECT_TYPE_CONTEXT:
76 finishCloseEvent<screen_context_t>(event);
78 case SCREEN_OBJECT_TYPE_DEVICE:
79 finishCloseEvent<screen_device_t>(event);
81 case SCREEN_OBJECT_TYPE_DISPLAY:
84 case SCREEN_OBJECT_TYPE_GROUP:
85 finishCloseEvent<screen_group_t>(event);
87 case SCREEN_OBJECT_TYPE_PIXMAP:
88 finishCloseEvent<screen_pixmap_t>(event);
90 case SCREEN_OBJECT_TYPE_SESSION:
91 finishCloseEvent<screen_session_t>(event);
94 case SCREEN_OBJECT_TYPE_STREAM:
95 finishCloseEvent<screen_stream_t>(event);
98 case SCREEN_OBJECT_TYPE_WINDOW:
99 finishCloseEvent<screen_window_t>(event);
106using namespace Qt::StringLiterals;
109 : m_qnxIntegration(integration)
110 , m_lastButtonState(Qt::NoButton)
111 , m_lastMouseWindow(0)
115 m_mouseDevice =
new QPointingDevice(
"mouse"_L1, 2, QInputDevice::DeviceType::Mouse,
116 QPointingDevice::PointerType::Generic,
117 QPointingDevice::Capability::Position, 1, 8);
118 QWindowSystemInterface::registerInputDevice(m_mouseDevice);
123 m_eventFilters.append(filter);
128 m_eventFilters.removeOne(filter);
136 "Failed to query event type");
138 return handleEvent(event, qnxType);
144 case SCREEN_EVENT_MTOUCH_TOUCH:
145 case SCREEN_EVENT_MTOUCH_MOVE:
146 case SCREEN_EVENT_MTOUCH_RELEASE:
147 handleTouchEvent(event, qnxType);
150 case SCREEN_EVENT_KEYBOARD:
151 handleKeyboardEvent(event);
154 case SCREEN_EVENT_POINTER:
155 handlePointerEvent(event);
158 case SCREEN_EVENT_CREATE:
159 handleCreateEvent(event);
162 case SCREEN_EVENT_CLOSE:
163 handleCloseEvent(event);
166 case SCREEN_EVENT_DISPLAY:
167 handleDisplayEvent(event);
170 case SCREEN_EVENT_PROPERTY:
171 handlePropertyEvent(event);
174 case SCREEN_EVENT_MANAGER:
175 handleManagerEvent(event);
180 qCDebug(lcQpaScreenEvents) << Q_FUNC_INFO <<
"Unknown event" << qnxType;
191 if (!(flags & KEY_CAP_VALID))
195 if ((flags & KEY_SYM_VALID) && sym ==
static_cast<
int>(0xFFFFFFFF))
196 flags &= ~(KEY_SYM_VALID);
198 Qt::KeyboardModifiers qtMod = Qt::NoModifier;
199 if (modifiers & KEYMOD_SHIFT)
200 qtMod |= Qt::ShiftModifier;
201 if (modifiers & KEYMOD_CTRL)
202 qtMod |= Qt::ControlModifier;
203 if (modifiers & KEYMOD_ALT)
204 qtMod |= Qt::AltModifier;
205 if (isKeypadKey(cap))
206 qtMod |= Qt::KeypadModifier;
208 QEvent::Type type = (flags & KEY_DOWN) ? QEvent::KeyPress : QEvent::KeyRelease;
210 int virtualKey = (flags & KEY_SYM_VALID) ? sym : cap;
211 QChar::Category category = QChar::category(virtualKey);
212 int key = qtKey(virtualKey, category);
213 QString keyStr = (flags & KEY_SYM_VALID) ? keyString(sym, category) :
214 capKeyString(cap, modifiers, key);
216 QWindowSystemInterface::handleExtendedKeyEvent(QGuiApplication::focusWindow(), type, key, qtMod,
217 scan, virtualKey, modifiers, keyStr, flags & KEY_REPEAT);
218 qCDebug(lcQpaScreenEvents) <<
"Qt key t=" << type <<
", k=" << key <<
", s=" << keyStr;
223 m_eventThread = eventThread;
224 connect(m_eventThread, &QQnxScreenEventThread::eventsPending,
225 this, &QQnxScreenEventHandler::processEvents);
226 connect(m_eventThread, &QQnxScreenEventThread::postEventReceived,
227 this, &QQnxScreenEventHandler::processPostEvent);
235 screen_event_t event =
nullptr;
236 if (screen_create_event(&event) != 0)
241 if (screen_get_event(m_eventThread->context(), event, 0) != 0)
244 int type = SCREEN_EVENT_NONE;
245 screen_get_event_property_iv(event, SCREEN_PROPERTY_TYPE, &type);
246 if (type == SCREEN_EVENT_NONE)
251 QAbstractEventDispatcher* dispatcher = QAbstractEventDispatcher::instance();
252 bool handled = dispatcher && dispatcher->filterNativeEvent(QByteArrayLiteral(
"screen_event_t"), event, &result);
256 if (type == SCREEN_EVENT_CLOSE)
257 finishCloseEvent(event);
260 m_eventThread->armEventsPending(count);
261 screen_destroy_event(event);
269 "Failed to query event flags");
274 "Failed to query event sym");
278 "Failed to query event modifieres");
282 "Failed to query event scan");
286 "Failed to query event cap");
291 Q_FOREACH (QQnxScreenEventFilter *filter, m_eventFilters) {
292 if (filter->handleKeyboardEvent(flags, sym, modifiers, scan, cap, sequenceId)) {
307 screen_window_t qnxWindow;
310 "Failed to query event window");
312 qnxWindow =
static_cast<screen_window_t>(handle);
316 Q_SCREEN_CHECKERROR(screen_get_event_property_iv(event, SCREEN_PROPERTY_BUTTONS, &buttonState),
317 "Failed to query event button state");
322 screen_get_event_property_iv(event, SCREEN_PROPERTY_SOURCE_POSITION, windowPos),
323 "Failed to query event window position");
328 "Failed to query event position");
333 screen_get_event_property_iv(event, SCREEN_PROPERTY_MOUSE_WHEEL, &wheelDelta),
334 "Failed to query event wheel delta");
337 Q_SCREEN_CHECKERROR(screen_get_event_property_llv(event, SCREEN_PROPERTY_TIMESTAMP, ×tamp),
338 "Failed to get timestamp");
344 if (qnxWindow != m_lastMouseWindow) {
348 QWindowSystemInterface::handleLeaveEvent(wOld);
349 qCDebug(lcQpaScreenEvents) <<
"Qt leave, w=" << wOld;
353 QWindowSystemInterface::handleEnterEvent(w);
354 qCDebug(lcQpaScreenEvents) <<
"Qt enter, w=" << w;
358 m_lastMouseWindow = qnxWindow;
366 QPoint globalPoint(pos[0], pos[1]);
367 QPoint localPoint(windowPos[0], windowPos[1]);
373 Qt::MouseButtons buttons = Qt::NoButton;
374 if (buttonState & 0x01)
375 buttons |= Qt::LeftButton;
376 if (buttonState & 0x02)
377 buttons |= Qt::MiddleButton;
378 if (buttonState & 0x04)
379 buttons |= Qt::RightButton;
380 if (buttonState & 0x08)
381 buttons |= Qt::ExtraButton1;
382 if (buttonState & 0x10)
383 buttons |= Qt::ExtraButton2;
384 if (buttonState & 0x20)
385 buttons |= Qt::ExtraButton3;
386 if (buttonState & 0x40)
387 buttons |= Qt::ExtraButton4;
388 if (buttonState & 0x80)
389 buttons |= Qt::ExtraButton5;
393 if (m_lastGlobalMousePoint != globalPoint || m_lastLocalMousePoint != localPoint) {
394 QWindowSystemInterface::handleMouseEvent(w, timestamp, m_mouseDevice, localPoint,
395 globalPoint, buttons, Qt::NoButton,
397 qCDebug(lcQpaScreenEvents) <<
"Qt mouse move, w=" << w <<
", (" << localPoint.x() <<
","
398 << localPoint.y() <<
"), b=" <<
static_cast<
int>(buttons);
401 if (m_lastButtonState != buttons) {
402 static const auto supportedButtons = { Qt::LeftButton, Qt::MiddleButton,
403 Qt::RightButton, Qt::ExtraButton1,
404 Qt::ExtraButton2, Qt::ExtraButton3,
405 Qt::ExtraButton4, Qt::ExtraButton5 };
407 int releasedButtons = (m_lastButtonState ^ buttons) & ~buttons;
408 for (
auto button : supportedButtons) {
409 if (releasedButtons & button) {
410 QWindowSystemInterface::handleMouseEvent(w, timestamp, m_mouseDevice,
411 localPoint, globalPoint, buttons,
412 button, QEvent::MouseButtonRelease);
413 qCDebug(lcQpaScreenEvents) <<
"Qt mouse release, w=" << w <<
", (" << localPoint.x()
414 <<
"," << localPoint.y() <<
"), b=" << button;
418 if (m_lastButtonState != 0 && buttons == 0) {
422 int pressedButtons = (m_lastButtonState ^ buttons) & buttons;
423 for (
auto button : supportedButtons) {
424 if (pressedButtons & button) {
425 QWindowSystemInterface::handleMouseEvent(w, timestamp, m_mouseDevice,
426 localPoint, globalPoint, buttons,
427 button, QEvent::MouseButtonPress);
428 qCDebug(lcQpaScreenEvents) <<
"Qt mouse press, w=" << w <<
", (" << localPoint.x()
429 <<
"," << localPoint.y() <<
"), b=" << button;
437 QPoint angleDelta(0, wheelDelta);
438 QWindowSystemInterface::handleWheelEvent(w, timestamp, m_mouseDevice, localPoint,
439 globalPoint, QPoint(), angleDelta);
440 qCDebug(lcQpaScreenEvents) <<
"Qt wheel, w=" << w <<
", (" << localPoint.x() <<
","
441 << localPoint.y() <<
"), d=" <<
static_cast<
int>(wheelDelta);
445 m_lastGlobalMousePoint = globalPoint;
446 m_lastLocalMousePoint = localPoint;
447 m_lastButtonState = buttons;
453 if (screens.isEmpty())
456 const int screenCount = screens.size();
457 m_touchDevices.resize(screenCount);
458 m_touchPoints.resize(screenCount * MaximumTouchPoints);
459 m_touchPointWindows.resize(screenCount * MaximumTouchPoints);
460 m_touchPointWindows.fill(
nullptr);
462 for (
int i = 0; i < m_touchPoints.size(); i++) {
463 m_touchPoints[i].id = i % MaximumTouchPoints;
464 m_touchPoints[i].pressure = 1.0;
465 m_touchPoints[i].state = QEventPoint::State::Released;
468 for (
int i = 0; i < m_touchDevices.size(); i++) {
469 const int displayId = screens[i]->displayId();
473 const int systemId = displayId >= 0 ? 0x10000 + displayId : 0x20000 + i;
474 m_touchDevices[i] =
new QPointingDevice(
475 "touchscreen-"_L1 + QString::number(displayId >= 0 ? displayId : i), systemId,
476 QInputDevice::DeviceType::TouchScreen,
477 QPointingDevice::PointerType::Finger,
478 QPointingDevice::Capability::Position | QPointingDevice::Capability::Area
479 | QPointingDevice::Capability::Pressure
480 | QPointingDevice::Capability::NormalizedPosition,
481 MaximumTouchPoints, 8, QString(), QPointingDeviceUniqueId(),
this);
482 QWindowSystemInterface::registerInputDevice(m_touchDevices[i]);
488 if (m_touchDevices.isEmpty()) {
489 initializeTouchDevices();
490 if (m_touchDevices.isEmpty()) {
491 qCDebug(lcQpaScreenEvents) <<
"Touch event dropped: no screens available";
499 "Failed to query event position");
501 QCursor::setPos(pos[0], pos[1]);
505 Q_SCREEN_CHECKERROR(screen_get_event_property_iv(event, SCREEN_PROPERTY_SOURCE_POSITION, windowPos),
506 "Failed to query event window position");
510 Q_SCREEN_CHECKERROR(screen_get_event_property_iv(event, SCREEN_PROPERTY_TOUCH_ID, &touchId),
511 "Failed to query event touch id");
516 "Failed to query event window");
521 "Failed to query event touch area");
525 screen_get_event_property_iv(event, SCREEN_PROPERTY_TOUCH_PRESSURE, &touchPressure),
526 "Failed to query event touch pressure");
528 screen_window_t qnxWindow =
static_cast<screen_window_t>(handle);
530 if (touchId < 0 || touchId >= MaximumTouchPoints) {
531 qCWarning(lcQpaScreenEvents) <<
"Touch event dropped: touchId" << touchId
532 <<
"out of range [0," << MaximumTouchPoints <<
")";
540 if (qnxWindow != m_lastMouseWindow) {
544 QWindowSystemInterface::handleLeaveEvent(wOld);
545 qCDebug(lcQpaScreenEvents) <<
"Qt leave, w=" << wOld;
549 QWindowSystemInterface::handleEnterEvent(w);
550 qCDebug(lcQpaScreenEvents) <<
"Qt enter, w=" << w;
553 m_lastMouseWindow = qnxWindow;
557 QPlatformScreen *platformScreen = w ? QPlatformScreen::platformScreenForWindow(w) :
nullptr;
558 const int screenIndex = screens.indexOf(
static_cast<
QQnxScreen *>(platformScreen));
559 if (screenIndex < 0) {
560 qCDebug(lcQpaScreenEvents) <<
"Touch event: screen not found, dropping";
563 const int uniqueTouchId = screenIndex * MaximumTouchPoints + touchId;
564 if (uniqueTouchId >= m_touchPoints.size()) {
565 qCWarning(lcQpaScreenEvents) <<
"Touch event dropped: uniqueTouchId" << uniqueTouchId
566 <<
"exceeds touch point array size" << m_touchPoints.size();
570 if (w && platformScreen) {
571 if (qnxType == SCREEN_EVENT_MTOUCH_RELEASE)
574 m_touchPointWindows[uniqueTouchId] = qnxWindow;
577 QSizeF screenSize = platformScreen->geometry().size();
579 m_touchPoints[uniqueTouchId].id = touchId;
582 m_touchPoints[uniqueTouchId].normalPosition =
583 QPointF(
static_cast<qreal>(pos[0]) / screenSize.width(),
584 static_cast<qreal>(pos[1]) / screenSize.height());
586 m_touchPoints[uniqueTouchId].area = QRectF(w->geometry().left() + windowPos[0] - (touchArea[0]>>1),
587 w->geometry().top() + windowPos[1] - (touchArea[1]>>1),
588 (touchArea[0]>>1), (touchArea[1]>>1));
589 QWindow *parent = w->parent();
591 m_touchPoints[uniqueTouchId].area.translate(parent->geometry().topLeft());
592 parent = parent->parent();
598 m_touchPoints[uniqueTouchId].pressure =
static_cast<qreal>(touchPressure)/200.0;
600 if (m_touchPoints[uniqueTouchId].pressure > 1)
601 m_touchPoints[uniqueTouchId].pressure = 1;
604 QEvent::Type type = QEvent::None;
606 case SCREEN_EVENT_MTOUCH_TOUCH:
607 m_touchPoints[uniqueTouchId].state = QEventPoint::State::Pressed;
608 type = QEvent::TouchBegin;
610 case SCREEN_EVENT_MTOUCH_MOVE:
611 m_touchPoints[uniqueTouchId].state = QEventPoint::State::Updated;
612 type = QEvent::TouchUpdate;
614 case SCREEN_EVENT_MTOUCH_RELEASE:
615 m_touchPoints[uniqueTouchId].state = QEventPoint::State::Released;
616 type = QEvent::TouchEnd;
621 QList<QWindowSystemInterface::TouchPoint> pointList;
622 pointList.reserve(MaximumTouchPoints);
623 const int base = screenIndex * MaximumTouchPoints;
624 for (
int i = base; i < base + MaximumTouchPoints; i++) {
625 if (i == uniqueTouchId) {
626 pointList.append(m_touchPoints[i]);
627 }
else if (m_touchPoints[i].state != QEventPoint::State::Released
628 && m_touchPointWindows[i] == qnxWindow) {
629 m_touchPoints[i].state = QEventPoint::State::Stationary;
630 pointList.append(m_touchPoints[i]);
635 if (Q_UNLIKELY(screenIndex >= m_touchDevices.size())) {
636 qCDebug(lcQpaScreenEvents) <<
"Touch event: screenIndex out of range, dropping";
639 QPointingDevice *touchDevice = m_touchDevices[screenIndex];
640 QWindowSystemInterface::handleTouchEvent(w, touchDevice, pointList);
641 qCDebug(lcQpaScreenEvents) <<
"Qt touch, w =" << w
642 <<
", p=" << m_touchPoints[uniqueTouchId].area.topLeft()
649 screen_window_t window = 0;
651 screen_get_event_property_pv(event, SCREEN_PROPERTY_WINDOW, (
void**)&window),
652 "Failed to query window property");
654 for (
int i = 0; i < m_touchPointWindows.size(); ++i) {
655 if (m_touchPointWindows[i] == window) {
656 m_touchPointWindows[i] =
nullptr;
657 m_touchPoints[i].state = QEventPoint::State::Released;
661 Q_EMIT windowClosed(window);
666 QWindowSystemInterface::handleCloseEvent(w);
671 screen_window_t window = 0;
672 int object_type = -1;
675 screen_get_event_property_iv(event, SCREEN_PROPERTY_OBJECT_TYPE, &object_type),
676 "Failed to query object type for create event");
678 switch (object_type) {
680 case SCREEN_OBJECT_TYPE_CONTEXT:
681 case SCREEN_OBJECT_TYPE_GROUP:
682 case SCREEN_OBJECT_TYPE_DISPLAY:
683 case SCREEN_OBJECT_TYPE_DEVICE:
684 case SCREEN_OBJECT_TYPE_PIXMAP:
685 case SCREEN_OBJECT_TYPE_SESSION:
686 case SCREEN_OBJECT_TYPE_STREAM:
688 case SCREEN_OBJECT_TYPE_WINDOW:
691 screen_get_event_property_pv(event, SCREEN_PROPERTY_WINDOW, (
void**)&window),
692 "Failed to query window property");
694 Q_EMIT newWindowCreated(window);
698 qCDebug(lcQpaScreenEvents) <<
"Ignore create event for object type: " << object_type;
705 screen_display_t nativeDisplay = 0;
706 if (screen_get_event_property_pv(event, SCREEN_PROPERTY_DISPLAY, (
void **)&nativeDisplay) != 0) {
707 qWarning(
"QQnx: failed to query display property, errno=%d", errno);
712 if (screen_get_event_property_iv(event, SCREEN_PROPERTY_ATTACHED, &isAttached) != 0) {
713 qWarning(
"QQnx: failed to query display attached property, errno=%d", errno);
717 qCDebug(lcQpaScreenEvents) <<
"display attachment is now:" << isAttached;
719 QQnxScreen *screen = m_qnxIntegration->screenForNative(nativeDisplay);
724 screen_get_display_property_iv(nativeDisplay, SCREEN_PROPERTY_SIZE, val);
725 if (val[0] == 0 && val[1] == 0)
728 qCDebug(lcQpaScreenEvents) <<
"Creating new QQnxScreen for newly attached display";
729 m_qnxIntegration->createDisplay(nativeDisplay,
false );
730 qDeleteAll(m_touchDevices);
731 m_touchDevices.clear();
733 }
else if (!isAttached) {
743 qCDebug(lcQpaScreenEvents) <<
"Removing display";
745 qDeleteAll(m_touchDevices);
746 m_touchDevices.clear();
756 screen_get_event_property_iv(event, SCREEN_PROPERTY_OBJECT_TYPE, &objectType),
757 "Failed to query object type property");
759 if (objectType != SCREEN_OBJECT_TYPE_WINDOW)
763 screen_window_t window = 0;
764 if (Q_UNLIKELY(screen_get_event_property_pv(event, SCREEN_PROPERTY_WINDOW, (
void**)&window) != 0))
765 qFatal(
"QQnx: failed to query window property, errno=%d", errno);
768 qCDebug(lcQpaScreenEvents) <<
"handlePositionEvent on NULL window";
774 if (Q_UNLIKELY(screen_get_event_property_iv(event, SCREEN_PROPERTY_NAME, &property) != 0))
775 qWarning(
"QQnx: failed to query window property, errno=%d", errno);
778 case SCREEN_PROPERTY_FOCUS:
779 handleKeyboardFocusPropertyEvent(window);
781 case SCREEN_PROPERTY_SIZE:
782 case SCREEN_PROPERTY_POSITION:
783 handleGeometryPropertyEvent(window);
787 qCDebug(lcQpaScreenEvents) <<
"Ignore property event for property: " << property;
796 qWarning(
"QQnx: failed to query keyboard focus property, errno=%d", errno);
800 m_focusLostTimer.stop();
802 if (focus && focusWindow != QGuiApplication::focusWindow())
803 QWindowSystemInterface::handleFocusWindowChanged(focusWindow, Qt::ActiveWindowFocusReason);
804 else if (!focus && focusWindow == QGuiApplication::focusWindow())
805 m_focusLostTimer.start(50ms,
this);
811 if (screen_get_window_property_iv(window, SCREEN_PROPERTY_POSITION, pos) != 0) {
812 qWarning(
"QQnx: failed to query window property, errno=%d", errno);
817 if (screen_get_window_property_iv(window, SCREEN_PROPERTY_SIZE, size) != 0) {
818 qWarning(
"QQnx: failed to query window property, errno=%d", errno);
822 QRect rect(pos[0], pos[1], size[0], size[1]);
828 if (qtWindow->handle() && qtWindow->handle()->geometry() != rect)
829 qtWindow->handle()->setGeometry(rect);
832 qCDebug(lcQpaScreenEvents) << qtWindow <<
"moved to" << rect;
837 if (event->id() == m_focusLostTimer.id()) {
838 m_focusLostTimer.stop();
841 QObject::timerEvent(event);
852 screen_get_event_property_iv(event, SCREEN_PROPERTY_SUBTYPE, &subtype),
853 "Failed to query object type property");
856 screen_window_t window = 0;
857 if (screen_get_event_property_pv(event, SCREEN_PROPERTY_WINDOW, (
void**)&window) != 0)
858 qFatal(
"QQnx: failed to query window property, errno=%d", errno);
861 case SCREEN_EVENT_CLOSE: {
863 closeWindow->close();
869 qCDebug(lcQpaScreenEvents) <<
"Ignore manager event for subtype: " << subtype;
882#include "moc_qqnxscreeneventhandler.cpp"
static QQnxIntegration * instance()
void removeDisplay(QQnxScreen *screen)
void removeScreenEventFilter(QQnxScreenEventFilter *filter)
void setScreenEventThread(QQnxScreenEventThread *eventThread)
void timerEvent(QTimerEvent *event) override
This event handler can be reimplemented in a subclass to receive timer events for the object.
bool handleEvent(screen_event_t event)
static void injectKeyboardEvent(int flags, int sym, int mod, int scan, int cap)
void addScreenEventFilter(QQnxScreenEventFilter *filter)
bool handleEvent(screen_event_t event, int qnxType)
bool isPrimaryScreen() const
The QQnxWindow is the base class of the various classes used as instances of QPlatformWindow in the Q...
void handleActivationEvent()
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")
#define Q_SCREEN_CHECKERROR(x, message)
QT_BEGIN_NAMESPACE int qtKeyForPrivateUseQnxKey(int key)
const int SCREEN_PROPERTY_SYM
const int SCREEN_PROPERTY_SCAN
const int SCREEN_PROPERTY_FOCUS
const int SCREEN_PROPERTY_MODIFIERS
#define _SCREEN_MAKE_VERSION(major, minor, patch)
static int qtKey(int virtualKey, QChar::Category category)
static QString keyString(int sym, QChar::Category category)
static void finishCloseEvent(screen_event_t event)
static QString capKeyString(int cap, int modifiers, int key)
static void finishCloseEvent(screen_event_t event)