1
0
mirror of https://git.FreeBSD.org/ports.git synced 2025-01-15 07:56:36 +00:00

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).
This commit is contained in:
Adriaan de Groot 2021-04-27 15:07:56 +02:00
parent 663eaaf8cc
commit ba447816c0
2 changed files with 114 additions and 10 deletions

View File

@ -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>

View File

@ -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();
}