Make the -nograb and -dograb arguments actually work on xcb

Change-Id: Idc725443e4abe27db3e530f08173897bfcbe1278
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>
bb10
Jørgen Lind 2014-10-30 16:53:18 +01:00
parent 7231e1fbe2
commit a7111c5dde
7 changed files with 38 additions and 41 deletions

View File

@ -163,7 +163,6 @@ 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;
@ -1196,20 +1195,10 @@ void QGuiApplicationPrivate::eventDispatcherReady()
platform_integration->initialize();
}
#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(QLatin1String("/gdb"));
}
#endif
void QGuiApplicationPrivate::init()
{
QCoreApplicationPrivate::is_app_running = false; // Starting up.
bool doGrabUnderDebugger = false;
bool loadTestability = false;
QList<QByteArray> pluginList;
// Get command line params
@ -1244,10 +1233,6 @@ void QGuiApplicationPrivate::init()
QDir::setCurrent(qbundlePath.section(QLatin1Char('/'), 0, -2));
}
#endif
} else if (arg == "-nograb") {
QGuiApplicationPrivate::noGrab = true;
} else if (arg == "-dograb") {
doGrabUnderDebugger = true;
#ifndef QT_NO_SESSIONMANAGER
} else if (arg == "-session" && i < argc-1) {
++i;
@ -1273,16 +1258,6 @@ 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;

View File

@ -221,7 +221,6 @@ public:
QStyleHints *styleHints;
static bool obey_desktop_settings;
static bool noGrab;
QInputMethod *inputMethod;
QString firstWindowTitle;

View File

@ -1639,8 +1639,6 @@ 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;
@ -1658,8 +1656,6 @@ 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;

View File

@ -471,6 +471,7 @@ public:
QXcbEventReader *eventReader() const { return m_reader; }
bool canGrab() const { return m_canGrabServer; }
protected:
bool event(QEvent *e) Q_DECL_OVERRIDE;

View File

@ -92,11 +92,11 @@
QT_BEGIN_NAMESPACE
#if defined(QT_DEBUG) && defined(Q_OS_LINUX)
// Find out if our parent process is gdb by looking at the 'exe' symlink under /proc,.
// or, for older Linuxes, read out 'cmdline'.
static bool runningUnderDebugger()
{
#if defined(QT_DEBUG) && defined(Q_OS_LINUX)
const QString parentProc = QLatin1String("/proc/") + QString::number(getppid());
const QFileInfo parentProcExe(parentProc + QLatin1String("/exe"));
if (parentProcExe.isSymLink())
@ -113,12 +113,15 @@ static bool runningUnderDebugger()
s += c;
}
return s == "gdb";
}
#else
return false;
#endif
}
QXcbIntegration::QXcbIntegration(const QStringList &parameters, int &argc, char **argv)
: m_services(new QGenericUnixServices)
, m_instanceName(0)
, m_canGrab(true)
{
qRegisterMetaType<QXcbWindow*>();
#ifdef XCB_USE_XLIB
@ -126,16 +129,10 @@ QXcbIntegration::QXcbIntegration(const QStringList &parameters, int &argc, char
#endif
m_nativeInterface.reset(new QXcbNativeInterface);
bool canGrab = true;
#if defined(QT_DEBUG) && defined(Q_OS_LINUX)
canGrab = !runningUnderDebugger();
#endif
static bool canNotGrabEnv = qgetenv("QT_XCB_NO_GRAB_SERVER").length();
if (canNotGrabEnv)
canGrab = false;
// Parse arguments
const char *displayName = 0;
bool noGrabArg = false;
bool doGrabArg = false;
if (argc) {
int j = 1;
for (int i = 1; i < argc; i++) {
@ -146,13 +143,35 @@ QXcbIntegration::QXcbIntegration(const QStringList &parameters, int &argc, char
displayName = argv[++i];
else if (arg == "-name" && i < argc - 1)
m_instanceName = argv[++i];
else if (arg == "-nograb")
noGrabArg = true;
else if (arg == "-dograb")
doGrabArg = true;
else
argv[j++] = argv[i];
}
argc = j;
} // argc
m_connections << new QXcbConnection(m_nativeInterface.data(), canGrab, displayName);
bool underDebugger = runningUnderDebugger();
if (noGrabArg && doGrabArg && underDebugger) {
qWarning() << "Both -nograb and -dograb command line arguments specified. Please pick one. -nograb takes prcedence";
doGrabArg = false;
}
#if defined(QT_DEBUG)
if (!noGrabArg && !doGrabArg && underDebugger) {
qDebug("Qt: gdb: -nograb added to command-line options.\n"
"\t Use the -dograb option to enforce grabbing.");
}
#endif
m_canGrab = (!underDebugger && noGrabArg) || (underDebugger && doGrabArg);
static bool canNotGrabEnv = qEnvironmentVariableIsSet("QT_XCB_NO_GRAB_SERVER");
if (canNotGrabEnv)
m_canGrab = false;
m_connections << new QXcbConnection(m_nativeInterface.data(), m_canGrab, displayName);
for (int i = 0; i < parameters.size() - 1; i += 2) {
#ifdef Q_XCB_DEBUG

View File

@ -117,6 +117,7 @@ private:
mutable QByteArray m_wmClass;
const char *m_instanceName;
bool m_canGrab;
};
QT_END_NAMESPACE

View File

@ -2170,6 +2170,9 @@ void QXcbWindow::updateSyncRequestCounter()
bool QXcbWindow::setKeyboardGrabEnabled(bool grab)
{
if (grab && !connection()->canGrab())
return false;
if (!grab) {
xcb_ungrab_keyboard(xcb_connection(), XCB_TIME_CURRENT_TIME);
return true;
@ -2185,6 +2188,9 @@ bool QXcbWindow::setKeyboardGrabEnabled(bool grab)
bool QXcbWindow::setMouseGrabEnabled(bool grab)
{
if (grab && !connection()->canGrab())
return false;
if (!grab) {
xcb_ungrab_pointer(xcb_connection(), XCB_TIME_CURRENT_TIME);
return true;