From 81d6df8e934ebdac1553e3cb102106fc0fb64f93 Mon Sep 17 00:00:00 2001 From: Robert Griebl Date: Mon, 11 Feb 2019 17:25:13 +0100 Subject: Avoid conflicts on Linux desktops by using a non-standard Wayland socket If not specified differently via command line option or $WAYLAND_DISPLAY, the AM would just rely on libwayland to pick a name for its Wayland socket. The problem here is that some desktop environments would see "wayland-0" (the first compositor registered) and think that they are running in Wayland mode and consequentially start client applications on this compositor. The default for the AM is now "qtam-wayland-0". Change-Id: I508ac8fb051735dc64de35ea8dfc44491786c7d7 Reviewed-by: Dominik Holland --- src/main-lib/defaultconfiguration.cpp | 17 ++++++++++++++++- src/window-lib/windowmanager.cpp | 6 +++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main-lib/defaultconfiguration.cpp b/src/main-lib/defaultconfiguration.cpp index c79da1d7..6ee6b2e0 100644 --- a/src/main-lib/defaultconfiguration.cpp +++ b/src/main-lib/defaultconfiguration.cpp @@ -42,6 +42,7 @@ #include #include +#include #include #include @@ -447,7 +448,21 @@ int DefaultConfiguration::quickLaunchRuntimesPerContainer() const QString DefaultConfiguration::waylandSocketName() const { - return value("wayland-socket-name"); + const QString socket = m_clp.value(qSL("wayland-socket-name")); // get the default value + if (!socket.isEmpty()) + return socket; + + const char *envName = "WAYLAND_DISPLAY"; + if (qEnvironmentVariableIsSet(envName)) + return qEnvironmentVariable(envName); + + const QString lockPattern = qEnvironmentVariable("XDG_RUNTIME_DIR") + qSL("/qtam-wayland-%1.lock"); + for (int i = 0; i < 32; ++i) { + QFile lock(lockPattern.arg(i)); + if (lock.open(QIODevice::ReadWrite | QIODevice::NewOnly)) + return qSL("qtam-wayland-%1").arg(i); + } + return QString(); } QString DefaultConfiguration::telnetAddress() const diff --git a/src/window-lib/windowmanager.cpp b/src/window-lib/windowmanager.cpp index 19297bdd..096db273 100644 --- a/src/window-lib/windowmanager.cpp +++ b/src/window-lib/windowmanager.cpp @@ -570,7 +570,7 @@ void WindowManager::registerCompositorView(QQuickWindow *view) // export the actual socket name for our child processes. qputenv("WAYLAND_DISPLAY", d->waylandCompositor->socketName()); - qCDebug(LogGraphics).nospace() << "WindowManager: running in Wayland mode [socket: " + qCInfo(LogGraphics).nospace() << "WindowManager: running in Wayland mode [socket: " << d->waylandCompositor->socketName() << "]"; ApplicationManager::instance()->setWindowManagerCompositorReady(true); } else { @@ -578,11 +578,11 @@ void WindowManager::registerCompositorView(QQuickWindow *view) } } else { if (!once) - qCDebug(LogGraphics) << "WindowManager: running in single-process mode [forced at run-time]"; + qCInfo(LogGraphics) << "WindowManager: running in single-process mode [forced at run-time]"; } #else if (!once) - qCDebug(LogGraphics) << "WindowManager: running in single-process mode [forced at compile-time]"; + qCInfo(LogGraphics) << "WindowManager: running in single-process mode [forced at compile-time]"; #endif emit compositorViewRegistered(view); -- cgit v1.2.3