Make the -nograb and -dograb arguments actually work on xcb
Change-Id: Idc725443e4abe27db3e530f08173897bfcbe1278 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>bb10
parent
7231e1fbe2
commit
a7111c5dde
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -221,7 +221,6 @@ public:
|
|||
|
||||
QStyleHints *styleHints;
|
||||
static bool obey_desktop_settings;
|
||||
static bool noGrab;
|
||||
QInputMethod *inputMethod;
|
||||
|
||||
QString firstWindowTitle;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ¶meters, 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 ¶meters, 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 ¶meters, 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
|
||||
|
|
|
|||
|
|
@ -117,6 +117,7 @@ private:
|
|||
|
||||
mutable QByteArray m_wmClass;
|
||||
const char *m_instanceName;
|
||||
bool m_canGrab;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue