# r87: the keyboard state (wayfire/get-keyboard-state, keyboard-modifier-state-changed) also reports caps-lock and num-lock, for the panel ticker (2026-11-01). # Pyr: drawers push a floating window that exactly fills the monitor too (placed to fill it rather than maximized), keeping it floating; grid only, WAYFIRE_ABI unchanged # Pyr: monitor reservations (drawers): a plugin can keep space free along one monitor's edges; maximize, slots, zones, placement and Move snap use the rest and grid re-fits that monitor's slotted windows; API additions only, WAYFIRE_ABI unchanged # Pyr: the Hedronfire session sets QT_QPA_PLATFORMTHEME=qt6ct when qt6ct is installed (launcher wayfire-session-4); compositor sources unchanged, WAYFIRE_ABI unchanged # Pyr: plain outputs honor grid/zone_gap around the workarea like a physical zone (maximize, half/quarter slots, Move snap previews); stitched layouts unchanged; WAYFIRE_ABI unchanged # Pyr: the Cube background choices list only what the 3d-windows Cube draws (Simple, Warp tunnel, Hyperspace, None); metadata only, WAYFIRE_ABI unchanged # Pyr shell naming: session description only; compositor sources unchanged # Hedron Sprint 3 follow-up: skip closing animation if snapshot allocation fails # Hedron Sprint 3 (2026-10-28): optional shell seed, session logout, atomic config watches # SrcUX Sprint 1 (panache work package, 2026-10-28): SrcUX keymap and plugin set in the shipped wayfire.ini (no code change; WAYFIRE_ABI unchanged), on top of the installed launch-origin-review r75 # SrcUX Sprint 2 (2026-10-28): Super+Ctrl+T theme chooser, Super+Ctrl+W live-sky cycle (wayfire-background-cycle), first-login welcome notification (wayfire-welcome); shipped wayfire.ini and two scripts only, WAYFIRE_ABI unchanged # Copyright 2019-2026 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 EAPI=8 inherit dot-a meson toolchain-funcs DESCRIPTION="compiz like 3D wayland compositor" HOMEPAGE="https://github.com/WayfireWM/wayfire" if [[ ${PV} == 9999 ]]; then inherit git-r3 EGIT_REPO_URI="https://github.com/WayfireWM/${PN}.git" SLOT="0/0.12" IUSE="vulkan" # vulkan support is experimental and uses a bundled fork of wlroots # keep it only in the live ebuild for now RDEPEND="vulkan? ( media-libs/vulkan-loader )" DEPEND="vulkan? ( dev-util/vulkan-headers )" COMMON_DEPEND=" !vulkan? ( gui-libs/wlroots:0.20[drm(+),libinput(+),x11-backend,X?] ) vulkan? ( dev-libs/libliftoff media-libs/lcms:2 media-libs/libdisplay-info:= media-libs/mesa sys-auth/seatd:= x11-libs/libdrm x11-libs/xcb-util-errors x11-libs/xcb-util-renderutil x11-libs/xcb-util-wm ) " else SRC_URI="https://github.com/WayfireWM/${PN}/releases/download/v${PV}/${P}.tar.xz" KEYWORDS="~amd64 ~arm64 ~riscv" SLOT="0/$(ver_cut 1-2)" COMMON_DEPEND="gui-libs/wlroots:0.20[drm(+),libinput(+),x11-backend,X?]" fi LICENSE="MIT" IUSE+=" X +dbus +gles3 nls openmp test" RESTRICT="!test? ( test )" # bundled wlroots has the following dependency string according to included headers. # wlroots[drm,gles2-renderer,libinput,x11-backend?,X?] # enable x11-backend with X and vice versa COMMON_DEPEND+=" dev-cpp/nlohmann_json dev-libs/glib:2 dev-libs/libevdev dev-libs/libinput:= dev-libs/wayland dev-libs/yyjson:= >=dev-libs/wayland-protocols-1.12 gui-libs/wf-config:${SLOT} media-libs/glm media-libs/libglvnd media-libs/libjpeg-turbo:= media-libs/libpng:= virtual/libudev:= x11-libs/cairo x11-libs/libxkbcommon x11-libs/pango x11-libs/pixman dbus? ( sys-apps/dbus ) X? ( x11-libs/libxcb:= ) " RDEPEND+=" >=dev-lang/python-3.11 ${COMMON_DEPEND} x11-misc/xkeyboard-config " DEPEND+=" ${COMMON_DEPEND} test? ( dev-cpp/doctest ) " BDEPEND=" dev-util/wayland-scanner virtual/pkgconfig openmp? ( || ( sys-devel/gcc[openmp] llvm-runtimes/clang-runtime[openmp] ) ) nls? ( sys-devel/gettext ) " PATCHES=( "${FILESDIR}"/${P}-transparent-cube.patch "${FILESDIR}"/${P}-rotate-layer-shell.patch "${FILESDIR}"/${P}-screensaver-layer.patch "${FILESDIR}"/${P}-desktop-sampling.patch "${FILESDIR}"/${P}-cube-damage-stacking.patch "${FILESDIR}"/${P}-cube-panel-overlay.patch "${FILESDIR}"/${P}-stitched-outputs.patch "${FILESDIR}"/${P}-virtual-output-polish.patch "${FILESDIR}"/${P}-wcm-displays.patch "${FILESDIR}"/${P}-window-scope.patch "${FILESDIR}"/${P}-float-on-top.patch "${FILESDIR}"/${P}-physical-tiling.patch "${FILESDIR}"/${P}-cube-key-repeat.patch "${FILESDIR}"/${P}-cube-repeat-minimum-20.patch "${FILESDIR}"/${P}-scope-toggle.patch "${FILESDIR}"/${P}-dialog-family-stacking.patch "${FILESDIR}"/${P}-physical-grid.patch "${FILESDIR}"/${P}-grid-preview.patch "${FILESDIR}"/${P}-grid-cycle.patch "${FILESDIR}"/${P}-physical-output-focus.patch "${FILESDIR}"/${P}-oswitch-local-symbols.patch "${FILESDIR}"/${P}-oswitch-wrap.patch "${FILESDIR}"/${P}-popup-physical-scope.patch "${FILESDIR}"/${P}-move-snapping.patch "${FILESDIR}"/${P}-move-held-redraw.patch "${FILESDIR}"/${P}-workspace-backgrounds.patch "${FILESDIR}"/${P}-show-desktop-workspace.patch "${FILESDIR}"/${P}-vswitch-held-target.patch "${FILESDIR}"/${P}-decoration-window-menu.patch "${FILESDIR}"/${P}-layer-move-old-damage.patch "${FILESDIR}"/${P}-workspace-grid-events.patch "${FILESDIR}"/${P}-r35-fullscreen-subpasses.patch "${FILESDIR}"/${P}-r36-cube-fixed-top.patch "${FILESDIR}"/${P}-r37-cube-carried-visibility.patch "${FILESDIR}"/${P}-r38-cube-workspace-lifecycle.patch "${FILESDIR}"/${P}-r39-cube-workspace-rows.patch "${FILESDIR}"/${P}-r40-cube-row-translation.patch "${FILESDIR}"/${P}-r41-cube-complete-row-translation.patch "${FILESDIR}"/${P}-r42-grid-monitor-window-move.patch "${FILESDIR}"/${P}-r43-cube-mouse-overview.patch "${FILESDIR}"/${P}-r44-cube-rigid-stack.patch "${FILESDIR}"/${P}-r45-cube-stack-tilt.patch "${FILESDIR}"/${P}-r46-cube-resting-faces.patch "${FILESDIR}"/${P}-r47-cube-direct-drag.patch "${FILESDIR}"/${P}-r48-cube-wheel-zoom.patch "${FILESDIR}"/${P}-r49-cube-square-footprint.patch "${FILESDIR}"/${P}-r50-cube-center-pivot.patch "${FILESDIR}"/${P}-r51-cube-centered-entry.patch "${FILESDIR}"/${P}-r53-cube-warp.patch "${FILESDIR}"/${P}-r55-cube-backdrop-opacity.patch "${FILESDIR}"/${P}-r56-cube-warp-rest.patch "${FILESDIR}"/${P}-r57-cube-hyperspace.patch "${FILESDIR}"/${P}-r58-cube-nebula.patch "${FILESDIR}"/${P}-r59-ambient-background.patch "${FILESDIR}"/${P}-r60-ambient-package-split.patch "${FILESDIR}"/${P}-r65-output-transforms.patch "${FILESDIR}"/${P}-drag-escape.patch "${FILESDIR}"/${P}-r67-grid-gap.patch "${FILESDIR}"/${P}-r68-ipc-control.patch "${FILESDIR}"/${P}-ipc-backpressure.patch "${FILESDIR}"/${P}-r71-switch-tile-exclusivity.patch "${FILESDIR}"/${P}-r71-cube-teardown-backgrounds.patch "${FILESDIR}"/${P}-r71-stitch-noop-reload.patch "${FILESDIR}"/${P}-r72-review-followups.patch "${FILESDIR}"/${P}-r73-stitch-persist.patch "${FILESDIR}"/${P}-r74-review-lows.patch "${FILESDIR}/wayfire-0.11.0-launch-origin-activation.patch" "${FILESDIR}/wayfire-0.11.0-launch-origin-aliases.patch" "${FILESDIR}/wayfire-0.11.0-launch-origin-plugin.patch" "${FILESDIR}/wayfire-0.11.0-srcux-keymap.patch" "${FILESDIR}/wayfire-0.11.0-sprint2-desktop.patch" "${FILESDIR}/wayfire-0.11.0-hedron-session.patch" "${FILESDIR}/wayfire-0.11.0-snapshot-allocation-failure.patch" "${FILESDIR}/wayfire-0.11.0-qol-1.patch" "${FILESDIR}/wayfire-0.11.0-cube-background-choices.patch" "${FILESDIR}/wayfire-0.11.0-r83-unzoned-gap.patch" "${FILESDIR}/wayfire-0.11.0-r85-monitor-reservations.patch" "${FILESDIR}/wayfire-0.11.0-r86-fill-monitor.patch" "${FILESDIR}/wayfire-0.11.0-r87-keyboard-locks.patch" ) # The local patches change the plugin ABI (scene layer indices, class layouts). # Tie the subslot to WAYFIRE_API_ABI_VERSION so := consumers rebuild whenever a # patch bumps it; src_prepare refuses to build if the two drift apart. # wf-config above retains its upstream 0.11 subslot. WAYFIRE_ABI="20260918" SLOT="${SLOT}.abi${WAYFIRE_ABI}" pkg_pretend() { [[ ${MERGE_TYPE} != binary ]] && use openmp && tc-check-openmp } pkg_setup() { [[ ${MERGE_TYPE} != binary ]] && use openmp && tc-check-openmp } src_prepare() { default local abi abi=$(sed -n "s/^#define WAYFIRE_API_ABI_VERSION_MACRO \([0-9']*\)$/\1/p" \ src/api/wayfire/plugin.hpp) || die abi=${abi//\'/} if [[ ${abi} != "${WAYFIRE_ABI}" ]]; then die "WAYFIRE_API_ABI_VERSION is '${abi}' but the subslot says '${WAYFIRE_ABI}'; update WAYFIRE_ABI" fi local dbusrunsession=$(usev dbus dbus-run-session) sed -e "s:@EPREFIX@:${EPREFIX}:g" -e "s:@DBUS_RUN_SESSION@:${dbusrunsession}:" \ "${FILESDIR}"/wayfire-session-4 > "${T}"/wayfire-session || die sed -e "s:@EPREFIX@:${EPREFIX}:" \ "${FILESDIR}"/wayfire-session-pyr.desktop > "${T}"/wayfire-session.desktop || die } src_configure() { lto-guarantee-fat local emesonargs=( $(meson_feature test tests) $(meson_feature X xwayland) $(meson_use gles3 enable_gles32) $(meson_feature nls build_locales) $(meson_use openmp enable_openmp) -Duse_system_wfconfig=enabled ) if [[ ${PV} == 9999 ]]; then emesonargs+=( $(meson_feature !vulkan use_system_wlroots) $(meson_use vulkan vulkan_effects) ) else emesonargs+=( -Duse_system_wlroots=enabled -Dvulkan_effects=false ) fi meson_src_configure } src_install() { meson_src_install dobin "${T}"/wayfire-session insinto "/usr/share/wayland-sessions/" insopts -m644 doins wayfire.desktop doins "${T}"/wayfire-session.desktop insinto "/usr/share/wayfire/" doins wayfire.ini # Started by the shipped wayfire.ini: Super+Ctrl+W and the first-login notification. exeinto /usr/libexec/wayfire newexe "${FILESDIR}"/wayfire-background-cycle wayfire-background-cycle-legacy newexe "${FILESDIR}"/wayfire-welcome wayfire-welcome-legacy newexe "${FILESDIR}"/wayfire-background-cycle-hedron wayfire-background-cycle newexe "${FILESDIR}"/wayfire-welcome-hedron wayfire-welcome insinto "/etc" doins "${FILESDIR}"/wayfire.env strip-lto-bytecode }