From 9b8759284bc7d447227c9e0aaf3caade49e9f5f7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=B8rgen=20Lind?= Date: Wed, 27 Apr 2011 17:28:51 +0200 Subject: [PATCH] clipboard (cherry picked from commit 3f5c0e26e0f8b6876c3fb4d3822df49c748b2eea) --- src/gui/kernel/qapplication.cpp | 13 +++++++------ src/gui/kernel/qapplication.h | 2 +- src/gui/kernel/qclipboard.h | 1 + src/gui/kernel/qguiapplication_qpa.cpp | 35 ++++++++++++++++++++++++++++++++++ src/gui/kernel/qguiapplication_qpa.h | 2 +- src/gui/kernel/qguiapplication_qpa_p.h | 3 +++ 6 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp index bab2ada..8533b39 100644 --- a/src/gui/kernel/qapplication.cpp +++ b/src/gui/kernel/qapplication.cpp @@ -544,7 +544,7 @@ FontHash *qt_app_fonts_hash() QWidgetList *QApplicationPrivate::popupWidgets = 0; // has keyboard input focus QDesktopWidget *qt_desktopWidget = 0; // root window widgets -#ifndef QT_NO_CLIPBOARD +#if !defined(Q_WS_QPA) && !defined(QT_NO_CLIPBOARD) QClipboard *qt_clipboard = 0; // global clipboard object #endif QWidgetList * qt_modal_stack=0; // stack of modal widgets @@ -1084,7 +1084,7 @@ QApplication::~QApplication() { Q_D(QApplication); -#ifndef QT_NO_CLIPBOARD +#if !defined(Q_WS_QPA) && !defined(QT_NO_CLIPBOARD) // flush clipboard contents if (qt_clipboard) { QEvent event(QEvent::Clipboard); @@ -1099,8 +1099,10 @@ QApplication::~QApplication() d->toolTipWakeUp.stop(); d->toolTipFallAsleep.stop(); +#if !defined(Q_WS_QPA) d->eventDispatcher->closingDown(); d->eventDispatcher = 0; +#endif QApplicationPrivate::is_app_closing = true; QApplicationPrivate::is_app_running = false; @@ -1122,7 +1124,7 @@ QApplication::~QApplication() delete qt_desktopWidget; qt_desktopWidget = 0; -#ifndef QT_NO_CLIPBOARD +#if !defined(Q_WS_QPA) && !defined(QT_NO_CLIPBOARD) delete qt_clipboard; qt_clipboard = 0; #endif @@ -3258,7 +3260,7 @@ QDesktopWidget *QApplication::desktop() return qt_desktopWidget; } -#ifndef QT_NO_CLIPBOARD +#if !defined(Q_WS_QPA) && !defined(QT_NO_CLIPBOARD) /*! Returns a pointer to the application global clipboard. @@ -3276,8 +3278,7 @@ QClipboard *QApplication::clipboard() } return qt_clipboard; } -#endif // QT_NO_CLIPBOARD - +#endif // Q_WS_QPA && QT_NO_CLIPBOARD /*! Sets whether Qt should use the system's standard colors, fonts, etc., to \a on. By default, this is true. diff --git a/src/gui/kernel/qapplication.h b/src/gui/kernel/qapplication.h index 6526739..1bf7e8a 100644 --- a/src/gui/kernel/qapplication.h +++ b/src/gui/kernel/qapplication.h @@ -188,7 +188,7 @@ public: static QWidget *activePopupWidget(); static QWidget *activeModalWidget(); -#ifndef QT_NO_CLIPBOARD +#if !defined(Q_WS_QPA) && !defined(QT_NO_CLIPBOARD) static QClipboard *clipboard(); #endif static QWidget *focusWidget(); diff --git a/src/gui/kernel/qclipboard.h b/src/gui/kernel/qclipboard.h index b55bdc6..0a9e28a 100644 --- a/src/gui/kernel/qclipboard.h +++ b/src/gui/kernel/qclipboard.h @@ -109,6 +109,7 @@ protected: friend class QApplication; friend class QApplicationPrivate; + friend class QGuiApplication; friend class QBaseApplication; friend class QDragManager; friend class QMimeSource; diff --git a/src/gui/kernel/qguiapplication_qpa.cpp b/src/gui/kernel/qguiapplication_qpa.cpp index 0a3c039..67ad5a7 100644 --- a/src/gui/kernel/qguiapplication_qpa.cpp +++ b/src/gui/kernel/qguiapplication_qpa.cpp @@ -46,6 +46,7 @@ #include "private/qevent_p.h" #include +#include #include #include @@ -54,6 +55,10 @@ #include #include "private/qwindowsysteminterface_qpa_p.h" +#ifndef QT_NO_CLIPBOARD +#include +#endif + QT_BEGIN_NAMESPACE Qt::MouseButtons QGuiApplicationPrivate::mouse_buttons = Qt::NoButton; @@ -83,6 +88,10 @@ int QGuiApplicationPrivate::mouse_double_click_distance = 5; QGuiApplicationPrivate *QGuiApplicationPrivate::self = 0; +#ifndef QT_NO_CLIPBOARD +QClipboard *QGuiApplicationPrivate::qt_clipboard = 0; +#endif + QGuiApplication::QGuiApplication(int &argc, char **argv, int flags) : QCoreApplication(*new QGuiApplicationPrivate(argc, argv, flags)) { @@ -97,6 +106,18 @@ QGuiApplication::QGuiApplication(QGuiApplicationPrivate &p) QGuiApplication::~QGuiApplication() { + Q_D(QGuiApplication); + // flush clipboard contents + if (QGuiApplicationPrivate::qt_clipboard) { + QEvent event(QEvent::Clipboard); + QApplication::sendEvent(QGuiApplicationPrivate::qt_clipboard, &event); + } + + d->eventDispatcher->closingDown(); + d->eventDispatcher = 0; + + delete QGuiApplicationPrivate::qt_clipboard; + QGuiApplicationPrivate::qt_clipboard = 0; } QGuiApplicationPrivate::QGuiApplicationPrivate(int &argc, char **argv, int flags) @@ -703,5 +724,19 @@ void QGuiApplicationPrivate::reportAvailableGeometryChange( #endif } +#ifndef QT_NO_CLIPBOARD +QClipboard * QGuiApplication::clipboard() +{ + if (QGuiApplicationPrivate::qt_clipboard == 0) { + if (!qApp) { + qWarning("QApplication: Must construct a QApplication before accessing a QClipboard"); + return 0; + } + QGuiApplicationPrivate::qt_clipboard = new QClipboard(0); + } + return QGuiApplicationPrivate::qt_clipboard; +} +#endif + QT_END_NAMESPACE diff --git a/src/gui/kernel/qguiapplication_qpa.h b/src/gui/kernel/qguiapplication_qpa.h index 549ef9c..4be4e19 100644 --- a/src/gui/kernel/qguiapplication_qpa.h +++ b/src/gui/kernel/qguiapplication_qpa.h @@ -79,11 +79,11 @@ public: static QFont font(const char *className); static void setFont(const QFont &, const char* className = 0); static QFontMetrics fontMetrics(); +#endif #ifndef QT_NO_CLIPBOARD static QClipboard *clipboard(); #endif -#endif static Qt::KeyboardModifiers keyboardModifiers(); static Qt::MouseButtons mouseButtons(); diff --git a/src/gui/kernel/qguiapplication_qpa_p.h b/src/gui/kernel/qguiapplication_qpa_p.h index fbbb010..b3ecd01 100644 --- a/src/gui/kernel/qguiapplication_qpa_p.h +++ b/src/gui/kernel/qguiapplication_qpa_p.h @@ -114,6 +114,9 @@ public: static int mousePressY; static int mouse_double_click_distance; +#ifndef QT_NO_CLIPBOARD + static QClipboard *qt_clipboard; +#endif private: void init(); -- 2.7.4