Bring back -nograb/-dograb for debugging.
authorFriedemann Kleint <Friedemann.Kleint@digia.com>
Wed, 24 Oct 2012 10:57:01 +0000 (12:57 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Thu, 15 Nov 2012 12:56:58 +0000 (13:56 +0100)
Task-number: QTBUG-27632

Change-Id: I4b59df01519af4684d9dbe6e4b6c18a5ebd9aeae
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
src/gui/kernel/qguiapplication.cpp
src/gui/kernel/qguiapplication_p.h
src/gui/kernel/qwindow.cpp

index 4c4e75c..949c963 100644 (file)
@@ -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;
index 173f4e6..9044d40 100644 (file)
@@ -220,6 +220,7 @@ public:
 
     QStyleHints *styleHints;
     static bool obey_desktop_settings;
+    static bool noGrab;
     QInputMethod *inputMethod;
 
     static QList<QObject *> generic_plugin_list;
index 9fb3c70..f930c72 100644 (file)
@@ -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;