diff --git a/x11-wm/hyprland/Makefile b/x11-wm/hyprland/Makefile index c1e6919c4302..f8ca16c6ba1a 100644 --- a/x11-wm/hyprland/Makefile +++ b/x11-wm/hyprland/Makefile @@ -1,95 +1,93 @@ PORTNAME= hyprland DISTVERSIONPREFIX= v -DISTVERSION= 0.24.1 -PORTREVISION= 2 +DISTVERSION= 0.25.0 CATEGORIES= x11-wm wayland -PATCH_SITES= https://github.com/${GH_ACCOUNT}/${GH_PROJECT}/commit/ -PATCHFILES+= efee6a1cda27.patch:-p1 # https://github.com/hyprwm/Hyprland/pull/2026 -PATCHFILES+= 8944db49be38.patch:-p1 # https://github.com/hyprwm/Hyprland/issues/2065 -PATCHFILES+= 63841c8aac8c.patch:-p1 # https://github.com/hyprwm/Hyprland/pull/2066 - MAINTAINER= jbeich@FreeBSD.org COMMENT= Dynamic tiling Wayland compositor that doesn't sacrifice on its looks #' WWW= https://hyprland.org/ LICENSE= BSD3CLAUSE LICENSE_FILE= ${WRKSRC}/LICENSE BUILD_DEPENDS= cmake:devel/cmake-core \ evdev-proto>0:devel/evdev-proto \ wayland-protocols>=1.25:graphics/wayland-protocols \ wlroots>=0.16.0<0.17.0:x11-toolkits/wlroots LIB_DEPENDS= libwayland-server.so:graphics/wayland \ libwlroots.so:x11-toolkits/wlroots \ libinput.so:x11/libinput \ libxkbcommon.so:x11/libxkbcommon USES= compiler:c++11-lib gl gnome meson pkgconfig xorg USE_GITHUB= yes USE_GL= egl opengl USE_GNOME= cairo pango USE_XORG= pixman GH_ACCOUNT= hyprwm GH_PROJECT= Hyprland -GH_TUPLE= hyprwm:hyprland-protocols:d7d403b:hyprland_protocols/subprojects/hyprland-protocols \ +GH_TUPLE= hyprwm:hyprland-protocols:4d29e48:hyprland_protocols/subprojects/hyprland-protocols \ canihavesomecoffee:udis86:1.7.2-186-g5336633:udis86/subprojects/udis86 MESON_ARGS= -Dsystemd=disabled CONFLICTS_INSTALL= ${PORTNAME}-devel OPTIONS_DEFINE= X11 OPTIONS_DEFAULT=X11 X11_USE= XORG=xcb X11_MESON_ENABLED= xwayland post-patch: # Extract (snapshot) version from the port instead of meson.build @${REINPLACE_CMD} -i .nogit -e "/GIT_BRANCH/s/run_command.*/'main'/" \ -e "/GIT_COMMIT_HASH/s/run_command.*/'${DISTVERSIONFULL}'/" \ -e "/GIT_COMMIT_MESSAGE/d" \ -e "/GIT_DIRTY/s/run_command.*/'portbld'/" \ -e "/version.*jq/s/run_command.*/'${DISTVERSIONFULL}',/" \ ${WRKSRC}/meson.build # Respect PREFIX for wallpapers @${REINPLACE_CMD} 's,/usr/share,${DATADIR:H},' \ ${WRKSRC}/src/render/OpenGL.cpp # Respect LOCALBASE for xdg-desktop-portal-hyprland installation @${REINPLACE_CMD} 's,/usr/share,${LOCALBASE}/share,g' \ ${WRKSRC}/src/Compositor.cpp .ifdef GH_TUPLE post-configure: @${REINPLACE_CMD} 's/meson install/& \ --skip-subprojects/' ${BUILD_WRKSRC}/build.ninja .endif +post-install: +# Plugin API installs all headers (no private vs. public) + @(cd ${STAGEDIR}${PREFIX} && ${FIND} include/${PORTNAME} ! -type d) >>${TMPPLIST} + # XXX Drop after FreeBSD 13.2 EOL around 2024-05-01 (don't forget distinfo) .if ${CXX} == c++ && exists(/usr/lib/libc++.so) .if !exists(/usr/include/c++/v1/__ranges/as_rvalue_view.h) || make(makesum) || make(fetch) USES+= llvm:min=16,build PATH:= ${LLVM_PREFIX}/bin:${PATH} # XXX _CMAKE_TOOLCHAIN_SUFFIX vs. devel/llvm* CC= clang${LLVM_VERSION} CXX= clang++${LLVM_VERSION} CPP= clang-cpp${LLVM_VERSION} CONFIGURE_ENV+= CC="${CC}" CXX="${CXX}" CPP="${CPP}" CMAKE_BIN= ${LOCALBASE}/bin/cmake # XXX Move into separate port and standardize via USES GH_TUPLE+= llvm:llvm-project:llvmorg-16.0.1:libcxx CXXFLAGS+= -nostdinc++ -isystem${WRKDIR}/libcxx_prefix/include/c++/v1 # Don't link against new libc++ as it's not necessary #LDFLAGS+= -nostdlib++ -L${WRKDIR}/libcxx_prefix/lib -l:libc++.a -lcxxrt pre-configure: bundled-libcxx bundled-libcxx: @${SETENV} ${CONFIGURE_ENV} ${CMAKE_BIN} ${CMAKE_ARGS} \ -DLIBCXX_INCLUDE_BENCHMARKS:BOOL=OFF \ -DCMAKE_INSTALL_PREFIX:PATH=${WRKDIR}/libcxx_prefix \ -B ${WRKDIR}/libcxx_build -S ${WRKSRC_libcxx}/libcxx @${DO_MAKE_BUILD:NDESTDIR*} install -C ${WRKDIR}/libcxx_build .endif .endif # exists(/usr/lib/libc++.so) .include diff --git a/x11-wm/hyprland/distinfo b/x11-wm/hyprland/distinfo index 32e469043657..e4890ec2778a 100644 --- a/x11-wm/hyprland/distinfo +++ b/x11-wm/hyprland/distinfo @@ -1,15 +1,9 @@ -TIMESTAMP = 1681059564 -SHA256 (hyprwm-Hyprland-v0.24.1_GH0.tar.gz) = 8b0cd0cc493aa0405c001426f0de153f3fc80f27c73088d4c66939643578e4e7 -SIZE (hyprwm-Hyprland-v0.24.1_GH0.tar.gz) = 758442 -SHA256 (hyprwm-hyprland-protocols-d7d403b_GH0.tar.gz) = f246db4d75546b6c411aa8c95363de4f475413f5e85b92b740d312b33729daed -SIZE (hyprwm-hyprland-protocols-d7d403b_GH0.tar.gz) = 6333 +TIMESTAMP = 1683130508 +SHA256 (hyprwm-Hyprland-v0.25.0_GH0.tar.gz) = 0e02b35f623acdfd71a768b9ef04b54407f1647f6b79c47a4239e1f70ac8c3f8 +SIZE (hyprwm-Hyprland-v0.25.0_GH0.tar.gz) = 766846 +SHA256 (hyprwm-hyprland-protocols-4d29e48_GH0.tar.gz) = 1384ccdbb0149cdc40d74fbe21fba97d706db08b718c7df9481076381d852c74 +SIZE (hyprwm-hyprland-protocols-4d29e48_GH0.tar.gz) = 6340 SHA256 (canihavesomecoffee-udis86-1.7.2-186-g5336633_GH0.tar.gz) = 69aff959179ff6247b375b92e797221dbd8e078eabbf1366280b0532617e7fb8 SIZE (canihavesomecoffee-udis86-1.7.2-186-g5336633_GH0.tar.gz) = 116938 SHA256 (llvm-llvm-project-llvmorg-16.0.1_GH0.tar.gz) = b5a9ff1793b1e2d388a3819bf35797002b1d2e40bb35a10c65605e0ea1435271 SIZE (llvm-llvm-project-llvmorg-16.0.1_GH0.tar.gz) = 179289803 -SHA256 (efee6a1cda27.patch) = 56621b462066573098774bb5601595bda8b4f2f55faacd84e1b93fbfc22f4c31 -SIZE (efee6a1cda27.patch) = 4384 -SHA256 (8944db49be38.patch) = 402c84680f0d206a991d8e07aa032b6af626e21cbf0fa93f3f9feea9be01daa3 -SIZE (8944db49be38.patch) = 1805 -SHA256 (63841c8aac8c.patch) = 318869b055e0bce87723004f2da13922c4ff82791c70fa99554dd3ab53bc279b -SIZE (63841c8aac8c.patch) = 2371 diff --git a/x11-wm/hyprland/files/patch-wlroots-0.16 b/x11-wm/hyprland/files/patch-wlroots-0.16 index ea893bfada93..0cd0eed17660 100644 --- a/x11-wm/hyprland/files/patch-wlroots-0.16 +++ b/x11-wm/hyprland/files/patch-wlroots-0.16 @@ -1,308 +1,322 @@ Revert to wlroots 0.16 API as 0.17 is a moving target, so hard to use as system package with more than one consumer. https://github.com/hyprwm/Hyprland/commit/df132e5ff339 https://github.com/hyprwm/Hyprland/commit/c012e3d66b21 https://github.com/hyprwm/Hyprland/commit/d6b3bfc48e22 https://github.com/hyprwm/Hyprland/commit/a46abd8b1ada https://github.com/hyprwm/Hyprland/commit/a34b74766193 https://github.com/hyprwm/Hyprland/commit/1a5d5bf6201b +https://github.com/hyprwm/Hyprland/commit/d03dcc3d9941 ---- src/Compositor.cpp.orig 2023-04-08 12:08:56 UTC +--- src/Compositor.cpp.orig 2023-05-03 16:15:08 UTC +++ src/Compositor.cpp @@ -104,7 +104,7 @@ void CCompositor::initServer() { if (LOGWLR && std::string(LOGWLR) == "1") wlr_log_init(WLR_DEBUG, Debug::wlrLog); - m_sWLRBackend = wlr_backend_autocreate(m_sWLDisplay, &m_sWLRSession); + m_sWLRBackend = wlr_backend_autocreate(m_sWLDisplay); if (!m_sWLRBackend) { Debug::log(CRIT, "m_sWLRBackend was NULL!"); @@ -127,10 +127,11 @@ void CCompositor::initServer() { wlr_renderer_init_wl_shm(m_sWLRRenderer, m_sWLDisplay); if (wlr_renderer_get_dmabuf_texture_formats(m_sWLRRenderer)) { - if (wlr_renderer_get_drm_fd(m_sWLRRenderer) >= 0) + if (wlr_renderer_get_drm_fd(m_sWLRRenderer) >= 0) { wlr_drm_create(m_sWLDisplay, m_sWLRRenderer); + } - m_sWLRLinuxDMABuf = wlr_linux_dmabuf_v1_create_with_renderer(m_sWLDisplay, 4, m_sWLRRenderer); + m_sWLRLinuxDMABuf = wlr_linux_dmabuf_v1_create(m_sWLDisplay, m_sWLRRenderer); } m_sWLRAllocator = wlr_allocator_autocreate(m_sWLRBackend, m_sWLRRenderer); +@@ -147,7 +148,7 @@ void CCompositor::initServer() { + throw std::runtime_error("wlr_gles2_renderer_get_egl() failed!"); + } + +- m_sWLRCompositor = wlr_compositor_create(m_sWLDisplay, 6, m_sWLRRenderer); ++ m_sWLRCompositor = wlr_compositor_create(m_sWLDisplay, m_sWLRRenderer); + m_sWLRSubCompositor = wlr_subcompositor_create(m_sWLDisplay); + m_sWLRDataDevMgr = wlr_data_device_manager_create(m_sWLDisplay); + @@ -187,7 +188,7 @@ void CCompositor::initServer() { m_sWLRIdle = wlr_idle_create(m_sWLDisplay); - m_sWLRLayerShell = wlr_layer_shell_v1_create(m_sWLDisplay, 4); + m_sWLRLayerShell = wlr_layer_shell_v1_create(m_sWLDisplay); m_sWLRServerDecoMgr = wlr_server_decoration_manager_create(m_sWLDisplay); m_sWLRXDGDecoMgr = wlr_xdg_decoration_manager_v1_create(m_sWLDisplay); @@ -227,6 +228,8 @@ void CCompositor::initServer() { wlr_xdg_foreign_v2_create(m_sWLDisplay, m_sWLRForeignRegistry); m_sWLRPointerGestures = wlr_pointer_gestures_v1_create(m_sWLDisplay); + + m_sWLRSession = wlr_backend_get_session(m_sWLRBackend); m_sWLRTextInputMgr = wlr_text_input_manager_v3_create(m_sWLDisplay); ---- src/events/Events.hpp.orig 2023-04-08 12:08:56 UTC +--- src/events/Events.hpp.orig 2023-05-03 16:15:08 UTC +++ src/events/Events.hpp @@ -97,7 +97,6 @@ namespace Events { // Monitor part 2 the sequel DYNLISTENFUNC(monitorFrame); DYNLISTENFUNC(monitorDestroy); - DYNLISTENFUNC(monitorStateRequest); DYNLISTENFUNC(monitorDamage); DYNLISTENFUNC(monitorNeedsFrame); - ---- src/events/Monitors.cpp.orig 2023-04-08 12:08:56 UTC + DYNLISTENFUNC(monitorCommit); +--- src/events/Monitors.cpp.orig 2023-05-03 16:15:08 UTC +++ src/events/Monitors.cpp -@@ -190,13 +190,6 @@ void Events::listener_monitorDestroy(void* owner, void +@@ -193,13 +193,6 @@ void Events::listener_monitorDestroy(void* owner, void } } -void Events::listener_monitorStateRequest(void* owner, void* data) { - const auto PMONITOR = (CMonitor*)owner; - const auto E = (wlr_output_event_request_state*)data; - - wlr_output_commit_state(PMONITOR->output, E->state); -} - void Events::listener_monitorDamage(void* owner, void* data) { const auto PMONITOR = (CMonitor*)owner; const auto E = (wlr_output_event_damage*)data; ---- src/events/Windows.cpp.orig 2023-04-08 12:08:56 UTC +--- src/events/Windows.cpp.orig 2023-05-03 16:15:08 UTC +++ src/events/Windows.cpp -@@ -846,7 +846,7 @@ void Events::listener_activateXDG(wl_listener* listene +@@ -863,7 +863,7 @@ void Events::listener_activateXDG(wl_listener* listene - Debug::log(LOG, "Activate request for surface at %x", E->surface); + Debug::log(LOG, "Activate request for surface at %lx", E->surface); - if (!wlr_xdg_surface_try_from_wlr_surface(E->surface)) + if (!wlr_surface_is_xdg_surface(E->surface)) return; const auto PWINDOW = g_pCompositor->getWindowFromSurface(E->surface); ---- src/helpers/Monitor.cpp.orig 2023-04-08 12:08:56 UTC +--- src/helpers/Monitor.cpp.orig 2023-05-03 16:15:08 UTC +++ src/helpers/Monitor.cpp -@@ -19,12 +19,10 @@ void CMonitor::onConnect(bool noRule) { +@@ -19,13 +19,11 @@ void CMonitor::onConnect(bool noRule) { void CMonitor::onConnect(bool noRule) { hyprListener_monitorDestroy.removeCallback(); hyprListener_monitorFrame.removeCallback(); - hyprListener_monitorStateRequest.removeCallback(); hyprListener_monitorDamage.removeCallback(); hyprListener_monitorNeedsFrame.removeCallback(); + hyprListener_monitorCommit.removeCallback(); hyprListener_monitorFrame.initCallback(&output->events.frame, &Events::listener_monitorFrame, this); hyprListener_monitorDestroy.initCallback(&output->events.destroy, &Events::listener_monitorDestroy, this); - hyprListener_monitorStateRequest.initCallback(&output->events.request_state, &Events::listener_monitorStateRequest, this); hyprListener_monitorDamage.initCallback(&output->events.damage, &Events::listener_monitorDamage, this); hyprListener_monitorNeedsFrame.initCallback(&output->events.needs_frame, &Events::listener_monitorNeedsFrame, this); - -@@ -238,7 +236,7 @@ void CMonitor::onDisconnect() { + hyprListener_monitorCommit.initCallback(&output->events.commit, &Events::listener_monitorCommit, this); +@@ -249,7 +247,7 @@ void CMonitor::onDisconnect() { if (!BACKUPMON) { Debug::log(WARN, "Unplugged last monitor, entering an unsafe state. Good luck my friend."); - hyprListener_monitorStateRequest.removeCallback(); + hyprListener_monitorMode.removeCallback(); hyprListener_monitorDestroy.removeCallback(); g_pCompositor->m_bUnsafeState = true; -@@ -295,7 +293,7 @@ void CMonitor::onDisconnect() { +@@ -307,7 +305,7 @@ void CMonitor::onDisconnect() { std::erase_if(g_pCompositor->m_vMonitors, [&](std::shared_ptr& el) { return el.get() == this; }); } -void CMonitor::addDamage(const pixman_region32_t* rg) { +void CMonitor::addDamage(pixman_region32_t* rg) { - if (wlr_damage_ring_add(&damage, rg)) - g_pCompositor->scheduleFrameForMonitor(this); - } ---- src/helpers/Monitor.hpp.orig 2023-04-08 12:08:56 UTC + static auto* const PZOOMFACTOR = &g_pConfigManager->getConfigValuePtr("misc:cursor_zoom_factor")->floatValue; + if (*PZOOMFACTOR != 1.f && g_pCompositor->getMonitorFromCursor() == this) { + wlr_damage_ring_add_whole(&damage); +--- src/helpers/Monitor.hpp.orig 2023-05-03 16:15:08 UTC +++ src/helpers/Monitor.hpp @@ -64,7 +64,7 @@ class CMonitor { DYNLISTENER(monitorFrame); DYNLISTENER(monitorDestroy); - DYNLISTENER(monitorStateRequest); + DYNLISTENER(monitorMode); DYNLISTENER(monitorDamage); DYNLISTENER(monitorNeedsFrame); - -@@ -75,7 +75,7 @@ class CMonitor { + DYNLISTENER(monitorCommit); +@@ -76,7 +76,7 @@ class CMonitor { // methods void onConnect(bool noRule); void onDisconnect(); - void addDamage(const pixman_region32_t* rg); + void addDamage(pixman_region32_t* rg); void addDamage(const wlr_box* box); void setMirror(const std::string&); bool isMirror(); ---- src/helpers/SubsurfaceTree.cpp.orig 2023-04-08 12:08:56 UTC +--- src/helpers/SubsurfaceTree.cpp.orig 2023-05-03 16:15:08 UTC +++ src/helpers/SubsurfaceTree.cpp @@ -6,8 +6,8 @@ void addSurfaceGlobalOffset(SSurfaceTreeNode* node, in if (!node->pSurface || !node->pSurface->exists()) return; - *lx += node->pSurface->wlr()->current.dx; - *ly += node->pSurface->wlr()->current.dy; + *lx += node->pSurface->wlr()->sx; + *ly += node->pSurface->wlr()->sy; if (node->offsetfn) { // This is the root node ---- src/managers/XWaylandManager.cpp.orig 2023-04-08 12:08:56 UTC +--- src/managers/XWaylandManager.cpp.orig 2023-05-03 16:15:08 UTC +++ src/managers/XWaylandManager.cpp @@ -35,16 +35,16 @@ void CHyprXWaylandManager::activateSurface(wlr_surface if (!pSurface) return; - if (wlr_xdg_surface_try_from_wlr_surface(pSurface)) { - const auto PSURF = wlr_xdg_surface_try_from_wlr_surface(pSurface); + if (wlr_surface_is_xdg_surface(pSurface)) { + const auto PSURF = wlr_xdg_surface_from_wlr_surface(pSurface); if (PSURF && PSURF->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL) { wlr_xdg_toplevel_set_activated(PSURF->toplevel, activate); } - } else if (wlr_xwayland_surface_try_from_wlr_surface(pSurface)) { - wlr_xwayland_surface_activate(wlr_xwayland_surface_try_from_wlr_surface(pSurface), activate); + } else if (wlr_surface_is_xwayland_surface(pSurface)) { + wlr_xwayland_surface_activate(wlr_xwayland_surface_from_wlr_surface(pSurface), activate); if (activate) - wlr_xwayland_surface_restack(wlr_xwayland_surface_try_from_wlr_surface(pSurface), nullptr, XCB_STACK_MODE_ABOVE); + wlr_xwayland_surface_restack(wlr_xwayland_surface_from_wlr_surface(pSurface), nullptr, XCB_STACK_MODE_ABOVE); } } ---- src/managers/input/InputMethodRelay.cpp.orig 2023-04-08 12:08:56 UTC +--- src/managers/input/InputMethodRelay.cpp.orig 2023-05-03 16:15:08 UTC +++ src/managers/input/InputMethodRelay.cpp @@ -184,8 +184,8 @@ void CInputMethodRelay::updateInputPopup(SIMEPopup* pP Vector2D parentPos; Vector2D parentSize; - if (wlr_layer_surface_v1_try_from_wlr_surface(PFOCUSEDSURFACE)) { - const auto PLS = g_pCompositor->getLayerSurfaceFromWlr(wlr_layer_surface_v1_try_from_wlr_surface(PFOCUSEDSURFACE)); + if (wlr_surface_is_layer_surface(PFOCUSEDSURFACE)) { + const auto PLS = g_pCompositor->getLayerSurfaceFromWlr(wlr_layer_surface_v1_from_wlr_surface(PFOCUSEDSURFACE)); if (PLS) { parentPos = Vector2D(PLS->geometry.x, PLS->geometry.y) + g_pCompositor->getMonitorFromID(PLS->monitorID)->vecPosition; @@ -292,8 +292,8 @@ void CInputMethodRelay::damagePopup(SIMEPopup* pPopup) const auto PFOCUSEDSURFACE = focusedSurface(PFOCUSEDTI); - if (wlr_layer_surface_v1_try_from_wlr_surface(PFOCUSEDSURFACE)) { - const auto PLS = g_pCompositor->getLayerSurfaceFromWlr(wlr_layer_surface_v1_try_from_wlr_surface(PFOCUSEDSURFACE)); + if (wlr_surface_is_layer_surface(PFOCUSEDSURFACE)) { + const auto PLS = g_pCompositor->getLayerSurfaceFromWlr(wlr_layer_surface_v1_from_wlr_surface(PFOCUSEDSURFACE)); if (PLS) { parentPos = Vector2D(PLS->geometry.x, PLS->geometry.y) + g_pCompositor->getMonitorFromID(PLS->monitorID)->vecPosition; ---- src/protocols/ToplevelExport.cpp.orig 2023-04-08 12:08:56 UTC +--- src/protocols/ToplevelExport.cpp.orig 2023-05-03 16:15:08 UTC +++ src/protocols/ToplevelExport.cpp -@@ -369,7 +369,8 @@ bool CToplevelExportProtocolManager::copyFrameShm(STop +@@ -373,7 +373,8 @@ bool CToplevelExportProtocolManager::copyFrameShm(SScr g_pHyprRenderer->renderWindow(frame->pWindow, PMONITOR, now, false, RENDER_PASS_ALL, true, true); g_pHyprRenderer->m_bBlockSurfaceFeedback = false; - if (frame->overlayCursor && wlr_renderer_begin(g_pCompositor->m_sWLRRenderer, PMONITOR->vecPixelSize.x, PMONITOR->vecPixelSize.y)) { + if (frame->overlayCursor) { + wlr_renderer_begin(g_pCompositor->m_sWLRRenderer, PMONITOR->vecPixelSize.x, PMONITOR->vecPixelSize.y); // hack le massive wlr_output_cursor* cursor; const auto OFFSET = frame->pWindow->m_vRealPosition.vec() - PMONITOR->vecPosition; ---- src/render/Renderer.cpp.orig 2023-04-08 12:08:56 UTC +--- src/render/Renderer.cpp.orig 2023-05-03 16:15:08 UTC +++ src/render/Renderer.cpp @@ -37,7 +37,7 @@ void renderSurface(struct wlr_surface* surface, int x, rounding -= 1; // to fix a border issue if (RDATA->surface && surface == RDATA->surface) { - if (wlr_xwayland_surface_try_from_wlr_surface(surface) && !wlr_xwayland_surface_try_from_wlr_surface(surface)->has_alpha && RDATA->fadeAlpha * RDATA->alpha == 1.f) { + if (wlr_surface_is_xwayland_surface(surface) && !wlr_xwayland_surface_from_wlr_surface(surface)->has_alpha && RDATA->fadeAlpha * RDATA->alpha == 1.f) { g_pHyprOpenGL->renderTexture(TEXTURE, &windowBox, RDATA->fadeAlpha * RDATA->alpha, rounding, true); } else { if (RDATA->blur) -@@ -665,9 +665,6 @@ bool CHyprRenderer::attemptDirectScanout(CMonitor* pMo +@@ -697,9 +697,6 @@ bool CHyprRenderer::attemptDirectScanout(CMonitor* pMo if (!pMonitor->mirrors.empty() || pMonitor->isMirror() || m_bDirectScanoutBlocked) return false; // do not DS if this monitor is being mirrored. Will break the functionality. - if (!wlr_output_is_direct_scanout_allowed(pMonitor->output)) - return false; - const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(pMonitor->activeWorkspace); if (!PWORKSPACE || !PWORKSPACE->m_bHasFullscreenWindow || g_pInputManager->m_sDrag.drag || g_pCompositor->m_sSeat.exclusiveClient || pMonitor->specialWorkspaceID) -@@ -928,10 +925,9 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) +@@ -971,7 +968,7 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) damageBlinkCleanup = 0; } - if (wlr_renderer_begin(g_pCompositor->m_sWLRRenderer, pMonitor->vecPixelSize.x, pMonitor->vecPixelSize.y)) { -- wlr_output_render_software_cursors(pMonitor->output, NULL); -- wlr_renderer_end(g_pCompositor->m_sWLRRenderer); ++ wlr_renderer_begin(g_pCompositor->m_sWLRRenderer, pMonitor->vecPixelSize.x, pMonitor->vecPixelSize.y); + if (pMonitor == g_pCompositor->getMonitorFromCursor() && *PZOOMFACTOR != 1.f) { + wlr_output_lock_software_cursors(pMonitor->output, true); + wlr_output_render_software_cursors(pMonitor->output, NULL); +@@ -979,7 +976,6 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) + } else + wlr_output_render_software_cursors(pMonitor->output, NULL); + wlr_renderer_end(g_pCompositor->m_sWLRRenderer); - } -+ wlr_renderer_begin(g_pCompositor->m_sWLRRenderer, pMonitor->vecPixelSize.x, pMonitor->vecPixelSize.y); -+ wlr_output_render_software_cursors(pMonitor->output, NULL); -+ wlr_renderer_end(g_pCompositor->m_sWLRRenderer); } - g_pHyprOpenGL->end(); -@@ -1003,20 +999,48 @@ void CHyprRenderer::setWindowScanoutMode(CWindow* pWin + if (pMonitor == g_pCompositor->getMonitorFromCursor()) +@@ -1081,20 +1077,48 @@ void CHyprRenderer::setWindowScanoutMode(CWindow* pWin return; } - const auto PMONITOR = g_pCompositor->getMonitorFromID(pWindow->m_iMonitorID); + const auto RENDERERDRMFD = wlr_renderer_get_drm_fd(g_pCompositor->m_sWLRRenderer); + const auto BACKENDDRMFD = wlr_backend_get_drm_fd(g_pCompositor->m_sWLRBackend); - const wlr_linux_dmabuf_feedback_v1_init_options INIT_OPTIONS = { - .main_renderer = g_pCompositor->m_sWLRRenderer, - .scanout_primary_output = PMONITOR->output, + if (RENDERERDRMFD < 0 || BACKENDDRMFD < 0) + return; + + auto deviceIDFromFD = [](int fd, unsigned long* deviceID) -> bool { + struct stat stat; + if (fstat(fd, &stat) != 0) { + return false; + } + *deviceID = stat.st_rdev; + return true; }; - wlr_linux_dmabuf_feedback_v1 feedback = {0}; + unsigned long rendererDevice, scanoutDevice; + if (!deviceIDFromFD(RENDERERDRMFD, &rendererDevice) || !deviceIDFromFD(BACKENDDRMFD, &scanoutDevice)) + return; - if (!wlr_linux_dmabuf_feedback_v1_init_with_options(&feedback, &INIT_OPTIONS)) + const auto PMONITOR = g_pCompositor->getMonitorFromID(pWindow->m_iMonitorID); + + const auto POUTPUTFORMATS = wlr_output_get_primary_formats(PMONITOR->output, WLR_BUFFER_CAP_DMABUF); + if (!POUTPUTFORMATS) return; - wlr_linux_dmabuf_v1_set_surface_feedback(g_pCompositor->m_sWLRLinuxDMABuf, pWindow->m_pWLSurface.wlr(), &feedback); - wlr_linux_dmabuf_feedback_v1_finish(&feedback); + const auto PRENDERERFORMATS = wlr_renderer_get_dmabuf_texture_formats(g_pCompositor->m_sWLRRenderer); + wlr_drm_format_set scanoutFormats = {0}; + + if (!wlr_drm_format_set_intersect(&scanoutFormats, POUTPUTFORMATS, PRENDERERFORMATS)) + return; + + const wlr_linux_dmabuf_feedback_v1_tranche TRANCHES[] = { + {.target_device = scanoutDevice, .flags = ZWP_LINUX_DMABUF_FEEDBACK_V1_TRANCHE_FLAGS_SCANOUT, .formats = &scanoutFormats}, + {.target_device = rendererDevice, .formats = PRENDERERFORMATS}}; + + const wlr_linux_dmabuf_feedback_v1 FEEDBACK = {.main_device = rendererDevice, .tranches_len = sizeof(TRANCHES) / sizeof(TRANCHES[0]), .tranches = TRANCHES}; + + if (!wlr_linux_dmabuf_v1_set_surface_feedback(g_pCompositor->m_sWLRLinuxDMABuf, pWindow->m_pWLSurface.wlr(), &FEEDBACK)) { + Debug::log(ERR, "Error in scanout mode setting: wlr_linux_dmabuf_v1_set_surface_feedback returned false."); + } + + wlr_drm_format_set_finish(&scanoutFormats); - Debug::log(LOG, "Scanout mode ON set for %x", pWindow); + Debug::log(LOG, "Scanout mode ON set for %lx", pWindow); } diff --git a/x11-wm/hyprland/pkg-plist b/x11-wm/hyprland/pkg-plist index 3c6d77e4eefd..63775edfaec7 100644 --- a/x11-wm/hyprland/pkg-plist +++ b/x11-wm/hyprland/pkg-plist @@ -1,9 +1,10 @@ bin/Hyprland bin/hyprctl man/man1/Hyprland.1.gz man/man1/hyprctl.1.gz %%DATADIR%%/hyprland.conf %%DATADIR%%/wall_2K.png %%DATADIR%%/wall_4K.png %%DATADIR%%/wall_8K.png +share/pkgconfig/hyprland.pc share/wayland-sessions/hyprland.desktop