diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/kernel/qguiapplication.cpp | 25 | ||||
-rw-r--r-- | src/gui/kernel/qguiapplication_p.h | 1 | ||||
-rw-r--r-- | src/gui/kernel/qwindow.cpp | 4 |
3 files changed, 30 insertions, 0 deletions
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 4c4e75c4f6..949c963d0c 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -151,6 +151,7 @@ QWindow *QGuiApplicationPrivate::focus_window = 0; static QBasicMutex applicationFontMutex; QFont *QGuiApplicationPrivate::app_font = 0; bool QGuiApplicationPrivate::obey_desktop_settings = true; +bool QGuiApplicationPrivate::noGrab = false; static qreal fontSmoothingGamma = 1.7; @@ -864,8 +865,18 @@ void QGuiApplicationPrivate::setEventDispatcher(QAbstractEventDispatcher *eventD } +#if defined(QT_DEBUG) && defined(Q_OS_LINUX) +// Find out if our parent process is gdb by looking at the 'exe' symlink under /proc. +static bool runningUnderDebugger() +{ + const QFileInfo parentProcExe(QStringLiteral("/proc/") + QString::number(getppid()) + QStringLiteral("/exe")); + return parentProcExe.isSymLink() && parentProcExe.symLinkTarget().endsWith(QStringLiteral("/gdb")); +} +#endif + void QGuiApplicationPrivate::init() { + bool doGrabUnderDebugger = false; QList<QByteArray> pluginList; // Get command line params @@ -894,6 +905,10 @@ void QGuiApplicationPrivate::init() QDir::setCurrent(qbundlePath.section(QLatin1Char('/'), 0, -2)); } #endif + } else if (arg == "-nograb") { + QGuiApplicationPrivate::noGrab = true; + } else if (arg == "-dograb") { + doGrabUnderDebugger = true; } else { argv[j++] = argv[i]; } @@ -904,6 +919,16 @@ void QGuiApplicationPrivate::init() argc = j; } +#if defined(QT_DEBUG) && defined(Q_OS_LINUX) + if (!doGrabUnderDebugger && !QGuiApplicationPrivate::noGrab && runningUnderDebugger()) { + QGuiApplicationPrivate::noGrab = true; + qDebug("Qt: gdb: -nograb added to command-line options.\n" + "\t Use the -dograb option to enforce grabbing."); + } +#else + Q_UNUSED(doGrabUnderDebugger) +#endif + // Load environment exported generic plugins foreach (const QByteArray &plugin, qgetenv("QT_QPA_GENERIC_PLUGINS").split(',')) pluginList << plugin; diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h index 173f4e6ba2..9044d40ab0 100644 --- a/src/gui/kernel/qguiapplication_p.h +++ b/src/gui/kernel/qguiapplication_p.h @@ -220,6 +220,7 @@ public: QStyleHints *styleHints; static bool obey_desktop_settings; + static bool noGrab; QInputMethod *inputMethod; static QList<QObject *> generic_plugin_list; diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index 9fb3c70efb..f930c720c2 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -1314,6 +1314,8 @@ QPlatformSurface *QWindow::surfaceHandle() const bool QWindow::setKeyboardGrabEnabled(bool grab) { Q_D(QWindow); + if (grab && QGuiApplicationPrivate::noGrab) + return false; if (d->platformWindow) return d->platformWindow->setKeyboardGrabEnabled(grab); return false; @@ -1331,6 +1333,8 @@ bool QWindow::setKeyboardGrabEnabled(bool grab) bool QWindow::setMouseGrabEnabled(bool grab) { Q_D(QWindow); + if (grab && QGuiApplicationPrivate::noGrab) + return false; if (d->platformWindow) return d->platformWindow->setMouseGrabEnabled(grab); return false; |