Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 30 Apr 2021 15:29:39 GMT
From:      Adriaan de Groot <adridg@FreeBSD.org>
To:        ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org
Subject:   git: ba447816c037 - main - x11-wm/plasma5-kwin: improve Wayland support
Message-ID:  <202104301529.13UFTdoE019975@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by adridg:

URL: https://cgit.FreeBSD.org/ports/commit/?id=ba447816c037c00e0540fa28678f860e4175bd67

commit ba447816c037c00e0540fa28678f860e4175bd67
Author:     Adriaan de Groot <adridg@FreeBSD.org>
AuthorDate: 2021-04-27 13:07:56 +0000
Commit:     Adriaan de Groot <adridg@FreeBSD.org>
CommitDate: 2021-04-30 15:29:36 +0000

    x11-wm/plasma5-kwin: improve Wayland support
    
    This is a backport / newly-developed patches for KDE Plasma
    Wayland on FreeBSD. Some parts are upstream.
    
    - Shuffle the USE_KDE line around a bit to make clear what
      the direct Wayland-dependencies are; also add the ones
      that were missing for full Wayland functionality.
    - The major() and minor() macros on FreeBSD have "return type"
      int, while on Linux they are "unsigned int" (see makedev(3)
      for details). When passed to QVariant without a cast, that leads
      to type-mismatches in DBus messages.
    - ConsoleKit returns a new seat, but that seat does not receive
      the libinput devices and never gets any input. Hard-code "seat0"
      since this codepath is Wayland-only.
    - Fix build on i386 (but really, modern X11/Wayland desktop on i386
      seems like a really, **really** unlikely combination).
---
 x11-wm/plasma5-kwin/Makefile                   |  20 ++---
 x11-wm/plasma5-kwin/files/patch-git-e940f73963 | 104 +++++++++++++++++++++++++
 2 files changed, 114 insertions(+), 10 deletions(-)

diff --git a/x11-wm/plasma5-kwin/Makefile b/x11-wm/plasma5-kwin/Makefile
index d861a43bc8c0..fceab4c12ef4 100644
--- a/x11-wm/plasma5-kwin/Makefile
+++ b/x11-wm/plasma5-kwin/Makefile
@@ -1,6 +1,6 @@
 PORTNAME=	kwin
 DISTVERSION=	${KDE_PLASMA_VERSION}
-PORTREVISION=	1
+PORTREVISION=	4
 CATEGORIES=	x11-wm kde kde-plasma
 
 MAINTAINER=	kde@FreeBSD.org
@@ -24,8 +24,10 @@ LIB_DEPENDS=	libXcursor.so:x11/libXcursor \
 		libxcb-keysyms.so:x11/xcb-util-keysyms \
 		libxkbcommon.so:x11/libxkbcommon
 BUILD_DEPENDS=	${LOCALBASE}/include/linux/input.h:devel/evdev-proto \
-		xwayland-devel>0:x11-servers/xwayland-devel
-RUN_DEPENDS=	xwayland-devel>0:x11-servers/xwayland-devel
+		xwayland-devel>0:x11-servers/xwayland-devel \
+		${kde-kwayland-protocols_LIB}:${kde-kwayland-protocols_PORT}
+RUN_DEPENDS=	xwayland-devel>0:x11-servers/xwayland-devel \
+		${kde-kwayland-protocols_LIB}:${kde-kwayland-protocols_PORT}
 
 USES=		cmake compiler:c++11-lib cpe gettext gl gnome kde:5 pkgconfig python:3.5+,run \
 		qt:5 shebangfix tar:xz xorg
@@ -33,10 +35,12 @@ USE_GL=		egl
 USE_GNOME=	glib20
 USE_KDE=	activities activities attica auth breeze codecs \
 		completion config configwidgets coreaddons crash decoration \
-		doctools_build globalaccel i18n iconthemes idletime init \
-		jobwidgets kcmutils kdeclarative kio kwayland-server kscreenlocker \
+		globalaccel i18n iconthemes idletime init \
+		jobwidgets kcmutils kdeclarative kio kscreenlocker \
 		newstuff notifications package plasma-framework runner service sonnet \
-		textwidgets wayland widgetsaddons windowsystem xmlgui
+		textwidgets widgetsaddons windowsystem xmlgui \
+		kwayland-integration kwayland-server wayland \
+		doctools_build 
 USE_LDCONFIG=	yes
 USE_QT=		concurrent core dbus declarative gui multimedia network script \
 		sensors testlib uiplugin uitools widgets x11extras xml \
@@ -46,8 +50,4 @@ USE_XORG=	ice sm x11 xcb xext xi
 SHEBANG_FILES=	kconf_update/*.py \
 		kconf_update/*.pl
 
-post-patch:
-	${REINPLACE_CMD} '/sysmacros.h/d' \
-		${PATCH_WRKSRC}/logind.cpp
-
 .include <bsd.port.mk>
diff --git a/x11-wm/plasma5-kwin/files/patch-git-e940f73963 b/x11-wm/plasma5-kwin/files/patch-git-e940f73963
new file mode 100644
index 000000000000..4f00660e6bc9
--- /dev/null
+++ b/x11-wm/plasma5-kwin/files/patch-git-e940f73963
@@ -0,0 +1,104 @@
+diff --git libinput/context.cpp libinput/context.cpp
+index 00aa98490..f239c8967 100644
+--- libinput/context.cpp
++++ libinput/context.cpp
+@@ -63,6 +63,13 @@ bool Context::assignSeat(const char *seat)
+     if (!isValid()) {
+         return false;
+     }
++#if defined(Q_OS_FREEBSD)
++    // On FreeBSD, seat-assignment does work; when assigning
++    // to a different seat, no input devices are ever reported.
++    // Using the default seat **does** return devices, so
++    // use that instead.
++    seat = "seat0";
++#endif
+     return libinput_udev_assign_seat(m_libinput, seat) == 0;
+ }
+ 
+diff --git logind.cpp logind.cpp
+index cf5266b68..da77a3a59 100644
+--- logind.cpp
++++ logind.cpp
+@@ -356,6 +356,11 @@ void LogindIntegration::releaseControl()
+     emit hasSessionControlChanged(false);
+ }
+ 
++static QVariantList fromRDev(const dev_t rdev)
++{
++    return QVariantList({quint32(major(rdev)), quint32(minor(rdev))});
++}
++
+ int LogindIntegration::takeDevice(const char *path)
+ {
+     struct stat st;
+@@ -367,7 +372,7 @@ int LogindIntegration::takeDevice(const char *path)
+                                                           m_sessionPath,
+                                                           m_sessionControllerSessionInterface,
+                                                           QStringLiteral("TakeDevice"));
+-    message.setArguments(QVariantList({QVariant(major(st.st_rdev)), QVariant(minor(st.st_rdev))}));
++    message.setArguments(fromRDev(st.st_rdev));
+     // intended to be a blocking call
+     QDBusMessage reply = m_bus.call(message);
+     if (reply.type() == QDBusMessage::ErrorMessage) {
+@@ -389,7 +394,7 @@ void LogindIntegration::releaseDevice(int fd)
+                                                               m_sessionPath,
+                                                               m_sessionControllerSessionInterface,
+                                                               QStringLiteral("ReleaseDevice"));
+-        message.setArguments(QVariantList({QVariant(major(st.st_rdev)), QVariant(minor(st.st_rdev))}));
++        message.setArguments(fromRDev(st.st_rdev));
+         m_bus.asyncCall(message);
+     }
+     close(fd);
+diff --git main_wayland.cpp main_wayland.cpp
+index b73ed09c9..a59dba849 100644
+--- main_wayland.cpp
++++ main_wayland.cpp
+@@ -776,6 +776,15 @@ int main(int argc, char * argv[])
+     a.platform()->setInitialOutputCount(outputCount);
+ 
+     QObject::connect(&a, &KWin::Application::workspaceCreated, server, &KWin::WaylandServer::initWorkspace);
++
++    // If startup doesn't complete within 20 seconds, exit rather than hanging
++    // around forever (e.g. if workspace creation can't happen due to DBus errors)
++    QTimer* startupTimeout = new QTimer;
++    QObject::connect(startupTimeout, &QTimer::timeout, [&](){ a.exit(2); });
++    QObject::connect(&a, &KWin::Application::workspaceCreated, [&](){ startupTimeout->stop(); delete startupTimeout; });
++    startupTimeout->setSingleShot(true);
++    startupTimeout->start(std::chrono::seconds(20));
++
+     if (!server->socketName().isEmpty()) {
+         environment.insert(QStringLiteral("WAYLAND_DISPLAY"), server->socketName());
+     }
+diff --git plugins/platforms/drm/drm_backend.cpp plugins/platforms/drm/drm_backend.cpp
+index cdf4bf689..0eb6d45d3 100644
+--- plugins/platforms/drm/drm_backend.cpp
++++ plugins/platforms/drm/drm_backend.cpp
+@@ -244,7 +244,7 @@ void DrmBackend::pageFlipHandler(int fd, unsigned int frame, unsigned int sec, u
+ 
+     std::chrono::nanoseconds timestamp = convertTimestamp(gpu->presentationClock(),
+                                                           CLOCK_MONOTONIC,
+-                                                          { sec, usec * 1000 });
++                                                          { static_cast<time_t>(sec), static_cast<long>(usec * 1000) });
+     if (timestamp == std::chrono::nanoseconds::zero()) {
+         qCDebug(KWIN_DRM, "Got invalid timestamp (sec: %u, usec: %u) on output %s",
+                 sec, usec, qPrintable(output->name()));
+diff --git tabletmodemanager.cpp tabletmodemanager.cpp
+index e23d91ec0..3b20cc4b2 100644
+--- tabletmodemanager.cpp
++++ tabletmodemanager.cpp
+@@ -60,9 +60,11 @@ public:
+         : QObject(parent)
+         , m_parent(parent)
+     {
+-        auto c = LibInput::Connection::self();
+-        connect(c, &LibInput::Connection::deviceAdded, this, &TabletModeTouchpadRemovedSpy::refresh);
+-        connect(c, &LibInput::Connection::deviceRemoved, this, &TabletModeTouchpadRemovedSpy::refresh);
++        auto c = LibInput::Connection::self(); // May be nullptr
++        if (c) {
++            connect(c, &LibInput::Connection::deviceAdded, this, &TabletModeTouchpadRemovedSpy::refresh);
++            connect(c, &LibInput::Connection::deviceRemoved, this, &TabletModeTouchpadRemovedSpy::refresh);
++        }
+ 
+         check();
+     }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202104301529.13UFTdoE019975>