/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtGui module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL3 included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 2.0 or (at your option) the GNU General ** Public license version 3 or any later version approved by the KDE Free ** Qt Foundation. The licenses are as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-2.0.html and ** https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGUIAPPLICATION_P_H #define QGUIAPPLICATION_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include #include #include #include #include "private/qshortcutmap_p.h" #include QT_BEGIN_NAMESPACE class QColorProfile; class QPlatformIntegration; class QPlatformTheme; class QPlatformDragQtResponse; #ifndef QT_NO_DRAGANDDROP class QDrag; #endif // QT_NO_DRAGANDDROP class QInputDeviceManager; class Q_GUI_EXPORT QGuiApplicationPrivate : public QCoreApplicationPrivate { Q_DECLARE_PUBLIC(QGuiApplication) public: QGuiApplicationPrivate(int &argc, char **argv, int flags); ~QGuiApplicationPrivate(); void init(); void createPlatformIntegration(); void createEventDispatcher() override; void eventDispatcherReady() override; virtual void notifyLayoutDirectionChange(); virtual void notifyActiveWindowChange(QWindow *previous); virtual bool shouldQuit() override; bool shouldQuitInternal(const QWindowList &processedWindows); virtual bool tryCloseAllWindows(); static Qt::KeyboardModifiers modifier_buttons; static Qt::MouseButtons mouse_buttons; static QPlatformIntegration *platform_integration; static QPlatformIntegration *platformIntegration() { return platform_integration; } static QPlatformTheme *platform_theme; static QPlatformTheme *platformTheme() { return platform_theme; } static QAbstractEventDispatcher *qt_qpa_core_dispatcher() { if (QCoreApplication::instance()) return QCoreApplication::instance()->d_func()->threadData->eventDispatcher.load(); else return 0; } static void processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent *e); static void processKeyEvent(QWindowSystemInterfacePrivate::KeyEvent *e); static void processWheelEvent(QWindowSystemInterfacePrivate::WheelEvent *e); static void processTouchEvent(QWindowSystemInterfacePrivate::TouchEvent *e); static void processCloseEvent(QWindowSystemInterfacePrivate::CloseEvent *e); static void processGeometryChangeEvent(QWindowSystemInterfacePrivate::GeometryChangeEvent *e); static void processEnterEvent(QWindowSystemInterfacePrivate::EnterEvent *e); static void processLeaveEvent(QWindowSystemInterfacePrivate::LeaveEvent *e); static void processActivatedEvent(QWindowSystemInterfacePrivate::ActivatedWindowEvent *e); static void processWindowStateChangedEvent(QWindowSystemInterfacePrivate::WindowStateChangedEvent *e); static void processWindowScreenChangedEvent(QWindowSystemInterfacePrivate::WindowScreenChangedEvent *e); static void processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent *e); static void updateFilteredScreenOrientation(QScreen *screen); static void reportScreenOrientationChange(QScreen *screen); static void reportScreenOrientationChange(QWindowSystemInterfacePrivate::ScreenOrientationEvent *e); static void reportGeometryChange(QWindowSystemInterfacePrivate::ScreenGeometryEvent *e); static void reportLogicalDotsPerInchChange(QWindowSystemInterfacePrivate::ScreenLogicalDotsPerInchEvent *e); static void reportRefreshRateChange(QWindowSystemInterfacePrivate::ScreenRefreshRateEvent *e); static void processThemeChanged(QWindowSystemInterfacePrivate::ThemeChangeEvent *tce); static void processExposeEvent(QWindowSystemInterfacePrivate::ExposeEvent *e); static void processFileOpenEvent(QWindowSystemInterfacePrivate::FileOpenEvent *e); static void processTabletEvent(QWindowSystemInterfacePrivate::TabletEvent *e); static void processTabletEnterProximityEvent(QWindowSystemInterfacePrivate::TabletEnterProximityEvent *e); static void processTabletLeaveProximityEvent(QWindowSystemInterfacePrivate::TabletLeaveProximityEvent *e); #ifndef QT_NO_GESTURES static void processGestureEvent(QWindowSystemInterfacePrivate::GestureEvent *e); #endif static void processPlatformPanelEvent(QWindowSystemInterfacePrivate::PlatformPanelEvent *e); #ifndef QT_NO_CONTEXTMENU static void processContextMenuEvent(QWindowSystemInterfacePrivate::ContextMenuEvent *e); #endif #ifndef QT_NO_DRAGANDDROP static QPlatformDragQtResponse processDrag(QWindow *w, const QMimeData *dropData, const QPoint &p, Qt::DropActions supportedActions); static QPlatformDropQtResponse processDrop(QWindow *w, const QMimeData *dropData, const QPoint &p, Qt::DropActions supportedActions); #endif static bool processNativeEvent(QWindow *window, const QByteArray &eventType, void *message, long *result); static void sendQWindowEventToQPlatformWindow(QWindow *window, QEvent *event); static inline Qt::Alignment visualAlignment(Qt::LayoutDirection direction, Qt::Alignment alignment) { if (!(alignment & Qt::AlignHorizontal_Mask)) alignment |= Qt::AlignLeft; if (!(alignment & Qt::AlignAbsolute) && (alignment & (Qt::AlignLeft | Qt::AlignRight))) { if (direction == Qt::RightToLeft) alignment ^= (Qt::AlignLeft | Qt::AlignRight); alignment |= Qt::AlignAbsolute; } return alignment; } static void emitLastWindowClosed(); QPixmap getPixmapCursor(Qt::CursorShape cshape); void _q_updateFocusObject(QObject *object); static QGuiApplicationPrivate *instance() { return self; } static QIcon *app_icon; static QString *platform_name; static QString *displayName; static QString *desktopFileName; QWindowList modalWindowList; static void showModalWindow(QWindow *window); static void hideModalWindow(QWindow *window); static void updateBlockedStatus(QWindow *window); virtual bool isWindowBlocked(QWindow *window, QWindow **blockingWindow = 0) const; virtual bool popupActive() { return false; } static ulong mousePressTime; static Qt::MouseButton mousePressButton; static int mousePressX; static int mousePressY; static int mouse_double_click_distance; static QPointF lastCursorPosition; static QWindow *currentMouseWindow; static QWindow *currentMousePressWindow; static Qt::ApplicationState applicationState; static bool highDpiScalingUpdated; struct TabletPointData { TabletPointData(qint64 devId = 0) : deviceId(devId), state(Qt::NoButton), target(nullptr) {} qint64 deviceId; Qt::MouseButtons state; QWindow *target; }; static QVector tabletDevicePoints; static TabletPointData &tabletDevicePoint(qint64 deviceId); #ifndef QT_NO_CLIPBOARD static QClipboard *qt_clipboard; #endif static QPalette *app_pal; static QWindowList window_list; static QWindow *focus_window; #ifndef QT_NO_CURSOR QList cursor_list; #endif static QList screen_list; static QFont *app_font; static QString styleOverride; static QStyleHints *styleHints; static bool obey_desktop_settings; QInputMethod *inputMethod; QString firstWindowTitle; QIcon forcedWindowIcon; static QList generic_plugin_list; #ifndef QT_NO_SHORTCUT QShortcutMap shortcutMap; #endif #ifndef QT_NO_SESSIONMANAGER static bool is_fallback_session_management_enabled; QSessionManager *session_manager; bool is_session_restored; bool is_saving_session; void commitData(); void saveState(); #endif struct ActiveTouchPointsKey { ActiveTouchPointsKey(QTouchDevice *dev, int id) : device(dev), touchPointId(id) { } QTouchDevice *device; int touchPointId; }; struct ActiveTouchPointsValue { QPointer window; QPointer target; QTouchEvent::TouchPoint touchPoint; }; QHash activeTouchPoints; QEvent::Type lastTouchType; struct SynthesizedMouseData { SynthesizedMouseData(const QPointF &p, const QPointF &sp, QWindow *w) : pos(p), screenPos(sp), window(w) { } QPointF pos; QPointF screenPos; QPointer window; }; QHash synthesizedMousePoints; static int mouseEventCaps(QMouseEvent *event); static QVector2D mouseEventVelocity(QMouseEvent *event); static void setMouseEventCapsAndVelocity(QMouseEvent *event, int caps, const QVector2D &velocity); static Qt::MouseEventSource mouseEventSource(const QMouseEvent *event); static void setMouseEventSource(QMouseEvent *event, Qt::MouseEventSource source); static Qt::MouseEventFlags mouseEventFlags(const QMouseEvent *event); static void setMouseEventFlags(QMouseEvent *event, Qt::MouseEventFlags flags); static QInputDeviceManager *inputDeviceManager(); const QColorProfile *colorProfileForA8Text(); const QColorProfile *colorProfileForA32Text(); // hook reimplemented in QApplication to apply the QStyle function on the QIcon virtual QPixmap applyQIconStyleHelper(QIcon::Mode, const QPixmap &basePixmap) const { return basePixmap; } virtual void notifyWindowIconChanged(); static void applyWindowGeometrySpecificationTo(QWindow *window); static void setApplicationState(Qt::ApplicationState state, bool forcePropagate = false); protected: virtual void notifyThemeChanged(); bool tryCloseRemainingWindows(QWindowList processedWindows); #ifndef QT_NO_DRAGANDDROP virtual void notifyDragStarted(const QDrag *); #endif // QT_NO_DRAGANDDROP private: friend class QDragManager; static QGuiApplicationPrivate *self; static QTouchDevice *m_fakeTouchDevice; static int m_fakeMouseSourcePointId; QAtomicPointer m_a8ColorProfile; QAtomicPointer m_a32ColorProfile; bool ownGlobalShareContext; static QInputDeviceManager *m_inputDeviceManager; }; Q_GUI_EXPORT uint qHash(const QGuiApplicationPrivate::ActiveTouchPointsKey &k); Q_GUI_EXPORT bool operator==(const QGuiApplicationPrivate::ActiveTouchPointsKey &a, const QGuiApplicationPrivate::ActiveTouchPointsKey &b); QT_END_NAMESPACE #endif // QGUIAPPLICATION_P_H