x11/waycheck: add port: Simple GUI that displays the protocols implemented by a Wayland compositor

Waycheck is a simple Qt6 application that displays all of the Wayland
protocols that your compositor supports, and all of the protocols that
it doesn't support. It can be used to compare protocol support between
compositors, or if you're working on your own compositor, to keep
track of which protocols you still need to implement.

WWW: https://gitlab.freedesktop.org/serebit/waycheck
This commit is contained in:
Hiroki Tagato 2025-08-29 23:13:43 +09:00
parent cd8520a8a9
commit 68a0a83b60
7 changed files with 120 additions and 0 deletions

View File

@ -460,6 +460,7 @@
SUBDIR += watershot
SUBDIR += way-displays
SUBDIR += waybar
SUBDIR += waycheck
SUBDIR += waycorner
SUBDIR += wayidle
SUBDIR += wayland-logout

30
x11/waycheck/Makefile Normal file
View File

@ -0,0 +1,30 @@
PORTNAME= waycheck
DISTVERSIONPREFIX= v
DISTVERSION= 1.7.0
CATEGORIES= x11 wayland
MAINTAINER= tagattie@FreeBSD.org
COMMENT= Simple GUI that displays the protocols implemented by a Wayland compositor
WWW= https://gitlab.freedesktop.org/serebit/waycheck
LICENSE= APACHE20 CC0-1.0
LICENSE_COMB= multi
LICENSE_FILE_APACHE20= ${WRKSRC}/LICENSES/Apache-2.0.txt
LICENSE_FILE_CC0-1.0= ${WRKSRC}/LICENSES/CC0-1.0.txt
LIB_DEPENDS= libwayland-client.so:graphics/wayland
USES= meson pkgconfig qt:6
USE_GITLAB= yes
GL_SITE= https://gitlab.freedesktop.org/
GL_ACCOUNT= serebit
USE_QT= base wayland
PLIST_FILES= bin/${PORTNAME} \
share/applications/dev.serebit.Waycheck.desktop \
share/icons/hicolor/scalable/apps/dev.serebit.Waycheck.svg \
share/metainfo/dev.serebit.Waycheck.metainfo.xml
.include <bsd.port.mk>

3
x11/waycheck/distinfo Normal file
View File

@ -0,0 +1,3 @@
TIMESTAMP = 1756195503
SHA256 (waycheck-v1.7.0.tar.bz2) = 658caca3d967d9b23bb1f6d42c6fd67832263bb60fd600a26e97748d0e47e105
SIZE (waycheck-v1.7.0.tar.bz2) = 21545

View File

@ -0,0 +1,15 @@
--- meson.build.orig 2025-08-27 20:19:12 UTC
+++ meson.build
@@ -16,6 +16,12 @@ dep_wayland_client = dependency('wayland-client')
)
dep_wayland_client = dependency('wayland-client')
+cc = meson.get_compiler('cpp')
+dep_libutil = dependency('', required : false)
+if host_machine.system() == 'freebsd'
+ dep_libutil = cc.find_library('util', required : true)
+endif
+
datadir = get_option('datadir')
subdir('src')

View File

@ -0,0 +1,10 @@
--- src/meson.build.orig 2025-08-27 20:18:18 UTC
+++ src/meson.build
@@ -15,6 +15,6 @@ waycheck = executable(
waycheck = executable(
'waycheck',
sources: waycheck_sources,
- dependencies: [dep_qt6, dep_wayland_client],
+ dependencies: [dep_qt6, dep_wayland_client, dep_libutil],
install: true,
)

View File

@ -0,0 +1,56 @@
--- src/window.cpp.orig 2025-06-27 19:43:51 UTC
+++ src/window.cpp
@@ -13,7 +13,24 @@
#include <unistd.h>
#include <wayland-client-protocol.h>
+#if defined(__FreeBSD__)
+#include <sys/types.h>
+#include <sys/ucred.h>
+#include <sys/un.h>
+#include <sys/user.h>
+#include <libutil.h>
+#endif
+
static pid_t pid_from_fd(const int fd) {
+#if defined(__FreeBSD__)
+ xucred cred{};
+ socklen_t len = sizeof(struct xucred);
+ if (getsockopt(fd, SOL_LOCAL, LOCAL_PEERCRED, &cred, &len) == -1) {
+ perror("getsockopt failed");
+ exit(1);
+ }
+ return cred.cr_pid;
+#else
ucred cred{};
socklen_t len = sizeof(struct ucred);
if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cred, &len) == -1) {
@@ -21,9 +38,19 @@ static pid_t pid_from_fd(const int fd) {
exit(1);
}
return cred.pid;
+#endif
}
static std::string process_name_from_pid(const pid_t pid) {
+#if defined(__FreeBSD__)
+ struct kinfo_proc *proc = kinfo_getproc(pid);
+
+ if (proc) {
+ std::string out = proc->ki_comm;
+ free(proc);
+ return out;
+ }
+#else
const std::string procpath = QString::asprintf("/proc/%d/comm", pid).toStdString();
std::ifstream infile(procpath);
@@ -38,7 +65,7 @@ static std::string process_name_from_pid(const pid_t p
// running in a flatpak or a snap, most likely
return "Unknown (Sandboxed)";
}
-
+#endif
return "Unknown";
}

5
x11/waycheck/pkg-descr Normal file
View File

@ -0,0 +1,5 @@
Waycheck is a simple Qt6 application that displays all of the Wayland
protocols that your compositor supports, and all of the protocols that
it doesn't support. It can be used to compare protocol support between
compositors, or if you're working on your own compositor, to keep
track of which protocols you still need to implement.