From fcb6f936ea8b39ec42f5979e55c7aa4a060d2f30 Mon Sep 17 00:00:00 2001 From: Jan Beich Date: Fri, 9 May 2025 01:42:19 +0000 Subject: [PATCH 001/901] hyprpm: add missing include for libc++ after 1c530cbc66db (#10344) hyprpm/src/helpers/Sys.cpp:24:24: error: implicit instantiation of undefined temp late 'std::basic_ostringstream' 24 | std::ostringstream oss; | ^ /usr/include/c++/v1/__fwd/sstream.h:27:28: note: template is declared here 27 | class _LIBCPP_TEMPLATE_VIS basic_ostringstream; | ^ --- hyprpm/src/helpers/Sys.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/hyprpm/src/helpers/Sys.cpp b/hyprpm/src/helpers/Sys.cpp index a5876b9d..58741caf 100644 --- a/hyprpm/src/helpers/Sys.cpp +++ b/hyprpm/src/helpers/Sys.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include From e44aae0c2064240f335b0e7706599ed0487726da Mon Sep 17 00:00:00 2001 From: Jan Beich Date: Fri, 9 May 2025 12:18:15 +0000 Subject: [PATCH 002/901] hyprpm: switch to numeric owner/group after f8bbe5124c00 (#10345) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On BSDs "root" is in "wheel" group. Instead of enumerating platforms or probing "wheel" explicitly use numeric value for the superuser. $ truss hyprpm add [...] read(5,"install: unknown group root\n",1023) = 28 (0x1c) [...] [ERR] ✖ Failed to write plugin state --- hyprpm/src/helpers/Sys.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hyprpm/src/helpers/Sys.cpp b/hyprpm/src/helpers/Sys.cpp index 58741caf..e7ac8854 100644 --- a/hyprpm/src/helpers/Sys.cpp +++ b/hyprpm/src/helpers/Sys.cpp @@ -153,7 +153,7 @@ bool NSys::root::install(const std::string& what, const std::string& where, cons if (!std::ranges::all_of(mode, [](const char& c) { return c >= '0' && c <= '9'; })) return false; - CProcess proc(subin(), {"install", "-m" + mode, "-o", "root", "-g", "root", what, where}); + CProcess proc(subin(), {"install", "-m" + mode, "-o", "0", "-g", "0", what, where}); return proc.runSync() && proc.exitCode() == 0; } From 25cf06f6cfe1b23b97d9beae91247413a3683803 Mon Sep 17 00:00:00 2001 From: "Florian \"sp1rit" <31540351+sp1ritCS@users.noreply.github.com> Date: Fri, 9 May 2025 12:47:28 +0000 Subject: [PATCH 003/901] build: require hyprgraphics>=0.1.3 (#10350) 49974d5 introduced use of types, which were only added in 0.1.3 --- CMakeLists.txt | 2 +- meson.build | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bc016d85..16007dc5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -110,7 +110,7 @@ pkg_check_modules(aquamarine_dep REQUIRED IMPORTED_TARGET aquamarine>=0.8.0) pkg_check_modules(hyprlang_dep REQUIRED IMPORTED_TARGET hyprlang>=0.3.2) pkg_check_modules(hyprcursor_dep REQUIRED IMPORTED_TARGET hyprcursor>=0.1.7) pkg_check_modules(hyprutils_dep REQUIRED IMPORTED_TARGET hyprutils>=0.7.0) -pkg_check_modules(hyprgraphics_dep REQUIRED IMPORTED_TARGET hyprgraphics>=0.1.1) +pkg_check_modules(hyprgraphics_dep REQUIRED IMPORTED_TARGET hyprgraphics>=0.1.3) string(REPLACE "." ";" AQ_VERSION_LIST ${aquamarine_dep_VERSION}) list(GET AQ_VERSION_LIST 0 AQ_VERSION_MAJOR) diff --git a/meson.build b/meson.build index a482cbf2..bf518216 100644 --- a/meson.build +++ b/meson.build @@ -33,7 +33,7 @@ endif aquamarine = dependency('aquamarine', version: '>=0.8.0') hyprcursor = dependency('hyprcursor', version: '>=0.1.7') -hyprgraphics = dependency('hyprgraphics', version: '>= 0.1.1') +hyprgraphics = dependency('hyprgraphics', version: '>= 0.1.3') hyprlang = dependency('hyprlang', version: '>= 0.3.2') hyprutils = dependency('hyprutils', version: '>= 0.7.0') aquamarine_version_list = aquamarine.version().split('.') From 60cd5b7a48af4a23717201d70395161a3bb4ab24 Mon Sep 17 00:00:00 2001 From: vaxerski Date: Fri, 9 May 2025 22:16:21 +0100 Subject: [PATCH 004/901] renderer: always render snapshots as 8bit fixes issues with transparent windows on 10b --- src/render/Framebuffer.cpp | 5 +++++ src/render/Framebuffer.hpp | 2 ++ src/render/OpenGL.cpp | 10 ++++++---- src/render/Renderer.cpp | 6 +++--- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/render/Framebuffer.cpp b/src/render/Framebuffer.cpp index ae2ce2a6..ab5a14a3 100644 --- a/src/render/Framebuffer.cpp +++ b/src/render/Framebuffer.cpp @@ -12,6 +12,11 @@ bool CFramebuffer::alloc(int w, int h, uint32_t drmFormat) { uint32_t glFormat = NFormatUtils::drmFormatToGL(drmFormat); uint32_t glType = NFormatUtils::glFormatToType(glFormat); + if (drmFormat != m_drmFormat || m_size != Vector2D{w, h}) + release(); + + m_drmFormat = drmFormat; + if (!m_tex) { m_tex = makeShared(); m_tex->allocate(); diff --git a/src/render/Framebuffer.hpp b/src/render/Framebuffer.hpp index 4e041573..0e18df5f 100644 --- a/src/render/Framebuffer.hpp +++ b/src/render/Framebuffer.hpp @@ -1,6 +1,7 @@ #pragma once #include "../defines.hpp" +#include "../helpers/Format.hpp" #include "Texture.hpp" class CFramebuffer { @@ -20,6 +21,7 @@ class CFramebuffer { GLuint getFBID(); Vector2D m_size; + DRMFormat m_drmFormat = 0 /* DRM_FORMAT_INVALID */; private: SP m_tex; diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 4bd8eba3..9cbf091b 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -752,13 +752,15 @@ void CHyprOpenGLImpl::begin(PHLMONITOR pMonitor, const CRegion& damage_, CFrameb if (!m_shadersInitialized) initShaders(); + const auto DRM_FORMAT = fb ? fb->m_drmFormat : pMonitor->m_output->state->state().drmFormat; + // ensure a framebuffer for the monitor exists - if (m_renderData.pCurrentMonData->offloadFB.m_size != pMonitor->m_pixelSize) { + if (m_renderData.pCurrentMonData->offloadFB.m_size != pMonitor->m_pixelSize || DRM_FORMAT != m_renderData.pCurrentMonData->offloadFB.m_drmFormat) { m_renderData.pCurrentMonData->stencilTex->allocate(); - m_renderData.pCurrentMonData->offloadFB.alloc(pMonitor->m_pixelSize.x, pMonitor->m_pixelSize.y, pMonitor->m_output->state->state().drmFormat); - m_renderData.pCurrentMonData->mirrorFB.alloc(pMonitor->m_pixelSize.x, pMonitor->m_pixelSize.y, pMonitor->m_output->state->state().drmFormat); - m_renderData.pCurrentMonData->mirrorSwapFB.alloc(pMonitor->m_pixelSize.x, pMonitor->m_pixelSize.y, pMonitor->m_output->state->state().drmFormat); + m_renderData.pCurrentMonData->offloadFB.alloc(pMonitor->m_pixelSize.x, pMonitor->m_pixelSize.y, DRM_FORMAT); + m_renderData.pCurrentMonData->mirrorFB.alloc(pMonitor->m_pixelSize.x, pMonitor->m_pixelSize.y, DRM_FORMAT); + m_renderData.pCurrentMonData->mirrorSwapFB.alloc(pMonitor->m_pixelSize.x, pMonitor->m_pixelSize.y, DRM_FORMAT); m_renderData.pCurrentMonData->offloadFB.addStencil(m_renderData.pCurrentMonData->stencilTex); m_renderData.pCurrentMonData->mirrorFB.addStencil(m_renderData.pCurrentMonData->stencilTex); diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index dde53f5d..343276c9 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -2389,7 +2389,7 @@ void CHyprRenderer::makeRawWindowSnapshot(PHLWINDOW pWindow, CFramebuffer* pFram makeEGLCurrent(); - pFramebuffer->alloc(PMONITOR->m_pixelSize.x, PMONITOR->m_pixelSize.y, PMONITOR->m_output->state->state().drmFormat); + pFramebuffer->alloc(PMONITOR->m_pixelSize.x, PMONITOR->m_pixelSize.y, DRM_FORMAT_ABGR8888); pFramebuffer->addStencil(g_pHyprOpenGL->m_renderData.pCurrentMonData->stencilTex); beginRender(PMONITOR, fakeDamage, RENDER_MODE_FULL_FAKE, nullptr, pFramebuffer); @@ -2440,7 +2440,7 @@ void CHyprRenderer::makeWindowSnapshot(PHLWINDOW pWindow) { const auto PFRAMEBUFFER = &g_pHyprOpenGL->m_windowFramebuffers[ref]; - PFRAMEBUFFER->alloc(PMONITOR->m_pixelSize.x, PMONITOR->m_pixelSize.y, PMONITOR->m_output->state->state().drmFormat); + PFRAMEBUFFER->alloc(PMONITOR->m_pixelSize.x, PMONITOR->m_pixelSize.y, DRM_FORMAT_ABGR8888); beginRender(PMONITOR, fakeDamage, RENDER_MODE_FULL_FAKE, nullptr, PFRAMEBUFFER); @@ -2484,7 +2484,7 @@ void CHyprRenderer::makeLayerSnapshot(PHLLS pLayer) { const auto PFRAMEBUFFER = &g_pHyprOpenGL->m_layerFramebuffers[pLayer]; - PFRAMEBUFFER->alloc(PMONITOR->m_pixelSize.x, PMONITOR->m_pixelSize.y, PMONITOR->m_output->state->state().drmFormat); + PFRAMEBUFFER->alloc(PMONITOR->m_pixelSize.x, PMONITOR->m_pixelSize.y, DRM_FORMAT_ABGR8888); beginRender(PMONITOR, fakeDamage, RENDER_MODE_FULL_FAKE, nullptr, PFRAMEBUFFER); From f58bb72d3a300dc482e9dc934101790c8707667d Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Sat, 10 May 2025 18:31:26 +0100 Subject: [PATCH 005/901] renderer: render blur on fade out (#10356) --- src/desktop/Window.cpp | 2 +- src/events/Windows.cpp | 3 +- src/render/OpenGL.cpp | 12 ++--- src/render/OpenGL.hpp | 10 +++-- src/render/Renderer.cpp | 72 +++++++++++++++++++----------- src/render/Renderer.hpp | 12 ++++- src/render/pass/TexPassElement.cpp | 19 ++++++-- src/render/pass/TexPassElement.hpp | 5 ++- 8 files changed, 90 insertions(+), 45 deletions(-) diff --git a/src/desktop/Window.cpp b/src/desktop/Window.cpp index f90702dc..7ef54da0 100644 --- a/src/desktop/Window.cpp +++ b/src/desktop/Window.cpp @@ -1149,7 +1149,7 @@ bool CWindow::opaque() { if (m_wlSurface->small() && !m_wlSurface->m_fillIgnoreSmall) return false; - if (PWORKSPACE->m_alpha->value() != 1.f) + if (PWORKSPACE && PWORKSPACE->m_alpha->value() != 1.f) return false; if (m_isX11 && m_xwaylandSurface && m_xwaylandSurface->m_surface && m_xwaylandSurface->m_surface->m_current.texture) diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index 48cf78d5..4bf54ca8 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -754,7 +754,8 @@ void Events::listener_unmapWindow(void* owner, void* data) { g_pCompositor->setWindowFullscreenInternal(PWINDOW, FSMODE_NONE); // Allow the renderer to catch the last frame. - g_pHyprRenderer->makeWindowSnapshot(PWINDOW); + if (g_pHyprRenderer->shouldRenderWindow(PWINDOW)) + g_pHyprRenderer->makeWindowSnapshot(PWINDOW); // swallowing if (valid(PWINDOW->m_swallowed)) { diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 9cbf091b..19d03fef 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -1813,13 +1813,16 @@ void CHyprOpenGLImpl::renderTextureMatte(SP tex, const CBox& box, CFra // // Dual (or more) kawase blur CFramebuffer* CHyprOpenGLImpl::blurMainFramebufferWithDamage(float a, CRegion* originalDamage) { - if (!m_renderData.currentFB->getTexture()) { Debug::log(ERR, "BUG THIS: null fb texture while attempting to blur main fb?! (introspection off?!)"); return &m_renderData.pCurrentMonData->mirrorFB; // return something to sample from at least } - TRACY_GPU_ZONE("RenderBlurMainFramebufferWithDamage"); + return blurFramebufferWithDamage(a, originalDamage, *m_renderData.currentFB); +} + +CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* originalDamage, CFramebuffer& source) { + TRACY_GPU_ZONE("RenderBlurFramebufferWithDamage"); const auto BLENDBEFORE = m_blend; blend(false); @@ -1859,7 +1862,7 @@ CFramebuffer* CHyprOpenGLImpl::blurMainFramebufferWithDamage(float a, CRegion* o glActiveTexture(GL_TEXTURE0); - auto currentTex = m_renderData.currentFB->getTexture(); + auto currentTex = source.getTexture(); glBindTexture(currentTex->m_target, currentTex->m_texID); @@ -2226,7 +2229,7 @@ void CHyprOpenGLImpl::renderTextureWithBlur(SP tex, const CBox& box, f // amazing hack: the surface has an opaque region! CRegion inverseOpaque; - if (a >= 1.f && std::round(pSurface->m_current.size.x * m_renderData.pMonitor->m_scale) == box.w && + if (a >= 1.f && pSurface && std::round(pSurface->m_current.size.x * m_renderData.pMonitor->m_scale) == box.w && std::round(pSurface->m_current.size.y * m_renderData.pMonitor->m_scale) == box.h) { pixman_box32_t surfbox = {0, 0, pSurface->m_current.size.x * pSurface->m_current.scale, pSurface->m_current.size.y * pSurface->m_current.scale}; inverseOpaque = pSurface->m_current.opaque; @@ -2249,7 +2252,6 @@ void CHyprOpenGLImpl::renderTextureWithBlur(SP tex, const CBox& box, f inverseOpaque.translate(box.pos()); m_renderData.renderModif.applyToRegion(inverseOpaque); inverseOpaque.intersect(texDamage); - POUTFB = blurMainFramebufferWithDamage(a, &inverseOpaque); } else POUTFB = &m_renderData.pCurrentMonData->blurFB; diff --git a/src/render/OpenGL.hpp b/src/render/OpenGL.hpp index 3c7a3169..17fe7f85 100644 --- a/src/render/OpenGL.hpp +++ b/src/render/OpenGL.hpp @@ -114,11 +114,12 @@ struct SMonitorRenderData { }; struct SCurrentRenderData { - PHLMONITORREF pMonitor; - Mat3x3 projection; - Mat3x3 savedProjection; - Mat3x3 monitorProjection; + PHLMONITORREF pMonitor; + Mat3x3 projection; + Mat3x3 savedProjection; + Mat3x3 monitorProjection; + // FIXME: raw pointer galore! SMonitorRenderData* pCurrentMonData = nullptr; CFramebuffer* currentFB = nullptr; // current rendering to CFramebuffer* mainFB = nullptr; // main to render to @@ -333,6 +334,7 @@ class CHyprOpenGLImpl { // returns the out FB, can be either Mirror or MirrorSwap CFramebuffer* blurMainFramebufferWithDamage(float a, CRegion* damage); + CFramebuffer* blurFramebufferWithDamage(float a, CRegion* damage, CFramebuffer& source); void passCMUniforms(const SShader&, const NColorManagement::SImageDescription& imageDescription, const NColorManagement::SImageDescription& targetImageDescription, bool modifySDR = false); diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 343276c9..3abeb7bd 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -493,7 +493,6 @@ void CHyprRenderer::renderWindow(PHLWINDOW pWindow, PHLMONITOR pMonitor, const T // whether to use m_fMovingToWorkspaceAlpha, only if fading out into an invisible ws const bool USE_WORKSPACE_FADE_ALPHA = pWindow->m_monitorMovedFrom != -1 && (!PWORKSPACE || !PWORKSPACE->isVisible()); - const bool DONT_BLUR = pWindow->m_windowData.noBlur.valueOrDefault() || pWindow->m_windowData.RGBX.valueOrDefault() || pWindow->opaque(); renderdata.surface = pWindow->m_wlSurface->resource(); renderdata.dontRound = pWindow->isEffectiveInternalFSMode(FSMODE_FULLSCREEN) || pWindow->m_windowData.noRounding.valueOrDefault(); @@ -503,7 +502,7 @@ void CHyprRenderer::renderWindow(PHLWINDOW pWindow, PHLMONITOR pMonitor, const T renderdata.decorate = decorate && !pWindow->m_X11DoesntWantBorders && !pWindow->isEffectiveInternalFSMode(FSMODE_FULLSCREEN); renderdata.rounding = standalone || renderdata.dontRound ? 0 : pWindow->rounding() * pMonitor->m_scale; renderdata.roundingPower = standalone || renderdata.dontRound ? 2.0f : pWindow->roundingPower(); - renderdata.blur = !standalone && *PBLUR && !DONT_BLUR; + renderdata.blur = !standalone && shouldBlur(pWindow); renderdata.pWindow = pWindow; if (standalone) { @@ -572,7 +571,7 @@ void CHyprRenderer::renderWindow(PHLWINDOW pWindow, PHLMONITOR pMonitor, const T if ((pWindow->m_isX11 && *PXWLUSENN) || pWindow->m_windowData.nearestNeighbor.valueOrDefault()) renderdata.useNearestNeighbor = true; - if (!pWindow->m_windowData.noBlur.valueOrDefault() && pWindow->m_wlSurface->small() && !pWindow->m_wlSurface->m_fillIgnoreSmall && renderdata.blur && *PBLUR) { + if (pWindow->m_wlSurface->small() && !pWindow->m_wlSurface->m_fillIgnoreSmall && renderdata.blur) { CBox wb = {renderdata.pos.x - pMonitor->m_position.x, renderdata.pos.y - pMonitor->m_position.y, renderdata.w, renderdata.h}; wb.scale(pMonitor->m_scale).round(); CRectPassElement::SRectData data; @@ -712,8 +711,6 @@ void CHyprRenderer::renderLayer(PHLLS pLayer, PHLMONITOR pMonitor, const Time::s return; } - static auto PBLUR = CConfigValue("decoration:blur:enabled"); - TRACY_GPU_ZONE("RenderLayer"); const auto REALPOS = pLayer->m_realPosition->value(); @@ -721,7 +718,7 @@ void CHyprRenderer::renderLayer(PHLLS pLayer, PHLMONITOR pMonitor, const Time::s CSurfacePassElement::SRenderData renderdata = {pMonitor, time, REALPOS}; renderdata.fadeAlpha = pLayer->m_alpha->value(); - renderdata.blur = pLayer->m_forceBlur && *PBLUR; + renderdata.blur = shouldBlur(pLayer); renderdata.surface = pLayer->m_surface->resource(); renderdata.decorate = false; renderdata.w = REALSIZ.x; @@ -874,12 +871,15 @@ void CHyprRenderer::renderAllClientsForWorkspace(PHLMONITOR pMonitor, PHLWORKSPA for (auto const& ls : pMonitor->m_layerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND]) { renderLayer(ls.lock(), pMonitor, time); } + for (auto const& ls : pMonitor->m_layerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM]) { renderLayer(ls.lock(), pMonitor, time); } + for (auto const& ls : pMonitor->m_layerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]) { renderLayer(ls.lock(), pMonitor, time); } + for (auto const& ls : pMonitor->m_layerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY]) { renderLayer(ls.lock(), pMonitor, time); } @@ -896,6 +896,7 @@ void CHyprRenderer::renderAllClientsForWorkspace(PHLMONITOR pMonitor, PHLWORKSPA for (auto const& ls : pMonitor->m_layerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND]) { renderLayer(ls.lock(), pMonitor, time); } + for (auto const& ls : pMonitor->m_layerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM]) { renderLayer(ls.lock(), pMonitor, time); } @@ -940,9 +941,9 @@ void CHyprRenderer::renderAllClientsForWorkspace(PHLMONITOR pMonitor, PHLWORKSPA // special for (auto const& ws : g_pCompositor->m_workspaces) { if (ws->m_alpha->value() > 0.f && ws->m_isSpecialWorkspace) { - if (ws->m_hasFullscreenWindow) + if (ws->m_hasFullscreenWindow) { renderWorkspaceWindowsFullscreen(pMonitor, ws, time); - else + } else renderWorkspaceWindows(pMonitor, ws, time); } } @@ -2448,21 +2449,8 @@ void CHyprRenderer::makeWindowSnapshot(PHLWINDOW pWindow) { g_pHyprOpenGL->clear(CHyprColor(0, 0, 0, 0)); // JIC - // this is a hack but it works :P - // we need to disable blur or else we will get a black background, as the shader - // will try to copy the bg to apply blur. - // this isn't entirely correct, but like, oh well. - // small todo: maybe make this correct? :P - static auto* const PBLUR = (Hyprlang::INT* const*)(g_pConfigManager->getConfigValuePtr("decoration:blur:enabled")); - const auto BLURVAL = **PBLUR; - **PBLUR = 0; - - g_pHyprOpenGL->clear(CHyprColor(0, 0, 0, 0)); // JIC - renderWindow(pWindow, PMONITOR, Time::steadyNow(), !pWindow->m_X11DoesntWantBorders, RENDER_PASS_ALL); - **PBLUR = BLURVAL; - endRender(); m_bRenderingSnapshot = false; @@ -2492,14 +2480,9 @@ void CHyprRenderer::makeLayerSnapshot(PHLLS pLayer) { g_pHyprOpenGL->clear(CHyprColor(0, 0, 0, 0)); // JIC - const auto BLURLSSTATUS = pLayer->m_forceBlur; - pLayer->m_forceBlur = false; - // draw the layer renderLayer(pLayer, PMONITOR, Time::steadyNow()); - pLayer->m_forceBlur = BLURLSSTATUS; - endRender(); m_bRenderingSnapshot = false; @@ -2534,7 +2517,6 @@ void CHyprRenderer::renderSnapshot(PHLWINDOW pWindow) { CRegion fakeDamage{0, 0, PMONITOR->m_transformedSize.x, PMONITOR->m_transformedSize.y}; if (*PDIMAROUND && pWindow->m_windowData.dimAround.valueOrDefault()) { - CRectPassElement::SRectData data; data.box = {0, 0, g_pHyprOpenGL->m_renderData.pMonitor->m_pixelSize.x, g_pHyprOpenGL->m_renderData.pMonitor->m_pixelSize.y}; @@ -2544,6 +2526,19 @@ void CHyprRenderer::renderSnapshot(PHLWINDOW pWindow) { damageMonitor(PMONITOR); } + if (shouldBlur(pWindow)) { + CRectPassElement::SRectData data; + data.box = CBox{pWindow->m_realPosition->value(), pWindow->m_realSize->value()}.translate(-PMONITOR->m_position).scale(PMONITOR->m_scale).round(); + data.color = CHyprColor{0, 0, 0, 0}; + data.blur = true; + data.blurA = sqrt(pWindow->m_alpha->value()); // sqrt makes the blur fadeout more realistic. + data.round = pWindow->rounding(); + data.roundingPower = pWindow->roundingPower(); + data.xray = pWindow->m_windowData.xray.valueOr(false); + + m_renderPass.add(makeShared(data)); + } + CTexPassElement::SRenderData data; data.flipEndFrame = true; data.tex = FBDATA->getTexture(); @@ -2580,12 +2575,35 @@ void CHyprRenderer::renderSnapshot(PHLLS pLayer) { CRegion fakeDamage{0, 0, PMONITOR->m_transformedSize.x, PMONITOR->m_transformedSize.y}; + const bool SHOULD_BLUR = shouldBlur(pLayer); + CTexPassElement::SRenderData data; data.flipEndFrame = true; data.tex = FBDATA->getTexture(); data.box = layerBox; data.a = pLayer->m_alpha->value(); data.damage = fakeDamage; + data.blur = SHOULD_BLUR; + data.blurA = sqrt(pLayer->m_alpha->value()); // sqrt makes the blur fadeout more realistic. + if (SHOULD_BLUR) + data.ignoreAlpha = pLayer->m_ignoreAlpha ? pLayer->m_ignoreAlphaValue : 0.01F /* ignore the alpha 0 regions */; m_renderPass.add(makeShared(data)); } + +bool CHyprRenderer::shouldBlur(PHLLS ls) { + if (m_bRenderingSnapshot) + return false; + + static auto PBLUR = CConfigValue("decoration:blur:enabled"); + return *PBLUR && ls->m_forceBlur; +} + +bool CHyprRenderer::shouldBlur(PHLWINDOW w) { + if (m_bRenderingSnapshot) + return false; + + static auto PBLUR = CConfigValue("decoration:blur:enabled"); + const bool DONT_BLUR = w->m_windowData.noBlur.valueOrDefault() || w->m_windowData.RGBX.valueOrDefault() || w->opaque(); + return *PBLUR && !DONT_BLUR; +} diff --git a/src/render/Renderer.hpp b/src/render/Renderer.hpp index 29d7464b..77e1fcf0 100644 --- a/src/render/Renderer.hpp +++ b/src/render/Renderer.hpp @@ -45,6 +45,11 @@ struct SExplicitSyncSettings { bool explicitEnabled = false, explicitKMSEnabled = false; }; +struct SRenderWorkspaceUntilData { + PHLLS ls; + PHLWINDOW w; +}; + class CHyprRenderer { public: CHyprRenderer(); @@ -117,20 +122,23 @@ class CHyprRenderer { private: void arrangeLayerArray(PHLMONITOR, const std::vector&, bool, CBox*); + void renderWorkspace(PHLMONITOR pMonitor, PHLWORKSPACE pWorkspace, const Time::steady_tp& now, const CBox& geometry); void renderWorkspaceWindowsFullscreen(PHLMONITOR, PHLWORKSPACE, const Time::steady_tp&); // renders workspace windows (fullscreen) (tiled, floating, pinned, but no special) void renderWorkspaceWindows(PHLMONITOR, PHLWORKSPACE, const Time::steady_tp&); // renders workspace windows (no fullscreen) (tiled, floating, pinned, but no special) + void renderAllClientsForWorkspace(PHLMONITOR pMonitor, PHLWORKSPACE pWorkspace, const Time::steady_tp& now, const Vector2D& translate = {0, 0}, const float& scale = 1.f); void renderWindow(PHLWINDOW, PHLMONITOR, const Time::steady_tp&, bool, eRenderPassMode, bool ignorePosition = false, bool standalone = false); void renderLayer(PHLLS, PHLMONITOR, const Time::steady_tp&, bool popups = false, bool lockscreen = false); void renderSessionLockSurface(WP, PHLMONITOR, const Time::steady_tp&); void renderDragIcon(PHLMONITOR, const Time::steady_tp&); void renderIMEPopup(CInputPopup*, PHLMONITOR, const Time::steady_tp&); - void renderWorkspace(PHLMONITOR pMonitor, PHLWORKSPACE pWorkspace, const Time::steady_tp& now, const CBox& geometry); void sendFrameEventsToWorkspace(PHLMONITOR pMonitor, PHLWORKSPACE pWorkspace, const Time::steady_tp& now); // sends frame displayed events but doesn't actually render anything - void renderAllClientsForWorkspace(PHLMONITOR pMonitor, PHLWORKSPACE pWorkspace, const Time::steady_tp& now, const Vector2D& translate = {0, 0}, const float& scale = 1.f); void renderSessionLockMissing(PHLMONITOR pMonitor); bool commitPendingAndDoExplicitSync(PHLMONITOR pMonitor); + bool shouldBlur(PHLLS ls); + bool shouldBlur(PHLWINDOW w); + bool m_cursorHidden = false; bool m_cursorHasSurface = false; SP m_currentRenderbuffer = nullptr; diff --git a/src/render/pass/TexPassElement.cpp b/src/render/pass/TexPassElement.cpp index b27f1032..e6f4d052 100644 --- a/src/render/pass/TexPassElement.cpp +++ b/src/render/pass/TexPassElement.cpp @@ -11,10 +11,14 @@ CTexPassElement::CTexPassElement(const CTexPassElement::SRenderData& data_) : m_ void CTexPassElement::draw(const CRegion& damage) { g_pHyprOpenGL->m_endFrame = m_data.flipEndFrame; - CScopeGuard x = {[]() { + CScopeGuard x = {[this]() { // g_pHyprOpenGL->m_endFrame = false; g_pHyprOpenGL->m_renderData.clipBox = {}; + if (m_data.replaceProjection) + g_pHyprOpenGL->m_renderData.monitorProjection = g_pHyprOpenGL->m_renderData.pMonitor->m_projMatrix; + if (m_data.ignoreAlpha.has_value()) + g_pHyprOpenGL->m_renderData.discardMode = 0; }}; if (!m_data.clipBox.empty()) @@ -22,9 +26,16 @@ void CTexPassElement::draw(const CRegion& damage) { if (m_data.replaceProjection) g_pHyprOpenGL->m_renderData.monitorProjection = *m_data.replaceProjection; - g_pHyprOpenGL->renderTextureInternalWithDamage(m_data.tex, m_data.box, m_data.a, m_data.damage.empty() ? damage : m_data.damage, m_data.round, m_data.roundingPower); - if (m_data.replaceProjection) - g_pHyprOpenGL->m_renderData.monitorProjection = g_pHyprOpenGL->m_renderData.pMonitor->m_projMatrix; + + if (m_data.ignoreAlpha.has_value()) { + g_pHyprOpenGL->m_renderData.discardMode = DISCARD_ALPHA; + g_pHyprOpenGL->m_renderData.discardOpacity = *m_data.ignoreAlpha; + } + + if (m_data.blur) + g_pHyprOpenGL->renderTextureWithBlur(m_data.tex, m_data.box, m_data.a, nullptr, m_data.round, m_data.roundingPower, false, m_data.blurA, 1.F); + else + g_pHyprOpenGL->renderTextureInternalWithDamage(m_data.tex, m_data.box, m_data.a, m_data.damage.empty() ? damage : m_data.damage, m_data.round, m_data.roundingPower); } bool CTexPassElement::needsLiveBlur() { diff --git a/src/render/pass/TexPassElement.hpp b/src/render/pass/TexPassElement.hpp index e98edd60..a9206d2d 100644 --- a/src/render/pass/TexPassElement.hpp +++ b/src/render/pass/TexPassElement.hpp @@ -11,13 +11,16 @@ class CTexPassElement : public IPassElement { struct SRenderData { SP tex; CBox box; - float a = 1.F; + float a = 1.F; + float blurA = 1.F; CRegion damage; int round = 0; float roundingPower = 2.0f; bool flipEndFrame = false; std::optional replaceProjection; CBox clipBox; + bool blur = false; + std::optional ignoreAlpha; }; CTexPassElement(const SRenderData& data); From 9a87498bb1cb923dec04807fb3fb1f66bd2c2580 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Sat, 10 May 2025 23:53:05 +0100 Subject: [PATCH 006/901] renderer: minor damage fixes --- src/render/Renderer.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 3abeb7bd..77c19697 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -175,7 +175,7 @@ bool CHyprRenderer::shouldRenderWindow(PHLWINDOW pWindow, PHLMONITOR pMonitor) { return false; if (!pWindow->m_workspace && pWindow->m_fadingOut) - return pWindow->workspaceID() == pMonitor->activeWorkspaceID(); + return pWindow->workspaceID() == pMonitor->activeWorkspaceID() || pWindow->workspaceID() == pMonitor->activeSpecialWorkspaceID(); if (pWindow->m_pinned) return true; @@ -2523,7 +2523,6 @@ void CHyprRenderer::renderSnapshot(PHLWINDOW pWindow) { data.color = CHyprColor(0, 0, 0, *PDIMAROUND * pWindow->m_alpha->value()); m_renderPass.add(makeShared(data)); - damageMonitor(PMONITOR); } if (shouldBlur(pWindow)) { From 390a357859e702b6416194291e0eb168270d50ac Mon Sep 17 00:00:00 2001 From: Vaxry Date: Sun, 11 May 2025 13:15:03 +0100 Subject: [PATCH 007/901] renderer: use alpha for the lockttytext texture ref #10348 --- src/render/Renderer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 77c19697..354d4cce 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -1037,7 +1037,7 @@ void CHyprRenderer::renderSessionLockMissing(PHLMONITOR pMonitor) { // also render text for the tty number if (g_pHyprOpenGL->m_lockTtyTextTexture) { CBox texbox = {{}, g_pHyprOpenGL->m_lockTtyTextTexture->m_size}; - g_pHyprOpenGL->renderTexture(g_pHyprOpenGL->m_lockTtyTextTexture, texbox, 1.F); + g_pHyprOpenGL->renderTexture(g_pHyprOpenGL->m_lockTtyTextTexture, texbox, ALPHA); } } From 04124988e8b4a9cdfc5995388ebfaad0005b4b31 Mon Sep 17 00:00:00 2001 From: Tom Englund Date: Sun, 11 May 2025 18:36:20 +0200 Subject: [PATCH 008/901] opengl: optimize shaders and reduce unneeded drawcalls (#10364) * opengl: remove unnecessery glflush calls glflushing forces the driver to break batching and issue commands prematurely and prevents optimisations like command reordering and merging. many glFunctions already internally glflushes and eglsync creation still has a glflush at end render. so lets reduce the overhead of these calls. * opengl: reduce glUseProgram calls apitrace shows cases where the same program gets called multiple times, add a helper function that keeps track of current program and only call it once on same program. reduces slight overhead. * opengl: use more efficient vertex array object use a more modern vertex array object approach with the shaders, makes it a onetime setup on shader creation instead of once per drawcall, also should make the driver not have to revalidate the vertex format on each call. --- src/Compositor.cpp | 1 - src/managers/PointerManager.cpp | 1 - src/render/OpenGL.cpp | 159 +++++++++++++------------------- src/render/OpenGL.hpp | 2 + src/render/Renderer.cpp | 3 - src/render/Shader.cpp | 36 +++++++- src/render/Shader.hpp | 5 + 7 files changed, 108 insertions(+), 99 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index ece6691a..973cb26b 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -1487,7 +1487,6 @@ void CCompositor::cleanupFadingOut(const MONITORID& monid) { Debug::log(LOG, "Cleanup: destroyed a layersurface"); - glFlush(); // to free mem NOW. return; } } diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp index 5415e7be..7bd66c5d 100644 --- a/src/managers/PointerManager.cpp +++ b/src/managers/PointerManager.cpp @@ -584,7 +584,6 @@ SP CPointerManager::renderHWCursorBuffer(SPrenderTexture(texture, xbox, 1.F); g_pHyprOpenGL->end(); - glFlush(); g_pHyprOpenGL->m_renderData.pMonitor.reset(); g_pHyprRenderer->onRenderbufferDestroy(RBO.get()); diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 19d03fef..7d1b9db9 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -977,6 +977,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shCM.applyTint = glGetUniformLocation(prog, "applyTint"); shaders->m_shCM.tint = glGetUniformLocation(prog, "tint"); shaders->m_shCM.useAlphaMatte = glGetUniformLocation(prog, "useAlphaMatte"); + shaders->m_shCM.createVao(); } else Debug::log(ERR, "WARNING: CM Shader failed compiling, color management will not work. It's likely because your GPU is an old piece of garbage, don't file bug reports " @@ -1006,6 +1007,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shQUAD.proj = glGetUniformLocation(prog, "proj"); shaders->m_shQUAD.color = glGetUniformLocation(prog, "color"); shaders->m_shQUAD.posAttrib = glGetAttribLocation(prog, "pos"); + shaders->m_shQUAD.createVao(); prog = createProgram(shaders->TEXVERTSRC, TEXFRAGSRCRGBA, isDynamic); if (!prog) @@ -1025,6 +1027,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shRGBA.applyTint = glGetUniformLocation(prog, "applyTint"); shaders->m_shRGBA.tint = glGetUniformLocation(prog, "tint"); shaders->m_shRGBA.useAlphaMatte = glGetUniformLocation(prog, "useAlphaMatte"); + shaders->m_shRGBA.createVao(); prog = createProgram(shaders->TEXVERTSRC, TEXFRAGSRCRGBAPASSTHRU, isDynamic); if (!prog) @@ -1034,6 +1037,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shPASSTHRURGBA.tex = glGetUniformLocation(prog, "tex"); shaders->m_shPASSTHRURGBA.texAttrib = glGetAttribLocation(prog, "texcoord"); shaders->m_shPASSTHRURGBA.posAttrib = glGetAttribLocation(prog, "pos"); + shaders->m_shPASSTHRURGBA.createVao(); prog = createProgram(shaders->TEXVERTSRC, TEXFRAGSRCRGBAMATTE, isDynamic); if (!prog) @@ -1044,6 +1048,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shMATTE.alphaMatte = glGetUniformLocation(prog, "texMatte"); shaders->m_shMATTE.texAttrib = glGetAttribLocation(prog, "texcoord"); shaders->m_shMATTE.posAttrib = glGetAttribLocation(prog, "pos"); + shaders->m_shMATTE.createVao(); prog = createProgram(shaders->TEXVERTSRC, FRAGGLITCH, isDynamic); if (!prog) @@ -1056,6 +1061,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shGLITCH.distort = glGetUniformLocation(prog, "distort"); shaders->m_shGLITCH.time = glGetUniformLocation(prog, "time"); shaders->m_shGLITCH.fullSize = glGetUniformLocation(prog, "screenSize"); + shaders->m_shGLITCH.createVao(); prog = createProgram(shaders->TEXVERTSRC, TEXFRAGSRCRGBX, isDynamic); if (!prog) @@ -1072,6 +1078,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shRGBX.discardAlphaValue = glGetUniformLocation(prog, "discardAlphaValue"); shaders->m_shRGBX.applyTint = glGetUniformLocation(prog, "applyTint"); shaders->m_shRGBX.tint = glGetUniformLocation(prog, "tint"); + shaders->m_shRGBX.createVao(); prog = createProgram(shaders->TEXVERTSRC, TEXFRAGSRCEXT, isDynamic); if (!prog) @@ -1088,6 +1095,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shEXT.discardAlphaValue = glGetUniformLocation(prog, "discardAlphaValue"); shaders->m_shEXT.applyTint = glGetUniformLocation(prog, "applyTint"); shaders->m_shEXT.tint = glGetUniformLocation(prog, "tint"); + shaders->m_shEXT.createVao(); prog = createProgram(shaders->TEXVERTSRC, FRAGBLUR1, isDynamic); if (!prog) @@ -1103,6 +1111,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shBLUR1.passes = glGetUniformLocation(prog, "passes"); shaders->m_shBLUR1.vibrancy = glGetUniformLocation(prog, "vibrancy"); shaders->m_shBLUR1.vibrancy_darkness = glGetUniformLocation(prog, "vibrancy_darkness"); + shaders->m_shBLUR1.createVao(); prog = createProgram(shaders->TEXVERTSRC, FRAGBLUR2, isDynamic); if (!prog) @@ -1115,6 +1124,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shBLUR2.texAttrib = glGetAttribLocation(prog, "texcoord"); shaders->m_shBLUR2.radius = glGetUniformLocation(prog, "radius"); shaders->m_shBLUR2.halfpixel = glGetUniformLocation(prog, "halfpixel"); + shaders->m_shBLUR2.createVao(); prog = createProgram(m_cmSupported ? shaders->TEXVERTSRC300 : shaders->TEXVERTSRC, FRAGBLURPREPARE, isDynamic); if (!prog) @@ -1129,6 +1139,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shBLURPREPARE.texAttrib = glGetAttribLocation(prog, "texcoord"); shaders->m_shBLURPREPARE.contrast = glGetUniformLocation(prog, "contrast"); shaders->m_shBLURPREPARE.brightness = glGetUniformLocation(prog, "brightness"); + shaders->m_shBLURPREPARE.createVao(); prog = createProgram(m_cmSupported ? shaders->TEXVERTSRC300 : shaders->TEXVERTSRC, FRAGBLURFINISH, isDynamic); if (!prog) @@ -1142,6 +1153,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shBLURFINISH.texAttrib = glGetAttribLocation(prog, "texcoord"); shaders->m_shBLURFINISH.brightness = glGetUniformLocation(prog, "brightness"); shaders->m_shBLURFINISH.noise = glGetUniformLocation(prog, "noise"); + shaders->m_shBLURFINISH.createVao(); prog = createProgram(m_cmSupported ? shaders->TEXVERTSRC300 : shaders->TEXVERTSRC, FRAGSHADOW, isDynamic); if (!prog) @@ -1157,6 +1169,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shSHADOW.range = glGetUniformLocation(prog, "range"); shaders->m_shSHADOW.shadowPower = glGetUniformLocation(prog, "shadowPower"); shaders->m_shSHADOW.color = glGetUniformLocation(prog, "color"); + shaders->m_shSHADOW.createVao(); prog = createProgram(m_cmSupported ? shaders->TEXVERTSRC300 : shaders->TEXVERTSRC, FRAGBORDER1, isDynamic); if (!prog) @@ -1181,6 +1194,8 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shBORDER1.angle2 = glGetUniformLocation(prog, "angle2"); shaders->m_shBORDER1.gradientLerp = glGetUniformLocation(prog, "gradientLerp"); shaders->m_shBORDER1.alpha = glGetUniformLocation(prog, "alpha"); + shaders->m_shBORDER1.createVao(); + } catch (const std::exception& e) { if (!m_shadersInitialized) throw e; @@ -1375,7 +1390,7 @@ void CHyprOpenGLImpl::renderRectWithDamage(const CBox& box, const CHyprColor& co newBox, wlTransformToHyprutils(invertTransform(!m_endFrame ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)), newBox.rot); Mat3x3 glMatrix = m_renderData.projection.copy().multiply(matrix); - glUseProgram(m_shaders->m_shQUAD.program); + useProgram(m_shaders->m_shQUAD.program); #ifndef GLES2 glUniformMatrix3fv(m_shaders->m_shQUAD.proj, 1, GL_TRUE, glMatrix.getMatrix().data()); @@ -1400,9 +1415,7 @@ void CHyprOpenGLImpl::renderRectWithDamage(const CBox& box, const CHyprColor& co glUniform1f(m_shaders->m_shQUAD.radius, round); glUniform1f(m_shaders->m_shQUAD.roundingPower, roundingPower); - glVertexAttribPointer(m_shaders->m_shQUAD.posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(m_shaders->m_shQUAD.posAttrib); + glBindVertexArray(m_shaders->m_shQUAD.shaderVao); if (m_renderData.clipBox.width != 0 && m_renderData.clipBox.height != 0) { CRegion damageClip{m_renderData.clipBox.x, m_renderData.clipBox.y, m_renderData.clipBox.width, m_renderData.clipBox.height}; @@ -1421,7 +1434,7 @@ void CHyprOpenGLImpl::renderRectWithDamage(const CBox& box, const CHyprColor& co } } - glDisableVertexAttribArray(m_shaders->m_shQUAD.posAttrib); + glBindVertexArray(0); scissor(nullptr); } @@ -1581,7 +1594,7 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(SP tex, const CB if (!skipCM && !usingFinalShader && (texType == TEXTURE_RGBA || texType == TEXTURE_RGBX)) shader = &m_shaders->m_shCM; - glUseProgram(shader->program); + useProgram(shader->program); if (shader == &m_shaders->m_shCM) { glUniform1i(shader->texType, texType); @@ -1655,22 +1668,20 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(SP tex, const CB glUniform1i(shader->applyTint, 0); } - const float verts[] = { - m_renderData.primarySurfaceUVBottomRight.x, m_renderData.primarySurfaceUVTopLeft.y, // top right - m_renderData.primarySurfaceUVTopLeft.x, m_renderData.primarySurfaceUVTopLeft.y, // top left - m_renderData.primarySurfaceUVBottomRight.x, m_renderData.primarySurfaceUVBottomRight.y, // bottom right - m_renderData.primarySurfaceUVTopLeft.x, m_renderData.primarySurfaceUVBottomRight.y, // bottom left - }; + glBindVertexArray(shader->shaderVao); + if (allowCustomUV && m_renderData.primarySurfaceUVTopLeft != Vector2D(-1, -1)) { + const float customUVs[] = { + m_renderData.primarySurfaceUVBottomRight.x, m_renderData.primarySurfaceUVTopLeft.y, m_renderData.primarySurfaceUVTopLeft.x, + m_renderData.primarySurfaceUVTopLeft.y, m_renderData.primarySurfaceUVBottomRight.x, m_renderData.primarySurfaceUVBottomRight.y, + m_renderData.primarySurfaceUVTopLeft.x, m_renderData.primarySurfaceUVBottomRight.y, + }; - glVertexAttribPointer(shader->posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - if (allowCustomUV && m_renderData.primarySurfaceUVTopLeft != Vector2D(-1, -1)) - glVertexAttribPointer(shader->texAttrib, 2, GL_FLOAT, GL_FALSE, 0, verts); - else - glVertexAttribPointer(shader->texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(shader->posAttrib); - glEnableVertexAttribArray(shader->texAttrib); + glBindBuffer(GL_ARRAY_BUFFER, shader->shaderVboUv); + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(customUVs), customUVs); + } else { + glBindBuffer(GL_ARRAY_BUFFER, shader->shaderVboUv); + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(fullVerts), fullVerts); + } if (!m_renderData.clipBox.empty() || !m_renderData.clipRegion.empty()) { CRegion damageClip = m_renderData.clipBox; @@ -1695,9 +1706,8 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(SP tex, const CB } } - glDisableVertexAttribArray(shader->posAttrib); - glDisableVertexAttribArray(shader->texAttrib); - + glBindVertexArray(0); + glBindBuffer(GL_ARRAY_BUFFER, 0); glBindTexture(tex->m_target, 0); } @@ -1723,7 +1733,7 @@ void CHyprOpenGLImpl::renderTexturePrimitive(SP tex, const CBox& box) glActiveTexture(GL_TEXTURE0); glBindTexture(tex->m_target, tex->m_texID); - glUseProgram(shader->program); + useProgram(shader->program); #ifndef GLES2 glUniformMatrix3fv(shader->proj, 1, GL_TRUE, glMatrix.getMatrix().data()); @@ -1733,11 +1743,7 @@ void CHyprOpenGLImpl::renderTexturePrimitive(SP tex, const CBox& box) #endif glUniform1i(shader->tex, 0); - glVertexAttribPointer(shader->posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - glVertexAttribPointer(shader->texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(shader->posAttrib); - glEnableVertexAttribArray(shader->texAttrib); + glBindVertexArray(shader->shaderVao); for (auto const& RECT : m_renderData.damage.getRects()) { scissor(&RECT); @@ -1746,9 +1752,7 @@ void CHyprOpenGLImpl::renderTexturePrimitive(SP tex, const CBox& box) scissor(nullptr); - glDisableVertexAttribArray(shader->posAttrib); - glDisableVertexAttribArray(shader->texAttrib); - + glBindVertexArray(0); glBindTexture(tex->m_target, 0); } @@ -1771,7 +1775,7 @@ void CHyprOpenGLImpl::renderTextureMatte(SP tex, const CBox& box, CFra SShader* shader = &m_shaders->m_shMATTE; - glUseProgram(shader->program); + useProgram(shader->program); #ifndef GLES2 glUniformMatrix3fv(shader->proj, 1, GL_TRUE, glMatrix.getMatrix().data()); @@ -1789,11 +1793,7 @@ void CHyprOpenGLImpl::renderTextureMatte(SP tex, const CBox& box, CFra auto matteTex = matte.getTexture(); glBindTexture(matteTex->m_target, matteTex->m_texID); - glVertexAttribPointer(shader->posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - glVertexAttribPointer(shader->texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(shader->posAttrib); - glEnableVertexAttribArray(shader->texAttrib); + glBindVertexArray(shader->shaderVao); for (auto const& RECT : m_renderData.damage.getRects()) { scissor(&RECT); @@ -1802,9 +1802,7 @@ void CHyprOpenGLImpl::renderTextureMatte(SP tex, const CBox& box, CFra scissor(nullptr); - glDisableVertexAttribArray(shader->posAttrib); - glDisableVertexAttribArray(shader->texAttrib); - + glBindVertexArray(0); glBindTexture(tex->m_target, 0); } @@ -1868,7 +1866,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi glTexParameteri(currentTex->m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glUseProgram(m_shaders->m_shBLURPREPARE.program); + useProgram(m_shaders->m_shBLURPREPARE.program); // From FB to sRGB const bool skipCM = !m_cmSupported || m_renderData.pMonitor->m_imageDescription == SImageDescription{}; @@ -1897,11 +1895,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi glUniform1f(m_shaders->m_shBLURPREPARE.brightness, *PBLURBRIGHTNESS); glUniform1i(m_shaders->m_shBLURPREPARE.tex, 0); - glVertexAttribPointer(m_shaders->m_shBLURPREPARE.posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - glVertexAttribPointer(m_shaders->m_shBLURPREPARE.texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(m_shaders->m_shBLURPREPARE.posAttrib); - glEnableVertexAttribArray(m_shaders->m_shBLURPREPARE.texAttrib); + glBindVertexArray(m_shaders->m_shBLURPREPARE.shaderVao); if (!damage.empty()) { for (auto const& RECT : damage.getRects()) { @@ -1910,9 +1904,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi } } - glDisableVertexAttribArray(m_shaders->m_shBLURPREPARE.posAttrib); - glDisableVertexAttribArray(m_shaders->m_shBLURPREPARE.texAttrib); - + glBindVertexArray(0); currentRenderToFB = PMIRRORSWAPFB; } @@ -1931,7 +1923,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi glTexParameteri(currentTex->m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glUseProgram(pShader->program); + useProgram(pShader->program); // prep two shaders #ifndef GLES2 @@ -1950,12 +1942,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi glUniform2f(m_shaders->m_shBLUR2.halfpixel, 0.5f / (m_renderData.pMonitor->m_pixelSize.x * 2.f), 0.5f / (m_renderData.pMonitor->m_pixelSize.y * 2.f)); glUniform1i(pShader->tex, 0); - glVertexAttribPointer(pShader->posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - glVertexAttribPointer(pShader->texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(pShader->posAttrib); - glEnableVertexAttribArray(pShader->texAttrib); - + glBindVertexArray(pShader->shaderVao); if (!pDamage->empty()) { for (auto const& RECT : pDamage->getRects()) { scissor(&RECT, false /* this region is already transformed */); @@ -1963,8 +1950,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi } } - glDisableVertexAttribArray(pShader->posAttrib); - glDisableVertexAttribArray(pShader->texAttrib); + glBindVertexArray(0); if (currentRenderToFB != PMIRRORFB) currentRenderToFB = PMIRRORFB; @@ -2009,7 +1995,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi glTexParameteri(currentTex->m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glUseProgram(m_shaders->m_shBLURFINISH.program); + useProgram(m_shaders->m_shBLURFINISH.program); #ifndef GLES2 glUniformMatrix3fv(m_shaders->m_shBLURFINISH.proj, 1, GL_TRUE, glMatrix.getMatrix().data()); @@ -2022,11 +2008,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi glUniform1i(m_shaders->m_shBLURFINISH.tex, 0); - glVertexAttribPointer(m_shaders->m_shBLURFINISH.posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - glVertexAttribPointer(m_shaders->m_shBLURFINISH.texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(m_shaders->m_shBLURFINISH.posAttrib); - glEnableVertexAttribArray(m_shaders->m_shBLURFINISH.texAttrib); + glBindVertexArray(m_shaders->m_shBLURFINISH.shaderVao); if (!damage.empty()) { for (auto const& RECT : damage.getRects()) { @@ -2035,8 +2017,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi } } - glDisableVertexAttribArray(m_shaders->m_shBLURFINISH.posAttrib); - glDisableVertexAttribArray(m_shaders->m_shBLURFINISH.texAttrib); + glBindVertexArray(0); if (currentRenderToFB != PMIRRORFB) currentRenderToFB = PMIRRORFB; @@ -2352,7 +2333,7 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr const auto BLEND = m_blend; blend(true); - glUseProgram(m_shaders->m_shBORDER1.program); + useProgram(m_shaders->m_shBORDER1.program); const bool skipCM = !m_cmSupported || m_renderData.pMonitor->m_imageDescription == SImageDescription{}; glUniform1i(m_shaders->m_shBORDER1.skipCM, skipCM); @@ -2387,11 +2368,7 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr glUniform1f(m_shaders->m_shBORDER1.roundingPower, roundingPower); glUniform1f(m_shaders->m_shBORDER1.thick, scaledBorderSize); - glVertexAttribPointer(m_shaders->m_shBORDER1.posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - glVertexAttribPointer(m_shaders->m_shBORDER1.texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(m_shaders->m_shBORDER1.posAttrib); - glEnableVertexAttribArray(m_shaders->m_shBORDER1.texAttrib); + glBindVertexArray(m_shaders->m_shBORDER1.shaderVao); if (m_renderData.clipBox.width != 0 && m_renderData.clipBox.height != 0) { CRegion damageClip{m_renderData.clipBox.x, m_renderData.clipBox.y, m_renderData.clipBox.width, m_renderData.clipBox.height}; @@ -2410,8 +2387,7 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr } } - glDisableVertexAttribArray(m_shaders->m_shBORDER1.posAttrib); - glDisableVertexAttribArray(m_shaders->m_shBORDER1.texAttrib); + glBindVertexArray(0); blend(BLEND); } @@ -2450,7 +2426,7 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr const auto BLEND = m_blend; blend(true); - glUseProgram(m_shaders->m_shBORDER1.program); + useProgram(m_shaders->m_shBORDER1.program); #ifndef GLES2 glUniformMatrix3fv(m_shaders->m_shBORDER1.proj, 1, GL_TRUE, glMatrix.getMatrix().data()); @@ -2484,11 +2460,7 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr glUniform1f(m_shaders->m_shBORDER1.roundingPower, roundingPower); glUniform1f(m_shaders->m_shBORDER1.thick, scaledBorderSize); - glVertexAttribPointer(m_shaders->m_shBORDER1.posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - glVertexAttribPointer(m_shaders->m_shBORDER1.texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(m_shaders->m_shBORDER1.posAttrib); - glEnableVertexAttribArray(m_shaders->m_shBORDER1.texAttrib); + glBindVertexArray(m_shaders->m_shBORDER1.shaderVao); if (m_renderData.clipBox.width != 0 && m_renderData.clipBox.height != 0) { CRegion damageClip{m_renderData.clipBox.x, m_renderData.clipBox.y, m_renderData.clipBox.width, m_renderData.clipBox.height}; @@ -2507,9 +2479,7 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr } } - glDisableVertexAttribArray(m_shaders->m_shBORDER1.posAttrib); - glDisableVertexAttribArray(m_shaders->m_shBORDER1.texAttrib); - + glBindVertexArray(0); blend(BLEND); } @@ -2538,7 +2508,7 @@ void CHyprOpenGLImpl::renderRoundedShadow(const CBox& box, int round, float roun blend(true); - glUseProgram(m_shaders->m_shSHADOW.program); + useProgram(m_shaders->m_shSHADOW.program); const bool skipCM = !m_cmSupported || m_renderData.pMonitor->m_imageDescription == SImageDescription{}; glUniform1i(m_shaders->m_shSHADOW.skipCM, skipCM); if (!skipCM) @@ -2565,11 +2535,7 @@ void CHyprOpenGLImpl::renderRoundedShadow(const CBox& box, int round, float roun glUniform1f(m_shaders->m_shSHADOW.range, range); glUniform1f(m_shaders->m_shSHADOW.shadowPower, SHADOWPOWER); - glVertexAttribPointer(m_shaders->m_shSHADOW.posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - glVertexAttribPointer(m_shaders->m_shSHADOW.texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(m_shaders->m_shSHADOW.posAttrib); - glEnableVertexAttribArray(m_shaders->m_shSHADOW.texAttrib); + glBindVertexArray(m_shaders->m_shSHADOW.shaderVao); if (m_renderData.clipBox.width != 0 && m_renderData.clipBox.height != 0) { CRegion damageClip{m_renderData.clipBox.x, m_renderData.clipBox.y, m_renderData.clipBox.width, m_renderData.clipBox.height}; @@ -2588,8 +2554,7 @@ void CHyprOpenGLImpl::renderRoundedShadow(const CBox& box, int round, float roun } } - glDisableVertexAttribArray(m_shaders->m_shSHADOW.posAttrib); - glDisableVertexAttribArray(m_shaders->m_shSHADOW.texAttrib); + glBindVertexArray(0); } void CHyprOpenGLImpl::saveBufferForMirror(const CBox& box) { @@ -2861,6 +2826,14 @@ void CHyprOpenGLImpl::initMissingAssetTexture() { m_missingAssetTexture = tex; } +void CHyprOpenGLImpl::useProgram(GLuint prog) { + if (m_currentProgram == prog) + return; + + glUseProgram(prog); + m_currentProgram = prog; +} + void CHyprOpenGLImpl::initAssets() { initMissingAssetTexture(); diff --git a/src/render/OpenGL.hpp b/src/render/OpenGL.hpp index 17fe7f85..5d76bba8 100644 --- a/src/render/OpenGL.hpp +++ b/src/render/OpenGL.hpp @@ -312,6 +312,7 @@ class CHyprOpenGLImpl { SShader m_finalScreenShader; CTimer m_globalTimer; + GLuint m_currentProgram; SP m_missingAssetTexture; SP m_backgroundTexture; @@ -328,6 +329,7 @@ class CHyprOpenGLImpl { EGLDeviceEXT eglDeviceFromDRMFD(int drmFD); void initAssets(); void initMissingAssetTexture(); + void useProgram(GLuint prog); // std::optional> getModsForFormat(EGLint format); diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 354d4cce..982e2ed8 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -2280,9 +2280,6 @@ void CHyprRenderer::endRender(const std::function& renderingDoneCallback g_pHyprOpenGL->m_renderData.mouseZoomUseMouse = true; } - // send all queued opengl commands so rendering starts happening immediately - glFlush(); - if (m_renderMode == RENDER_MODE_FULL_FAKE) return; diff --git a/src/render/Shader.cpp b/src/render/Shader.cpp index 7b22c83a..7201d1c0 100644 --- a/src/render/Shader.cpp +++ b/src/render/Shader.cpp @@ -1,14 +1,48 @@ #include "Shader.hpp" +#include "render/OpenGL.hpp" SShader::~SShader() { destroy(); } +void SShader::createVao() { + glGenVertexArrays(1, &shaderVao); + glBindVertexArray(shaderVao); + + if (posAttrib != -1) { + glGenBuffers(1, &shaderVboPos); + glBindBuffer(GL_ARRAY_BUFFER, shaderVboPos); + glBufferData(GL_ARRAY_BUFFER, sizeof(fullVerts), fullVerts, GL_STATIC_DRAW); + glEnableVertexAttribArray(posAttrib); + glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); + } + + // UV VBO (dynamic, may be updated per frame) + if (texAttrib != -1) { + glGenBuffers(1, &shaderVboUv); + glBindBuffer(GL_ARRAY_BUFFER, shaderVboUv); + glBufferData(GL_ARRAY_BUFFER, sizeof(fullVerts), fullVerts, GL_DYNAMIC_DRAW); // Initial dummy UVs + glEnableVertexAttribArray(texAttrib); + glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); + } + + glBindVertexArray(0); + glBindBuffer(GL_ARRAY_BUFFER, 0); +} + void SShader::destroy() { if (program == 0) return; - glDeleteProgram(program); + if (shaderVao) + glDeleteVertexArrays(1, &shaderVao); + if (shaderVboPos) + glDeleteBuffers(1, &shaderVboPos); + + if (shaderVboUv) + glDeleteBuffers(1, &shaderVboUv); + + glDeleteProgram(program); program = 0; } diff --git a/src/render/Shader.hpp b/src/render/Shader.hpp index d23d2d5a..7bed9041 100644 --- a/src/render/Shader.hpp +++ b/src/render/Shader.hpp @@ -32,6 +32,10 @@ struct SShader { GLint discardAlpha = -1; GLfloat discardAlphaValue = -1; + GLuint shaderVao = 0; + GLuint shaderVboPos = 0; + GLuint shaderVboUv = 0; + GLint topLeft = -1; GLint bottomRight = -1; GLint fullSize = -1; @@ -76,5 +80,6 @@ struct SShader { GLint brightness = -1; GLint noise = -1; + void createVao(); void destroy(); }; From da3583fd5e86044d02af9fcfac84724e02545336 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Mon, 12 May 2025 05:15:47 -0700 Subject: [PATCH 009/901] opengl: publicize shader creation/usage functions (#10378) Allows plugins to create and use shaders again --- src/render/OpenGL.hpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/render/OpenGL.hpp b/src/render/OpenGL.hpp index 5d76bba8..09aff9da 100644 --- a/src/render/OpenGL.hpp +++ b/src/render/OpenGL.hpp @@ -240,6 +240,11 @@ class CHyprOpenGLImpl { EGLImageKHR createEGLImage(const Aquamarine::SDMABUFAttrs& attrs); bool initShaders(); + + GLuint createProgram(const std::string&, const std::string&, bool dynamic = false, bool silent = false); + GLuint compileShader(const GLuint&, std::string, bool dynamic = false, bool silent = false); + void useProgram(GLuint prog); + bool m_shadersInitialized = false; SP m_shaders; @@ -321,15 +326,12 @@ class CHyprOpenGLImpl { SP m_lockTtyTextTexture; // TODO: don't always load lock void logShaderError(const GLuint&, bool program = false, bool silent = false); - GLuint createProgram(const std::string&, const std::string&, bool dynamic = false, bool silent = false); - GLuint compileShader(const GLuint&, std::string, bool dynamic = false, bool silent = false); void createBGTextureForMonitor(PHLMONITOR); void initDRMFormats(); void initEGL(bool gbm); EGLDeviceEXT eglDeviceFromDRMFD(int drmFD); void initAssets(); void initMissingAssetTexture(); - void useProgram(GLuint prog); // std::optional> getModsForFormat(EGLint format); From 59b23406804d0c6aa37dc40c271852e697759663 Mon Sep 17 00:00:00 2001 From: Tom Englund Date: Wed, 14 May 2025 00:46:29 +0200 Subject: [PATCH 010/901] opengl: add missing vao for screenshader (#10397) missed creating vertex array objects in 04124988e8b4a9cdfc5995388ebfaad0005b4b31 add it. --- src/render/OpenGL.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 7d1b9db9..c4223085 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -1262,6 +1262,7 @@ void CHyprOpenGLImpl::applyScreenShader(const std::string& path) { } m_finalScreenShader.texAttrib = glGetAttribLocation(m_finalScreenShader.program, "texcoord"); m_finalScreenShader.posAttrib = glGetAttribLocation(m_finalScreenShader.program, "pos"); + m_finalScreenShader.createVao(); } void CHyprOpenGLImpl::clear(const CHyprColor& color) { From a51e639d81b445ad00c5403198e0c1f6c18ed303 Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Wed, 14 May 2025 17:48:17 +0100 Subject: [PATCH 011/901] input: disallow virtual keyboards from changing LED state (#10402) --- src/managers/input/InputManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index 68769987..cd603ca5 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -1368,7 +1368,7 @@ void CInputManager::destroyTabletPad(SP pad) { } void CInputManager::updateKeyboardsLeds(SP pKeyboard) { - if (!pKeyboard) + if (!pKeyboard || pKeyboard->isVirtual()) return; std::optional leds = pKeyboard->getLEDs(); From 75f2cb5f6559ca6ca7c6300b270e5ddc3fdabe31 Mon Sep 17 00:00:00 2001 From: Yukari Chiba Date: Thu, 15 May 2025 02:31:19 +0800 Subject: [PATCH 012/901] xwayland: do not include xcb.h when xwayland is disabled (#10407) xcb.h should not be included when xwayland is disabled. This allows hyprland to not use X11 libraries at all when xwayland is disabled. --- src/xwayland/Dnd.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/xwayland/Dnd.hpp b/src/xwayland/Dnd.hpp index 58129741..33c841a5 100644 --- a/src/xwayland/Dnd.hpp +++ b/src/xwayland/Dnd.hpp @@ -5,7 +5,9 @@ #include "../managers/input/InputManager.hpp" #include #include +#ifndef NO_XWAYLAND #include +#endif #define XDND_VERSION 5 From f707d86912fa75c19920818321aec99d1f287c46 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Thu, 15 May 2025 02:12:55 -0700 Subject: [PATCH 013/901] protocols/hyprland-surface: account for scaled monitor positions (#10415) --- src/render/pass/SurfacePassElement.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render/pass/SurfacePassElement.cpp b/src/render/pass/SurfacePassElement.cpp index ed699a02..d161f909 100644 --- a/src/render/pass/SurfacePassElement.cpp +++ b/src/render/pass/SurfacePassElement.cpp @@ -273,7 +273,7 @@ CRegion CSurfacePassElement::visibleRegion(bool& cancel) { texBox.round(); visibleRegion.scale((Vector2D(1, 1) / (uvBR - uvTL)) * (texBox.size() / bufferSize)); - visibleRegion.translate((m_data.pos + m_data.localPos) * m_data.pMonitor->m_scale - m_data.pMonitor->m_position); + visibleRegion.translate((m_data.pos + m_data.localPos - m_data.pMonitor->m_position) * m_data.pMonitor->m_scale); return visibleRegion; } From 5ceb0ec15df6301cafe95a1b1f73b4f4bf255968 Mon Sep 17 00:00:00 2001 From: Tom Englund Date: Thu, 15 May 2025 11:13:24 +0200 Subject: [PATCH 014/901] core: drop the legacy renderer (#10408) * core: drop the legacy renderer the legacy renderer is broken and barely used, drop it. * Nix: drop support for legacyRenderer --------- Co-authored-by: Mihai Fufezan --- CMakeLists.txt | 11 +- Makefile | 8 -- flake.nix | 1 - meson.build | 4 - meson_options.txt | 1 - nix/default.nix | 6 +- nix/overlays.nix | 8 +- src/debug/CrashReporter.cpp | 3 - src/debug/HyprCtl.cpp | 8 +- src/debug/HyprDebugOverlay.cpp | 3 - src/debug/HyprNotificationOverlay.cpp | 3 - src/helpers/Format.cpp | 111 +++++------------- src/hyprerror/HyprError.cpp | 3 - src/includes.hpp | 6 - src/protocols/Screencopy.cpp | 8 -- src/protocols/ToplevelExport.cpp | 6 - src/render/Framebuffer.cpp | 14 --- src/render/OpenGL.cpp | 107 +---------------- src/render/Texture.cpp | 6 +- .../decorations/CHyprGroupBarDecoration.cpp | 3 - 20 files changed, 50 insertions(+), 270 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 16007dc5..4267a59d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,11 +99,7 @@ message(STATUS "Checking deps...") find_package(Threads REQUIRED) -if(LEGACY_RENDERER) - set(GLES_VERSION "GLES2") -else() - set(GLES_VERSION "GLES3") -endif() +set(GLES_VERSION "GLES3") find_package(OpenGL REQUIRED COMPONENTS ${GLES_VERSION}) pkg_check_modules(aquamarine_dep REQUIRED IMPORTED_TARGET aquamarine>=0.8.0) @@ -216,11 +212,6 @@ if(NOT HAS_INOTIFY AND inotify_FOUND) target_link_libraries(Hyprland PkgConfig::inotify) endif() -if(LEGACY_RENDERER) - message(STATUS "Using the legacy GLES2 renderer!") - add_compile_definitions(LEGACY_RENDERER) -endif() - if(NO_XWAYLAND) message(STATUS "Using the NO_XWAYLAND flag, disabling XWayland!") add_compile_definitions(NO_XWAYLAND) diff --git a/Makefile b/Makefile index 7405cfad..01d1d650 100644 --- a/Makefile +++ b/Makefile @@ -3,14 +3,6 @@ PREFIX = /usr/local stub: @echo "Do not run $(MAKE) directly without any arguments. Please refer to the wiki on how to compile Hyprland." -legacyrenderer: - cmake --no-warn-unused-cli -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_INSTALL_PREFIX:STRING=${PREFIX} -DLEGACY_RENDERER:BOOL=true -S . -B ./build - cmake --build ./build --config Release --target all -j`nproc 2>/dev/null || getconf NPROCESSORS_CONF` - -legacyrendererdebug: - cmake --no-warn-unused-cli -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_INSTALL_PREFIX:STRING=${PREFIX} -DLEGACY_RENDERER:BOOL=true -S . -B ./build - cmake --build ./build --config Debug --target all -j`nproc 2>/dev/null || getconf NPROCESSORS_CONF` - release: cmake --no-warn-unused-cli -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_INSTALL_PREFIX:STRING=${PREFIX} -S . -B ./build cmake --build ./build --config Release --target all -j`nproc 2>/dev/null || getconf NPROCESSORS_CONF` diff --git a/flake.nix b/flake.nix index 801d96ec..dde2860c 100644 --- a/flake.nix +++ b/flake.nix @@ -132,7 +132,6 @@ # hyprland-packages hyprland hyprland-debug - hyprland-legacy-renderer hyprland-unwrapped # hyprland-extras xdg-desktop-portal-hyprland diff --git a/meson.build b/meson.build index bf518216..58ec2475 100644 --- a/meson.build +++ b/meson.build @@ -77,10 +77,6 @@ if (systemd_option.enabled()) subdir('systemd') endif -if get_option('legacy_renderer').enabled() - add_project_arguments('-DLEGACY_RENDERER', language: 'cpp') -endif - if get_option('buildtype') == 'debug' add_project_arguments('-DHYPRLAND_DEBUG', language: 'cpp') endif diff --git a/meson_options.txt b/meson_options.txt index 3eb01696..e50b4cce 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,6 +1,5 @@ option('xwayland', type: 'feature', value: 'auto', description: 'Enable support for X11 applications') option('systemd', type: 'feature', value: 'auto', description: 'Enable systemd integration') option('uwsm', type: 'feature', value: 'enabled', description: 'Enable uwsm integration (only if systemd is enabled)') -option('legacy_renderer', type: 'feature', value: 'disabled', description: 'Enable legacy renderer') option('hyprpm', type: 'feature', value: 'enabled', description: 'Enable hyprpm') option('tracy_enable', type: 'boolean', value: false , description: 'Enable profiling') diff --git a/nix/default.nix b/nix/default.nix index f66bac93..6832006f 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -41,7 +41,6 @@ xwayland, debug ? false, enableXWayland ? true, - legacyRenderer ? false, withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd, wrapRuntimeDeps ? true, version ? "git", @@ -52,6 +51,7 @@ enableNvidiaPatches ? false, nvidiaPatches ? false, hidpiXWayland ? false, + legacyRenderer ? false, }: let inherit (builtins) baseNameOf foldl' readFile; inherit (lib.asserts) assertMsg; @@ -70,6 +70,7 @@ in assert assertMsg (!nvidiaPatches) "The option `nvidiaPatches` has been removed."; assert assertMsg (!enableNvidiaPatches) "The option `enableNvidiaPatches` has been removed."; assert assertMsg (!hidpiXWayland) "The option `hidpiXWayland` has been removed. Please refer https://wiki.hyprland.org/Configuring/XWayland"; + assert assertMsg (!legacyRenderer) "The option `legacyRenderer` has been removed. Legacy renderer is no longer supported."; customStdenv.mkDerivation (finalAttrs: { pname = "hyprland${optionalString debug "-debug"}"; inherit version; @@ -142,7 +143,7 @@ in wayland-scanner xorg.libXcursor ] - (optionals customStdenv.hostPlatform.isBSD [ epoll-shim ]) + (optionals customStdenv.hostPlatform.isBSD [epoll-shim]) (optionals customStdenv.hostPlatform.isMusl [libexecinfo]) (optionals enableXWayland [ xorg.libxcb @@ -165,7 +166,6 @@ in mesonFlags = flatten [ (mapAttrsToList mesonEnable { "xwayland" = enableXWayland; - "legacy_renderer" = legacyRenderer; "systemd" = withSystemd; "uwsm" = false; "hyprpm" = false; diff --git a/nix/overlays.nix b/nix/overlays.nix index 1f50e88d..687a49d4 100644 --- a/nix/overlays.nix +++ b/nix/overlays.nix @@ -50,9 +50,15 @@ in { hyprutils = final.hyprutils.override {debug = true;}; debug = true; }; - hyprland-legacy-renderer = final.hyprland.override {legacyRenderer = true;}; # deprecated packages + hyprland-legacy-renderer = + builtins.trace '' + hyprland-legacy-renderer was removed. Please use the hyprland package. + Legacy renderer is no longer supported. + '' + final.hyprland; + hyprland-nvidia = builtins.trace '' hyprland-nvidia was removed. Please use the hyprland package. diff --git a/src/debug/CrashReporter.cpp b/src/debug/CrashReporter.cpp index e220b0ac..38552c51 100644 --- a/src/debug/CrashReporter.cpp +++ b/src/debug/CrashReporter.cpp @@ -109,9 +109,6 @@ void NCrashReporter::createAndSaveCrash(int sig) { finalCrashReport += "\nDate: "; finalCrashReport += GIT_COMMIT_DATE; finalCrashReport += "\nFlags:\n"; -#ifdef LEGACY_RENDERER - finalCrashReport += "legacyrenderer\n"; -#endif #if ISDEBUG finalCrashReport += "debug\n"; #endif diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp index d3f9efa1..adfbab1e 100644 --- a/src/debug/HyprCtl.cpp +++ b/src/debug/HyprCtl.cpp @@ -931,13 +931,10 @@ std::string versionRequest(eHyprCtlOutputFormat format, std::string request) { HYPRLAND_VERSION, GIT_BRANCH, GIT_COMMIT_HASH, GIT_DIRTY, commitMsg, GIT_COMMIT_DATE, GIT_TAG, GIT_COMMITS, AQUAMARINE_VERSION, HYPRLANG_VERSION, HYPRUTILS_VERSION, HYPRCURSOR_VERSION, HYPRGRAPHICS_VERSION); -#if (!defined(LEGACY_RENDERER) && !ISDEBUG && !defined(NO_XWAYLAND)) +#if (!ISDEBUG && !defined(NO_XWAYLAND)) result += "no flags were set\n"; #else result += "flags set:\n"; -#ifdef LEGACY_RENDERER - result += "legacyrenderer\n"; -#endif #if ISDEBUG result += "debug\n"; #endif @@ -966,9 +963,6 @@ std::string versionRequest(eHyprCtlOutputFormat format, std::string request) { GIT_BRANCH, GIT_COMMIT_HASH, HYPRLAND_VERSION, (strcmp(GIT_DIRTY, "dirty") == 0 ? "true" : "false"), escapeJSONStrings(commitMsg), GIT_COMMIT_DATE, GIT_TAG, GIT_COMMITS, AQUAMARINE_VERSION, HYPRLANG_VERSION, HYPRUTILS_VERSION, HYPRCURSOR_VERSION, HYPRGRAPHICS_VERSION); -#ifdef LEGACY_RENDERER - result += "\"legacyrenderer\","; -#endif #if ISDEBUG result += "\"debug\","; #endif diff --git a/src/debug/HyprDebugOverlay.cpp b/src/debug/HyprDebugOverlay.cpp index 522b3a83..332800dd 100644 --- a/src/debug/HyprDebugOverlay.cpp +++ b/src/debug/HyprDebugOverlay.cpp @@ -263,11 +263,8 @@ void CHyprDebugOverlay::draw() { glBindTexture(GL_TEXTURE_2D, m_texture->m_texID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - -#ifndef GLES2 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_BLUE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED); -#endif glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, PMONITOR->m_pixelSize.x, PMONITOR->m_pixelSize.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, DATA); diff --git a/src/debug/HyprNotificationOverlay.cpp b/src/debug/HyprNotificationOverlay.cpp index f8dd69ab..4e17e797 100644 --- a/src/debug/HyprNotificationOverlay.cpp +++ b/src/debug/HyprNotificationOverlay.cpp @@ -238,11 +238,8 @@ void CHyprNotificationOverlay::draw(PHLMONITOR pMonitor) { glBindTexture(GL_TEXTURE_2D, m_texture->m_texID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - -#ifndef GLES2 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_BLUE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED); -#endif glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, MONSIZE.x, MONSIZE.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, DATA); diff --git a/src/helpers/Format.cpp b/src/helpers/Format.cpp index 6679e869..c3d72185 100644 --- a/src/helpers/Format.cpp +++ b/src/helpers/Format.cpp @@ -14,26 +14,18 @@ */ inline const std::vector GLES3_FORMATS = { { - .drmFormat = DRM_FORMAT_ARGB8888, - .flipRB = true, -#ifndef GLES2 - .glFormat = GL_RGBA, -#else - .glFormat = GL_BGRA_EXT, -#endif + .drmFormat = DRM_FORMAT_ARGB8888, + .flipRB = true, + .glFormat = GL_RGBA, .glType = GL_UNSIGNED_BYTE, .withAlpha = true, .alphaStripped = DRM_FORMAT_XRGB8888, .bytesPerBlock = 4, }, { - .drmFormat = DRM_FORMAT_XRGB8888, - .flipRB = true, -#ifndef GLES2 - .glFormat = GL_RGBA, -#else - .glFormat = GL_BGRA_EXT, -#endif + .drmFormat = DRM_FORMAT_XRGB8888, + .flipRB = true, + .glFormat = GL_RGBA, .glType = GL_UNSIGNED_BYTE, .withAlpha = false, .alphaStripped = DRM_FORMAT_XRGB8888, @@ -104,96 +96,64 @@ inline const std::vector GLES3_FORMATS = { .bytesPerBlock = 2, }, { - .drmFormat = DRM_FORMAT_XBGR2101010, - .glFormat = GL_RGBA, -#ifndef GLES2 - .glType = GL_UNSIGNED_INT_2_10_10_10_REV, -#else - .glType = GL_UNSIGNED_INT_2_10_10_10_REV_EXT, -#endif + .drmFormat = DRM_FORMAT_XBGR2101010, + .glFormat = GL_RGBA, + .glType = GL_UNSIGNED_INT_2_10_10_10_REV, .withAlpha = false, .alphaStripped = DRM_FORMAT_XBGR2101010, .bytesPerBlock = 4, }, { - .drmFormat = DRM_FORMAT_ABGR2101010, - .glFormat = GL_RGBA, -#ifndef GLES2 - .glType = GL_UNSIGNED_INT_2_10_10_10_REV, -#else - .glType = GL_UNSIGNED_INT_2_10_10_10_REV_EXT, -#endif + .drmFormat = DRM_FORMAT_ABGR2101010, + .glFormat = GL_RGBA, + .glType = GL_UNSIGNED_INT_2_10_10_10_REV, .withAlpha = true, .alphaStripped = DRM_FORMAT_XBGR2101010, .bytesPerBlock = 4, }, { - .drmFormat = DRM_FORMAT_XRGB2101010, - .glFormat = GL_RGBA, -#ifndef GLES2 - .glType = GL_UNSIGNED_INT_2_10_10_10_REV, -#else - .glType = GL_UNSIGNED_INT_2_10_10_10_REV_EXT, -#endif + .drmFormat = DRM_FORMAT_XRGB2101010, + .glFormat = GL_RGBA, + .glType = GL_UNSIGNED_INT_2_10_10_10_REV, .withAlpha = false, .alphaStripped = DRM_FORMAT_XRGB2101010, .bytesPerBlock = 4, }, { - .drmFormat = DRM_FORMAT_ARGB2101010, - .glFormat = GL_RGBA, -#ifndef GLES2 - .glType = GL_UNSIGNED_INT_2_10_10_10_REV, -#else - .glType = GL_UNSIGNED_INT_2_10_10_10_REV_EXT, -#endif + .drmFormat = DRM_FORMAT_ARGB2101010, + .glFormat = GL_RGBA, + .glType = GL_UNSIGNED_INT_2_10_10_10_REV, .withAlpha = true, .alphaStripped = DRM_FORMAT_XRGB2101010, .bytesPerBlock = 4, }, { - .drmFormat = DRM_FORMAT_XBGR16161616F, - .glFormat = GL_RGBA, -#ifndef GLES2 - .glType = GL_HALF_FLOAT, -#else - .glType = GL_HALF_FLOAT_OES, -#endif + .drmFormat = DRM_FORMAT_XBGR16161616F, + .glFormat = GL_RGBA, + .glType = GL_HALF_FLOAT, .withAlpha = false, .alphaStripped = DRM_FORMAT_XBGR16161616F, .bytesPerBlock = 8, }, { - .drmFormat = DRM_FORMAT_ABGR16161616F, - .glFormat = GL_RGBA, -#ifndef GLES2 - .glType = GL_HALF_FLOAT, -#else - .glType = GL_HALF_FLOAT_OES, -#endif + .drmFormat = DRM_FORMAT_ABGR16161616F, + .glFormat = GL_RGBA, + .glType = GL_HALF_FLOAT, .withAlpha = true, .alphaStripped = DRM_FORMAT_XBGR16161616F, .bytesPerBlock = 8, }, { - .drmFormat = DRM_FORMAT_XBGR16161616, -#ifndef GLES2 - .glFormat = GL_RGBA16UI, -#else - .glFormat = GL_RGBA16_EXT, -#endif + .drmFormat = DRM_FORMAT_XBGR16161616, + .glFormat = GL_RGBA16UI, .glType = GL_UNSIGNED_SHORT, .withAlpha = false, .alphaStripped = DRM_FORMAT_XBGR16161616, .bytesPerBlock = 8, }, { - .drmFormat = DRM_FORMAT_ABGR16161616, -#ifndef GLES2 - .glFormat = GL_RGBA16UI, -#else - .glFormat = GL_RGBA16_EXT, -#endif + .drmFormat = DRM_FORMAT_ABGR16161616, + .glFormat = GL_RGBA16UI, .glType = GL_UNSIGNED_SHORT, .withAlpha = true, .alphaStripped = DRM_FORMAT_XBGR16161616, @@ -290,12 +250,7 @@ uint32_t NFormatUtils::drmFormatToGL(DRMFormat drm) { case DRM_FORMAT_XRGB8888: case DRM_FORMAT_XBGR8888: return GL_RGBA; // doesn't matter, opengl is gucci in this case. case DRM_FORMAT_XRGB2101010: - case DRM_FORMAT_XBGR2101010: -#ifdef GLES2 - return GL_RGB10_A2_EXT; -#else - return GL_RGB10_A2; -#endif + case DRM_FORMAT_XBGR2101010: return GL_RGB10_A2; default: return GL_RGBA; } UNREACHABLE(); @@ -303,13 +258,7 @@ uint32_t NFormatUtils::drmFormatToGL(DRMFormat drm) { } uint32_t NFormatUtils::glFormatToType(uint32_t gl) { - return gl != GL_RGBA ? -#ifdef GLES2 - GL_UNSIGNED_INT_2_10_10_10_REV_EXT : -#else - GL_UNSIGNED_INT_2_10_10_10_REV : -#endif - GL_UNSIGNED_BYTE; + return gl != GL_RGBA ? GL_UNSIGNED_INT_2_10_10_10_REV : GL_UNSIGNED_BYTE; } std::string NFormatUtils::drmFormatName(DRMFormat drm) { diff --git a/src/hyprerror/HyprError.cpp b/src/hyprerror/HyprError.cpp index d9f50db3..614fdd2e 100644 --- a/src/hyprerror/HyprError.cpp +++ b/src/hyprerror/HyprError.cpp @@ -146,11 +146,8 @@ void CHyprError::createQueued() { glBindTexture(GL_TEXTURE_2D, m_texture->m_texID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - -#ifndef GLES2 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_BLUE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED); -#endif glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, PMONITOR->m_pixelSize.x, PMONITOR->m_pixelSize.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, DATA); diff --git a/src/includes.hpp b/src/includes.hpp index c00fec97..e33e4e3f 100644 --- a/src/includes.hpp +++ b/src/includes.hpp @@ -17,15 +17,9 @@ #include #include -#ifdef LEGACY_RENDERER -#include -#include -#define GLES2 -#else #define GLES32 #include #include -#endif #ifdef NO_XWAYLAND #define XWAYLAND false diff --git a/src/protocols/Screencopy.cpp b/src/protocols/Screencopy.cpp index e0ef6783..1afa477f 100644 --- a/src/protocols/Screencopy.cpp +++ b/src/protocols/Screencopy.cpp @@ -264,11 +264,7 @@ bool CScreencopyFrame::copyShm() { g_pHyprOpenGL->renderTexture(g_pHyprOpenGL->m_screencopyDeniedTexture, texbox, 1); } -#ifndef GLES2 glBindFramebuffer(GL_READ_FRAMEBUFFER, fb.getFBID()); -#else - glBindFramebuffer(GL_FRAMEBUFFER, fb.getFBID()); -#endif const auto PFORMAT = NFormatUtils::getPixelFormatFromDRM(shm.format); if (!PFORMAT) { @@ -304,11 +300,7 @@ bool CScreencopyFrame::copyShm() { g_pHyprOpenGL->m_renderData.pMonitor.reset(); -#ifndef GLES2 glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); -#else - glBindFramebuffer(GL_FRAMEBUFFER, 0); -#endif LOGM(TRACE, "Copied frame via shm"); diff --git a/src/protocols/ToplevelExport.cpp b/src/protocols/ToplevelExport.cpp index 498bcba9..e50f1fce 100644 --- a/src/protocols/ToplevelExport.cpp +++ b/src/protocols/ToplevelExport.cpp @@ -281,10 +281,7 @@ bool CToplevelExportFrame::copyShm(const Time::steady_tp& now) { g_pHyprOpenGL->m_renderData.pMonitor = PMONITOR; outFB.bind(); -#ifndef GLES2 glBindFramebuffer(GL_READ_FRAMEBUFFER, outFB.getFBID()); -#endif - glPixelStorei(GL_PACK_ALIGNMENT, 1); auto glFormat = PFORMAT->flipRB ? GL_BGRA_EXT : GL_RGBA; @@ -318,10 +315,7 @@ bool CToplevelExportFrame::copyShm(const Time::steady_tp& now) { } outFB.unbind(); - -#ifndef GLES2 glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); -#endif return true; } diff --git a/src/render/Framebuffer.cpp b/src/render/Framebuffer.cpp index ab5a14a3..b3681c95 100644 --- a/src/render/Framebuffer.cpp +++ b/src/render/Framebuffer.cpp @@ -40,14 +40,11 @@ bool CFramebuffer::alloc(int w, int h, uint32_t drmFormat) { glBindFramebuffer(GL_FRAMEBUFFER, m_fb); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_tex->m_texID, 0); -// TODO: Allow this with gles2 -#ifndef GLES2 if (m_stencilTex) { glBindTexture(GL_TEXTURE_2D, m_stencilTex->m_texID); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, w, h, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, nullptr); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, m_stencilTex->m_texID, 0); } -#endif auto status = glCheckFramebufferStatus(GL_FRAMEBUFFER); RASSERT((status == GL_FRAMEBUFFER_COMPLETE), "Framebuffer incomplete, couldn't create! (FB status: {}, GL Error: 0x{:x})", status, (int)glGetError()); @@ -64,8 +61,6 @@ bool CFramebuffer::alloc(int w, int h, uint32_t drmFormat) { } void CFramebuffer::addStencil(SP tex) { - // TODO: Allow this with gles2 -#ifndef GLES2 m_stencilTex = tex; glBindTexture(GL_TEXTURE_2D, m_stencilTex->m_texID); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, m_size.x, m_size.y, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, nullptr); @@ -79,15 +74,10 @@ void CFramebuffer::addStencil(SP tex) { glBindTexture(GL_TEXTURE_2D, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0); -#endif } void CFramebuffer::bind() { -#ifndef GLES2 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fb); -#else - glBindFramebuffer(GL_FRAMEBUFFER, m_iFb); -#endif if (g_pHyprOpenGL) glViewport(0, 0, g_pHyprOpenGL->m_renderData.pMonitor->m_pixelSize.x, g_pHyprOpenGL->m_renderData.pMonitor->m_pixelSize.y); @@ -96,11 +86,7 @@ void CFramebuffer::bind() { } void CFramebuffer::unbind() { -#ifndef GLES2 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); -#else - glBindFramebuffer(GL_FRAMEBUFFER, 0); -#endif } void CFramebuffer::release() { diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index c4223085..20862a7a 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -162,24 +162,14 @@ void CHyprOpenGLImpl::initEGL(bool gbm) { auto attrsNoVer = attrs; -#ifndef GLES2 attrs.push_back(EGL_CONTEXT_MAJOR_VERSION); attrs.push_back(3); attrs.push_back(EGL_CONTEXT_MINOR_VERSION); attrs.push_back(2); -#else - attrs.push_back(EGL_CONTEXT_CLIENT_VERSION); - attrs.push_back(2); - m_eglContextVersion = EGL_CONTEXT_GLES_2_0; -#endif - attrs.push_back(EGL_NONE); m_eglContext = eglCreateContext(m_eglDisplay, EGL_NO_CONFIG_KHR, EGL_NO_CONTEXT, attrs.data()); if (m_eglContext == EGL_NO_CONTEXT) { -#ifdef GLES2 - RASSERT(false, "EGL: failed to create a context with GLES2.0"); -#endif Debug::log(WARN, "EGL: Failed to create a context with GLES3.2, retrying 3.0"); attrs = attrsNoVer; @@ -362,10 +352,6 @@ CHyprOpenGLImpl::CHyprOpenGLImpl() : m_drmFD(g_pCompositor->m_drmFD) { TRACY_GPU_CONTEXT; -#ifdef GLES2 - Debug::log(WARN, "!RENDERER: Using the legacy GLES2 renderer!"); -#endif - initDRMFormats(); initAssets(); @@ -669,7 +655,6 @@ GLuint CHyprOpenGLImpl::compileShader(const GLuint& type, std::string src, bool void CHyprOpenGLImpl::beginSimple(PHLMONITOR pMonitor, const CRegion& damage, SP rb, CFramebuffer* fb) { m_renderData.pMonitor = pMonitor; -#ifndef GLES2 const GLenum RESETSTATUS = glGetGraphicsResetStatus(); if (RESETSTATUS != GL_NO_ERROR) { std::string errStr = ""; @@ -682,7 +667,6 @@ void CHyprOpenGLImpl::beginSimple(PHLMONITOR pMonitor, const CRegion& damage, SP RASSERT(false, "Aborting, glGetGraphicsResetStatus returned {}. Cannot continue until proper GPU reset handling is implemented.", errStr); return; } -#endif TRACY_GPU_ZONE("RenderBeginSimple"); @@ -721,7 +705,6 @@ void CHyprOpenGLImpl::beginSimple(PHLMONITOR pMonitor, const CRegion& damage, SP void CHyprOpenGLImpl::begin(PHLMONITOR pMonitor, const CRegion& damage_, CFramebuffer* fb, std::optional finalDamage) { m_renderData.pMonitor = pMonitor; -#ifndef GLES2 const GLenum RESETSTATUS = glGetGraphicsResetStatus(); if (RESETSTATUS != GL_NO_ERROR) { std::string errStr = ""; @@ -734,7 +717,6 @@ void CHyprOpenGLImpl::begin(PHLMONITOR pMonitor, const CRegion& damage_, CFrameb RASSERT(false, "Aborting, glGetGraphicsResetStatus returned {}. Cannot continue until proper GPU reset handling is implemented.", errStr); return; } -#endif TRACY_GPU_ZONE("RenderBegin"); @@ -860,11 +842,7 @@ void CHyprOpenGLImpl::end() { // check for gl errors const GLenum ERR = glGetError(); -#ifdef GLES2 - if (ERR == GL_CONTEXT_LOST_KHR) /* We don't have infra to recover from this */ -#else if (ERR == GL_CONTEXT_LOST) /* We don't have infra to recover from this */ -#endif RASSERT(false, "glGetError at Opengl::end() returned GL_CONTEXT_LOST. Cannot continue until proper GPU reset handling is implemented."); } @@ -946,9 +924,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->TEXVERTSRC320 = processShader("tex320.vert", includes); GLuint prog; -#ifdef GLES2 - m_cmSupported = false; -#else + if (!*PCM) m_cmSupported = false; else { @@ -983,7 +959,6 @@ bool CHyprOpenGLImpl::initShaders() { "WARNING: CM Shader failed compiling, color management will not work. It's likely because your GPU is an old piece of garbage, don't file bug reports " "about this!"); } -#endif const auto FRAGSHADOW = processShader(m_cmSupported ? "shadow.frag" : "shadow_legacy.frag", includes); const auto FRAGBORDER1 = processShader(m_cmSupported ? "border.frag" : "border_legacy.frag", includes); @@ -1392,13 +1367,7 @@ void CHyprOpenGLImpl::renderRectWithDamage(const CBox& box, const CHyprColor& co Mat3x3 glMatrix = m_renderData.projection.copy().multiply(matrix); useProgram(m_shaders->m_shQUAD.program); - -#ifndef GLES2 glUniformMatrix3fv(m_shaders->m_shQUAD.proj, 1, GL_TRUE, glMatrix.getMatrix().data()); -#else - glMatrix.transpose(); - glUniformMatrix3fv(m_renderData.pCurrentMonData->m_shQUAD.proj, 1, GL_FALSE, glMatrix.getMatrix().data()); -#endif // premultiply the color as well as we don't work with straight alpha glUniform4f(m_shaders->m_shQUAD.color, col.r * col.a, col.g * col.a, col.b * col.a, col.a); @@ -1602,12 +1571,7 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(SP tex, const CB passCMUniforms(*shader, imageDescription); } -#ifndef GLES2 glUniformMatrix3fv(shader->proj, 1, GL_TRUE, glMatrix.getMatrix().data()); -#else - glMatrix.transpose(); - glUniformMatrix3fv(shader->proj, 1, GL_FALSE, glMatrix.getMatrix().data()); -#endif glUniform1i(shader->tex, 0); if ((usingFinalShader && *PDT == 0) || CRASHING) { @@ -1735,15 +1699,8 @@ void CHyprOpenGLImpl::renderTexturePrimitive(SP tex, const CBox& box) glBindTexture(tex->m_target, tex->m_texID); useProgram(shader->program); - -#ifndef GLES2 glUniformMatrix3fv(shader->proj, 1, GL_TRUE, glMatrix.getMatrix().data()); -#else - glMatrix.transpose(); - glUniformMatrix3fv(shader->proj, 1, GL_FALSE, glMatrix.getMatrix().data()); -#endif glUniform1i(shader->tex, 0); - glBindVertexArray(shader->shaderVao); for (auto const& RECT : m_renderData.damage.getRects()) { @@ -1777,13 +1734,7 @@ void CHyprOpenGLImpl::renderTextureMatte(SP tex, const CBox& box, CFra SShader* shader = &m_shaders->m_shMATTE; useProgram(shader->program); - -#ifndef GLES2 glUniformMatrix3fv(shader->proj, 1, GL_TRUE, glMatrix.getMatrix().data()); -#else - glMatrix.transpose(); - glUniformMatrix3fv(shader->proj, 1, GL_FALSE, glMatrix.getMatrix().data()); -#endif glUniform1i(shader->tex, 0); glUniform1i(shader->alphaMatte, 1); @@ -1886,12 +1837,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi 1.0f); } -#ifndef GLES2 glUniformMatrix3fv(m_shaders->m_shBLURPREPARE.proj, 1, GL_TRUE, glMatrix.getMatrix().data()); -#else - glMatrix.transpose(); - glUniformMatrix3fv(m_shaders->m_shBLURPREPARE.proj, 1, GL_FALSE, glMatrix.getMatrix().data()); -#endif glUniform1f(m_shaders->m_shBLURPREPARE.contrast, *PBLURCONTRAST); glUniform1f(m_shaders->m_shBLURPREPARE.brightness, *PBLURBRIGHTNESS); glUniform1i(m_shaders->m_shBLURPREPARE.tex, 0); @@ -1927,12 +1873,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi useProgram(pShader->program); // prep two shaders -#ifndef GLES2 glUniformMatrix3fv(pShader->proj, 1, GL_TRUE, glMatrix.getMatrix().data()); -#else - glMatrix.transpose(); - glUniformMatrix3fv(pShader->proj, 1, GL_FALSE, glMatrix.getMatrix().data()); -#endif glUniform1f(pShader->radius, *PBLURSIZE * a); // this makes the blursize change with a if (pShader == &m_shaders->m_shBLUR1) { glUniform2f(m_shaders->m_shBLUR1.halfpixel, 0.5f / (m_renderData.pMonitor->m_pixelSize.x / 2.f), 0.5f / (m_renderData.pMonitor->m_pixelSize.y / 2.f)); @@ -1997,13 +1938,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi glTexParameteri(currentTex->m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); useProgram(m_shaders->m_shBLURFINISH.program); - -#ifndef GLES2 glUniformMatrix3fv(m_shaders->m_shBLURFINISH.proj, 1, GL_TRUE, glMatrix.getMatrix().data()); -#else - glMatrix.transpose(); - glUniformMatrix3fv(m_shaders->m_shBLURFINISH.proj, 1, GL_FALSE, glMatrix.getMatrix().data()); -#endif glUniform1f(m_shaders->m_shBLURFINISH.noise, *PBLURNOISE); glUniform1f(m_shaders->m_shBLURFINISH.brightness, *PBLURBRIGHTNESS); @@ -2341,13 +2276,7 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr if (!skipCM) passCMUniforms(m_shaders->m_shBORDER1, SImageDescription{}); -#ifndef GLES2 glUniformMatrix3fv(m_shaders->m_shBORDER1.proj, 1, GL_TRUE, glMatrix.getMatrix().data()); -#else - glMatrix.transpose(); - glUniformMatrix3fv(m_shaders->m_shBORDER1.proj, 1, GL_FALSE, glMatrix.getMatrix().data()); -#endif - glUniform4fv(m_shaders->m_shBORDER1.gradient, grad.m_colorsOkLabA.size() / 4, (float*)grad.m_colorsOkLabA.data()); glUniform1i(m_shaders->m_shBORDER1.gradientLength, grad.m_colorsOkLabA.size() / 4); glUniform1f(m_shaders->m_shBORDER1.angle, (int)(grad.m_angle / (PI / 180.0)) % 360 * (PI / 180.0)); @@ -2428,14 +2357,7 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr blend(true); useProgram(m_shaders->m_shBORDER1.program); - -#ifndef GLES2 glUniformMatrix3fv(m_shaders->m_shBORDER1.proj, 1, GL_TRUE, glMatrix.getMatrix().data()); -#else - glMatrix.transpose(); - glUniformMatrix3fv(m_shaders->m_shBORDER1.proj, 1, GL_FALSE, glMatrix.getMatrix().data()); -#endif - glUniform4fv(m_shaders->m_shBORDER1.gradient, grad1.m_colorsOkLabA.size() / 4, (float*)grad1.m_colorsOkLabA.data()); glUniform1i(m_shaders->m_shBORDER1.gradientLength, grad1.m_colorsOkLabA.size() / 4); glUniform1f(m_shaders->m_shBORDER1.angle, (int)(grad1.m_angle / (PI / 180.0)) % 360 * (PI / 180.0)); @@ -2515,12 +2437,7 @@ void CHyprOpenGLImpl::renderRoundedShadow(const CBox& box, int round, float roun if (!skipCM) passCMUniforms(m_shaders->m_shSHADOW, SImageDescription{}); -#ifndef GLES2 glUniformMatrix3fv(m_shaders->m_shSHADOW.proj, 1, GL_TRUE, glMatrix.getMatrix().data()); -#else - glMatrix.transpose(); - glUniformMatrix3fv(m_shaders->m_shSHADOW.proj, 1, GL_FALSE, glMatrix.getMatrix().data()); -#endif glUniform4f(m_shaders->m_shSHADOW.color, col.r, col.g, col.b, col.a * a); const auto TOPLEFT = Vector2D(range + round, range + round); @@ -2675,26 +2592,20 @@ SP CHyprOpenGLImpl::loadAsset(const std::string& filename) { tex->allocate(); tex->m_size = {cairo_image_surface_get_width(CAIROSURFACE), cairo_image_surface_get_height(CAIROSURFACE)}; - const GLint glIFormat = CAIROFORMAT == CAIRO_FORMAT_RGB96F ? -#ifdef GLES2 - GL_RGB32F_EXT : -#else - GL_RGB32F : -#endif - GL_RGBA; - const GLint glFormat = CAIROFORMAT == CAIRO_FORMAT_RGB96F ? GL_RGB : GL_RGBA; - const GLint glType = CAIROFORMAT == CAIRO_FORMAT_RGB96F ? GL_FLOAT : GL_UNSIGNED_BYTE; + const GLint glIFormat = CAIROFORMAT == CAIRO_FORMAT_RGB96F ? GL_RGB32F : GL_RGBA; + const GLint glFormat = CAIROFORMAT == CAIRO_FORMAT_RGB96F ? GL_RGB : GL_RGBA; + const GLint glType = CAIROFORMAT == CAIRO_FORMAT_RGB96F ? GL_FLOAT : GL_UNSIGNED_BYTE; const auto DATA = cairo_image_surface_get_data(CAIROSURFACE); glBindTexture(GL_TEXTURE_2D, tex->m_texID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -#ifndef GLES2 + if (CAIROFORMAT != CAIRO_FORMAT_RGB96F) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_BLUE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED); } -#endif + glTexImage2D(GL_TEXTURE_2D, 0, glIFormat, tex->m_size.x, tex->m_size.y, 0, glFormat, glType, DATA); cairo_surface_destroy(CAIROSURFACE); @@ -2772,10 +2683,8 @@ SP CHyprOpenGLImpl::renderText(const std::string& text, CHyprColor col glBindTexture(GL_TEXTURE_2D, tex->m_texID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -#ifndef GLES2 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_BLUE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED); -#endif glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex->m_size.x, tex->m_size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, DATA); cairo_destroy(CAIRO); @@ -2815,10 +2724,8 @@ void CHyprOpenGLImpl::initMissingAssetTexture() { glBindTexture(GL_TEXTURE_2D, tex->m_texID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -#ifndef GLES2 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_BLUE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED); -#endif glTexImage2D(GL_TEXTURE_2D, 0, glFormat, tex->m_size.x, tex->m_size.y, 0, glFormat, glType, DATA); cairo_surface_destroy(CAIROSURFACE); @@ -2928,10 +2835,8 @@ void CHyprOpenGLImpl::createBGTextureForMonitor(PHLMONITOR pMonitor) { glBindTexture(GL_TEXTURE_2D, tex->m_texID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -#ifndef GLES2 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_BLUE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED); -#endif glTexImage2D(GL_TEXTURE_2D, 0, glFormat, tex->m_size.x, tex->m_size.y, 0, glFormat, glType, DATA); cairo_surface_destroy(CAIROSURFACE); diff --git a/src/render/Texture.cpp b/src/render/Texture.cpp index 74770cb9..52b79e8d 100644 --- a/src/render/Texture.cpp +++ b/src/render/Texture.cpp @@ -72,12 +72,12 @@ void CTexture::createFromShm(uint32_t drmFormat, uint8_t* pixels, uint32_t strid GLCALL(glBindTexture(GL_TEXTURE_2D, m_texID)); GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); -#ifndef GLES2 + if (format->flipRB) { GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_BLUE)); GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED)); } -#endif + GLCALL(glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT, stride / format->bytesPerBlock)); GLCALL(glTexImage2D(GL_TEXTURE_2D, 0, format->glInternalFormat ? format->glInternalFormat : format->glFormat, size_.x, size_.y, 0, format->glFormat, format->glType, pixels)); GLCALL(glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT, 0)); @@ -120,12 +120,10 @@ void CTexture::update(uint32_t drmFormat, uint8_t* pixels, uint32_t stride, cons auto rects = damage.copy().intersect(CBox{{}, m_size}).getRects(); -#ifndef GLES2 if (format->flipRB) { GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_BLUE)); GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED)); } -#endif for (auto const& rect : rects) { GLCALL(glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT, stride / format->bytesPerBlock)); diff --git a/src/render/decorations/CHyprGroupBarDecoration.cpp b/src/render/decorations/CHyprGroupBarDecoration.cpp index ade4d372..84060e0d 100644 --- a/src/render/decorations/CHyprGroupBarDecoration.cpp +++ b/src/render/decorations/CHyprGroupBarDecoration.cpp @@ -332,11 +332,8 @@ static void renderGradientTo(SP tex, CGradientValueData* grad) { glBindTexture(GL_TEXTURE_2D, tex->m_texID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - -#ifndef GLES2 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_BLUE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED); -#endif glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferSize.x, bufferSize.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, DATA); From dfb841c303263208c2f8ac7a55fbdf4668594fb7 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Thu, 15 May 2025 02:16:03 -0700 Subject: [PATCH 015/901] desktop: prevent layers from dismissing their own seat grabs on map (#10417) --- src/desktop/LayerSurface.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/desktop/LayerSurface.cpp b/src/desktop/LayerSurface.cpp index f913b658..048a3641 100644 --- a/src/desktop/LayerSurface.cpp +++ b/src/desktop/LayerSurface.cpp @@ -167,7 +167,9 @@ void CLayerSurface::onMap() { if (GRABSFOCUS) { // TODO: use the new superb really very cool grab - g_pSeatManager->setGrab(nullptr); + if (g_pSeatManager->m_seatGrab && !g_pSeatManager->m_seatGrab->accepts(m_surface->resource())) + g_pSeatManager->setGrab(nullptr); + g_pInputManager->releaseAllMouseButtons(); g_pCompositor->focusSurface(m_surface->resource()); From a5c9b3e49047b4f03f79c5146d8925363eab3072 Mon Sep 17 00:00:00 2001 From: Zach DeCook Date: Thu, 15 May 2025 05:31:44 -0400 Subject: [PATCH 016/901] core: Include cstring whenever strncpy is used (#10404) Fixes ppc64le build in alpine --- hyprpm/src/core/HyprlandSocket.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/hyprpm/src/core/HyprlandSocket.cpp b/hyprpm/src/core/HyprlandSocket.cpp index 4d86192c..50b3558c 100644 --- a/hyprpm/src/core/HyprlandSocket.cpp +++ b/hyprpm/src/core/HyprlandSocket.cpp @@ -5,6 +5,7 @@ #include #include #include +#include static int getUID() { const auto UID = getuid(); From b0cc49218d37e6e791725b40fe5da97832daa9c8 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Fri, 16 May 2025 14:38:45 -0700 Subject: [PATCH 017/901] protocols: simulate mouse movement after activating a toplevel (#10429) --- src/protocols/ForeignToplevelWlr.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/protocols/ForeignToplevelWlr.cpp b/src/protocols/ForeignToplevelWlr.cpp index 8807c225..dccf83b6 100644 --- a/src/protocols/ForeignToplevelWlr.cpp +++ b/src/protocols/ForeignToplevelWlr.cpp @@ -1,6 +1,7 @@ #include "ForeignToplevelWlr.hpp" #include #include "../Compositor.hpp" +#include "managers/input/InputManager.hpp" #include "protocols/core/Output.hpp" #include "render/Renderer.hpp" #include "../managers/HookSystemManager.hpp" @@ -24,6 +25,7 @@ CForeignToplevelHandleWlr::CForeignToplevelHandleWlr(SPactivate(true); + g_pInputManager->simulateMouseMovement(); }); m_resource->setSetFullscreen([this](CZwlrForeignToplevelHandleV1* p, wl_resource* output) { From 2946009006bd8a988ff8a51b83528f6e1d8f0e98 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Fri, 16 May 2025 14:39:28 -0700 Subject: [PATCH 018/901] input: do not send mouse events when outside of a surface (#10416) --- src/managers/input/InputManager.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index cd603ca5..cc46aaec 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -201,6 +201,7 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus, bool mouse) { Vector2D surfacePos = Vector2D(-1337, -1337); PHLWINDOW pFoundWindow; PHLLS pFoundLayerSurface; + bool sendExternalMouseEvents = false; EMIT_HOOK_EVENT_CANCELLABLE("mouseMove", MOUSECOORDSFLOORED); @@ -297,7 +298,8 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus, bool mouse) { // and we're not dnd-ing, don't refocus. Keep focus on last surface. if (!PROTO::data->dndActive() && !m_currentlyHeldButtons.empty() && g_pCompositor->m_lastFocus && g_pCompositor->m_lastFocus->m_mapped && g_pSeatManager->m_state.pointerFocus && !m_hardInput) { - foundSurface = g_pSeatManager->m_state.pointerFocus.lock(); + foundSurface = g_pSeatManager->m_state.pointerFocus.lock(); + sendExternalMouseEvents = true; // IME popups aren't desktop-like elements // TODO: make them. @@ -598,6 +600,13 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus, bool mouse) { m_lastFocusOnLS = true; } + // Don't send events outside of the surface unless holding a mouse button, + // except for X11 surfaces which are always sent events in case of potential breakage. + if (!sendExternalMouseEvents && foundSurface && (!pFoundWindow || !pFoundWindow->m_isX11)) { + if (!foundSurface->at(surfaceLocal, true).first) + foundSurface = nullptr; + } + g_pSeatManager->setPointerFocus(foundSurface, surfaceLocal); g_pSeatManager->sendPointerMotion(time, surfaceLocal); } From 2aa21625bd9036a918c220b89ff94d003fb6cbe7 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Sat, 17 May 2025 04:06:48 -0700 Subject: [PATCH 019/901] input: ensure seat grabs from exclusive layers can be dismissed (#10418) --- src/managers/input/InputManager.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index cc46aaec..69c70af8 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -607,6 +607,12 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus, bool mouse) { foundSurface = nullptr; } + // Releases any seat grabs after a click outside of them not handled by an earlier case (notably exclusive layers). + if ((m_hardInput || refocus) && g_pSeatManager->m_seatGrab && !foundSurface) { + g_pSeatManager->setGrab(nullptr); + return; // setGrab will refocus + } + g_pSeatManager->setPointerFocus(foundSurface, surfaceLocal); g_pSeatManager->sendPointerMotion(time, surfaceLocal); } From 18377d221d8c440c6ec3a1d2313947d81c4741e1 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Sat, 17 May 2025 11:08:13 +0000 Subject: [PATCH 020/901] [gha] Nix: update inputs --- flake.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index d82b7df9..1be8e6d4 100644 --- a/flake.lock +++ b/flake.lock @@ -276,11 +276,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1746461020, - "narHash": "sha256-7+pG1I9jvxNlmln4YgnlW4o+w0TZX24k688mibiFDUE=", + "lastModified": 1747327360, + "narHash": "sha256-LSmTbiq/nqZR9B2t4MRnWG7cb0KVNU70dB7RT4+wYK4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3730d8a308f94996a9ba7c7138ede69c1b9ac4ae", + "rev": "e06158e58f3adee28b139e9c2bcfcc41f8625b46", "type": "github" }, "original": { @@ -299,11 +299,11 @@ ] }, "locked": { - "lastModified": 1746537231, - "narHash": "sha256-Wb2xeSyOsCoTCTj7LOoD6cdKLEROyFAArnYoS+noCWo=", + "lastModified": 1747372754, + "narHash": "sha256-2Y53NGIX2vxfie1rOW0Qb86vjRZ7ngizoo+bnXU9D9k=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "fa466640195d38ec97cf0493d6d6882bc4d14969", + "rev": "80479b6ec16fefd9c1db3ea13aeb038c60530f46", "type": "github" }, "original": { From dfa483621609cc443daab40e7d8b71786d8d21c9 Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Sat, 17 May 2025 17:08:42 +0100 Subject: [PATCH 021/901] hyprpm: fix execute permission bit on installed dirs (#10435) --- hyprpm/src/core/PluginManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hyprpm/src/core/PluginManager.cpp b/hyprpm/src/core/PluginManager.cpp index 8686910f..76f20110 100644 --- a/hyprpm/src/core/PluginManager.cpp +++ b/hyprpm/src/core/PluginManager.cpp @@ -566,7 +566,7 @@ bool CPluginManager::updateHeaders(bool force) { ret = execAndGet(cmd); - cmd = std::format("make -C '{}' installheaders && chmod -R 644 '{}' && find '{}' -type d -exec chmod o+x {{}} \\;", WORKINGDIR, DataState::getHeadersPath(), + cmd = std::format("make -C '{}' installheaders && chmod -R 644 '{}' && find '{}' -type d -exec chmod a+x {{}} \\;", WORKINGDIR, DataState::getHeadersPath(), DataState::getHeadersPath()); if (m_bVerbose) From bb9aa79b216b952c692c2443c50b0a6d7e5b108d Mon Sep 17 00:00:00 2001 From: Vaxry Date: Sat, 17 May 2025 18:10:28 +0200 Subject: [PATCH 022/901] hyprpm: reject remove without a param ref #10458 --- hyprpm/src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hyprpm/src/main.cpp b/hyprpm/src/main.cpp index ca9c0fdb..b8bf8bca 100644 --- a/hyprpm/src/main.cpp +++ b/hyprpm/src/main.cpp @@ -106,7 +106,7 @@ int main(int argc, char** argv, char** envp) { return g_pPluginManager->addNewPluginRepo(command[1], rev) ? 0 : 1; } else if (command[0] == "remove") { - if (ARGS.size() < 2) { + if (command.size() < 2) { std::println(stderr, "{}", failureString("Not enough args for remove.")); return 1; } From bb5cd5b2ddcb2dbe58613aa41fa2062208208339 Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Sat, 17 May 2025 18:03:35 +0100 Subject: [PATCH 023/901] screencopy: store a fb before permission popup if the permission is pending (#10455) stops rendering the permission popup on stuff like grim when it asks --- src/protocols/Screencopy.cpp | 79 ++++++++++++++++++++++++------------ src/protocols/Screencopy.hpp | 14 +++++-- 2 files changed, 64 insertions(+), 29 deletions(-) diff --git a/src/protocols/Screencopy.cpp b/src/protocols/Screencopy.cpp index 1afa477f..5fa7c84e 100644 --- a/src/protocols/Screencopy.cpp +++ b/src/protocols/Screencopy.cpp @@ -187,9 +187,43 @@ void CScreencopyFrame::share() { callback(copyShm()); } +void CScreencopyFrame::renderMon() { + auto TEXTURE = makeShared(m_monitor->m_output->state->state().buffer); + + CRegion fakeDamage = {0, 0, INT16_MAX, INT16_MAX}; + + CBox monbox = CBox{0, 0, m_monitor->m_pixelSize.x, m_monitor->m_pixelSize.y} + .translate({-m_box.x, -m_box.y}) // vvvv kinda ass-backwards but that's how I designed the renderer... sigh. + .transform(wlTransformToHyprutils(invertTransform(m_monitor->m_transform)), m_monitor->m_pixelSize.x, m_monitor->m_pixelSize.y); + g_pHyprOpenGL->setMonitorTransformEnabled(true); + g_pHyprOpenGL->setRenderModifEnabled(false); + g_pHyprOpenGL->renderTexture(TEXTURE, monbox, 1); + g_pHyprOpenGL->setRenderModifEnabled(true); + g_pHyprOpenGL->setMonitorTransformEnabled(false); + if (m_overlayCursor) + g_pPointerManager->renderSoftwareCursorsFor(m_monitor.lock(), Time::steadyNow(), fakeDamage, + g_pInputManager->getMouseCoordsInternal() - m_monitor->m_position - m_box.pos(), true); +} + +void CScreencopyFrame::storeTempFB() { + g_pHyprRenderer->makeEGLCurrent(); + + m_tempFb.alloc(m_box.w, m_box.h); + + CRegion fakeDamage = {0, 0, INT16_MAX, INT16_MAX}; + + if (!g_pHyprRenderer->beginRender(m_monitor.lock(), fakeDamage, RENDER_MODE_FULL_FAKE, nullptr, &m_tempFb, true)) { + LOGM(ERR, "Can't copy: failed to begin rendering to temp fb"); + return; + } + + renderMon(); + + g_pHyprRenderer->endRender(); +} + void CScreencopyFrame::copyDmabuf(std::function callback) { - const auto PERM = g_pDynamicPermissionManager->clientPermissionMode(m_resource->client(), PERMISSION_TYPE_SCREENCOPY); - auto TEXTURE = makeShared(m_monitor->m_output->state->state().buffer); + const auto PERM = g_pDynamicPermissionManager->clientPermissionMode(m_resource->client(), PERMISSION_TYPE_SCREENCOPY); CRegion fakeDamage = {0, 0, INT16_MAX, INT16_MAX}; @@ -200,17 +234,12 @@ void CScreencopyFrame::copyDmabuf(std::function callback) { } if (PERM == PERMISSION_RULE_ALLOW_MODE_ALLOW) { - CBox monbox = CBox{0, 0, m_monitor->m_pixelSize.x, m_monitor->m_pixelSize.y} - .translate({-m_box.x, -m_box.y}) // vvvv kinda ass-backwards but that's how I designed the renderer... sigh. - .transform(wlTransformToHyprutils(invertTransform(m_monitor->m_transform)), m_monitor->m_pixelSize.x, m_monitor->m_pixelSize.y); - g_pHyprOpenGL->setMonitorTransformEnabled(true); - g_pHyprOpenGL->setRenderModifEnabled(false); - g_pHyprOpenGL->renderTexture(TEXTURE, monbox, 1); - g_pHyprOpenGL->setRenderModifEnabled(true); - g_pHyprOpenGL->setMonitorTransformEnabled(false); - if (m_overlayCursor) - g_pPointerManager->renderSoftwareCursorsFor(m_monitor.lock(), Time::steadyNow(), fakeDamage, - g_pInputManager->getMouseCoordsInternal() - m_monitor->m_position - m_box.pos(), true); + if (m_tempFb.isAllocated()) { + CBox texbox = {{}, m_box.size()}; + g_pHyprOpenGL->renderTexture(m_tempFb.getTexture(), texbox, 1); + m_tempFb.release(); + } else + renderMon(); } else if (PERM == PERMISSION_RULE_ALLOW_MODE_PENDING) g_pHyprOpenGL->clear(Colors::BLACK); else { @@ -228,8 +257,7 @@ void CScreencopyFrame::copyDmabuf(std::function callback) { } bool CScreencopyFrame::copyShm() { - const auto PERM = g_pDynamicPermissionManager->clientPermissionMode(m_resource->client(), PERMISSION_TYPE_SCREENCOPY); - auto TEXTURE = makeShared(m_monitor->m_output->state->state().buffer); + const auto PERM = g_pDynamicPermissionManager->clientPermissionMode(m_resource->client(), PERMISSION_TYPE_SCREENCOPY); auto shm = m_buffer->shm(); auto [pixelData, fmt, bufLen] = m_buffer->beginDataPtr(0); // no need for end, cuz it's shm @@ -247,15 +275,12 @@ bool CScreencopyFrame::copyShm() { } if (PERM == PERMISSION_RULE_ALLOW_MODE_ALLOW) { - CBox monbox = CBox{0, 0, m_monitor->m_transformedSize.x, m_monitor->m_transformedSize.y}.translate({-m_box.x, -m_box.y}); - g_pHyprOpenGL->setMonitorTransformEnabled(true); - g_pHyprOpenGL->setRenderModifEnabled(false); - g_pHyprOpenGL->renderTexture(TEXTURE, monbox, 1); - g_pHyprOpenGL->setRenderModifEnabled(true); - g_pHyprOpenGL->setMonitorTransformEnabled(false); - if (m_overlayCursor) - g_pPointerManager->renderSoftwareCursorsFor(m_monitor.lock(), Time::steadyNow(), fakeDamage, - g_pInputManager->getMouseCoordsInternal() - m_monitor->m_position - m_box.pos(), true); + if (m_tempFb.isAllocated()) { + CBox texbox = {{}, m_box.size()}; + g_pHyprOpenGL->renderTexture(m_tempFb.getTexture(), texbox, 1); + m_tempFb.release(); + } else + renderMon(); } else if (PERM == PERMISSION_RULE_ALLOW_MODE_PENDING) g_pHyprOpenGL->clear(Colors::BLACK); else { @@ -420,8 +445,12 @@ void CScreencopyProtocol::onOutputCommit(PHLMONITOR pMonitor) { // check permissions const auto PERM = g_pDynamicPermissionManager->clientPermissionMode(f->m_resource->client(), PERMISSION_TYPE_SCREENCOPY); - if (PERM == PERMISSION_RULE_ALLOW_MODE_PENDING) + if (PERM == PERMISSION_RULE_ALLOW_MODE_PENDING) { + if (!f->m_tempFb.isAllocated()) + f->storeTempFB(); // make a snapshot before the popup + continue; // pending an answer, don't do anything yet. + } // otherwise share. If it's denied, it will be black. diff --git a/src/protocols/Screencopy.hpp b/src/protocols/Screencopy.hpp index ead8b2ed..665fede1 100644 --- a/src/protocols/Screencopy.hpp +++ b/src/protocols/Screencopy.hpp @@ -10,6 +10,7 @@ #include "../managers/HookSystemManager.hpp" #include "../helpers/time/Timer.hpp" #include "../helpers/time/Time.hpp" +#include "../render/Framebuffer.hpp" #include "../managers/eventLoop/EventLoopTimer.hpp" #include @@ -72,10 +73,15 @@ class CScreencopyFrame { int m_shmStride = 0; CBox m_box = {}; - void copy(CZwlrScreencopyFrameV1* pFrame, wl_resource* buffer); - void copyDmabuf(std::function callback); - bool copyShm(); - void share(); + // if we have a pending perm, hold the buffer. + CFramebuffer m_tempFb; + + void copy(CZwlrScreencopyFrameV1* pFrame, wl_resource* buffer); + void copyDmabuf(std::function callback); + bool copyShm(); + void renderMon(); + void storeTempFB(); + void share(); friend class CScreencopyProtocol; }; From c19f383685000fcf61706c95feb4d80d22c9afe5 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Sat, 17 May 2025 19:07:11 +0200 Subject: [PATCH 024/901] hyprpm: fix crash with enable without an arg --- hyprpm/src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hyprpm/src/main.cpp b/hyprpm/src/main.cpp index b8bf8bca..98458762 100644 --- a/hyprpm/src/main.cpp +++ b/hyprpm/src/main.cpp @@ -142,7 +142,7 @@ int main(int argc, char** argv, char** envp) { } else if (notify) g_pPluginManager->notify(ICON_ERROR, 0, 10000, "[hyprpm] Couldn't update headers"); } else if (command[0] == "enable") { - if (ARGS.size() < 2) { + if (command.size() < 2) { std::println(stderr, "{}", failureString("Not enough args for enable.")); return 1; } From 705b97c4ac93148820012c701fe39445cf76a590 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Sat, 17 May 2025 19:43:12 +0200 Subject: [PATCH 025/901] input: revert #10416 and #10418 fixes #10451 --- src/managers/input/InputManager.cpp | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index 69c70af8..cd603ca5 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -201,7 +201,6 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus, bool mouse) { Vector2D surfacePos = Vector2D(-1337, -1337); PHLWINDOW pFoundWindow; PHLLS pFoundLayerSurface; - bool sendExternalMouseEvents = false; EMIT_HOOK_EVENT_CANCELLABLE("mouseMove", MOUSECOORDSFLOORED); @@ -298,8 +297,7 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus, bool mouse) { // and we're not dnd-ing, don't refocus. Keep focus on last surface. if (!PROTO::data->dndActive() && !m_currentlyHeldButtons.empty() && g_pCompositor->m_lastFocus && g_pCompositor->m_lastFocus->m_mapped && g_pSeatManager->m_state.pointerFocus && !m_hardInput) { - foundSurface = g_pSeatManager->m_state.pointerFocus.lock(); - sendExternalMouseEvents = true; + foundSurface = g_pSeatManager->m_state.pointerFocus.lock(); // IME popups aren't desktop-like elements // TODO: make them. @@ -600,19 +598,6 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus, bool mouse) { m_lastFocusOnLS = true; } - // Don't send events outside of the surface unless holding a mouse button, - // except for X11 surfaces which are always sent events in case of potential breakage. - if (!sendExternalMouseEvents && foundSurface && (!pFoundWindow || !pFoundWindow->m_isX11)) { - if (!foundSurface->at(surfaceLocal, true).first) - foundSurface = nullptr; - } - - // Releases any seat grabs after a click outside of them not handled by an earlier case (notably exclusive layers). - if ((m_hardInput || refocus) && g_pSeatManager->m_seatGrab && !foundSurface) { - g_pSeatManager->setGrab(nullptr); - return; // setGrab will refocus - } - g_pSeatManager->setPointerFocus(foundSurface, surfaceLocal); g_pSeatManager->sendPointerMotion(time, surfaceLocal); } From 44cb8f769e45cbe13edc6605e3b51ba041afd92f Mon Sep 17 00:00:00 2001 From: zacoons Date: Mon, 19 May 2025 03:10:06 +1000 Subject: [PATCH 026/901] internal: added error log when getEdgeDefinedPoint is impossible (#10462) --- src/render/decorations/DecorationPositioner.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/render/decorations/DecorationPositioner.cpp b/src/render/decorations/DecorationPositioner.cpp index 250070bc..82f2e5a8 100644 --- a/src/render/decorations/DecorationPositioner.cpp +++ b/src/render/decorations/DecorationPositioner.cpp @@ -42,7 +42,6 @@ Vector2D CDecorationPositioner::getEdgeDefinedPoint(uint32_t edges, PHLWINDOW pW return wb.pos() + Vector2D{0.0, wb.size().y / 2.0}; else if (RIGHT) return wb.pos() + Vector2D{wb.size().x, wb.size().y / 2.0}; - UNREACHABLE(); } else { if (TOP && LEFT) return wb.pos(); @@ -52,9 +51,8 @@ Vector2D CDecorationPositioner::getEdgeDefinedPoint(uint32_t edges, PHLWINDOW pW return wb.pos() + wb.size(); if (BOTTOM && LEFT) return wb.pos() + Vector2D{0.0, wb.size().y}; - UNREACHABLE(); } - UNREACHABLE(); + Debug::log(ERR, "getEdgeDefinedPoint: invalid configuration of edges"); return {}; } From 158c0f2911894f5f97af7361f639f97f6d100c82 Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Sun, 18 May 2025 18:13:20 +0100 Subject: [PATCH 027/901] permissions: add permission management for keyboards (#10367) --- src/config/ConfigManager.cpp | 2 ++ src/devices/IKeyboard.hpp | 3 ++ src/managers/input/InputManager.cpp | 24 ++++++++++++++- .../permissions/DynamicPermissionManager.cpp | 30 ++++++++++++------- .../permissions/DynamicPermissionManager.hpp | 1 + 5 files changed, 48 insertions(+), 12 deletions(-) diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 564ebcda..f5f0bed3 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -2900,6 +2900,8 @@ std::optional CConfigManager::handlePermission(const std::string& c type = PERMISSION_TYPE_SCREENCOPY; else if (data[1] == "plugin") type = PERMISSION_TYPE_PLUGIN; + else if (data[1] == "keyboard" || data[1] == "keeb") + type = PERMISSION_TYPE_KEYBOARD; if (data[2] == "ask") mode = PERMISSION_RULE_ALLOW_MODE_ASK; diff --git a/src/devices/IKeyboard.hpp b/src/devices/IKeyboard.hpp index 3d7b2dd1..c66aee27 100644 --- a/src/devices/IKeyboard.hpp +++ b/src/devices/IKeyboard.hpp @@ -78,6 +78,9 @@ class IKeyboard : public IHID { bool m_enabled = true; bool m_allowBinds = true; + // permission flag: whether this keyboard is allowed to be processed + bool m_allowed = true; + // if the keymap is overridden by the implementation, // don't try to set keyboard rules anymore, to avoid overwriting the requested one. // e.g. Virtual keyboards with custom maps. diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index cd603ca5..f9f36cf2 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -36,6 +36,7 @@ #include "../../managers/HookSystemManager.hpp" #include "../../managers/EventManager.hpp" #include "../../managers/LayoutManager.hpp" +#include "../../managers/permissions/DynamicPermissionManager.hpp" #include "../../helpers/time/Time.hpp" @@ -1054,6 +1055,27 @@ void CInputManager::applyConfigToKeyboard(SP pKeyboard) { pKeyboard->m_resolveBindsBySym = RESOLVEBINDSBYSYM; pKeyboard->m_allowBinds = ALLOWBINDS; + const auto PERM = g_pDynamicPermissionManager->clientPermissionModeWithString(-1, pKeyboard->m_hlName, PERMISSION_TYPE_KEYBOARD); + if (PERM == PERMISSION_RULE_ALLOW_MODE_PENDING) { + const auto PROMISE = g_pDynamicPermissionManager->promiseFor(-1, pKeyboard->m_hlName, PERMISSION_TYPE_KEYBOARD); + if (!PROMISE) + Debug::log(ERR, "BUG THIS: No promise for client permission for keyboard"); + else { + PROMISE->then([k = WP{pKeyboard}](SP> r) { + if (r->hasError()) { + Debug::log(ERR, "BUG THIS: No permission returned for keyboard"); + return; + } + + if (!k) + return; + + k->m_allowed = r->result() == PERMISSION_RULE_ALLOW_MODE_ALLOW; + }); + } + } else + pKeyboard->m_allowed = PERM == PERMISSION_RULE_ALLOW_MODE_ALLOW; + try { if (NUMLOCKON == pKeyboard->m_numlockOn && REPEATDELAY == pKeyboard->m_repeatDelay && REPEATRATE == pKeyboard->m_repeatRate && RULES != "" && RULES == pKeyboard->m_currentRules.rules && MODEL == pKeyboard->m_currentRules.model && LAYOUT == pKeyboard->m_currentRules.layout && @@ -1382,7 +1404,7 @@ void CInputManager::updateKeyboardsLeds(SP pKeyboard) { } void CInputManager::onKeyboardKey(std::any event, SP pKeyboard) { - if (!pKeyboard->m_enabled) + if (!pKeyboard->m_enabled || !pKeyboard->m_allowed) return; const bool DISALLOWACTION = pKeyboard->isVirtual() && shouldIgnoreVirtualKeyboard(pKeyboard); diff --git a/src/managers/permissions/DynamicPermissionManager.cpp b/src/managers/permissions/DynamicPermissionManager.cpp index e111343e..dd1fd4cf 100644 --- a/src/managers/permissions/DynamicPermissionManager.cpp +++ b/src/managers/permissions/DynamicPermissionManager.cpp @@ -52,6 +52,7 @@ static const char* permissionToString(eDynamicPermissionType type) { case PERMISSION_TYPE_UNKNOWN: return "PERMISSION_TYPE_UNKNOWN"; case PERMISSION_TYPE_SCREENCOPY: return "PERMISSION_TYPE_SCREENCOPY"; case PERMISSION_TYPE_PLUGIN: return "PERMISSION_TYPE_PLUGIN"; + case PERMISSION_TYPE_KEYBOARD: return "PERMISSION_TYPE_KEYBOARD"; } return "error"; @@ -59,9 +60,10 @@ static const char* permissionToString(eDynamicPermissionType type) { static const char* permissionToHumanString(eDynamicPermissionType type) { switch (type) { - case PERMISSION_TYPE_UNKNOWN: return "requesting an unknown permission"; - case PERMISSION_TYPE_SCREENCOPY: return "trying to capture your screen"; - case PERMISSION_TYPE_PLUGIN: return "trying to load a plugin"; + case PERMISSION_TYPE_UNKNOWN: return "An application {} is requesting an unknown permission."; + case PERMISSION_TYPE_SCREENCOPY: return "An application {} is trying to capture your screen.

Do you want to allow it to do so?"; + case PERMISSION_TYPE_PLUGIN: return "An application {} is trying to load a plugin: {}.

Do you want to load it?"; + case PERMISSION_TYPE_KEYBOARD: return "A new keyboard has been plugged in: {}.

Do you want to allow it to operate?"; } return "error"; @@ -184,7 +186,7 @@ eDynamicPermissionAllowMode CDynamicPermissionManager::clientPermissionMode(wl_c return PERMISSION_RULE_ALLOW_MODE_PENDING; } - // if we are here, we need to ask. + // if we are here, we need to ask, that's the fallback for all these (keyboards wont come here) askForPermission(client, LOOKUP.value_or(""), permission); return PERMISSION_RULE_ALLOW_MODE_PENDING; @@ -232,6 +234,10 @@ eDynamicPermissionAllowMode CDynamicPermissionManager::clientPermissionModeWithS } else if ((*it)->m_allowMode == PERMISSION_RULE_ALLOW_MODE_PENDING) { Debug::log(TRACE, "CDynamicPermissionManager::clientHasPermission: permission pending by config rule"); return PERMISSION_RULE_ALLOW_MODE_PENDING; + } else if ((*it)->m_allowMode == PERMISSION_RULE_ALLOW_MODE_ASK) { + Debug::log(TRACE, "CDynamicPermissionManager::clientHasPermission: permission ask by config rule"); + askForPermission(nullptr, str, permission, pid); + return PERMISSION_RULE_ALLOW_MODE_PENDING; } else Debug::log(TRACE, "CDynamicPermissionManager::clientHasPermission: permission ask by config rule"); } @@ -247,6 +253,10 @@ eDynamicPermissionAllowMode CDynamicPermissionManager::clientPermissionModeWithS return PERMISSION_RULE_ALLOW_MODE_PENDING; } + // keyboards are allow default + if (permission == PERMISSION_TYPE_KEYBOARD) + return PERMISSION_RULE_ALLOW_MODE_ALLOW; + // if we are here, we need to ask. askForPermission(nullptr, str, permission, pid); @@ -263,22 +273,20 @@ void CDynamicPermissionManager::askForPermission(wl_client* client, const std::s std::string description = ""; if (binaryPath.empty()) - description = std::format("An unknown application (wayland client ID 0x{:x}) is {}.", (uintptr_t)client, permissionToHumanString(type)); + description = std::format(std::runtime_format(permissionToHumanString(type)), std::format("unknown application (wayland client ID 0x{:x})", (uintptr_t)client)); else if (client) { std::string binaryName = binaryPath.contains("/") ? binaryPath.substr(binaryPath.find_last_of('/') + 1) : binaryPath; - description = std::format("An application {} ({}) is {}.", binaryName, binaryPath, permissionToHumanString(type)); + description = std::format(std::runtime_format(permissionToHumanString(type)), std::format("{} ({})", binaryName, binaryPath)); } else if (pid >= 0) { if (type == PERMISSION_TYPE_PLUGIN) { const auto LOOKUP = binaryNameForPid(pid); - description = std::format("An application {} is {}:
{}", LOOKUP.value_or("Unknown"), permissionToHumanString(type), binaryPath); + description = std::format(std::runtime_format(permissionToHumanString(type)), LOOKUP.value_or("Unknown"), binaryPath); } else { const auto LOOKUP = binaryNameForPid(pid); - description = std::format("An application {} ({}) is {}.", LOOKUP.value_or("Unknown"), binaryPath, permissionToHumanString(type)); + description = std::format(std::runtime_format(permissionToHumanString(type)), LOOKUP.value_or("Unknown"), binaryPath); } } else - description = std::format("An application is {}:
{}", permissionToHumanString(type), binaryPath); - - description += "

Do you want to allow this?"; + description = std::format(std::runtime_format(permissionToHumanString(type)), binaryPath); std::vector options; diff --git a/src/managers/permissions/DynamicPermissionManager.hpp b/src/managers/permissions/DynamicPermissionManager.hpp index f8cfe3ad..a61f256e 100644 --- a/src/managers/permissions/DynamicPermissionManager.hpp +++ b/src/managers/permissions/DynamicPermissionManager.hpp @@ -17,6 +17,7 @@ enum eDynamicPermissionType : uint8_t { PERMISSION_TYPE_UNKNOWN = 0, PERMISSION_TYPE_SCREENCOPY, PERMISSION_TYPE_PLUGIN, + PERMISSION_TYPE_KEYBOARD, }; enum eDynamicPermissionRuleSource : uint8_t { From d9c8a378118d954932eb9906b07150ccd9a3a434 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Sun, 18 May 2025 19:34:14 +0200 Subject: [PATCH 028/901] input: always allow focus to permission popups --- src/Compositor.cpp | 31 ++++++++++++++----- src/desktop/Window.cpp | 4 +++ src/desktop/Window.hpp | 2 ++ src/helpers/AsyncDialogBox.cpp | 19 +++++++++--- src/helpers/AsyncDialogBox.hpp | 6 +++- src/managers/input/InputManager.cpp | 9 ++++-- .../permissions/DynamicPermissionManager.cpp | 3 +- 7 files changed, 58 insertions(+), 16 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 973cb26b..c6593923 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -870,10 +870,14 @@ PHLWINDOW CCompositor::vectorToWindowUnified(const Vector2D& pos, uint8_t proper static auto PBORDERGRABEXTEND = CConfigValue("general:extend_border_grab_area"); static auto PSPECIALFALLTHRU = CConfigValue("input:special_fallthrough"); const auto BORDER_GRAB_AREA = *PRESIZEONBORDER ? *PBORDERSIZE + *PBORDERGRABEXTEND : 0; + const bool ONLY_PRIORITY = properties & FOCUS_PRIORITY; // pinned windows on top of floating regardless if (properties & ALLOW_FLOATING) { for (auto const& w : m_windows | std::views::reverse) { + if (ONLY_PRIORITY && !w->priorityFocus()) + continue; + if (w->m_isFloating && w->m_isMapped && !w->isHidden() && !w->m_X11ShouldntFocus && w->m_pinned && !w->m_windowData.noFocus.valueOrDefault() && w != pIgnoreWindow) { const auto BB = w->getWindowBoxUnified(properties); CBox box = BB.copy().expand(!w->isX11OverrideRedirect() ? BORDER_GRAB_AREA : 0); @@ -898,6 +902,9 @@ PHLWINDOW CCompositor::vectorToWindowUnified(const Vector2D& pos, uint8_t proper if (!w->m_workspace) continue; + if (ONLY_PRIORITY && !w->priorityFocus()) + continue; + const auto PWINDOWMONITOR = w->m_monitor.lock(); // to avoid focusing windows behind special workspaces from other monitors @@ -950,7 +957,7 @@ PHLWINDOW CCompositor::vectorToWindowUnified(const Vector2D& pos, uint8_t proper const WORKSPACEID WSPID = special ? PMONITOR->activeSpecialWorkspaceID() : PMONITOR->activeWorkspaceID(); const auto PWORKSPACE = getWorkspaceByID(WSPID); - if (PWORKSPACE->m_hasFullscreenWindow && !(properties & SKIP_FULLSCREEN_PRIORITY)) + if (PWORKSPACE->m_hasFullscreenWindow && !(properties & SKIP_FULLSCREEN_PRIORITY) && !ONLY_PRIORITY) return PWORKSPACE->getFullscreenWindow(); auto found = floating(false); @@ -959,6 +966,9 @@ PHLWINDOW CCompositor::vectorToWindowUnified(const Vector2D& pos, uint8_t proper // for windows, we need to check their extensions too, first. for (auto const& w : m_windows) { + if (ONLY_PRIORITY && !w->priorityFocus()) + continue; + if (special != w->onSpecialWorkspace()) continue; @@ -973,6 +983,9 @@ PHLWINDOW CCompositor::vectorToWindowUnified(const Vector2D& pos, uint8_t proper } for (auto const& w : m_windows) { + if (ONLY_PRIORITY && !w->priorityFocus()) + continue; + if (special != w->onSpecialWorkspace()) continue; @@ -1083,14 +1096,16 @@ void CCompositor::focusWindow(PHLWINDOW pWindow, SP pSurface static auto PFOLLOWMOUSE = CConfigValue("input:follow_mouse"); static auto PSPECIALFALLTHROUGH = CConfigValue("input:special_fallthrough"); - if (g_pSessionLockManager->isSessionLocked()) { - Debug::log(LOG, "Refusing a keyboard focus to a window because of a sessionlock"); - return; - } + if (!pWindow || !pWindow->priorityFocus()) { + if (g_pSessionLockManager->isSessionLocked()) { + Debug::log(LOG, "Refusing a keyboard focus to a window because of a sessionlock"); + return; + } - if (!g_pInputManager->m_exclusiveLSes.empty()) { - Debug::log(LOG, "Refusing a keyboard focus to a window because of an exclusive ls"); - return; + if (!g_pInputManager->m_exclusiveLSes.empty()) { + Debug::log(LOG, "Refusing a keyboard focus to a window because of an exclusive ls"); + return; + } } if (pWindow && pWindow->m_isX11 && pWindow->isX11OverrideRedirect() && !pWindow->m_xwaylandSurface->wantsFocus()) diff --git a/src/desktop/Window.cpp b/src/desktop/Window.cpp index 7ef54da0..9f69e364 100644 --- a/src/desktop/Window.cpp +++ b/src/desktop/Window.cpp @@ -1836,3 +1836,7 @@ PHLWINDOW CWindow::parent() { return m_xdgSurface->m_toplevel->m_parent->m_window.lock(); } + +bool CWindow::priorityFocus() { + return !m_isX11 && CAsyncDialogBox::isPriorityDialogBox(getPID()); +} diff --git a/src/desktop/Window.hpp b/src/desktop/Window.hpp index 47d28db2..0d06b69c 100644 --- a/src/desktop/Window.hpp +++ b/src/desktop/Window.hpp @@ -51,6 +51,7 @@ enum eGetWindowProperties : uint8_t { ALLOW_FLOATING = 1 << 4, USE_PROP_TILED = 1 << 5, SKIP_FULLSCREEN_PRIORITY = 1 << 6, + FOCUS_PRIORITY = 1 << 7, }; enum eSuppressEvents : uint8_t { @@ -408,6 +409,7 @@ class CWindow { std::optional xdgTag(); std::optional xdgDescription(); PHLWINDOW parent(); + bool priorityFocus(); CBox getWindowMainSurfaceBox() const { return {m_realPosition->value().x, m_realPosition->value().y, m_realSize->value().x, m_realSize->value().y}; diff --git a/src/helpers/AsyncDialogBox.cpp b/src/helpers/AsyncDialogBox.cpp index 42dac469..697d61ba 100644 --- a/src/helpers/AsyncDialogBox.cpp +++ b/src/helpers/AsyncDialogBox.cpp @@ -7,7 +7,7 @@ using namespace Hyprutils::OS; -static std::vector asyncDialogBoxes; +static std::vector>> asyncDialogBoxes; // SP CAsyncDialogBox::create(const std::string& title, const std::string& description, std::vector buttons) { @@ -24,7 +24,18 @@ SP CAsyncDialogBox::create(const std::string& title, const std: } bool CAsyncDialogBox::isAsyncDialogBox(pid_t pid) { - return std::ranges::contains(asyncDialogBoxes, pid); + return std::ranges::find_if(asyncDialogBoxes, [pid](const auto& e) { return e.first == pid; }) != asyncDialogBoxes.end(); +} + +bool CAsyncDialogBox::isPriorityDialogBox(pid_t pid) { + for (const auto& [p, db] : asyncDialogBoxes) { + if (p != pid) + continue; + + return db && db->m_priority; + } + + return false; } CAsyncDialogBox::CAsyncDialogBox(const std::string& title, const std::string& description, std::vector buttons) : @@ -68,7 +79,7 @@ void CAsyncDialogBox::onWrite(int fd, uint32_t mask) { Debug::log(LOG, "CAsyncDialogBox: dialog {:x} hung up, closed."); m_promiseResolver->resolve(m_stdout); - std::erase(asyncDialogBoxes, m_dialogPid); + std::erase_if(asyncDialogBoxes, [this](const auto& e) { return e.first == m_dialogPid; }); wl_event_source_remove(m_readEventSource); m_selfReference.reset(); @@ -112,7 +123,7 @@ SP> CAsyncDialogBox::open() { } m_dialogPid = proc.pid(); - asyncDialogBoxes.emplace_back(m_dialogPid); + asyncDialogBoxes.emplace_back(std::make_pair<>(m_dialogPid, m_selfWeakReference)); // close the write fd, only the dialog owns it now close(outPipe[1]); diff --git a/src/helpers/AsyncDialogBox.hpp b/src/helpers/AsyncDialogBox.hpp index 4018a857..0ee0144e 100644 --- a/src/helpers/AsyncDialogBox.hpp +++ b/src/helpers/AsyncDialogBox.hpp @@ -16,6 +16,7 @@ class CAsyncDialogBox { public: static SP create(const std::string& title, const std::string& description, std::vector buttons); static bool isAsyncDialogBox(pid_t pid); + static bool isPriorityDialogBox(pid_t pid); CAsyncDialogBox(const CAsyncDialogBox&) = delete; CAsyncDialogBox(CAsyncDialogBox&&) = delete; @@ -26,7 +27,10 @@ class CAsyncDialogBox { void kill(); bool isRunning() const; - void onWrite(int fd, uint32_t mask); + // focus priority, only permission popups + bool m_priority = false; + + void onWrite(int fd, uint32_t mask); private: CAsyncDialogBox(const std::string& title, const std::string& description, std::vector buttons); diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index f9f36cf2..2d50dbcf 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -250,7 +250,12 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus, bool mouse) { if (PMONITOR != g_pCompositor->m_lastMonitor && (*PMOUSEFOCUSMON || refocus) && m_forcedFocus.expired()) g_pCompositor->setActiveMonitor(PMONITOR); - if (g_pSessionLockManager->isSessionLocked()) { + // check for windows that have focus priority like our permission popups + pFoundWindow = g_pCompositor->vectorToWindowUnified(mouseCoords, FOCUS_PRIORITY); + if (pFoundWindow) + foundSurface = g_pCompositor->vectorWindowToSurface(mouseCoords, pFoundWindow, surfaceCoords); + + if (!foundSurface && g_pSessionLockManager->isSessionLocked()) { // set keyboard focus on session lock surface regardless of layers const auto PSESSIONLOCKSURFACE = g_pSessionLockManager->getSessionLockSurfaceForMonitor(PMONITOR->m_id); @@ -288,7 +293,7 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus, bool mouse) { if (!forcedFocus) forcedFocus = g_pCompositor->getForceFocus(); - if (forcedFocus) { + if (forcedFocus && !foundSurface) { pFoundWindow = forcedFocus; surfacePos = pFoundWindow->m_realPosition->value(); foundSurface = pFoundWindow->m_wlSurface->resource(); diff --git a/src/managers/permissions/DynamicPermissionManager.cpp b/src/managers/permissions/DynamicPermissionManager.cpp index dd1fd4cf..c015adfe 100644 --- a/src/managers/permissions/DynamicPermissionManager.cpp +++ b/src/managers/permissions/DynamicPermissionManager.cpp @@ -296,7 +296,8 @@ void CDynamicPermissionManager::askForPermission(wl_client* client, const std::s } else options = {"Deny", "Allow"}; - rule->m_dialogBox = CAsyncDialogBox::create("Permission request", description, options); + rule->m_dialogBox = CAsyncDialogBox::create("Permission request", description, options); + rule->m_dialogBox->m_priority = true; if (!rule->m_dialogBox) { Debug::log(ERR, "CDynamicPermissionManager::askForPermission: hyprland-qtutils likely missing, cannot ask! Disabling permission control..."); From eb3b38d40baca5c05ddbc1507b3d3f02a0ccb164 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Mon, 19 May 2025 01:27:30 +0200 Subject: [PATCH 029/901] eventLoop: fixup event source callbacks --- src/managers/eventLoop/EventLoopManager.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/managers/eventLoop/EventLoopManager.cpp b/src/managers/eventLoop/EventLoopManager.cpp index 338b75e3..6233a2d0 100644 --- a/src/managers/eventLoop/EventLoopManager.cpp +++ b/src/managers/eventLoop/EventLoopManager.cpp @@ -70,16 +70,20 @@ static int handleWaiterFD(int fd, uint32_t mask, void* data) { void CEventLoopManager::onFdReadable(SReadableWaiter* waiter) { auto it = std::ranges::find_if(m_readableWaiters, [waiter](const UP& w) { return waiter == w.get() && w->fd == waiter->fd && w->source == waiter->source; }); - if (waiter->source) { - wl_event_source_remove(waiter->source); - waiter->source = nullptr; + // ??? + if (it == m_readableWaiters.end()) + return; + + UP taken = std::move(*it); + m_readableWaiters.erase(it); + + if (taken->source) { + wl_event_source_remove(taken->source); + taken->source = nullptr; } - if (waiter->fn) - waiter->fn(); - - if (it != m_readableWaiters.end()) - m_readableWaiters.erase(it); + if (taken->fn) + taken->fn(); } void CEventLoopManager::enterLoop() { From b90910c0dcc6db9d7529d02190b0a19f69cb46e3 Mon Sep 17 00:00:00 2001 From: zacoons <73414084+zacoons@users.noreply.github.com> Date: Thu, 22 May 2025 01:41:40 +1000 Subject: [PATCH 030/901] renderer: add wrapping options to renderTexture method (#10497) --- src/render/OpenGL.cpp | 11 ++++++----- src/render/OpenGL.hpp | 5 +++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 20862a7a..855da879 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -1409,10 +1409,11 @@ void CHyprOpenGLImpl::renderRectWithDamage(const CBox& box, const CHyprColor& co scissor(nullptr); } -void CHyprOpenGLImpl::renderTexture(SP tex, const CBox& box, float alpha, int round, float roundingPower, bool discardActive, bool allowCustomUV) { +void CHyprOpenGLImpl::renderTexture(SP tex, const CBox& box, float alpha, int round, float roundingPower, bool discardActive, bool allowCustomUV, GLenum wrapX, + GLenum wrapY) { RASSERT(m_renderData.pMonitor, "Tried to render texture without begin()!"); - renderTextureInternalWithDamage(tex, box, alpha, m_renderData.damage, round, roundingPower, discardActive, false, allowCustomUV, true); + renderTextureInternalWithDamage(tex, box, alpha, m_renderData.damage, round, roundingPower, discardActive, false, allowCustomUV, true, wrapX, wrapY); scissor(nullptr); } @@ -1477,7 +1478,7 @@ void CHyprOpenGLImpl::passCMUniforms(const SShader& shader, const SImageDescript } void CHyprOpenGLImpl::renderTextureInternalWithDamage(SP tex, const CBox& box, float alpha, const CRegion& damage, int round, float roundingPower, bool discardActive, - bool noAA, bool allowCustomUV, bool allowDim) { + bool noAA, bool allowCustomUV, bool allowDim, GLenum wrapX, GLenum wrapY) { RASSERT(m_renderData.pMonitor, "Tried to render texture without begin()!"); RASSERT((tex->m_texID > 0), "Attempted to draw nullptr texture!"); @@ -1541,8 +1542,8 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(SP tex, const CB glActiveTexture(GL_TEXTURE0); glBindTexture(tex->m_target, tex->m_texID); - glTexParameteri(tex->m_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(tex->m_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(tex->m_target, GL_TEXTURE_WRAP_S, wrapX); + glTexParameteri(tex->m_target, GL_TEXTURE_WRAP_T, wrapY); if (m_renderData.useNearestNeighbor) { glTexParameteri(tex->m_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); diff --git a/src/render/OpenGL.hpp b/src/render/OpenGL.hpp index 09aff9da..fade4a9d 100644 --- a/src/render/OpenGL.hpp +++ b/src/render/OpenGL.hpp @@ -183,7 +183,8 @@ class CHyprOpenGLImpl { void renderRect(const CBox&, const CHyprColor&, int round = 0, float roundingPower = 2.0f); void renderRectWithBlur(const CBox&, const CHyprColor&, int round = 0, float roundingPower = 2.0f, float blurA = 1.f, bool xray = false); void renderRectWithDamage(const CBox&, const CHyprColor&, const CRegion& damage, int round = 0, float roundingPower = 2.0f); - void renderTexture(SP, const CBox&, float a, int round = 0, float roundingPower = 2.0f, bool discardActive = false, bool allowCustomUV = false); + void renderTexture(SP, const CBox&, float a, int round = 0, float roundingPower = 2.0f, bool discardActive = false, bool allowCustomUV = false, + GLenum wrapX = GL_CLAMP_TO_EDGE, GLenum wrapY = GL_CLAMP_TO_EDGE); void renderTextureWithDamage(SP, const CBox&, const CRegion& damage, float a, int round = 0, float roundingPower = 2.0f, bool discardActive = false, bool allowCustomUV = false); void renderTextureWithBlur(SP, const CBox&, float a, SP pSurface, int round = 0, float roundingPower = 2.0f, bool blockBlurOptimization = false, @@ -344,7 +345,7 @@ class CHyprOpenGLImpl { bool modifySDR = false); void passCMUniforms(const SShader&, const NColorManagement::SImageDescription& imageDescription); void renderTextureInternalWithDamage(SP, const CBox& box, float a, const CRegion& damage, int round = 0, float roundingPower = 2.0f, bool discardOpaque = false, - bool noAA = false, bool allowCustomUV = false, bool allowDim = false); + bool noAA = false, bool allowCustomUV = false, bool allowDim = false, GLenum wrapX = GL_CLAMP_TO_EDGE, GLenum wrapY = GL_CLAMP_TO_EDGE); void renderTexturePrimitive(SP tex, const CBox& box); void renderSplash(cairo_t* const, cairo_surface_t* const, double offset, const Vector2D& size); From 185c96849ef59da3e101116662d942dea16b468a Mon Sep 17 00:00:00 2001 From: darkwater Date: Wed, 21 May 2025 23:44:21 +0200 Subject: [PATCH 031/901] input: unhide cursor on tablet events after touch events (#10484) --- src/managers/input/Tablets.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/managers/input/Tablets.cpp b/src/managers/input/Tablets.cpp index 5b9ca378..b0fe7c64 100644 --- a/src/managers/input/Tablets.cpp +++ b/src/managers/input/Tablets.cpp @@ -134,6 +134,7 @@ void CInputManager::onTabletAxis(CTablet::SAxisEvent e) { } } + m_lastInputTouch = false; simulateMouseMovement(); refocusTablet(PTAB, PTOOL, true); m_lastCursorMovement.reset(); From 4f161da3d6a3eb16cffd8c7706e2b916c82c93a7 Mon Sep 17 00:00:00 2001 From: nezu <29180158+dumbasPL@users.noreply.github.com> Date: Thu, 22 May 2025 13:54:02 +0200 Subject: [PATCH 032/901] hyprpm: ignore pins when adding a package with a git rev (#10502) ref #10436 --- hyprpm/src/core/PluginManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hyprpm/src/core/PluginManager.cpp b/hyprpm/src/core/PluginManager.cpp index 76f20110..90eba579 100644 --- a/hyprpm/src/core/PluginManager.cpp +++ b/hyprpm/src/core/PluginManager.cpp @@ -256,7 +256,7 @@ bool CPluginManager::addNewPluginRepo(const std::string& url, const std::string& progress.printMessageAbove(message); } - if (!pManifest->m_repository.commitPins.empty()) { + if (rev.empty() && !pManifest->m_repository.commitPins.empty()) { // check commit pins progress.printMessageAbove(infoString("Manifest has {} pins, checking", pManifest->m_repository.commitPins.size())); From bd4733a0ff2b89fd3f22dc6ec9ff00e070753662 Mon Sep 17 00:00:00 2001 From: Mihai Fufezan Date: Thu, 22 May 2025 18:02:18 +0300 Subject: [PATCH 033/901] flake.lock: update nix/overlays: remove wayland-protocols overlay. PR landed in master a while ago --- flake.lock | 24 ++++++++++++------------ nix/overlays.nix | 13 ------------- 2 files changed, 12 insertions(+), 25 deletions(-) diff --git a/flake.lock b/flake.lock index 1be8e6d4..de57aab4 100644 --- a/flake.lock +++ b/flake.lock @@ -16,11 +16,11 @@ ] }, "locked": { - "lastModified": 1745357003, - "narHash": "sha256-jYwzQkv1r7HN/4qrAuKp+NR4YYNp2xDrOX5O9YVqkWo=", + "lastModified": 1747864449, + "narHash": "sha256-PIjVAWghZhr3L0EFM2UObhX84UQxIACbON0IC0zzSKA=", "owner": "hyprwm", "repo": "aquamarine", - "rev": "a19cf76ee1a15c1c12083fa372747ce46387289f", + "rev": "389372c5f4dc1ac0e7645ed29a35fd6d71672ef5", "type": "github" }, "original": { @@ -215,11 +215,11 @@ ] }, "locked": { - "lastModified": 1746655412, - "narHash": "sha256-kVQ0bHVtX6baYxRWWIh4u3LNJZb9Zcm2xBeDPOGz5BY=", + "lastModified": 1747484975, + "narHash": "sha256-+LAQ81HBwG0lwshHlWe0kfWg4KcChIPpnwtnwqmnoEU=", "owner": "hyprwm", "repo": "hyprlang", - "rev": "557241780c179cf7ef224df392f8e67dab6cef83", + "rev": "163c83b3db48a17c113729c220a60b94596c9291", "type": "github" }, "original": { @@ -261,11 +261,11 @@ ] }, "locked": { - "lastModified": 1739870480, - "narHash": "sha256-SiDN5BGxa/1hAsqhgJsS03C3t2QrLgBT8u+ENJ0Qzwc=", + "lastModified": 1747584298, + "narHash": "sha256-PH9qZqWLHvSBQiUnA0NzAyQA3tu2no2z8kz0ZeHWj4w=", "owner": "hyprwm", "repo": "hyprwayland-scanner", - "rev": "206367a08dc5ac4ba7ad31bdca391d098082e64b", + "rev": "e511882b9c2e1d7a75d45d8fddd2160daeafcbc3", "type": "github" }, "original": { @@ -276,11 +276,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1747327360, - "narHash": "sha256-LSmTbiq/nqZR9B2t4MRnWG7cb0KVNU70dB7RT4+wYK4=", + "lastModified": 1747744144, + "narHash": "sha256-W7lqHp0qZiENCDwUZ5EX/lNhxjMdNapFnbErcbnP11Q=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e06158e58f3adee28b139e9c2bcfcc41f8625b46", + "rev": "2795c506fe8fb7b03c36ccb51f75b6df0ab2553f", "type": "github" }, "original": { diff --git a/nix/overlays.nix b/nix/overlays.nix index 687a49d4..6085bf80 100644 --- a/nix/overlays.nix +++ b/nix/overlays.nix @@ -29,7 +29,6 @@ in { inputs.hyprutils.overlays.default inputs.hyprwayland-scanner.overlays.default self.overlays.udis86 - self.overlays.wayland-protocols # Hyprland packages themselves (final: _prev: let @@ -96,16 +95,4 @@ in { patches = []; }); }; - - # TODO: remove when https://github.com/NixOS/nixpkgs/pull/397497 lands in master - wayland-protocols = final: prev: { - wayland-protocols = prev.wayland-protocols.overrideAttrs (self: super: { - version = "1.43"; - - src = final.fetchurl { - url = "https://gitlab.freedesktop.org/wayland/${self.pname}/-/releases/${self.version}/downloads/${self.pname}-${self.version}.tar.xz"; - hash = "sha256-ujw0Jd0nxXtSkek9upe+EkeWAeALyrJNJkcZSMtkNlM="; - }; - }); - }; } From 81cd526f923f4a9074bbfef59b4c7e9f3350c349 Mon Sep 17 00:00:00 2001 From: Virt <41426325+VirtCode@users.noreply.github.com> Date: Fri, 23 May 2025 23:41:35 +0200 Subject: [PATCH 034/901] cursor: fix screencopy cursor pos and duplicate shape with sw cursors (#10519) * cursor: account for hotspot with overridePos * cursor: don't draw cursor on screencopy if using sw anyways --- src/managers/PointerManager.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp index 7bd66c5d..f42fd686 100644 --- a/src/managers/PointerManager.cpp +++ b/src/managers/PointerManager.cpp @@ -603,10 +603,17 @@ void CPointerManager::renderSoftwareCursorsFor(PHLMONITOR pMonitor, const Time:: return; } + // don't render cursor if forced but we are already using sw cursors for the monitor + // otherwise we draw the cursor again for screencopy when using sw cursors + if (forceRender && (state->hardwareFailed || state->softwareLocks != 0)) + return; + auto box = state->box.copy(); if (overridePos.has_value()) { box.x = overridePos->x; box.y = overridePos->y; + + box.translate(-m_currentCursorImage.hotspot); } if (box.intersection(CBox{{}, {pMonitor->m_size}}).empty()) From 55076edaac38865562d647e22b42566822264218 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Sat, 24 May 2025 20:39:36 +0200 Subject: [PATCH 035/901] versionkeeper: don't pop up on initial launch --- src/managers/VersionKeeperManager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/managers/VersionKeeperManager.cpp b/src/managers/VersionKeeperManager.cpp index ef9c274d..93f820f4 100644 --- a/src/managers/VersionKeeperManager.cpp +++ b/src/managers/VersionKeeperManager.cpp @@ -31,6 +31,7 @@ CVersionKeeperManager::CVersionKeeperManager() { if (!LASTVER) { NFsUtils::writeToFile(*DATAROOT + "/" + VERSION_FILE_NAME, "0.0.0"); LASTVER = "0.0.0"; + return; } if (!isVersionOlderThanRunning(*LASTVER)) { From 28c9122adbb9cba2ba19ad723eb0f36c19b21f2d Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Sat, 24 May 2025 18:41:03 +0000 Subject: [PATCH 036/901] [gha] Nix: update inputs --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index de57aab4..22f246d5 100644 --- a/flake.lock +++ b/flake.lock @@ -276,11 +276,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1747744144, - "narHash": "sha256-W7lqHp0qZiENCDwUZ5EX/lNhxjMdNapFnbErcbnP11Q=", + "lastModified": 1748026106, + "narHash": "sha256-6m1Y3/4pVw1RWTsrkAK2VMYSzG4MMIj7sqUy7o8th1o=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "2795c506fe8fb7b03c36ccb51f75b6df0ab2553f", + "rev": "063f43f2dbdef86376cc29ad646c45c46e93234c", "type": "github" }, "original": { From cc0792c1dce250311a19e92bad204eefae072592 Mon Sep 17 00:00:00 2001 From: Vladimir-csp <4061903+Vladimir-csp@users.noreply.github.com> Date: Sat, 24 May 2025 17:26:10 +0300 Subject: [PATCH 037/901] hyprland-uwsm.desktop: Add TryExec This should hide this entry when uwsm is missing (at least in DMs that handle TryExec) --- systemd/hyprland-uwsm.desktop | 1 + 1 file changed, 1 insertion(+) diff --git a/systemd/hyprland-uwsm.desktop b/systemd/hyprland-uwsm.desktop index e00f4aa2..3f37532d 100644 --- a/systemd/hyprland-uwsm.desktop +++ b/systemd/hyprland-uwsm.desktop @@ -2,5 +2,6 @@ Name=Hyprland (uwsm-managed) Comment=An intelligent dynamic tiling Wayland compositor Exec=uwsm start -- hyprland.desktop +TryExec=uwsm DesktopNames=Hyprland Type=Application From a58ab20e8bc27a50d55e924b13047db6bbf9dc4a Mon Sep 17 00:00:00 2001 From: Vaxry Date: Sun, 25 May 2025 18:45:23 +0200 Subject: [PATCH 038/901] debug/pass: show live/precompile blur in debug --- src/render/pass/Pass.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/render/pass/Pass.cpp b/src/render/pass/Pass.cpp index fc743865..5877d9a9 100644 --- a/src/render/pass/Pass.cpp +++ b/src/render/pass/Pass.cpp @@ -273,8 +273,8 @@ void CRenderPass::renderDebugData() { auto yn = [](const bool val) -> const char* { return val ? "yes" : "no"; }; auto tick = [](const bool val) -> const char* { return val ? "✔" : "✖"; }; for (const auto& el : m_passElements | std::views::reverse) { - passStructure += std::format("{} {} (bb: {} op: {})\n", tick(!el->discard), el->element->passName(), yn(el->element->boundingBox().has_value()), - yn(!el->element->opaqueRegion().empty())); + passStructure += std::format("{} {} (bb: {} op: {}, pb: {}, lb: {})\n", tick(!el->discard), el->element->passName(), yn(el->element->boundingBox().has_value()), + yn(!el->element->opaqueRegion().empty()), yn(el->element->needsPrecomputeBlur()), yn(el->element->needsLiveBlur())); } if (!passStructure.empty()) From 2347050285920925db8bc844e3232bc932eef21e Mon Sep 17 00:00:00 2001 From: Vaxry Date: Sun, 25 May 2025 18:48:32 +0200 Subject: [PATCH 039/901] pass/surface: make sure popup blurs are marked for require live blur fixes #10535 --- src/render/pass/SurfacePassElement.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/render/pass/SurfacePassElement.cpp b/src/render/pass/SurfacePassElement.cpp index d161f909..2163566a 100644 --- a/src/render/pass/SurfacePassElement.cpp +++ b/src/render/pass/SurfacePassElement.cpp @@ -195,6 +195,9 @@ bool CSurfacePassElement::needsLiveBlur() { if (!m_data.pLS && !m_data.pWindow) return BLUR; + if (m_data.popup) + return BLUR; + const bool NEWOPTIM = g_pHyprOpenGL->shouldUseNewBlurOptimizations(m_data.pLS, m_data.pWindow); return BLUR && !NEWOPTIM; @@ -209,6 +212,9 @@ bool CSurfacePassElement::needsPrecomputeBlur() { if (!m_data.pLS && !m_data.pWindow) return BLUR; + if (m_data.popup) + return false; + const bool NEWOPTIM = g_pHyprOpenGL->shouldUseNewBlurOptimizations(m_data.pLS, m_data.pWindow); return BLUR && NEWOPTIM; From 292a7456af9465a57a7fe3ee36d113ae661a9ff3 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Mon, 26 May 2025 16:53:35 +0200 Subject: [PATCH 040/901] eventLoop: fixup headers --- src/managers/eventLoop/EventLoopManager.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/managers/eventLoop/EventLoopManager.hpp b/src/managers/eventLoop/EventLoopManager.hpp index a3c755a7..977d2b01 100644 --- a/src/managers/eventLoop/EventLoopManager.hpp +++ b/src/managers/eventLoop/EventLoopManager.hpp @@ -5,7 +5,7 @@ #include #include #include -#include "helpers/signal/Signal.hpp" +#include "../../helpers/signal/Signal.hpp" #include #include "EventLoopTimer.hpp" From 4c4c9bb324b9e17bddb72c4614b451775521ee24 Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Tue, 27 May 2025 01:15:11 +0800 Subject: [PATCH 041/901] dwindle: add better automatic window drag and drop direction detection (#9704) --- src/config/ConfigDescriptions.hpp | 6 ++++++ src/config/ConfigManager.cpp | 1 + src/layout/IHyprLayout.cpp | 26 +++++++++++++++++++++++++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/config/ConfigDescriptions.hpp b/src/config/ConfigDescriptions.hpp index 8fc6b04b..19c1f74c 100644 --- a/src/config/ConfigDescriptions.hpp +++ b/src/config/ConfigDescriptions.hpp @@ -1757,6 +1757,12 @@ inline static const std::vector CONFIG_OPTIONS = { .type = CONFIG_OPTION_CHOICE, .data = SConfigOptionDescription::SChoiceData{0, "positional,current,opening"}, }, + SConfigOptionDescription{ + .value = "dwindle:precise_move", + .description = "if enabled, bindm movewindow will drop the window more precisely depending on where your mouse is.", + .type = CONFIG_OPTION_BOOL, + .data = SConfigOptionDescription::SBoolData{true}, + }, /* * master: diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index f5f0bed3..99b4cf85 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -592,6 +592,7 @@ CConfigManager::CConfigManager() { registerConfigVar("dwindle:split_bias", Hyprlang::INT{0}); registerConfigVar("dwindle:smart_split", Hyprlang::INT{0}); registerConfigVar("dwindle:smart_resizing", Hyprlang::INT{1}); + registerConfigVar("dwindle:precise_move", Hyprlang::INT{0}); registerConfigVar("master:special_scale_factor", {1.f}); registerConfigVar("master:mfact", {0.55f}); diff --git a/src/layout/IHyprLayout.cpp b/src/layout/IHyprLayout.cpp index 8d32e44e..93b09c87 100644 --- a/src/layout/IHyprLayout.cpp +++ b/src/layout/IHyprLayout.cpp @@ -362,9 +362,33 @@ void IHyprLayout::onEndDragWindow() { } if (DRAGGINGWINDOW->m_draggingTiled) { + static auto PPRECISEMOUSE = CConfigValue("dwindle:precise_mouse_move"); DRAGGINGWINDOW->m_isFloating = false; g_pInputManager->refocus(); - changeWindowFloatingMode(DRAGGINGWINDOW); + + if (*PPRECISEMOUSE) { + eDirection direction = DIRECTION_DEFAULT; + + const auto MOUSECOORDS = g_pInputManager->getMouseCoordsInternal(); + const PHLWINDOW pReferenceWindow = g_pCompositor->vectorToWindowUnified(MOUSECOORDS, RESERVED_EXTENTS | INPUT_EXTENTS | ALLOW_FLOATING, DRAGGINGWINDOW); + + if (pReferenceWindow && pReferenceWindow != DRAGGINGWINDOW) { + const Vector2D draggedCenter = DRAGGINGWINDOW->m_realPosition->goal() + DRAGGINGWINDOW->m_realSize->goal() / 2.f; + const Vector2D referenceCenter = pReferenceWindow->m_realPosition->goal() + pReferenceWindow->m_realSize->goal() / 2.f; + const float xDiff = draggedCenter.x - referenceCenter.x; + const float yDiff = draggedCenter.y - referenceCenter.y; + + if (fabs(xDiff) > fabs(yDiff)) + direction = xDiff < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; + else + direction = yDiff < 0 ? DIRECTION_UP : DIRECTION_DOWN; + } + + onWindowRemovedTiling(DRAGGINGWINDOW); + onWindowCreatedTiling(DRAGGINGWINDOW, direction); + } else + changeWindowFloatingMode(DRAGGINGWINDOW); + DRAGGINGWINDOW->m_lastFloatingSize = m_draggingWindowOriginalFloatSize; } From c2805aad92978577a4d89b14f1c4f51e50247547 Mon Sep 17 00:00:00 2001 From: Nikolaos Karaolidis Date: Mon, 26 May 2025 18:25:58 +0100 Subject: [PATCH 042/901] config: add maxwidth monitor resolution mode (#10528) Signed-off-by: Nikolaos Karaolidis --- src/config/ConfigManager.cpp | 2 ++ src/helpers/Monitor.cpp | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 99b4cf85..a8d70bb6 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -2014,6 +2014,8 @@ std::optional CConfigManager::handleMonitor(const std::string& comm newrule.resolution = Vector2D(-1, -1); } else if (ARGS[1].starts_with("highres")) { newrule.resolution = Vector2D(-1, -2); + } else if (ARGS[1].starts_with("maxwidth")) { + newrule.resolution = Vector2D(-1, -3); } else if (parseModeLine(ARGS[1], newrule.drmMode)) { newrule.resolution = Vector2D(newrule.drmMode.hdisplay, newrule.drmMode.vdisplay); newrule.refreshRate = float(newrule.drmMode.vrefresh) / 1000; diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index 4dc0942d..72a221f5 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -515,7 +515,7 @@ bool CMonitor::applyMonitorRule(SMonitorRule* pMonitorRule, bool force) { } else if (RULE->resolution == Vector2D(-1, -2)) { requestedStr = "highres"; - // sort prioritizing resultion 1st and refresh rate 2nd, then add best 3 + // sort prioritizing resolution 1st and refresh rate 2nd, then add best 3 addBest3Modes([](auto const& a, auto const& b) { if (a->pixelSize.x > b->pixelSize.x && a->pixelSize.y > b->pixelSize.y) return true; @@ -524,6 +524,17 @@ bool CMonitor::applyMonitorRule(SMonitorRule* pMonitorRule, bool force) { return true; return false; }); + } else if (RULE->resolution == Vector2D(-1, -3)) { + requestedStr = "maxwidth"; + + // sort prioritizing widest resolution 1st and refresh rate 2nd, then add best 3 + addBest3Modes([](auto const& a, auto const& b) { + if (a->pixelSize.x > b->pixelSize.x) + return true; + if (a->pixelSize.x == b->pixelSize.x && std::round(a->refreshRate) > std::round(b->refreshRate)) + return true; + return false; + }); } else if (RULE->resolution != Vector2D()) { // user requested mode requestedStr = std::format("{:X0}@{:.2f}Hz", RULE->resolution, RULE->refreshRate); From be6ee6e55f08387a9e2fbf712c061fb238a70319 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Mon, 26 May 2025 23:33:25 +0200 Subject: [PATCH 043/901] cmake: disable gprof by default --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4267a59d..61893803 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -153,7 +153,7 @@ endif() add_executable(Hyprland ${SRCFILES} ${TRACY_CPP_FILES}) -set(USE_GPROF ON) +set(USE_GPROF OFF) if(CMAKE_BUILD_TYPE MATCHES Debug OR CMAKE_BUILD_TYPE MATCHES DEBUG) message(STATUS "Setting debug flags") From a62ccb169aa05ef40c6c215c0638e843740920f3 Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Tue, 27 May 2025 15:33:17 +0800 Subject: [PATCH 044/901] config: fix crash on misnamed variable (#10549) --- src/config/ConfigDescriptions.hpp | 2 +- src/config/ConfigManager.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config/ConfigDescriptions.hpp b/src/config/ConfigDescriptions.hpp index 19c1f74c..f59bd1a9 100644 --- a/src/config/ConfigDescriptions.hpp +++ b/src/config/ConfigDescriptions.hpp @@ -1758,7 +1758,7 @@ inline static const std::vector CONFIG_OPTIONS = { .data = SConfigOptionDescription::SChoiceData{0, "positional,current,opening"}, }, SConfigOptionDescription{ - .value = "dwindle:precise_move", + .value = "dwindle:precise_mouse_move", .description = "if enabled, bindm movewindow will drop the window more precisely depending on where your mouse is.", .type = CONFIG_OPTION_BOOL, .data = SConfigOptionDescription::SBoolData{true}, diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index a8d70bb6..a4f09d65 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -592,7 +592,7 @@ CConfigManager::CConfigManager() { registerConfigVar("dwindle:split_bias", Hyprlang::INT{0}); registerConfigVar("dwindle:smart_split", Hyprlang::INT{0}); registerConfigVar("dwindle:smart_resizing", Hyprlang::INT{1}); - registerConfigVar("dwindle:precise_move", Hyprlang::INT{0}); + registerConfigVar("dwindle:precise_mouse_move", Hyprlang::INT{0}); registerConfigVar("master:special_scale_factor", {1.f}); registerConfigVar("master:mfact", {0.55f}); From ddb9f8394df01eaa575955e7f0eee99065441e4b Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Tue, 27 May 2025 22:50:00 +0800 Subject: [PATCH 045/901] config: fix inconsistant hint of default value (#10556) similar to https://github.com/hyprwm/hyprland-wiki/pull/1093 --- src/config/ConfigDescriptions.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/ConfigDescriptions.hpp b/src/config/ConfigDescriptions.hpp index f59bd1a9..5e18233d 100644 --- a/src/config/ConfigDescriptions.hpp +++ b/src/config/ConfigDescriptions.hpp @@ -1761,7 +1761,7 @@ inline static const std::vector CONFIG_OPTIONS = { .value = "dwindle:precise_mouse_move", .description = "if enabled, bindm movewindow will drop the window more precisely depending on where your mouse is.", .type = CONFIG_OPTION_BOOL, - .data = SConfigOptionDescription::SBoolData{true}, + .data = SConfigOptionDescription::SBoolData{false}, }, /* From 90d0b8ecae9540c21ce418ef781cf0fc2afc4dff Mon Sep 17 00:00:00 2001 From: Nikolaos Karaolidis Date: Tue, 27 May 2025 15:51:59 +0100 Subject: [PATCH 046/901] core: add auto-center arrangements (#10527) Signed-off-by: Nikolaos Karaolidis --- src/Compositor.cpp | 24 ++++++++++++++++++++++++ src/config/ConfigManager.cpp | 12 +++++++++++- src/helpers/Monitor.hpp | 6 +++++- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index c6593923..b4d3aaea 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -2890,6 +2890,30 @@ void CCompositor::arrangeMonitors() { case eAutoDirs::DIR_AUTO_LEFT: newPosition.x = maxXOffsetLeft - m->m_size.x; break; case eAutoDirs::DIR_AUTO_RIGHT: case eAutoDirs::DIR_AUTO_NONE: newPosition.x = maxXOffsetRight; break; + case eAutoDirs::DIR_AUTO_CENTER_UP: { + int width = maxXOffsetRight - maxXOffsetLeft; + newPosition.y = maxYOffsetUp - m->m_size.y; + newPosition.x = maxXOffsetLeft + (width - m->m_size.x) / 2; + break; + } + case eAutoDirs::DIR_AUTO_CENTER_DOWN: { + int width = maxXOffsetRight - maxXOffsetLeft; + newPosition.y = maxYOffsetDown; + newPosition.x = maxXOffsetLeft + (width - m->m_size.x) / 2; + break; + } + case eAutoDirs::DIR_AUTO_CENTER_LEFT: { + int height = maxYOffsetDown - maxYOffsetUp; + newPosition.x = maxXOffsetLeft - m->m_size.x; + newPosition.y = maxYOffsetUp + (height - m->m_size.y) / 2; + break; + } + case eAutoDirs::DIR_AUTO_CENTER_RIGHT: { + int height = maxYOffsetDown - maxYOffsetUp; + newPosition.x = maxXOffsetRight; + newPosition.y = maxYOffsetUp + (height - m->m_size.y) / 2; + break; + } default: UNREACHABLE(); } Debug::log(LOG, "arrangeMonitors: {} auto {:j}", m->m_name, m->m_position); diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index a4f09d65..a79afb35 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -2049,10 +2049,20 @@ std::optional CConfigManager::handleMonitor(const std::string& comm newrule.autoDir = eAutoDirs::DIR_AUTO_UP; else if (ARGS[2] == "auto-down") newrule.autoDir = eAutoDirs::DIR_AUTO_DOWN; + else if (ARGS[2] == "auto-center-right") + newrule.autoDir = eAutoDirs::DIR_AUTO_CENTER_RIGHT; + else if (ARGS[2] == "auto-center-left") + newrule.autoDir = eAutoDirs::DIR_AUTO_CENTER_LEFT; + else if (ARGS[2] == "auto-center-up") + newrule.autoDir = eAutoDirs::DIR_AUTO_CENTER_UP; + else if (ARGS[2] == "auto-center-down") + newrule.autoDir = eAutoDirs::DIR_AUTO_CENTER_DOWN; else { Debug::log(WARN, "Invalid auto direction. Valid options are 'auto'," - "'auto-up', 'auto-down', 'auto-left', and 'auto-right'."); + "'auto-up', 'auto-down', 'auto-left', 'auto-right'," + "'auto-center-up', 'auto-center-down'," + "'auto-center-left', and 'auto-center-right'."); error += "invalid auto direction "; } } else { diff --git a/src/helpers/Monitor.hpp b/src/helpers/Monitor.hpp index 31777b0c..019a5547 100644 --- a/src/helpers/Monitor.hpp +++ b/src/helpers/Monitor.hpp @@ -25,7 +25,11 @@ enum eAutoDirs : uint8_t { DIR_AUTO_UP, DIR_AUTO_DOWN, DIR_AUTO_LEFT, - DIR_AUTO_RIGHT + DIR_AUTO_RIGHT, + DIR_AUTO_CENTER_UP, + DIR_AUTO_CENTER_DOWN, + DIR_AUTO_CENTER_LEFT, + DIR_AUTO_CENTER_RIGHT }; enum eCMType : uint8_t { From 24915a3a9b0bb8c4dc8b5a365cc0bc3a03ee36f0 Mon Sep 17 00:00:00 2001 From: Kamikadze <40305144+Kam1k4dze@users.noreply.github.com> Date: Tue, 27 May 2025 20:10:22 +0500 Subject: [PATCH 047/901] windowrules: Add noscreenshare (#10482) --- src/desktop/Window.hpp | 2 ++ src/protocols/Screencopy.cpp | 54 ++++++++++++++++++++++++++++++++ src/protocols/ToplevelExport.cpp | 17 +++++----- 3 files changed, 66 insertions(+), 7 deletions(-) diff --git a/src/desktop/Window.hpp b/src/desktop/Window.hpp index 0d06b69c..3f73c468 100644 --- a/src/desktop/Window.hpp +++ b/src/desktop/Window.hpp @@ -104,6 +104,7 @@ struct SWindowData { CWindowOverridableVar xray = false; CWindowOverridableVar renderUnfocused = false; CWindowOverridableVar noFollowMouse = false; + CWindowOverridableVar noScreenShare = false; CWindowOverridableVar borderSize = {std::string("general:border_size"), Hyprlang::INT(0), std::nullopt}; CWindowOverridableVar rounding = {std::string("decoration:rounding"), Hyprlang::INT(0), std::nullopt}; @@ -489,6 +490,7 @@ namespace NWindowProperties { {"immediate", [](const PHLWINDOW& pWindow) { return &pWindow->m_windowData.tearing; }}, {"xray", [](const PHLWINDOW& pWindow) { return &pWindow->m_windowData.xray; }}, {"nofollowmouse", [](const PHLWINDOW& pWindow) { return &pWindow->m_windowData.noFollowMouse; }}, + {"noscreenshare", [](const PHLWINDOW& pWindow) { return &pWindow->m_windowData.noScreenShare; }}, }; const std::unordered_map*(const PHLWINDOW&)>> intWindowProperties = { diff --git a/src/protocols/Screencopy.cpp b/src/protocols/Screencopy.cpp index 5fa7c84e..8002776a 100644 --- a/src/protocols/Screencopy.cpp +++ b/src/protocols/Screencopy.cpp @@ -13,6 +13,7 @@ #include "types/Buffer.hpp" #include "../helpers/Format.hpp" #include "../helpers/time/Time.hpp" +#include "XDGShell.hpp" #include #include @@ -200,6 +201,59 @@ void CScreencopyFrame::renderMon() { g_pHyprOpenGL->renderTexture(TEXTURE, monbox, 1); g_pHyprOpenGL->setRenderModifEnabled(true); g_pHyprOpenGL->setMonitorTransformEnabled(false); + + for (auto const& w : g_pCompositor->m_windows) { + if (!w->m_windowData.noScreenShare.valueOrDefault()) + continue; + + if (!g_pHyprRenderer->shouldRenderWindow(w)) + continue; + + const auto PWORKSPACE = w->m_workspace; + + if UNLIKELY (!PWORKSPACE) + continue; + + const auto REALPOS = w->m_realPosition->value() + (w->m_pinned ? Vector2D{} : PWORKSPACE->m_renderOffset->value()); + const auto noScreenShareBox = CBox{REALPOS.x, REALPOS.y, std::max(w->m_realSize->value().x, 5.0), std::max(w->m_realSize->value().y, 5.0)} + .scale(m_monitor->m_scale) + .translate({-m_monitor->m_position.x, -m_monitor->m_position.y}) + .translate({-m_box.x, -m_box.y}); + + const auto dontRound = w->isEffectiveInternalFSMode(FSMODE_FULLSCREEN) || w->m_windowData.noRounding.valueOrDefault(); + const auto rounding = dontRound ? 0 : w->rounding() * m_monitor->m_scale; + const auto roundingPower = dontRound ? 2.0f : w->roundingPower(); + + g_pHyprOpenGL->renderRect(noScreenShareBox, {0, 0, 0, 255}, rounding, roundingPower); + + if (w->m_isX11 || !w->m_popupHead) + continue; + + const auto geom = w->m_xdgSurface->m_current.geometry; + const Vector2D popupBaseOffset = REALPOS - Vector2D{geom.pos().x, geom.pos().y}; + + w->m_popupHead->breadthfirst( + [&](WP popup, void*) { + if (!popup->m_wlSurface || !popup->m_wlSurface->resource() || !popup->m_mapped) + return; + + const auto popRel = popup->coordsRelativeToParent(); + popup->m_wlSurface->resource()->breadthfirst( + [&](SP surf, const Vector2D& localOff, void*) { + const auto size = surf->m_current.size; + const auto surfBox = CBox{popupBaseOffset.x + popRel.x + localOff.x, popupBaseOffset.y + popRel.y + localOff.y, size.x, size.y} + .scale(m_monitor->m_scale) + .translate({-m_monitor->m_position.x, -m_monitor->m_position.y}) + .translate({-m_box.x, -m_box.y}); + + if LIKELY (surfBox.w > 0 && surfBox.h > 0) + g_pHyprOpenGL->renderRect(surfBox, {0, 0, 0, 255}); + }, + nullptr); + }, + nullptr); + } + if (m_overlayCursor) g_pPointerManager->renderSoftwareCursorsFor(m_monitor.lock(), Time::steadyNow(), fakeDamage, g_pInputManager->getMouseCoordsInternal() - m_monitor->m_position - m_box.pos(), true); diff --git a/src/protocols/ToplevelExport.cpp b/src/protocols/ToplevelExport.cpp index e50f1fce..4d0ee0f8 100644 --- a/src/protocols/ToplevelExport.cpp +++ b/src/protocols/ToplevelExport.cpp @@ -257,10 +257,11 @@ bool CToplevelExportFrame::copyShm(const Time::steady_tp& now) { // render client at 0,0 if (PERM == PERMISSION_RULE_ALLOW_MODE_ALLOW) { - g_pHyprRenderer->m_bBlockSurfaceFeedback = g_pHyprRenderer->shouldRenderWindow(m_window); // block the feedback to avoid spamming the surface if it's visible - g_pHyprRenderer->renderWindow(m_window, PMONITOR, now, false, RENDER_PASS_ALL, true, true); - g_pHyprRenderer->m_bBlockSurfaceFeedback = false; - + if (!m_window->m_windowData.noScreenShare.valueOrDefault()) { + g_pHyprRenderer->m_bBlockSurfaceFeedback = g_pHyprRenderer->shouldRenderWindow(m_window); // block the feedback to avoid spamming the surface if it's visible + g_pHyprRenderer->renderWindow(m_window, PMONITOR, now, false, RENDER_PASS_ALL, true, true); + g_pHyprRenderer->m_bBlockSurfaceFeedback = false; + } if (overlayCursor) g_pPointerManager->renderSoftwareCursorsFor(PMONITOR->m_self.lock(), now, fakeDamage, g_pInputManager->getMouseCoordsInternal() - m_window->m_realPosition->value()); } else if (PERM == PERMISSION_RULE_ALLOW_MODE_DENY) { @@ -338,9 +339,11 @@ bool CToplevelExportFrame::copyDmabuf(const Time::steady_tp& now) { g_pHyprOpenGL->clear(CHyprColor(0, 0, 0, 1.0)); if (PERM == PERMISSION_RULE_ALLOW_MODE_ALLOW) { - g_pHyprRenderer->m_bBlockSurfaceFeedback = g_pHyprRenderer->shouldRenderWindow(m_window); // block the feedback to avoid spamming the surface if it's visible - g_pHyprRenderer->renderWindow(m_window, PMONITOR, now, false, RENDER_PASS_ALL, true, true); - g_pHyprRenderer->m_bBlockSurfaceFeedback = false; + if (!m_window->m_windowData.noScreenShare.valueOrDefault()) { + g_pHyprRenderer->m_bBlockSurfaceFeedback = g_pHyprRenderer->shouldRenderWindow(m_window); // block the feedback to avoid spamming the surface if it's visible + g_pHyprRenderer->renderWindow(m_window, PMONITOR, now, false, RENDER_PASS_ALL, true, true); + g_pHyprRenderer->m_bBlockSurfaceFeedback = false; + } if (overlayCursor) g_pPointerManager->renderSoftwareCursorsFor(PMONITOR->m_self.lock(), now, fakeDamage, g_pInputManager->getMouseCoordsInternal() - m_window->m_realPosition->value()); From 9b327ddfd1ad4cfef7a04a178e9f0aed16e95e0a Mon Sep 17 00:00:00 2001 From: vaxerski Date: Tue, 27 May 2025 21:26:47 +0200 Subject: [PATCH 048/901] monitor: mark 0, 0 presentation timestamps as invalid fixes #10562 --- src/helpers/Monitor.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index 72a221f5..d7536a39 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -74,11 +74,16 @@ void CMonitor::onConnect(bool noRule) { auto E = std::any_cast(d); timespec* ts = E.when; - if (!ts) { - timespec now; - clock_gettime(CLOCK_MONOTONIC, &now); - PROTO::presentation->onPresented(m_self.lock(), Time::fromTimespec(&now), E.refresh, E.seq, E.flags); - } else + + if (ts && ts->tv_sec <= 2) { + // drop this timestamp, it's not valid. Likely drm is cringe. We can't push it further because + // a) it's wrong, b) our translations aren't 100% accurate and risk underflows + ts = nullptr; + } + + if (!ts) + PROTO::presentation->onPresented(m_self.lock(), Time::steadyNow(), E.refresh, E.seq, E.flags); + else PROTO::presentation->onPresented(m_self.lock(), Time::fromTimespec(E.when), E.refresh, E.seq, E.flags); }); From 5cc6cb49458634bd277ada22dfffe6f189cd7d34 Mon Sep 17 00:00:00 2001 From: vaxerski Date: Wed, 28 May 2025 15:18:30 +0200 Subject: [PATCH 049/901] groupbar: force recalc on visibility changes fixes #10566 --- .../decorations/CHyprGroupBarDecoration.cpp | 17 ++++++++++++----- .../decorations/CHyprGroupBarDecoration.hpp | 3 +++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/render/decorations/CHyprGroupBarDecoration.cpp b/src/render/decorations/CHyprGroupBarDecoration.cpp index 84060e0d..65d7d7ff 100644 --- a/src/render/decorations/CHyprGroupBarDecoration.cpp +++ b/src/render/decorations/CHyprGroupBarDecoration.cpp @@ -29,7 +29,6 @@ SDecorationPositioningInfo CHyprGroupBarDecoration::getPositioningInfo() { static auto PHEIGHT = CConfigValue("group:groupbar:height"); static auto PINDICATORGAP = CConfigValue("group:groupbar:indicator_gap"); static auto PINDICATORHEIGHT = CConfigValue("group:groupbar:indicator_height"); - static auto PENABLED = CConfigValue("group:groupbar:enabled"); static auto PRENDERTITLES = CConfigValue("group:groupbar:render_titles"); static auto PGRADIENTS = CConfigValue("group:groupbar:gradients"); static auto PPRIORITY = CConfigValue("group:groupbar:priority"); @@ -43,7 +42,7 @@ SDecorationPositioningInfo CHyprGroupBarDecoration::getPositioningInfo() { info.priority = *PPRIORITY; info.reserved = true; - if (*PENABLED && m_window->m_windowData.decorate.valueOrDefault()) { + if (visible()) { if (*PSTACKED) { const auto ONEBARHEIGHT = *POUTERGAP + *PINDICATORHEIGHT + *PINDICATORGAP + (*PGRADIENTS || *PRENDERTITLES ? *PHEIGHT : 0); info.desiredExtents = {{0, (ONEBARHEIGHT * m_dwGroupMembers.size()) + (*PKEEPUPPERGAP * *POUTERGAP)}, {0, 0}}; @@ -96,11 +95,14 @@ void CHyprGroupBarDecoration::damageEntire() { void CHyprGroupBarDecoration::draw(PHLMONITOR pMonitor, float const& a) { // get how many bars we will draw - int barsToDraw = m_dwGroupMembers.size(); + int barsToDraw = m_dwGroupMembers.size(); - static auto PENABLED = CConfigValue("group:groupbar:enabled"); + const bool VISIBLE = visible(); - if (!*PENABLED || !m_window->m_windowData.decorate.valueOrDefault()) + if (VISIBLE != m_bLastVisibilityStatus) + g_pDecorationPositioner->repositionDeco(this); + + if (!VISIBLE) return; static auto PRENDERTITLES = CConfigValue("group:groupbar:render_titles"); @@ -583,3 +585,8 @@ CBox CHyprGroupBarDecoration::assignedBoxGlobal() { return box.round(); } + +bool CHyprGroupBarDecoration::visible() { + static auto PENABLED = CConfigValue("group:groupbar:enabled"); + return *PENABLED && m_window->m_windowData.decorate.valueOrDefault(); +} diff --git a/src/render/decorations/CHyprGroupBarDecoration.hpp b/src/render/decorations/CHyprGroupBarDecoration.hpp index feb304f2..5e1abc5a 100644 --- a/src/render/decorations/CHyprGroupBarDecoration.hpp +++ b/src/render/decorations/CHyprGroupBarDecoration.hpp @@ -56,10 +56,13 @@ class CHyprGroupBarDecoration : public IHyprWindowDecoration { float m_barWidth; float m_barHeight; + bool m_bLastVisibilityStatus = true; + CTitleTex* textureFromTitle(const std::string&); void invalidateTextures(); CBox assignedBoxGlobal(); + bool visible(); bool onBeginWindowDragOnDeco(const Vector2D&); bool onEndWindowDragOnDeco(const Vector2D&, PHLWINDOW); From 9bf1b491440eac6f9c0d6853013ad5666c12d1d9 Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Wed, 28 May 2025 21:20:03 +0800 Subject: [PATCH 050/901] snap: add option to respect gaps (#10524) --- src/config/ConfigDescriptions.hpp | 6 ++++ src/config/ConfigManager.cpp | 1 + src/layout/IHyprLayout.cpp | 48 +++++++++++++++++++------------ 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/config/ConfigDescriptions.hpp b/src/config/ConfigDescriptions.hpp index 5e18233d..a77cf757 100644 --- a/src/config/ConfigDescriptions.hpp +++ b/src/config/ConfigDescriptions.hpp @@ -128,6 +128,12 @@ inline static const std::vector CONFIG_OPTIONS = { .type = CONFIG_OPTION_BOOL, .data = SConfigOptionDescription::SBoolData{false}, }, + SConfigOptionDescription{ + .value = "general:snap:respect_gaps", + .description = "if true, snapping will respect gaps between windows", + .type = CONFIG_OPTION_BOOL, + .data = SConfigOptionDescription::SBoolData{false}, + }, /* * decoration: diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index a79afb35..acbc0262 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -456,6 +456,7 @@ CConfigManager::CConfigManager() { registerConfigVar("general:snap:window_gap", Hyprlang::INT{10}); registerConfigVar("general:snap:monitor_gap", Hyprlang::INT{10}); registerConfigVar("general:snap:border_overlap", Hyprlang::INT{0}); + registerConfigVar("general:snap:respect_gaps", Hyprlang::INT{0}); registerConfigVar("general:col.active_border", Hyprlang::CConfigCustomValueType{&configHandleGradientSet, configHandleGradientDestroy, "0xffffffff"}); registerConfigVar("general:col.inactive_border", Hyprlang::CConfigCustomValueType{&configHandleGradientSet, configHandleGradientDestroy, "0xff444444"}); registerConfigVar("general:col.nogroup_border", Hyprlang::CConfigCustomValueType{&configHandleGradientSet, configHandleGradientDestroy, "0xffffaaff"}); diff --git a/src/layout/IHyprLayout.cpp b/src/layout/IHyprLayout.cpp index 93b09c87..1fe3a936 100644 --- a/src/layout/IHyprLayout.cpp +++ b/src/layout/IHyprLayout.cpp @@ -417,6 +417,7 @@ static void performSnap(Vector2D& sourcePos, Vector2D& sourceSize, PHLWINDOW DRA static auto SNAPWINDOWGAP = CConfigValue("general:snap:window_gap"); static auto SNAPMONITORGAP = CConfigValue("general:snap:monitor_gap"); static auto SNAPBORDEROVERLAP = CConfigValue("general:snap:border_overlap"); + static auto SNAPRESPECTGAPS = CConfigValue("general:snap:respect_gaps"); const SnapFn SNAP = (MODE == MBIND_MOVE) ? snapMove : snapResize; int snaps = 0; @@ -444,9 +445,15 @@ static void performSnap(Vector2D& sourcePos, Vector2D& sourceSize, PHLWINDOW DRA const int OTHERBORDERSIZE = other->getRealBorderSize(); const double BORDERSIZE = OVERLAP ? std::max(DRAGGINGBORDERSIZE, OTHERBORDERSIZE) : (DRAGGINGBORDERSIZE + OTHERBORDERSIZE); - const CBox SURF = other->getWindowMainSurfaceBox(); - const SRange SURFBX = {SURF.x - BORDERSIZE, SURF.x + SURF.w + BORDERSIZE}; - const SRange SURFBY = {SURF.y - BORDERSIZE, SURF.y + SURF.h + BORDERSIZE}; + const CBox SURF = other->getWindowMainSurfaceBox(); + double gapOffset = 0; + if (*SNAPRESPECTGAPS) { + static auto PGAPSINDATA = CConfigValue("general:gaps_in"); + auto* PGAPSINPTR = (CCssGapData*)(PGAPSINDATA.ptr())->getData(); + gapOffset = std::max({PGAPSINPTR->m_left, PGAPSINPTR->m_right, PGAPSINPTR->m_top, PGAPSINPTR->m_bottom}); + } + const SRange SURFBX = {SURF.x - BORDERSIZE - gapOffset, SURF.x + SURF.w + BORDERSIZE + gapOffset}; + const SRange SURFBY = {SURF.y - BORDERSIZE - gapOffset, SURF.y + SURF.h + BORDERSIZE + gapOffset}; // only snap windows if their ranges overlap in the opposite axis if (sourceY.start <= SURFBY.end && SURFBY.start <= sourceY.end) { @@ -497,32 +504,37 @@ static void performSnap(Vector2D& sourcePos, Vector2D& sourceSize, PHLWINDOW DRA const double GAPSIZE = *SNAPMONITORGAP; const double BORDERDIFF = OVERLAP ? DRAGGINGBORDERSIZE : 0; const auto MON = DRAGGINGWINDOW->m_monitor.lock(); - - SRange monX = {MON->m_position.x + MON->m_reservedTopLeft.x + DRAGGINGBORDERSIZE, MON->m_position.x + MON->m_size.x - MON->m_reservedBottomRight.x - DRAGGINGBORDERSIZE}; - SRange monY = {MON->m_position.y + MON->m_reservedTopLeft.y + DRAGGINGBORDERSIZE, MON->m_position.y + MON->m_size.y - MON->m_reservedBottomRight.y - DRAGGINGBORDERSIZE}; + double gapOffset = 0; + if (*SNAPRESPECTGAPS) { + static auto PGAPSOUTDATA = CConfigValue("general:gaps_out"); + auto* PGAPSOUTPTR = (CCssGapData*)(PGAPSOUTDATA.ptr())->getData(); + gapOffset = std::max({PGAPSOUTPTR->m_left, PGAPSOUTPTR->m_right, PGAPSOUTPTR->m_top, PGAPSOUTPTR->m_bottom}); + } if (CORNER & (CORNER_TOPLEFT | CORNER_BOTTOMLEFT) && - ((MON->m_reservedTopLeft.x > 0 && canSnap(sourceX.start, monX.start, GAPSIZE)) || - canSnap(sourceX.start, (monX.start -= MON->m_reservedTopLeft.x + BORDERDIFF), GAPSIZE))) { - SNAP(sourceX.start, sourceX.end, monX.start); + ((MON->m_reservedTopLeft.x > 0 && canSnap(sourceX.start, MON->m_position.x + MON->m_reservedTopLeft.x + DRAGGINGBORDERSIZE + gapOffset, GAPSIZE)) || + canSnap(sourceX.start, MON->m_position.x + MON->m_reservedTopLeft.x - BORDERDIFF + gapOffset, GAPSIZE))) { + SNAP(sourceX.start, sourceX.end, MON->m_position.x + MON->m_reservedTopLeft.x + DRAGGINGBORDERSIZE + gapOffset); snaps |= SNAP_LEFT; } if (CORNER & (CORNER_TOPRIGHT | CORNER_BOTTOMRIGHT) && - ((MON->m_reservedBottomRight.x > 0 && canSnap(sourceX.end, monX.end, GAPSIZE)) || - canSnap(sourceX.end, (monX.end += MON->m_reservedBottomRight.x + BORDERDIFF), GAPSIZE))) { - SNAP(sourceX.end, sourceX.start, monX.end); + ((MON->m_reservedBottomRight.x > 0 && + canSnap(sourceX.end, MON->m_position.x + MON->m_size.x - MON->m_reservedBottomRight.x - DRAGGINGBORDERSIZE - gapOffset, GAPSIZE)) || + canSnap(sourceX.end, MON->m_position.x + MON->m_size.x - MON->m_reservedBottomRight.x + BORDERDIFF - gapOffset, GAPSIZE))) { + SNAP(sourceX.end, sourceX.start, MON->m_position.x + MON->m_size.x - MON->m_reservedBottomRight.x - DRAGGINGBORDERSIZE - gapOffset); snaps |= SNAP_RIGHT; } if (CORNER & (CORNER_TOPLEFT | CORNER_TOPRIGHT) && - ((MON->m_reservedTopLeft.y > 0 && canSnap(sourceY.start, monY.start, GAPSIZE)) || - canSnap(sourceY.start, (monY.start -= MON->m_reservedTopLeft.y + BORDERDIFF), GAPSIZE))) { - SNAP(sourceY.start, sourceY.end, monY.start); + ((MON->m_reservedTopLeft.y > 0 && canSnap(sourceY.start, MON->m_position.y + MON->m_reservedTopLeft.y + DRAGGINGBORDERSIZE + gapOffset, GAPSIZE)) || + canSnap(sourceY.start, MON->m_position.y + MON->m_reservedTopLeft.y - BORDERDIFF + gapOffset, GAPSIZE))) { + SNAP(sourceY.start, sourceY.end, MON->m_position.y + MON->m_reservedTopLeft.y + DRAGGINGBORDERSIZE + gapOffset); snaps |= SNAP_UP; } if (CORNER & (CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT) && - ((MON->m_reservedBottomRight.y > 0 && canSnap(sourceY.end, monY.end, GAPSIZE)) || - canSnap(sourceY.end, (monY.end += MON->m_reservedBottomRight.y + BORDERDIFF), GAPSIZE))) { - SNAP(sourceY.end, sourceY.start, monY.end); + ((MON->m_reservedBottomRight.y > 0 && + canSnap(sourceY.end, MON->m_position.y + MON->m_size.y - MON->m_reservedBottomRight.y - DRAGGINGBORDERSIZE - gapOffset, GAPSIZE)) || + canSnap(sourceY.end, MON->m_position.y + MON->m_size.y - MON->m_reservedBottomRight.y + BORDERDIFF - gapOffset, GAPSIZE))) { + SNAP(sourceY.end, sourceY.start, MON->m_position.y + MON->m_size.y - MON->m_reservedBottomRight.y - DRAGGINGBORDERSIZE - gapOffset); snaps |= SNAP_DOWN; } } From 9190443d951c21ab24201d033accf90b4d172f46 Mon Sep 17 00:00:00 2001 From: Kamikadze <40305144+Kam1k4dze@users.noreply.github.com> Date: Fri, 30 May 2025 18:25:59 +0500 Subject: [PATCH 051/901] refactor: use std::ranges whenever possible (#10584) --- src/Compositor.cpp | 4 ++-- src/config/ConfigDataValues.hpp | 2 +- src/config/ConfigManager.cpp | 12 +++++----- src/debug/HyprCtl.cpp | 11 ++++----- src/debug/HyprNotificationOverlay.cpp | 2 +- src/desktop/Window.cpp | 3 ++- src/devices/IKeyboard.cpp | 2 +- src/events/Windows.cpp | 2 +- src/helpers/MiscFunctions.cpp | 8 +++---- src/helpers/Monitor.cpp | 12 ++++++---- src/hyprerror/HyprError.cpp | 2 +- src/layout/MasterLayout.cpp | 23 +++++++++---------- src/managers/AnimationManager.cpp | 2 +- src/managers/CursorManager.cpp | 2 +- src/managers/EventManager.cpp | 2 +- src/managers/HookSystemManager.cpp | 2 +- src/managers/KeybindManager.cpp | 13 ++++------- src/managers/LayoutManager.cpp | 4 ++-- src/managers/PointerManager.cpp | 2 +- src/managers/SeatManager.cpp | 2 +- src/managers/XCursorManager.cpp | 8 +++---- src/managers/input/InputManager.cpp | 12 +++++----- src/protocols/AlphaModifier.cpp | 2 +- src/protocols/ColorManagement.cpp | 4 ++-- src/protocols/DRMLease.cpp | 6 ++--- src/protocols/DataDeviceWlr.cpp | 6 ++--- src/protocols/FocusGrab.cpp | 4 ++-- src/protocols/ForeignToplevel.cpp | 2 +- src/protocols/ForeignToplevelWlr.cpp | 2 +- src/protocols/HyprlandSurface.cpp | 2 +- src/protocols/LayerShell.cpp | 2 +- src/protocols/LinuxDMABUF.cpp | 16 ++++++------- src/protocols/PointerConstraints.cpp | 2 +- src/protocols/PrimarySelection.cpp | 6 ++--- src/protocols/SecurityContext.cpp | 2 +- src/protocols/VirtualKeyboard.cpp | 2 +- src/protocols/XDGActivation.cpp | 5 ++-- src/protocols/XDGShell.cpp | 8 +++---- src/protocols/XXColorManagement.cpp | 4 ++-- src/protocols/core/Compositor.cpp | 4 ++-- src/protocols/core/DataDevice.cpp | 6 ++--- src/protocols/core/Seat.cpp | 4 ++-- src/protocols/core/Shm.cpp | 2 +- src/protocols/core/Subcompositor.cpp | 14 +++++------ src/render/OpenGL.cpp | 8 +++---- src/render/Renderer.cpp | 10 ++++---- .../decorations/DecorationPositioner.cpp | 16 ++++++------- src/render/pass/Pass.cpp | 2 +- src/xwayland/XSurface.cpp | 2 +- src/xwayland/XWM.cpp | 8 +++---- 50 files changed, 137 insertions(+), 146 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index b4d3aaea..8d53f3d8 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -1724,13 +1724,13 @@ static PHLWINDOW getWeakWindowPred(Iterator cur, Iterator end, Iterator begin, c PHLWINDOW CCompositor::getWindowCycleHist(PHLWINDOWREF cur, bool focusableOnly, std::optional floating, bool visible, bool next) { const auto FINDER = [&](const PHLWINDOWREF& w) { return isWindowAvailableForCycle(cur, w, focusableOnly, floating, visible); }; // also m_vWindowFocusHistory has reverse order, so when it is next - we need to reverse again - return next ? getWeakWindowPred(std::ranges::find(std::ranges::reverse_view(m_windowFocusHistory), cur), m_windowFocusHistory.rend(), m_windowFocusHistory.rbegin(), FINDER) : + return next ? getWeakWindowPred(std::ranges::find(m_windowFocusHistory | std::views::reverse, cur), m_windowFocusHistory.rend(), m_windowFocusHistory.rbegin(), FINDER) : getWeakWindowPred(std::ranges::find(m_windowFocusHistory, cur), m_windowFocusHistory.end(), m_windowFocusHistory.begin(), FINDER); } PHLWINDOW CCompositor::getWindowCycle(PHLWINDOW cur, bool focusableOnly, std::optional floating, bool visible, bool prev) { const auto FINDER = [&](const PHLWINDOW& w) { return isWindowAvailableForCycle(cur, w, focusableOnly, floating, visible); }; - return prev ? getWindowPred(std::ranges::find(std::ranges::reverse_view(m_windows), cur), m_windows.rend(), m_windows.rbegin(), FINDER) : + return prev ? getWindowPred(std::ranges::find(m_windows | std::views::reverse, cur), m_windows.rend(), m_windows.rbegin(), FINDER) : getWindowPred(std::ranges::find(m_windows, cur), m_windows.end(), m_windows.begin(), FINDER); } diff --git a/src/config/ConfigDataValues.hpp b/src/config/ConfigDataValues.hpp index 2fad9277..d17e7672 100644 --- a/src/config/ConfigDataValues.hpp +++ b/src/config/ConfigDataValues.hpp @@ -158,7 +158,7 @@ class CFontWeightConfigValueData : public ICustomConfigValueData { void parseWeight(const std::string& strWeight) { auto lcWeight{strWeight}; - transform(strWeight.begin(), strWeight.end(), lcWeight.begin(), ::tolower); + std::ranges::transform(strWeight, lcWeight.begin(), ::tolower); // values taken from Pango weight enums const auto WEIGHTS = std::map{ diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index acbc0262..3ab53a3c 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -1651,7 +1651,7 @@ Hyprlang::CConfigValue* CConfigManager::getHyprlangConfigValuePtr(const std::str bool CConfigManager::deviceConfigExists(const std::string& dev) { auto copy = dev; - std::replace(copy.begin(), copy.end(), ' ', '-'); + std::ranges::replace(copy, ' ', '-'); return m_config->specialCategoryExistsForKey("device", copy.c_str()); } @@ -1902,7 +1902,7 @@ static bool parseModeLine(const std::string& modeline, drmModeModeInfo& mode) { auto args = CVarList(modeline, 0, 's'); auto keyword = args[0]; - std::transform(keyword.begin(), keyword.end(), keyword.begin(), ::tolower); + std::ranges::transform(keyword, keyword.begin(), ::tolower); if (keyword != "modeline") return false; @@ -1938,7 +1938,7 @@ static bool parseModeLine(const std::string& modeline, drmModeModeInfo& mode) { for (; argno < static_cast(args.size()); argno++) { auto key = args[argno]; - std::transform(key.begin(), key.end(), key.begin(), ::tolower); + std::ranges::transform(key, key.begin(), ::tolower); auto it = flagsmap.find(key); @@ -2375,7 +2375,7 @@ std::optional CConfigManager::handleBind(const std::string& command HANDLER = "mouse"; // to lower - std::transform(HANDLER.begin(), HANDLER.end(), HANDLER.begin(), ::tolower); + std::ranges::transform(HANDLER, HANDLER.begin(), ::tolower); const auto DISPATCHER = g_pKeybindManager->m_dispatchers.find(HANDLER); @@ -2798,7 +2798,7 @@ std::optional CConfigManager::handleWorkspaceRules(const std::strin wsRule.workspaceId = id; wsRule.workspaceName = name; - const auto IT = std::find_if(m_workspaceRules.begin(), m_workspaceRules.end(), [&](const auto& other) { return other.workspaceString == wsRule.workspaceString; }); + const auto IT = std::ranges::find_if(m_workspaceRules, [&](const auto& other) { return other.workspaceString == wsRule.workspaceString; }); if (IT == m_workspaceRules.end()) m_workspaceRules.emplace_back(wsRule); @@ -2896,7 +2896,7 @@ std::optional CConfigManager::handleEnv(const std::string& command, } std::optional CConfigManager::handlePlugin(const std::string& command, const std::string& path) { - if (std::find(m_declaredPlugins.begin(), m_declaredPlugins.end(), path) != m_declaredPlugins.end()) + if (std::ranges::find(m_declaredPlugins, path) != m_declaredPlugins.end()) return "plugin '" + path + "' declared twice"; m_declaredPlugins.push_back(path); diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp index adfbab1e..c8cc5c59 100644 --- a/src/debug/HyprCtl.cpp +++ b/src/debug/HyprCtl.cpp @@ -216,10 +216,10 @@ static std::string getTagsData(PHLWINDOW w, eHyprCtlOutputFormat format) { const auto tags = w->m_tags.getTags(); if (format == eHyprCtlOutputFormat::FORMAT_JSON) - return std::accumulate(tags.begin(), tags.end(), std::string(), - [](const std::string& a, const std::string& b) { return a.empty() ? std::format("\"{}\"", b) : std::format("{}, \"{}\"", a, b); }); + return std::ranges::fold_left(tags, std::string(), + [](const std::string& a, const std::string& b) { return a.empty() ? std::format("\"{}\"", b) : std::format("{}, \"{}\"", a, b); }); else - return std::accumulate(tags.begin(), tags.end(), std::string(), [](const std::string& a, const std::string& b) { return a.empty() ? b : a + ", " + b; }); + return std::ranges::fold_left(tags, std::string(), [](const std::string& a, const std::string& b) { return a.empty() ? b : a + ", " + b; }); } static std::string getGroupedData(PHLWINDOW w, eHyprCtlOutputFormat format) { @@ -921,7 +921,7 @@ static std::string bindsRequest(eHyprCtlOutputFormat format, std::string request std::string versionRequest(eHyprCtlOutputFormat format, std::string request) { auto commitMsg = trim(GIT_COMMIT_MESSAGE); - std::replace(commitMsg.begin(), commitMsg.end(), '#', ' '); + std::ranges::replace(commitMsg, '#', ' '); if (format == eHyprCtlOutputFormat::FORMAT_NORMAL) { std::string result = std::format("Hyprland {} built from branch {} at commit {} {} ({}).\n" @@ -1296,8 +1296,7 @@ static std::string switchXKBLayoutRequest(eHyprCtlOutputFormat format, std::stri } return result.empty() ? "ok" : result; } else { - auto k = std::find_if(g_pInputManager->m_keyboards.begin(), g_pInputManager->m_keyboards.end(), - [&](const auto& other) { return other->m_hlName == g_pInputManager->deviceNameToInternalString(KB); }); + auto k = std::ranges::find_if(g_pInputManager->m_keyboards, [&](const auto& other) { return other->m_hlName == g_pInputManager->deviceNameToInternalString(KB); }); if (k == g_pInputManager->m_keyboards.end()) return "device not found"; diff --git a/src/debug/HyprNotificationOverlay.cpp b/src/debug/HyprNotificationOverlay.cpp index 4e17e797..bfa5c4e4 100644 --- a/src/debug/HyprNotificationOverlay.cpp +++ b/src/debug/HyprNotificationOverlay.cpp @@ -13,7 +13,7 @@ static inline auto iconBackendFromLayout(PangoLayout* layout) { // preference: Nerd > FontAwesome > text auto eIconBackendChecks = std::array{ICONS_BACKEND_NF, ICONS_BACKEND_FA}; for (auto iconID : eIconBackendChecks) { - auto iconsText = std::accumulate(ICONS_ARRAY[iconID].begin(), ICONS_ARRAY[iconID].end(), std::string()); + auto iconsText = std::ranges::fold_left(ICONS_ARRAY[iconID], std::string(), std::plus<>()); pango_layout_set_text(layout, iconsText.c_str(), -1); if (pango_layout_get_unknown_glyphs_count(layout) == 0) return iconID; diff --git a/src/desktop/Window.cpp b/src/desktop/Window.cpp index 9f69e364..cc3c9390 100644 --- a/src/desktop/Window.cpp +++ b/src/desktop/Window.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -1507,7 +1508,7 @@ std::string CWindow::fetchClass() { } void CWindow::onAck(uint32_t serial) { - const auto SERIAL = std::ranges::find_if(m_pendingSizeAcks.rbegin(), m_pendingSizeAcks.rend(), [serial](const auto& e) { return e.first == serial; }); + const auto SERIAL = std::ranges::find_if(m_pendingSizeAcks | std::views::reverse, [serial](const auto& e) { return e.first == serial; }); if (SERIAL == m_pendingSizeAcks.rend()) return; diff --git a/src/devices/IKeyboard.cpp b/src/devices/IKeyboard.cpp index 597724a6..89ad8c16 100644 --- a/src/devices/IKeyboard.cpp +++ b/src/devices/IKeyboard.cpp @@ -379,7 +379,7 @@ bool IKeyboard::updateModifiersState() { void IKeyboard::updateXkbStateWithKey(uint32_t xkbKey, bool pressed) { - const auto contains = std::find(m_pressedXKB.begin(), m_pressedXKB.end(), xkbKey) != m_pressedXKB.end(); + const auto contains = std::ranges::find(m_pressedXKB, xkbKey) != m_pressedXKB.end(); if (contains && pressed) return; diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index 4bf54ca8..b019adff 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -742,7 +742,7 @@ void Events::listener_unmapWindow(void* owner, void* data) { EMIT_HOOK_EVENT("closeWindow", PWINDOW); if (PWINDOW->m_isFloating && !PWINDOW->m_isX11 && - std::any_of(PWINDOW->m_matchedRules.begin(), PWINDOW->m_matchedRules.end(), [](const auto& r) { return r->m_ruleType == CWindowRule::RULE_PERSISTENTSIZE; })) { + std::ranges::any_of(PWINDOW->m_matchedRules, [](const auto& r) { return r->m_ruleType == CWindowRule::RULE_PERSISTENTSIZE; })) { Debug::log(LOG, "storing floating size {}x{} for window {}::{} on close", PWINDOW->m_realSize->value().x, PWINDOW->m_realSize->value().y, PWINDOW->m_class, PWINDOW->m_title); g_pConfigManager->storeFloatingSize(PWINDOW, PWINDOW->m_realSize->value()); diff --git a/src/helpers/MiscFunctions.cpp b/src/helpers/MiscFunctions.cpp index ed67618e..ddd16144 100644 --- a/src/helpers/MiscFunctions.cpp +++ b/src/helpers/MiscFunctions.cpp @@ -243,7 +243,7 @@ SWorkspaceIDName getWorkspaceIDNameFromString(const std::string& in) { namedWSes.push_back(ws->m_id); } - std::sort(namedWSes.begin(), namedWSes.end()); + std::ranges::sort(namedWSes); if (absolute) { // 1-index @@ -388,7 +388,7 @@ SWorkspaceIDName getWorkspaceIDNameFromString(const std::string& in) { validWSes.push_back(ws->m_id); } - std::sort(validWSes.begin(), validWSes.end()); + std::ranges::sort(validWSes); ssize_t currentItem = -1; @@ -623,7 +623,7 @@ std::expected configStringToInt(const std::string& VALUE) const auto VALUEWITHOUTFUNC = trim(VALUE.substr(5, VALUE.length() - 6)); // try doing it the comma way first - if (std::count(VALUEWITHOUTFUNC.begin(), VALUEWITHOUTFUNC.end(), ',') == 3) { + if (std::ranges::count(VALUEWITHOUTFUNC, ',') == 3) { // cool std::string rolling = VALUEWITHOUTFUNC; auto r = configStringToInt(trim(rolling.substr(0, rolling.find(',')))); @@ -657,7 +657,7 @@ std::expected configStringToInt(const std::string& VALUE) const auto VALUEWITHOUTFUNC = trim(VALUE.substr(4, VALUE.length() - 5)); // try doing it the comma way first - if (std::count(VALUEWITHOUTFUNC.begin(), VALUEWITHOUTFUNC.end(), ',') == 2) { + if (std::ranges::count(VALUEWITHOUTFUNC, ',') == 2) { // cool std::string rolling = VALUEWITHOUTFUNC; auto r = configStringToInt(trim(rolling.substr(0, rolling.find(',')))); diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index d7536a39..5afd0123 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -32,6 +32,8 @@ #include #include #include +#include +#include using namespace Hyprutils::String; using namespace Hyprutils::Utils; @@ -189,7 +191,7 @@ void CMonitor::onConnect(bool noRule) { RASSERT(thisWrapper->get(), "CMonitor::onConnect: Had no wrapper???"); - if (std::find_if(g_pCompositor->m_monitors.begin(), g_pCompositor->m_monitors.end(), [&](auto& other) { return other.get() == this; }) == g_pCompositor->m_monitors.end()) + if (std::ranges::find_if(g_pCompositor->m_monitors, [&](auto& other) { return other.get() == this; }) == g_pCompositor->m_monitors.end()) g_pCompositor->m_monitors.push_back(*thisWrapper); m_enabled = true; @@ -320,7 +322,7 @@ void CMonitor::onDisconnect(bool destroy) { // remove mirror if (m_mirrorOf) { - m_mirrorOf->m_mirrors.erase(std::find_if(m_mirrorOf->m_mirrors.begin(), m_mirrorOf->m_mirrors.end(), [&](const auto& other) { return other == m_self; })); + m_mirrorOf->m_mirrors.erase(std::ranges::find_if(m_mirrorOf->m_mirrors, [&](const auto& other) { return other == m_self; })); // unlock software for mirrored monitor g_pPointerManager->unlockSoftwareForMonitor(m_mirrorOf.lock()); @@ -486,7 +488,7 @@ bool CMonitor::applyMonitorRule(SMonitorRule* pMonitorRule, bool force) { std::ranges::sort(sortedModes, sortFunc); if (sortedModes.size() > 3) sortedModes.erase(sortedModes.begin() + 3, sortedModes.end()); - requestedModes.insert(requestedModes.end(), sortedModes.rbegin(), sortedModes.rend()); + requestedModes.insert_range(requestedModes.end(), sortedModes | std::views::reverse); }; // last fallback is always preferred mode @@ -1019,7 +1021,7 @@ void CMonitor::setMirror(const std::string& mirrorOf) { // disable mirroring if (m_mirrorOf) { - m_mirrorOf->m_mirrors.erase(std::find_if(m_mirrorOf->m_mirrors.begin(), m_mirrorOf->m_mirrors.end(), [&](const auto& other) { return other == m_self; })); + m_mirrorOf->m_mirrors.erase(std::ranges::find_if(m_mirrorOf->m_mirrors, [&](const auto& other) { return other == m_self; })); // unlock software for mirrored monitor g_pPointerManager->unlockSoftwareForMonitor(m_mirrorOf.lock()); @@ -1046,7 +1048,7 @@ void CMonitor::setMirror(const std::string& mirrorOf) { RASSERT(thisWrapper->get(), "CMonitor::setMirror: Had no wrapper???"); - if (std::find_if(g_pCompositor->m_monitors.begin(), g_pCompositor->m_monitors.end(), [&](auto& other) { return other.get() == this; }) == g_pCompositor->m_monitors.end()) { + if (std::ranges::find_if(g_pCompositor->m_monitors, [&](auto& other) { return other.get() == this; }) == g_pCompositor->m_monitors.end()) { g_pCompositor->m_monitors.push_back(*thisWrapper); } diff --git a/src/hyprerror/HyprError.cpp b/src/hyprerror/HyprError.cpp index 614fdd2e..22744c93 100644 --- a/src/hyprerror/HyprError.cpp +++ b/src/hyprerror/HyprError.cpp @@ -63,7 +63,7 @@ void CHyprError::createQueued() { cairo_paint(CAIRO); cairo_restore(CAIRO); - const auto LINECOUNT = Hyprlang::INT{1} + std::count(m_queued.begin(), m_queued.end(), '\n'); + const auto LINECOUNT = Hyprlang::INT{1} + std::ranges::count(m_queued, '\n'); static auto LINELIMIT = CConfigValue("debug:error_limit"); static auto BAR_POSITION = CConfigValue("debug:error_position"); diff --git a/src/layout/MasterLayout.cpp b/src/layout/MasterLayout.cpp index 065dcdc2..cb1313a8 100644 --- a/src/layout/MasterLayout.cpp +++ b/src/layout/MasterLayout.cpp @@ -94,7 +94,7 @@ void CHyprMasterLayout::onWindowCreatedTiling(PHLWINDOW pWindow, eDirection dire if (*PNEWONACTIVE != "none" && !BNEWISMASTER) { const auto pLastNode = getNodeFromWindow(g_pCompositor->m_lastWindow.lock()); if (pLastNode && !(pLastNode->isMaster && (getMastersOnWorkspace(pWindow->workspaceID()) == 1 || *PNEWSTATUS == "slave"))) { - auto it = std::find(m_masterNodesData.begin(), m_masterNodesData.end(), *pLastNode); + auto it = std::ranges::find(m_masterNodesData, *pLastNode); if (!BNEWBEFOREACTIVE) ++it; return &(*m_masterNodesData.emplace(it)); @@ -117,7 +117,7 @@ void CHyprMasterLayout::onWindowCreatedTiling(PHLWINDOW pWindow, eDirection dire const auto MOUSECOORDS = g_pInputManager->getMouseCoordsInternal(); static auto PDROPATCURSOR = CConfigValue("master:drop_at_cursor"); eOrientation orientation = getDynamicOrientation(pWindow->m_workspace); - const auto NODEIT = std::find(m_masterNodesData.begin(), m_masterNodesData.end(), *PNODE); + const auto NODEIT = std::ranges::find(m_masterNodesData, *PNODE); bool forceDropAsMaster = false; // if dragging window to move, drop it at the cursor position instead of bottom/top of stack @@ -804,8 +804,8 @@ void CHyprMasterLayout::resizeActiveWindow(const Vector2D& pixResize, eRectCorne if (!*PSMARTRESIZING) { PNODE->percSize = std::clamp(PNODE->percSize + RESIZEDELTA / SIZE, 0.05, 1.95); } else { - const auto NODEIT = std::find(m_masterNodesData.begin(), m_masterNodesData.end(), *PNODE); - const auto REVNODEIT = std::find(m_masterNodesData.rbegin(), m_masterNodesData.rend(), *PNODE); + const auto NODEIT = std::ranges::find(m_masterNodesData, *PNODE); + const auto REVNODEIT = std::ranges::find(m_masterNodesData | std::views::reverse, *PNODE); const float totalSize = isStackVertical ? WSSIZE.y : WSSIZE.x; const float minSize = totalSize / nodesInSameColumn * 0.2; @@ -1026,16 +1026,15 @@ PHLWINDOW CHyprMasterLayout::getNextWindow(PHLWINDOW pWindow, bool next, bool lo auto nodes = m_masterNodesData; if (!next) - std::reverse(nodes.begin(), nodes.end()); + std::ranges::reverse(nodes); - const auto NODEIT = std::find(nodes.begin(), nodes.end(), *PNODE); + const auto NODEIT = std::ranges::find(nodes, *PNODE); const bool ISMASTER = PNODE->isMaster; auto CANDIDATE = std::find_if(NODEIT, nodes.end(), [&](const auto& other) { return other != *PNODE && ISMASTER == other.isMaster && other.workspaceID == PNODE->workspaceID; }); if (CANDIDATE == nodes.end()) - CANDIDATE = - std::find_if(nodes.begin(), nodes.end(), [&](const auto& other) { return other != *PNODE && ISMASTER != other.isMaster && other.workspaceID == PNODE->workspaceID; }); + CANDIDATE = std::ranges::find_if(nodes, [&](const auto& other) { return other != *PNODE && ISMASTER != other.isMaster && other.workspaceID == PNODE->workspaceID; }); if (CANDIDATE != nodes.end() && !loop) { if (CANDIDATE->isMaster && next) @@ -1308,12 +1307,12 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri if (!OLDMASTER) return 0; - const auto OLDMASTERIT = std::find(m_masterNodesData.begin(), m_masterNodesData.end(), *OLDMASTER); + const auto OLDMASTERIT = std::ranges::find(m_masterNodesData, *OLDMASTER); for (auto& nd : m_masterNodesData) { if (nd.workspaceID == PNODE->workspaceID && !nd.isMaster) { nd.isMaster = true; - const auto NEWMASTERIT = std::find(m_masterNodesData.begin(), m_masterNodesData.end(), nd); + const auto NEWMASTERIT = std::ranges::find(m_masterNodesData, nd); m_masterNodesData.splice(OLDMASTERIT, m_masterNodesData, NEWMASTERIT); switchToWindow(nd.pWindow.lock()); OLDMASTER->isMaster = false; @@ -1334,12 +1333,12 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri if (!OLDMASTER) return 0; - const auto OLDMASTERIT = std::find(m_masterNodesData.begin(), m_masterNodesData.end(), *OLDMASTER); + const auto OLDMASTERIT = std::ranges::find(m_masterNodesData, *OLDMASTER); for (auto& nd : m_masterNodesData | std::views::reverse) { if (nd.workspaceID == PNODE->workspaceID && !nd.isMaster) { nd.isMaster = true; - const auto NEWMASTERIT = std::find(m_masterNodesData.begin(), m_masterNodesData.end(), nd); + const auto NEWMASTERIT = std::ranges::find(m_masterNodesData, nd); m_masterNodesData.splice(OLDMASTERIT, m_masterNodesData, NEWMASTERIT); switchToWindow(nd.pWindow.lock()); OLDMASTER->isMaster = false; diff --git a/src/managers/AnimationManager.cpp b/src/managers/AnimationManager.cpp index d12b91a5..f935d3dc 100644 --- a/src/managers/AnimationManager.cpp +++ b/src/managers/AnimationManager.cpp @@ -384,7 +384,7 @@ void CHyprAnimationManager::onWindowPostCreateClose(PHLWINDOW pWindow, bool clos } std::string ANIMSTYLE = pWindow->m_realPosition->getStyle(); - transform(ANIMSTYLE.begin(), ANIMSTYLE.end(), ANIMSTYLE.begin(), ::tolower); + std::ranges::transform(ANIMSTYLE, ANIMSTYLE.begin(), ::tolower); CVarList animList(ANIMSTYLE, 0, 's'); diff --git a/src/managers/CursorManager.cpp b/src/managers/CursorManager.cpp index 77ea5a28..9211fc20 100644 --- a/src/managers/CursorManager.cpp +++ b/src/managers/CursorManager.cpp @@ -186,7 +186,7 @@ void CCursorManager::setCursorFromName(const std::string& name) { if (m_currentCursorShapeData.images.size() < 1) { // try with '_' first (old hc, etc) std::string newName = name; - std::replace(newName.begin(), newName.end(), '-', '_'); + std::ranges::replace(newName, '-', '_'); m_currentCursorShapeData = m_hyprcursor->getShape(newName.c_str(), m_currentStyleInfo); } diff --git a/src/managers/EventManager.cpp b/src/managers/EventManager.cpp index 651bf436..e0d8704b 100644 --- a/src/managers/EventManager.cpp +++ b/src/managers/EventManager.cpp @@ -123,7 +123,7 @@ int CEventManager::onClientEvent(int fd, uint32_t mask) { } std::vector::iterator CEventManager::findClientByFD(int fd) { - return std::find_if(m_clients.begin(), m_clients.end(), [fd](const auto& client) { return client.fd.get() == fd; }); + return std::ranges::find_if(m_clients, [fd](const auto& client) { return client.fd.get() == fd; }); } std::vector::iterator CEventManager::removeClientByFD(int fd) { diff --git a/src/managers/HookSystemManager.cpp b/src/managers/HookSystemManager.cpp index 67e6e732..2f1f3a27 100644 --- a/src/managers/HookSystemManager.cpp +++ b/src/managers/HookSystemManager.cpp @@ -46,7 +46,7 @@ void CHookSystemManager::emit(std::vector* const callbacks, SCal m_currentEventPlugin = true; - if (std::find(faultyHandles.begin(), faultyHandles.end(), cb.handle) != faultyHandles.end()) + if (std::ranges::find(faultyHandles, cb.handle) != faultyHandles.end()) continue; try { diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index c4c6d4ab..58951281 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -225,7 +225,7 @@ void CKeybindManager::removeKeybind(uint32_t mod, const SParsedKey& key) { uint32_t CKeybindManager::stringToModMask(std::string mods) { uint32_t modMask = 0; - std::transform(mods.begin(), mods.end(), mods.begin(), ::toupper); + std::ranges::transform(mods, mods.begin(), ::toupper); if (mods.contains("SHIFT")) modMask |= HL_MODIFIER_SHIFT; if (mods.contains("CAPS")) @@ -624,10 +624,8 @@ eMultiKeyCase CKeybindManager::mkKeysymSetMatches(const std::set k std::set boundKeysNotPressed; std::set pressedKeysNotBound; - std::set_difference(keybindKeysyms.begin(), keybindKeysyms.end(), pressedKeysyms.begin(), pressedKeysyms.end(), - std::inserter(boundKeysNotPressed, boundKeysNotPressed.begin())); - std::set_difference(pressedKeysyms.begin(), pressedKeysyms.end(), keybindKeysyms.begin(), keybindKeysyms.end(), - std::inserter(pressedKeysNotBound, pressedKeysNotBound.begin())); + std::ranges::set_difference(keybindKeysyms, pressedKeysyms, std::inserter(boundKeysNotPressed, boundKeysNotPressed.begin())); + std::ranges::set_difference(pressedKeysyms, keybindKeysyms, std::inserter(pressedKeysNotBound, pressedKeysNotBound.begin())); if (boundKeysNotPressed.empty() && pressedKeysNotBound.empty()) return MK_FULL_MATCH; @@ -670,8 +668,7 @@ SDispatchResult CKeybindManager::handleKeybinds(const uint32_t modmask, const SP for (auto& k : m_keybinds) { const bool SPECIALDISPATCHER = k->handler == "global" || k->handler == "pass" || k->handler == "sendshortcut" || k->handler == "mouse"; - const bool SPECIALTRIGGERED = - std::find_if(m_pressedSpecialBinds.begin(), m_pressedSpecialBinds.end(), [&](const auto& other) { return other == k; }) != m_pressedSpecialBinds.end(); + const bool SPECIALTRIGGERED = std::ranges::find_if(m_pressedSpecialBinds, [&](const auto& other) { return other == k; }) != m_pressedSpecialBinds.end(); const bool IGNORECONDITIONS = SPECIALDISPATCHER && !pressed && SPECIALTRIGGERED; // ignore mods. Pass, global dispatchers should be released immediately once the key is released. @@ -1106,7 +1103,7 @@ SDispatchResult CKeybindManager::signalWindow(std::string args) { return {.success = false, .error = "signalWindow: no window"}; } - if (!std::all_of(SIGNAL.begin(), SIGNAL.end(), ::isdigit)) + if (!std::ranges::all_of(SIGNAL, ::isdigit)) return {.success = false, .error = "signalWindow: signal has to be int"}; try { diff --git a/src/managers/LayoutManager.cpp b/src/managers/LayoutManager.cpp index a929b42e..08bbcf44 100644 --- a/src/managers/LayoutManager.cpp +++ b/src/managers/LayoutManager.cpp @@ -26,7 +26,7 @@ void CLayoutManager::switchToLayout(std::string layout) { } bool CLayoutManager::addLayout(const std::string& name, IHyprLayout* layout) { - if (std::find_if(m_layouts.begin(), m_layouts.end(), [&](const auto& other) { return other.first == name || other.second == layout; }) != m_layouts.end()) + if (std::ranges::find_if(m_layouts, [&](const auto& other) { return other.first == name || other.second == layout; }) != m_layouts.end()) return false; m_layouts.emplace_back(std::make_pair<>(name, layout)); @@ -37,7 +37,7 @@ bool CLayoutManager::addLayout(const std::string& name, IHyprLayout* layout) { } bool CLayoutManager::removeLayout(IHyprLayout* layout) { - const auto IT = std::find_if(m_layouts.begin(), m_layouts.end(), [&](const auto& other) { return other.second == layout; }); + const auto IT = std::ranges::find_if(m_layouts, [&](const auto& other) { return other.second == layout; }); if (IT == m_layouts.end() || IT->first == "dwindle" || IT->first == "master") return false; diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp index f42fd686..a82be1b0 100644 --- a/src/managers/PointerManager.cpp +++ b/src/managers/PointerManager.cpp @@ -94,7 +94,7 @@ bool CPointerManager::hasCursor() { } SP CPointerManager::stateFor(PHLMONITOR mon) { - auto it = std::find_if(m_monitorStates.begin(), m_monitorStates.end(), [mon](const auto& other) { return other->monitor == mon; }); + auto it = std::ranges::find_if(m_monitorStates, [mon](const auto& other) { return other->monitor == mon; }); if (it == m_monitorStates.end()) return m_monitorStates.emplace_back(makeShared(mon)); return *it; diff --git a/src/managers/SeatManager.cpp b/src/managers/SeatManager.cpp index 419e8bf4..a7660854 100644 --- a/src/managers/SeatManager.cpp +++ b/src/managers/SeatManager.cpp @@ -653,7 +653,7 @@ void CSeatManager::resendEnterEvents() { } bool CSeatGrab::accepts(SP surf) { - return std::find(m_surfs.begin(), m_surfs.end(), surf) != m_surfs.end(); + return std::ranges::find(m_surfs, surf) != m_surfs.end(); } void CSeatGrab::add(SP surf) { diff --git a/src/managers/XCursorManager.cpp b/src/managers/XCursorManager.cpp index 79bb7a5d..9bbf531b 100644 --- a/src/managers/XCursorManager.cpp +++ b/src/managers/XCursorManager.cpp @@ -127,8 +127,8 @@ void CXCursorManager::loadTheme(std::string const& name, int size, float scale) for (auto const& p : paths) { try { auto dirCursors = loadAllFromDir(p, m_lastLoadSize); - std::copy_if(dirCursors.begin(), dirCursors.end(), std::back_inserter(m_cursors), - [this](auto const& p) { return std::none_of(m_cursors.begin(), m_cursors.end(), [&p](auto const& dp) { return dp->shape == p->shape; }); }); + std::ranges::copy_if(dirCursors, std::back_inserter(m_cursors), + [this](auto const& p) { return std::ranges::none_of(m_cursors, [&p](auto const& dp) { return dp->shape == p->shape; }); }); } catch (std::exception& e) { Debug::log(ERR, "XCursor path {} can't be loaded: threw error {}", p, e.what()); } } } @@ -144,14 +144,14 @@ void CXCursorManager::loadTheme(std::string const& name, int size, float scale) if (legacyName.empty()) continue; - auto it = std::find_if(m_cursors.begin(), m_cursors.end(), [&legacyName](auto const& c) { return c->shape == legacyName; }); + auto it = std::ranges::find_if(m_cursors, [&legacyName](auto const& c) { return c->shape == legacyName; }); if (it == m_cursors.end()) { Debug::log(LOG, "XCursor failed to find a legacy shape with name {}, skipping", legacyName); continue; } - if (std::any_of(m_cursors.begin(), m_cursors.end(), [&shape](auto const& dp) { return dp->shape == shape; })) { + if (std::ranges::any_of(m_cursors, [&shape](auto const& dp) { return dp->shape == shape; })) { Debug::log(LOG, "XCursor already has a shape {} loaded, skipping", shape); continue; } diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index 2d50dbcf..cc0485d8 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -619,7 +619,7 @@ void CInputManager::onMouseButton(IPointer::SButtonEvent e) { if (e.state == WL_POINTER_BUTTON_STATE_PRESSED) { m_currentlyHeldButtons.push_back(e.button); } else { - if (std::find_if(m_currentlyHeldButtons.begin(), m_currentlyHeldButtons.end(), [&](const auto& other) { return other == e.button; }) == m_currentlyHeldButtons.end()) + if (std::ranges::find_if(m_currentlyHeldButtons, [&](const auto& other) { return other == e.button; }) == m_currentlyHeldButtons.end()) return; std::erase_if(m_currentlyHeldButtons, [&](const auto& other) { return other == e.button; }); } @@ -1552,7 +1552,7 @@ void CInputManager::unconstrainMouse() { } bool CInputManager::isConstrained() { - return std::any_of(m_constraints.begin(), m_constraints.end(), [](auto const& c) { + return std::ranges::any_of(m_constraints, [](auto const& c) { const auto constraint = c.lock(); return constraint && constraint->isActive() && constraint->owner()->resource() == g_pCompositor->m_lastFocus; }); @@ -1773,9 +1773,9 @@ void CInputManager::unsetCursorImage() { } std::string CInputManager::deviceNameToInternalString(std::string in) { - std::replace(in.begin(), in.end(), ' ', '-'); - std::replace(in.begin(), in.end(), '\n', '-'); - std::transform(in.begin(), in.end(), in.begin(), ::tolower); + std::ranges::replace(in, ' ', '-'); + std::ranges::replace(in, '\n', '-'); + std::ranges::transform(in, in.begin(), ::tolower); return in; } @@ -1786,7 +1786,7 @@ std::string CInputManager::getNameForNewDevice(std::string internalName) { auto makeNewName = [&]() { return (proposedNewName.empty() ? "unknown-device" : proposedNewName) + (dupeno == 0 ? "" : ("-" + std::to_string(dupeno))); }; - while (std::find_if(m_hids.begin(), m_hids.end(), [&](const auto& other) { return other->m_hlName == makeNewName(); }) != m_hids.end()) + while (std::ranges::find_if(m_hids, [&](const auto& other) { return other->m_hlName == makeNewName(); }) != m_hids.end()) dupeno++; return makeNewName(); diff --git a/src/protocols/AlphaModifier.cpp b/src/protocols/AlphaModifier.cpp index e2408397..ad4bc107 100644 --- a/src/protocols/AlphaModifier.cpp +++ b/src/protocols/AlphaModifier.cpp @@ -81,7 +81,7 @@ void CAlphaModifierProtocol::destroyAlphaModifier(CAlphaModifier* modifier) { void CAlphaModifierProtocol::getSurface(CWpAlphaModifierV1* manager, uint32_t id, SP surface) { CAlphaModifier* alphaModifier = nullptr; - auto iter = std::find_if(m_alphaModifiers.begin(), m_alphaModifiers.end(), [&](const auto& entry) { return entry.second->m_surface == surface; }); + auto iter = std::ranges::find_if(m_alphaModifiers, [&](const auto& entry) { return entry.second->m_surface == surface; }); if (iter != m_alphaModifiers.end()) { if (iter->second->m_resource) { diff --git a/src/protocols/ColorManagement.cpp b/src/protocols/ColorManagement.cpp index 5ace1f7e..50bded7f 100644 --- a/src/protocols/ColorManagement.cpp +++ b/src/protocols/ColorManagement.cpp @@ -281,8 +281,8 @@ CColorManagementSurface::CColorManagementSurface(SP return; } - const auto imageDescription = std::find_if(PROTO::colorManagement->m_imageDescriptions.begin(), PROTO::colorManagement->m_imageDescriptions.end(), - [&](const auto& other) { return other->resource()->resource() == image_description; }); + const auto imageDescription = + std::ranges::find_if(PROTO::colorManagement->m_imageDescriptions, [&](const auto& other) { return other->resource()->resource() == image_description; }); if (imageDescription == PROTO::colorManagement->m_imageDescriptions.end()) { r->error(WP_COLOR_MANAGEMENT_SURFACE_V1_ERROR_IMAGE_DESCRIPTION, "Image description not found"); return; diff --git a/src/protocols/DRMLease.cpp b/src/protocols/DRMLease.cpp index c4b5a84a..622c907c 100644 --- a/src/protocols/DRMLease.cpp +++ b/src/protocols/DRMLease.cpp @@ -96,7 +96,7 @@ CDRMLeaseRequestResource::CDRMLeaseRequestResource(SP reso auto CONNECTOR = CDRMLeaseConnectorResource::fromResource(conn); - if (std::find(m_requested.begin(), m_requested.end(), CONNECTOR) != m_requested.end()) { + if (std::ranges::find(m_requested, CONNECTOR) != m_requested.end()) { m_resource->error(WP_DRM_LEASE_REQUEST_V1_ERROR_DUPLICATE_CONNECTOR, "Connector already requested"); return; } @@ -208,7 +208,7 @@ bool CDRMLeaseDeviceResource::good() { } void CDRMLeaseDeviceResource::sendConnector(PHLMONITOR monitor) { - if (std::find_if(m_connectorsSent.begin(), m_connectorsSent.end(), [monitor](const auto& e) { return e && !e->m_dead && e->m_monitor == monitor; }) != m_connectorsSent.end()) + if (std::ranges::find_if(m_connectorsSent, [monitor](const auto& e) { return e && !e->m_dead && e->m_monitor == monitor; }) != m_connectorsSent.end()) return; auto RESOURCE = makeShared(makeShared(m_resource->client(), m_resource->version(), 0), monitor); @@ -294,7 +294,7 @@ void CDRMLeaseProtocol::destroyResource(CDRMLeaseResource* resource) { void CDRMLeaseProtocol::offer(PHLMONITOR monitor) { std::erase_if(m_primaryDevice->m_offeredOutputs, [](const auto& e) { return e.expired(); }); - if (std::find(m_primaryDevice->m_offeredOutputs.begin(), m_primaryDevice->m_offeredOutputs.end(), monitor) != m_primaryDevice->m_offeredOutputs.end()) + if (std::ranges::find(m_primaryDevice->m_offeredOutputs, monitor) != m_primaryDevice->m_offeredOutputs.end()) return; if (monitor->m_output->getBackend()->type() != Aquamarine::AQ_BACKEND_DRM) diff --git a/src/protocols/DataDeviceWlr.cpp b/src/protocols/DataDeviceWlr.cpp index 2e9c032b..e169f666 100644 --- a/src/protocols/DataDeviceWlr.cpp +++ b/src/protocols/DataDeviceWlr.cpp @@ -78,7 +78,7 @@ std::vector CWLRDataSource::mimes() { } void CWLRDataSource::send(const std::string& mime, CFileDescriptor fd) { - if (std::find(m_mimeTypes.begin(), m_mimeTypes.end(), mime) == m_mimeTypes.end()) { + if (std::ranges::find(m_mimeTypes, mime) == m_mimeTypes.end()) { LOGM(ERR, "Compositor/App bug: CWLRDataSource::sendAskSend with non-existent mime"); return; } @@ -87,7 +87,7 @@ void CWLRDataSource::send(const std::string& mime, CFileDescriptor fd) { } void CWLRDataSource::accepted(const std::string& mime) { - if (std::find(m_mimeTypes.begin(), m_mimeTypes.end(), mime) == m_mimeTypes.end()) + if (std::ranges::find(m_mimeTypes, mime) == m_mimeTypes.end()) LOGM(ERR, "Compositor/App bug: CWLRDataSource::sendAccepted with non-existent mime"); // wlr has no accepted @@ -315,7 +315,7 @@ void CDataDeviceWLRProtocol::setSelection(SP source, bool primary) } SP CDataDeviceWLRProtocol::dataDeviceForClient(wl_client* c) { - auto it = std::find_if(m_devices.begin(), m_devices.end(), [c](const auto& e) { return e->client() == c; }); + auto it = std::ranges::find_if(m_devices, [c](const auto& e) { return e->client() == c; }); if (it == m_devices.end()) return nullptr; return *it; diff --git a/src/protocols/FocusGrab.cpp b/src/protocols/FocusGrab.cpp index 9f054953..41396459 100644 --- a/src/protocols/FocusGrab.cpp +++ b/src/protocols/FocusGrab.cpp @@ -36,7 +36,7 @@ bool CFocusGrab::good() { } bool CFocusGrab::isSurfaceComitted(SP surface) { - auto iter = std::find_if(m_surfaces.begin(), m_surfaces.end(), [surface](const auto& o) { return o.first == surface; }); + auto iter = std::ranges::find_if(m_surfaces, [surface](const auto& o) { return o.first == surface; }); if (iter == m_surfaces.end()) return false; @@ -70,7 +70,7 @@ void CFocusGrab::finish(bool sendCleared) { } void CFocusGrab::addSurface(SP surface) { - auto iter = std::find_if(m_surfaces.begin(), m_surfaces.end(), [surface](const auto& e) { return e.first == surface; }); + auto iter = std::ranges::find_if(m_surfaces, [surface](const auto& e) { return e.first == surface; }); if (iter == m_surfaces.end()) m_surfaces.emplace(surface, makeUnique(this, surface)); } diff --git a/src/protocols/ForeignToplevel.cpp b/src/protocols/ForeignToplevel.cpp index e48f0722..ec5943af 100644 --- a/src/protocols/ForeignToplevel.cpp +++ b/src/protocols/ForeignToplevel.cpp @@ -69,7 +69,7 @@ void CForeignToplevelList::onMap(PHLWINDOW pWindow) { SP CForeignToplevelList::handleForWindow(PHLWINDOW pWindow) { std::erase_if(m_handles, [](const auto& wp) { return wp.expired(); }); - const auto IT = std::find_if(m_handles.begin(), m_handles.end(), [pWindow](const auto& h) { return h->window() == pWindow; }); + const auto IT = std::ranges::find_if(m_handles, [pWindow](const auto& h) { return h->window() == pWindow; }); return IT == m_handles.end() ? SP{} : IT->lock(); } diff --git a/src/protocols/ForeignToplevelWlr.cpp b/src/protocols/ForeignToplevelWlr.cpp index dccf83b6..600412cb 100644 --- a/src/protocols/ForeignToplevelWlr.cpp +++ b/src/protocols/ForeignToplevelWlr.cpp @@ -247,7 +247,7 @@ void CForeignToplevelWlrManager::onMap(PHLWINDOW pWindow) { SP CForeignToplevelWlrManager::handleForWindow(PHLWINDOW pWindow) { std::erase_if(m_handles, [](const auto& wp) { return wp.expired(); }); - const auto IT = std::find_if(m_handles.begin(), m_handles.end(), [pWindow](const auto& h) { return h->window() == pWindow; }); + const auto IT = std::ranges::find_if(m_handles, [pWindow](const auto& h) { return h->window() == pWindow; }); return IT == m_handles.end() ? SP{} : IT->lock(); } diff --git a/src/protocols/HyprlandSurface.cpp b/src/protocols/HyprlandSurface.cpp index 9c66fba4..2e386027 100644 --- a/src/protocols/HyprlandSurface.cpp +++ b/src/protocols/HyprlandSurface.cpp @@ -109,7 +109,7 @@ void CHyprlandSurfaceProtocol::destroySurface(CHyprlandSurface* surface) { void CHyprlandSurfaceProtocol::getSurface(CHyprlandSurfaceManagerV1* manager, uint32_t id, SP surface) { CHyprlandSurface* hyprlandSurface = nullptr; - auto iter = std::find_if(m_surfaces.begin(), m_surfaces.end(), [&](const auto& entry) { return entry.second->m_surface == surface; }); + auto iter = std::ranges::find_if(m_surfaces, [&](const auto& entry) { return entry.second->m_surface == surface; }); if (iter != m_surfaces.end()) { if (iter->second->m_resource) { diff --git a/src/protocols/LayerShell.cpp b/src/protocols/LayerShell.cpp index 4cb37ff4..bb5480b6 100644 --- a/src/protocols/LayerShell.cpp +++ b/src/protocols/LayerShell.cpp @@ -130,7 +130,7 @@ CLayerShellResource::CLayerShellResource(SP resource_, SPsetAckConfigure([this](CZwlrLayerSurfaceV1* r, uint32_t serial) { - auto serialFound = std::find_if(m_serials.begin(), m_serials.end(), [serial](const auto& e) { return e.first == serial; }); + auto serialFound = std::ranges::find_if(m_serials, [serial](const auto& e) { return e.first == serial; }); if (serialFound == m_serials.end()) { r->error(ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_SURFACE_STATE, "Serial invalid in ack_configure"); diff --git a/src/protocols/LinuxDMABUF.cpp b/src/protocols/LinuxDMABUF.cpp index ee64415b..a0fe571a 100644 --- a/src/protocols/LinuxDMABUF.cpp +++ b/src/protocols/LinuxDMABUF.cpp @@ -46,8 +46,7 @@ CDMABUFFormatTable::CDMABUFFormatTable(SDMABUFTranche _rendererTranche, std::vec }); } else { // if it wasn't inserted then find its index in vec - auto it = - std::find_if(formatsVec.begin(), formatsVec.end(), [fmt, mod](const SDMABUFFormatTableEntry& oth) { return oth.fmt == fmt.drmFormat && oth.modifier == mod; }); + auto it = std::ranges::find_if(formatsVec, [fmt, mod](const SDMABUFFormatTableEntry& oth) { return oth.fmt == fmt.drmFormat && oth.modifier == mod; }); m_rendererTranche.indicies.push_back(it - formatsVec.begin()); } } @@ -69,8 +68,7 @@ CDMABUFFormatTable::CDMABUFFormatTable(SDMABUFTranche _rendererTranche, std::vec .modifier = mod, }); } else { - auto it = std::find_if(formatsVec.begin(), formatsVec.end(), - [fmt, mod](const SDMABUFFormatTableEntry& oth) { return oth.fmt == fmt.drmFormat && oth.modifier == mod; }); + auto it = std::ranges::find_if(formatsVec, [fmt, mod](const SDMABUFFormatTableEntry& oth) { return oth.fmt == fmt.drmFormat && oth.modifier == mod; }); tranche.indicies.push_back(it - formatsVec.begin()); } } @@ -89,7 +87,7 @@ CDMABUFFormatTable::CDMABUFFormatTable(SDMABUFTranche _rendererTranche, std::vec return; } - std::copy(formatsVec.begin(), formatsVec.end(), arr); + std::ranges::copy(formatsVec, arr); munmap(arr, m_tableSize); @@ -169,7 +167,7 @@ CLinuxDMABUFParamsResource::CLinuxDMABUFParamsResource(SPsize = {w, h}; m_attrs->format = fmt; - m_attrs->planes = 4 - std::count(m_attrs->fds.begin(), m_attrs->fds.end(), -1); + m_attrs->planes = 4 - std::ranges::count(m_attrs->fds, -1); create(0); }); @@ -188,7 +186,7 @@ CLinuxDMABUFParamsResource::CLinuxDMABUFParamsResource(SPsize = {w, h}; m_attrs->format = fmt; - m_attrs->planes = 4 - std::count(m_attrs->fds.begin(), m_attrs->fds.end(), -1); + m_attrs->planes = 4 - std::ranges::count(m_attrs->fds, -1); create(id); }); @@ -564,8 +562,8 @@ void CLinuxDMABufV1Protocol::updateScanoutTranche(SP surface return; } - const auto& monitorTranchePair = std::find_if(m_formatTable->m_monitorTranches.begin(), m_formatTable->m_monitorTranches.end(), - [pMonitor](std::pair pair) { return pair.first == pMonitor; }); + const auto& monitorTranchePair = + std::ranges::find_if(m_formatTable->m_monitorTranches, [pMonitor](std::pair pair) { return pair.first == pMonitor; }); if (monitorTranchePair == m_formatTable->m_monitorTranches.end()) { LOGM(LOG, "updateScanoutTranche: monitor has no tranche"); diff --git a/src/protocols/PointerConstraints.cpp b/src/protocols/PointerConstraints.cpp index 425a983d..ea917932 100644 --- a/src/protocols/PointerConstraints.cpp +++ b/src/protocols/PointerConstraints.cpp @@ -229,7 +229,7 @@ void CPointerConstraintsProtocol::onNewConstraint(SP constra const auto OWNER = constraint->owner(); - const auto DUPES = std::count_if(m_constraints.begin(), m_constraints.end(), [OWNER](const auto& c) { return c->owner() == OWNER; }); + const auto DUPES = std::ranges::count_if(m_constraints, [OWNER](const auto& c) { return c->owner() == OWNER; }); if UNLIKELY (DUPES > 1) { LOGM(ERR, "Constraint for surface duped"); diff --git a/src/protocols/PrimarySelection.cpp b/src/protocols/PrimarySelection.cpp index 3c263647..14df7af5 100644 --- a/src/protocols/PrimarySelection.cpp +++ b/src/protocols/PrimarySelection.cpp @@ -79,7 +79,7 @@ std::vector CPrimarySelectionSource::mimes() { } void CPrimarySelectionSource::send(const std::string& mime, CFileDescriptor fd) { - if (std::find(m_mimeTypes.begin(), m_mimeTypes.end(), mime) == m_mimeTypes.end()) { + if (std::ranges::find(m_mimeTypes, mime) == m_mimeTypes.end()) { LOGM(ERR, "Compositor/App bug: CPrimarySelectionSource::sendAskSend with non-existent mime"); return; } @@ -88,7 +88,7 @@ void CPrimarySelectionSource::send(const std::string& mime, CFileDescriptor fd) } void CPrimarySelectionSource::accepted(const std::string& mime) { - if (std::find(m_mimeTypes.begin(), m_mimeTypes.end(), mime) == m_mimeTypes.end()) + if (std::ranges::find(m_mimeTypes, mime) == m_mimeTypes.end()) LOGM(ERR, "Compositor/App bug: CPrimarySelectionSource::sendAccepted with non-existent mime"); // primary sel has no accepted @@ -327,7 +327,7 @@ void CPrimarySelectionProtocol::onPointerFocus() { } SP CPrimarySelectionProtocol::dataDeviceForClient(wl_client* c) { - auto it = std::find_if(m_devices.begin(), m_devices.end(), [c](const auto& e) { return e->client() == c; }); + auto it = std::ranges::find_if(m_devices, [c](const auto& e) { return e->client() == c; }); if (it == m_devices.end()) return nullptr; return *it; diff --git a/src/protocols/SecurityContext.cpp b/src/protocols/SecurityContext.cpp index ae3f41b1..acabe0a1 100644 --- a/src/protocols/SecurityContext.cpp +++ b/src/protocols/SecurityContext.cpp @@ -214,5 +214,5 @@ void CSecurityContextProtocol::destroyContext(CSecurityContext* context) { } bool CSecurityContextProtocol::isClientSandboxed(const wl_client* client) { - return std::find_if(m_sandboxedClients.begin(), m_sandboxedClients.end(), [client](const auto& e) { return e->m_client == client; }) != m_sandboxedClients.end(); + return std::ranges::find_if(m_sandboxedClients, [client](const auto& e) { return e->m_client == client; }) != m_sandboxedClients.end(); } diff --git a/src/protocols/VirtualKeyboard.cpp b/src/protocols/VirtualKeyboard.cpp index 48ed7eeb..7512f9bd 100644 --- a/src/protocols/VirtualKeyboard.cpp +++ b/src/protocols/VirtualKeyboard.cpp @@ -31,7 +31,7 @@ CVirtualKeyboardV1Resource::CVirtualKeyboardV1Resource(SP .state = (wl_keyboard_key_state)state, }); - const bool CONTAINS = std::find(m_pressed.begin(), m_pressed.end(), key) != m_pressed.end(); + const bool CONTAINS = std::ranges::find(m_pressed, key) != m_pressed.end(); if (state && !CONTAINS) m_pressed.emplace_back(key); else if (!state && CONTAINS) diff --git a/src/protocols/XDGActivation.cpp b/src/protocols/XDGActivation.cpp index bae3acc3..f25ffca8 100644 --- a/src/protocols/XDGActivation.cpp +++ b/src/protocols/XDGActivation.cpp @@ -33,8 +33,7 @@ CXDGActivationToken::CXDGActivationToken(SP resource_) : PROTO::activation->m_sentTokens.push_back({m_token, m_resource->client()}); - auto count = std::count_if(PROTO::activation->m_sentTokens.begin(), PROTO::activation->m_sentTokens.end(), - [this](const auto& other) { return other.client == m_resource->client(); }); + auto count = std::ranges::count_if(PROTO::activation->m_sentTokens, [this](const auto& other) { return other.client == m_resource->client(); }); if UNLIKELY (count > 10) { // remove first token. Too many, dear app. @@ -68,7 +67,7 @@ void CXDGActivationProtocol::bindManager(wl_client* client, void* data, uint32_t RESOURCE->setDestroy([this](CXdgActivationV1* pMgr) { this->onManagerResourceDestroy(pMgr->resource()); }); RESOURCE->setGetActivationToken([this](CXdgActivationV1* pMgr, uint32_t id) { this->onGetToken(pMgr, id); }); RESOURCE->setActivate([this](CXdgActivationV1* pMgr, const char* token, wl_resource* surface) { - auto TOKEN = std::find_if(m_sentTokens.begin(), m_sentTokens.end(), [token](const auto& t) { return t.token == token; }); + auto TOKEN = std::ranges::find_if(m_sentTokens, [token](const auto& t) { return t.token == token; }); if UNLIKELY (TOKEN == m_sentTokens.end()) { LOGM(WARN, "activate event for non-existent token {}??", token); diff --git a/src/protocols/XDGShell.cpp b/src/protocols/XDGShell.cpp index d3d5c18e..5351e267 100644 --- a/src/protocols/XDGShell.cpp +++ b/src/protocols/XDGShell.cpp @@ -258,7 +258,7 @@ uint32_t CXDGToplevelResource::setSize(const Vector2D& size) { } uint32_t CXDGToplevelResource::setMaximized(bool maximized) { - bool set = std::find(m_pendingApply.states.begin(), m_pendingApply.states.end(), XDG_TOPLEVEL_STATE_MAXIMIZED) != m_pendingApply.states.end(); + bool set = std::ranges::find(m_pendingApply.states, XDG_TOPLEVEL_STATE_MAXIMIZED) != m_pendingApply.states.end(); if (maximized == set) return m_owner->m_scheduledSerial; @@ -272,7 +272,7 @@ uint32_t CXDGToplevelResource::setMaximized(bool maximized) { } uint32_t CXDGToplevelResource::setFullscreen(bool fullscreen) { - bool set = std::find(m_pendingApply.states.begin(), m_pendingApply.states.end(), XDG_TOPLEVEL_STATE_FULLSCREEN) != m_pendingApply.states.end(); + bool set = std::ranges::find(m_pendingApply.states, XDG_TOPLEVEL_STATE_FULLSCREEN) != m_pendingApply.states.end(); if (fullscreen == set) return m_owner->m_scheduledSerial; @@ -286,7 +286,7 @@ uint32_t CXDGToplevelResource::setFullscreen(bool fullscreen) { } uint32_t CXDGToplevelResource::setActive(bool active) { - bool set = std::find(m_pendingApply.states.begin(), m_pendingApply.states.end(), XDG_TOPLEVEL_STATE_ACTIVATED) != m_pendingApply.states.end(); + bool set = std::ranges::find(m_pendingApply.states, XDG_TOPLEVEL_STATE_ACTIVATED) != m_pendingApply.states.end(); if (active == set) return m_owner->m_scheduledSerial; @@ -303,7 +303,7 @@ uint32_t CXDGToplevelResource::setSuspeneded(bool sus) { if (m_resource->version() < 6) return m_owner->scheduleConfigure(); // SUSPENDED is since 6 - bool set = std::find(m_pendingApply.states.begin(), m_pendingApply.states.end(), XDG_TOPLEVEL_STATE_SUSPENDED) != m_pendingApply.states.end(); + bool set = std::ranges::find(m_pendingApply.states, XDG_TOPLEVEL_STATE_SUSPENDED) != m_pendingApply.states.end(); if (sus == set) return m_owner->m_scheduledSerial; diff --git a/src/protocols/XXColorManagement.cpp b/src/protocols/XXColorManagement.cpp index 5a345f40..23b033a0 100644 --- a/src/protocols/XXColorManagement.cpp +++ b/src/protocols/XXColorManagement.cpp @@ -237,8 +237,8 @@ CXXColorManagementSurface::CXXColorManagementSurface(SPm_imageDescriptions.begin(), PROTO::xxColorManagement->m_imageDescriptions.end(), - [&](const auto& other) { return other->resource()->resource() == image_description; }); + const auto imageDescription = + std::ranges::find_if(PROTO::xxColorManagement->m_imageDescriptions, [&](const auto& other) { return other->resource()->resource() == image_description; }); if (imageDescription == PROTO::xxColorManagement->m_imageDescriptions.end()) { r->error(XX_COLOR_MANAGEMENT_SURFACE_V4_ERROR_IMAGE_DESCRIPTION, "Image description not found"); return; diff --git a/src/protocols/core/Compositor.cpp b/src/protocols/core/Compositor.cpp index 07bad77b..d1efe2e8 100644 --- a/src/protocols/core/Compositor.cpp +++ b/src/protocols/core/Compositor.cpp @@ -268,7 +268,7 @@ wl_client* CWLSurfaceResource::client() { } void CWLSurfaceResource::enter(PHLMONITOR monitor) { - if (std::find(m_enteredOutputs.begin(), m_enteredOutputs.end(), monitor) != m_enteredOutputs.end()) + if (std::ranges::find(m_enteredOutputs, monitor) != m_enteredOutputs.end()) return; if UNLIKELY (!PROTO::outputs.contains(monitor->m_name)) { @@ -295,7 +295,7 @@ void CWLSurfaceResource::enter(PHLMONITOR monitor) { } void CWLSurfaceResource::leave(PHLMONITOR monitor) { - if UNLIKELY (std::find(m_enteredOutputs.begin(), m_enteredOutputs.end(), monitor) == m_enteredOutputs.end()) + if UNLIKELY (std::ranges::find(m_enteredOutputs, monitor) == m_enteredOutputs.end()) return; auto output = PROTO::outputs.at(monitor->m_name)->outputResourceFrom(m_client); diff --git a/src/protocols/core/DataDevice.cpp b/src/protocols/core/DataDevice.cpp index ad580ed1..ec075e8b 100644 --- a/src/protocols/core/DataDevice.cpp +++ b/src/protocols/core/DataDevice.cpp @@ -171,7 +171,7 @@ void CWLDataSourceResource::accepted(const std::string& mime) { return; } - if (std::find(m_mimeTypes.begin(), m_mimeTypes.end(), mime) == m_mimeTypes.end()) { + if (std::ranges::find(m_mimeTypes, mime) == m_mimeTypes.end()) { LOGM(ERR, "Compositor/App bug: CWLDataSourceResource::sendAccepted with non-existent mime"); return; } @@ -184,7 +184,7 @@ std::vector CWLDataSourceResource::mimes() { } void CWLDataSourceResource::send(const std::string& mime, CFileDescriptor fd) { - if (std::find(m_mimeTypes.begin(), m_mimeTypes.end(), mime) == m_mimeTypes.end()) { + if (std::ranges::find(m_mimeTypes, mime) == m_mimeTypes.end()) { LOGM(ERR, "Compositor/App bug: CWLDataSourceResource::sendAskSend with non-existent mime"); return; } @@ -424,7 +424,7 @@ SP CWLDataDeviceProtocol::dataDeviceForClient(wl_client* c) { return g_pXWayland->m_wm->getDataDevice(); #endif - auto it = std::find_if(m_devices.begin(), m_devices.end(), [c](const auto& e) { return e->client() == c; }); + auto it = std::ranges::find_if(m_devices, [c](const auto& e) { return e->client() == c; }); if (it == m_devices.end()) return nullptr; return *it; diff --git a/src/protocols/core/Seat.cpp b/src/protocols/core/Seat.cpp index bc224043..c341f95a 100644 --- a/src/protocols/core/Seat.cpp +++ b/src/protocols/core/Seat.cpp @@ -204,10 +204,10 @@ void CWLPointerResource::sendButton(uint32_t timeMs, uint32_t button, wl_pointer if (!(PROTO::seat->m_currentCaps & eHIDCapabilityType::HID_INPUT_CAPABILITY_POINTER)) return; - if (state == WL_POINTER_BUTTON_STATE_RELEASED && std::find(m_pressedButtons.begin(), m_pressedButtons.end(), button) == m_pressedButtons.end()) { + if (state == WL_POINTER_BUTTON_STATE_RELEASED && std::ranges::find(m_pressedButtons, button) == m_pressedButtons.end()) { LOGM(ERR, "sendButton release on a non-pressed button"); return; - } else if (state == WL_POINTER_BUTTON_STATE_PRESSED && std::find(m_pressedButtons.begin(), m_pressedButtons.end(), button) != m_pressedButtons.end()) { + } else if (state == WL_POINTER_BUTTON_STATE_PRESSED && std::ranges::find(m_pressedButtons, button) != m_pressedButtons.end()) { LOGM(ERR, "sendButton press on a non-pressed button"); return; } diff --git a/src/protocols/core/Shm.cpp b/src/protocols/core/Shm.cpp index 228884b9..8d610fe0 100644 --- a/src/protocols/core/Shm.cpp +++ b/src/protocols/core/Shm.cpp @@ -137,7 +137,7 @@ CWLSHMPoolResource::CWLSHMPoolResource(SP resource_, CFileDescriptor return; } - if UNLIKELY (std::find(PROTO::shm->m_shmFormats.begin(), PROTO::shm->m_shmFormats.end(), fmt) == PROTO::shm->m_shmFormats.end()) { + if UNLIKELY (std::ranges::find(PROTO::shm->m_shmFormats, fmt) == PROTO::shm->m_shmFormats.end()) { r->error(WL_SHM_ERROR_INVALID_FORMAT, "Format invalid"); return; } diff --git a/src/protocols/core/Subcompositor.cpp b/src/protocols/core/Subcompositor.cpp index 4111b5dc..85a0edc4 100644 --- a/src/protocols/core/Subcompositor.cpp +++ b/src/protocols/core/Subcompositor.cpp @@ -30,7 +30,7 @@ CWLSubsurfaceResource::CWLSubsurfaceResource(SP resource_, SPm_subsurfaces, [this](const auto& e) { return e == m_self || !e; }); - auto it = std::find(m_parent->m_subsurfaces.begin(), m_parent->m_subsurfaces.end(), SURF); + auto it = std::ranges::find(m_parent->m_subsurfaces, SURF); if (it == m_parent->m_subsurfaces.end()) { LOGM(ERR, "Invalid surface reference in placeAbove, likely parent"); @@ -43,7 +43,7 @@ CWLSubsurfaceResource::CWLSubsurfaceResource(SP resource_, SPm_subsurfaces.emplace_back(m_self); } - std::sort(m_parent->m_subsurfaces.begin(), m_parent->m_subsurfaces.end(), [](const auto& a, const auto& b) { return a->m_zIndex < b->m_zIndex; }); + std::ranges::sort(m_parent->m_subsurfaces, [](const auto& a, const auto& b) { return a->m_zIndex < b->m_zIndex; }); }); m_resource->setPlaceBelow([this](CWlSubsurface* r, wl_resource* surf) { @@ -61,7 +61,7 @@ CWLSubsurfaceResource::CWLSubsurfaceResource(SP resource_, SPm_subsurfaces, [this](const auto& e) { return e == m_self || !e; }); - auto it = std::find(m_parent->m_subsurfaces.begin(), m_parent->m_subsurfaces.end(), SURF); + auto it = std::ranges::find(m_parent->m_subsurfaces, SURF); if (it == m_parent->m_subsurfaces.end()) { LOGM(ERR, "Invalid surface reference in placeBelow, likely parent"); @@ -74,7 +74,7 @@ CWLSubsurfaceResource::CWLSubsurfaceResource(SP resource_, SPm_subsurfaces.emplace_back(m_self); } - std::sort(m_parent->m_subsurfaces.begin(), m_parent->m_subsurfaces.end(), [](const auto& a, const auto& b) { return a->m_zIndex < b->m_zIndex; }); + std::ranges::sort(m_parent->m_subsurfaces, [](const auto& a, const auto& b) { return a->m_zIndex < b->m_zIndex; }); }); m_listeners.commitSurface = m_surface->m_events.commit.registerListener([this](std::any d) { @@ -116,8 +116,7 @@ Vector2D CWLSubsurfaceResource::posRelativeToParent() { // surfaces we've visited and if we hit a surface we've visited we bail out. std::vector> surfacesVisited; - while (surf->m_role->role() == SURFACE_ROLE_SUBSURFACE && - std::find_if(surfacesVisited.begin(), surfacesVisited.end(), [surf](const auto& other) { return surf == other; }) == surfacesVisited.end()) { + while (surf->m_role->role() == SURFACE_ROLE_SUBSURFACE && std::ranges::find_if(surfacesVisited, [surf](const auto& other) { return surf == other; }) == surfacesVisited.end()) { surfacesVisited.emplace_back(surf); auto subsurface = ((CSubsurfaceRole*)m_parent->m_role.get())->m_subsurface.lock(); pos += subsurface->m_position; @@ -134,8 +133,7 @@ SP CWLSubsurfaceResource::t1Parent() { SP surf = m_parent.lock(); std::vector> surfacesVisited; - while (surf->m_role->role() == SURFACE_ROLE_SUBSURFACE && - std::find_if(surfacesVisited.begin(), surfacesVisited.end(), [surf](const auto& other) { return surf == other; }) == surfacesVisited.end()) { + while (surf->m_role->role() == SURFACE_ROLE_SUBSURFACE && std::ranges::find_if(surfacesVisited, [surf](const auto& other) { return surf == other; }) == surfacesVisited.end()) { surfacesVisited.emplace_back(surf); auto subsurface = ((CSubsurfaceRole*)m_parent->m_role.get())->m_subsurface.lock(); surf = subsurface->m_parent.lock(); diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 855da879..89d769b3 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -255,7 +255,7 @@ EGLDeviceEXT CHyprOpenGLImpl::eglDeviceFromDRMFD(int drmFD) { CHyprOpenGLImpl::CHyprOpenGLImpl() : m_drmFD(g_pCompositor->m_drmFD) { const std::string EGLEXTENSIONS = (const char*)eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS); - Debug::log(LOG, "Supported EGL extensions: ({}) {}", std::count(EGLEXTENSIONS.begin(), EGLEXTENSIONS.end(), ' '), EGLEXTENSIONS); + Debug::log(LOG, "Supported EGL extensions: ({}) {}", std::ranges::count(EGLEXTENSIONS, ' '), EGLEXTENSIONS); m_exts.KHR_display_reference = EGLEXTENSIONS.contains("KHR_display_reference"); @@ -331,7 +331,7 @@ CHyprOpenGLImpl::CHyprOpenGLImpl() : m_drmFD(g_pCompositor->m_drmFD) { Debug::log(LOG, "Using: {}", (char*)glGetString(GL_VERSION)); Debug::log(LOG, "Vendor: {}", (char*)glGetString(GL_VENDOR)); Debug::log(LOG, "Renderer: {}", (char*)glGetString(GL_RENDERER)); - Debug::log(LOG, "Supported extensions: ({}) {}", std::count(m_extensions.begin(), m_extensions.end(), ' '), m_extensions); + Debug::log(LOG, "Supported extensions: ({}) {}", std::ranges::count(m_extensions, ' '), m_extensions); m_exts.EXT_read_format_bgra = m_extensions.contains("GL_EXT_read_format_bgra"); @@ -415,7 +415,7 @@ std::optional> CHyprOpenGLImpl::getModsForFormat(EGLint fo } // if the driver doesn't mark linear as external, add it. It's allowed unless the driver says otherwise. (e.g. nvidia) - if (!linearIsExternal && std::find(mods.begin(), mods.end(), DRM_FORMAT_MOD_LINEAR) == mods.end() && mods.size() == 0) + if (!linearIsExternal && std::ranges::find(mods, DRM_FORMAT_MOD_LINEAR) == mods.end() && mods.size() == 0) mods.push_back(DRM_FORMAT_MOD_LINEAR); return result; @@ -490,7 +490,7 @@ void CHyprOpenGLImpl::initDRMFormats() { free(fmtName); mods.clear(); - std::sort(modifierData.begin(), modifierData.end(), [](const auto& a, const auto& b) { + std::ranges::sort(modifierData, [](const auto& a, const auto& b) { if (a.first == 0) return false; if (a.second.contains("DCC")) diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 982e2ed8..28f078aa 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -59,7 +59,7 @@ CHyprRenderer::CHyprRenderer() { if (!DRMV) continue; std::string name = std::string{DRMV->name, DRMV->name_len}; - std::transform(name.begin(), name.end(), name.begin(), tolower); + std::ranges::transform(name, name.begin(), tolower); if (name.contains("nvidia")) m_nvidia = true; @@ -76,7 +76,7 @@ CHyprRenderer::CHyprRenderer() { if (DRMV) { std::string name = std::string{DRMV->name, DRMV->name_len}; - std::transform(name.begin(), name.end(), name.begin(), tolower); + std::ranges::transform(name, name.begin(), tolower); if (name.contains("nvidia")) m_nvidia = true; @@ -1794,7 +1794,7 @@ void CHyprRenderer::arrangeLayersForMonitor(const MONITORID& monitor) { } for (auto& la : PMONITOR->m_layerSurfaceLayers) { - std::stable_sort(la.begin(), la.end(), [](const PHLLSREF& a, const PHLLSREF& b) { return a->m_order > b->m_order; }); + std::ranges::stable_sort(la, [](const PHLLSREF& a, const PHLLSREF& b) { return a->m_order > b->m_order; }); } for (auto const& la : PMONITOR->m_layerSurfaceLayers) @@ -2171,7 +2171,7 @@ void CHyprRenderer::recheckSolitaryForMonitor(PHLMONITOR pMonitor) { } SP CHyprRenderer::getOrCreateRenderbuffer(SP buffer, uint32_t fmt) { - auto it = std::find_if(m_renderbuffers.begin(), m_renderbuffers.end(), [&](const auto& other) { return other->m_hlBuffer == buffer; }); + auto it = std::ranges::find_if(m_renderbuffers, [&](const auto& other) { return other->m_hlBuffer == buffer; }); if (it != m_renderbuffers.end()) return *it; @@ -2364,7 +2364,7 @@ SExplicitSyncSettings CHyprRenderer::getExplicitSyncSettings(SP("misc:render_unfocused_fps"); - if (std::find(m_renderUnfocused.begin(), m_renderUnfocused.end(), window) != m_renderUnfocused.end()) + if (std::ranges::find(m_renderUnfocused, window) != m_renderUnfocused.end()) return; m_renderUnfocused.emplace_back(window); diff --git a/src/render/decorations/DecorationPositioner.cpp b/src/render/decorations/DecorationPositioner.cpp index 82f2e5a8..178f3b9b 100644 --- a/src/render/decorations/DecorationPositioner.cpp +++ b/src/render/decorations/DecorationPositioner.cpp @@ -59,7 +59,7 @@ Vector2D CDecorationPositioner::getEdgeDefinedPoint(uint32_t edges, PHLWINDOW pW void CDecorationPositioner::uncacheDecoration(IHyprWindowDecoration* deco) { std::erase_if(m_windowPositioningDatas, [&](const auto& data) { return !data->pWindow.lock() || data->pDecoration == deco; }); - const auto WIT = std::find_if(m_windowDatas.begin(), m_windowDatas.end(), [&](const auto& other) { return other.first.lock() == deco->m_window.lock(); }); + const auto WIT = std::ranges::find_if(m_windowDatas, [&](const auto& other) { return other.first.lock() == deco->m_window.lock(); }); if (WIT == m_windowDatas.end()) return; @@ -72,7 +72,7 @@ void CDecorationPositioner::repositionDeco(IHyprWindowDecoration* deco) { } CDecorationPositioner::SWindowPositioningData* CDecorationPositioner::getDataFor(IHyprWindowDecoration* pDecoration, PHLWINDOW pWindow) { - auto it = std::find_if(m_windowPositioningDatas.begin(), m_windowPositioningDatas.end(), [&](const auto& el) { return el->pDecoration == pDecoration; }); + auto it = std::ranges::find_if(m_windowPositioningDatas, [&](const auto& el) { return el->pDecoration == pDecoration; }); if (it != m_windowPositioningDatas.end()) return it->get(); @@ -89,15 +89,14 @@ void CDecorationPositioner::sanitizeDatas() { std::erase_if(m_windowPositioningDatas, [](const auto& other) { if (!validMapped(other->pWindow)) return true; - if (std::find_if(other->pWindow->m_windowDecorations.begin(), other->pWindow->m_windowDecorations.end(), [&](const auto& el) { return el.get() == other->pDecoration; }) == - other->pWindow->m_windowDecorations.end()) + if (std::ranges::find_if(other->pWindow->m_windowDecorations, [&](const auto& el) { return el.get() == other->pDecoration; }) == other->pWindow->m_windowDecorations.end()) return true; return false; }); } void CDecorationPositioner::forceRecalcFor(PHLWINDOW pWindow) { - const auto WIT = std::find_if(m_windowDatas.begin(), m_windowDatas.end(), [&](const auto& other) { return other.first.lock() == pWindow; }); + const auto WIT = std::ranges::find_if(m_windowDatas, [&](const auto& other) { return other.first.lock() == pWindow; }); if (WIT == m_windowDatas.end()) return; @@ -110,7 +109,7 @@ void CDecorationPositioner::onWindowUpdate(PHLWINDOW pWindow) { if (!validMapped(pWindow)) return; - const auto WIT = std::find_if(m_windowDatas.begin(), m_windowDatas.end(), [&](const auto& other) { return other.first.lock() == pWindow; }); + const auto WIT = std::ranges::find_if(m_windowDatas, [&](const auto& other) { return other.first.lock() == pWindow; }); if (WIT == m_windowDatas.end()) return; @@ -128,8 +127,7 @@ void CDecorationPositioner::onWindowUpdate(PHLWINDOW pWindow) { } if (WINDOWDATA->lastWindowSize == pWindow->m_realSize->value() /* position not changed */ - && std::all_of(m_windowPositioningDatas.begin(), m_windowPositioningDatas.end(), - [pWindow](const auto& data) { return pWindow != data->pWindow.lock() || !data->needsReposition; }) + && std::ranges::all_of(m_windowPositioningDatas, [pWindow](const auto& data) { return pWindow != data->pWindow.lock() || !data->needsReposition; }) /* all window datas are either not for this window or don't need a reposition */ && !WINDOWDATA->needsRecalc /* window doesn't need recalc */ ) @@ -143,7 +141,7 @@ void CDecorationPositioner::onWindowUpdate(PHLWINDOW pWindow) { WINDOWDATA->needsRecalc = false; const bool EPHEMERAL = pWindow->m_realSize->isBeingAnimated(); - std::sort(datas.begin(), datas.end(), [](const auto& a, const auto& b) { return a->positioningInfo.priority > b->positioningInfo.priority; }); + std::ranges::sort(datas, [](const auto& a, const auto& b) { return a->positioningInfo.priority > b->positioningInfo.priority; }); CBox wb = pWindow->getWindowMainSurfaceBox(); diff --git a/src/render/pass/Pass.cpp b/src/render/pass/Pass.cpp index 5877d9a9..32296ad7 100644 --- a/src/render/pass/Pass.cpp +++ b/src/render/pass/Pass.cpp @@ -259,7 +259,7 @@ void CRenderPass::renderDebugData() { } } - const auto DISCARDED_ELEMENTS = std::count_if(m_passElements.begin(), m_passElements.end(), [](const auto& e) { return e->discard; }); + const auto DISCARDED_ELEMENTS = std::ranges::count_if(m_passElements, [](const auto& e) { return e->discard; }); auto tex = g_pHyprOpenGL->renderText(std::format("occlusion layers: {}\npass elements: {} ({} discarded)\nviewport: {:X0}", m_occludedRegions.size(), m_passElements.size(), DISCARDED_ELEMENTS, g_pHyprOpenGL->m_renderData.pMonitor->m_pixelSize), Colors::WHITE, 12); diff --git a/src/xwayland/XSurface.cpp b/src/xwayland/XSurface.cpp index 949649ae..71e710b3 100644 --- a/src/xwayland/XSurface.cpp +++ b/src/xwayland/XSurface.cpp @@ -214,7 +214,7 @@ void CXWaylandSurface::restackToTop() { xcb_configure_window(g_pXWayland->m_wm->m_connection, m_xID, XCB_CONFIG_WINDOW_STACK_MODE, values); auto& stack = g_pXWayland->m_wm->m_mappedSurfacesStacking; - auto it = std::find(stack.begin(), stack.end(), m_self); + auto it = std::ranges::find(stack, m_self); if (it != stack.end()) std::rotate(it, it + 1, stack.end()); diff --git a/src/xwayland/XWM.cpp b/src/xwayland/XWM.cpp index 8e4f9a87..76ae1d88 100644 --- a/src/xwayland/XWM.cpp +++ b/src/xwayland/XWM.cpp @@ -164,7 +164,7 @@ static bool lookupParentExists(SP XSURF, SP XSURF = XSURF->m_parent.lock(); - if (std::find(visited.begin(), visited.end(), XSURF) != visited.end()) + if (std::ranges::find(visited, XSURF) != visited.end()) return false; } @@ -202,7 +202,7 @@ void CXWM::readProp(SP XSURF, uint32_t atom, xcb_get_property_ size_t len = xcb_get_property_value_length(reply); char* string = (char*)xcb_get_property_value(reply); XSURF->m_state.appid = std::string{string, len}; - if (std::count(XSURF->m_state.appid.begin(), XSURF->m_state.appid.end(), '\000') == 2) + if (std::ranges::count(XSURF->m_state.appid, '\000') == 2) XSURF->m_state.appid = XSURF->m_state.appid.substr(XSURF->m_state.appid.find_first_of('\000') + 1); // fuck you X if (!XSURF->m_state.appid.empty()) XSURF->m_state.appid.pop_back(); @@ -1109,7 +1109,7 @@ void CXWM::associate(SP surf, SP wlSurf) { if (surf->m_surface) return; - auto existing = std::find_if(m_surfaces.begin(), m_surfaces.end(), [wlSurf](const auto& e) { return e->m_surface == wlSurf; }); + auto existing = std::ranges::find_if(m_surfaces, [wlSurf](const auto& e) { return e->m_surface == wlSurf; }); if (existing != m_surfaces.end()) { Debug::log(WARN, "[xwm] associate() called but surface is already associated to {:x}, ignoring...", (uintptr_t)surf.get()); @@ -1420,7 +1420,7 @@ bool SXSelection::sendData(xcb_selection_request_event_t* e, std::string mime) { if (MIMES.empty()) return false; - if (std::find(MIMES.begin(), MIMES.end(), mime) == MIMES.end()) { + if (std::ranges::find(MIMES, mime) == MIMES.end()) { Debug::log(ERR, "[xwm] X Client asked for an invalid MIME, sending the first advertised. THIS SHIT MAY BREAK!"); mime = *MIMES.begin(); } From af2fdb5d58f5d3017aafd78a8ddafb40f710e34b Mon Sep 17 00:00:00 2001 From: mitsuru Date: Fri, 30 May 2025 22:40:12 +0100 Subject: [PATCH 052/901] nix: use gcc15 resolves Nix build/CI failures introduced in 9190443 bumps flake.lock as gcc15Stdenv wasn't available at the pinned version of nixpkgs --- flake.lock | 6 +++--- nix/overlays.nix | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/flake.lock b/flake.lock index 22f246d5..01b437e6 100644 --- a/flake.lock +++ b/flake.lock @@ -276,11 +276,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1748026106, - "narHash": "sha256-6m1Y3/4pVw1RWTsrkAK2VMYSzG4MMIj7sqUy7o8th1o=", + "lastModified": 1748460289, + "narHash": "sha256-7doLyJBzCllvqX4gszYtmZUToxKvMUrg45EUWaUYmBg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "063f43f2dbdef86376cc29ad646c45c46e93234c", + "rev": "96ec055edbe5ee227f28cdbc3f1ddf1df5965102", "type": "github" }, "original": { diff --git a/nix/overlays.nix b/nix/overlays.nix index 6085bf80..ee020eaa 100644 --- a/nix/overlays.nix +++ b/nix/overlays.nix @@ -35,7 +35,7 @@ in { date = mkDate (self.lastModifiedDate or "19700101"); in { hyprland = final.callPackage ./default.nix { - stdenv = final.gcc14Stdenv; + stdenv = final.gcc15Stdenv; version = "${version}+date=${date}_${self.shortRev or "dirty"}"; commit = self.rev or ""; revCount = self.sourceInfo.revCount or ""; From 4078e1d17c0fb1439ee5a0ba1e539f06a8f47aab Mon Sep 17 00:00:00 2001 From: Kamikadze <40305144+Kam1k4dze@users.noreply.github.com> Date: Sat, 31 May 2025 18:02:02 +0500 Subject: [PATCH 053/901] refactor: replace all `typedef` with `using` (#10594) --- src/SharedDefs.hpp | 8 ++++---- src/desktop/DesktopTypes.hpp | 16 ++++++++-------- src/helpers/Format.hpp | 6 +++--- src/layout/IHyprLayout.cpp | 2 +- src/managers/HookSystemManager.hpp | 4 ++-- src/managers/XWaylandManager.hpp | 2 +- src/plugins/PluginAPI.hpp | 10 +++++----- src/protocols/types/ColorManagement.hpp | 2 +- src/xwayland/XSurface.hpp | 12 ++++++------ 9 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/SharedDefs.hpp b/src/SharedDefs.hpp index a46a2429..b8094997 100644 --- a/src/SharedDefs.hpp +++ b/src/SharedDefs.hpp @@ -58,8 +58,8 @@ struct SDispatchResult { std::string error; }; -typedef int64_t WINDOWID; -typedef int64_t MONITORID; -typedef int64_t WORKSPACEID; +using WINDOWID = int64_t; +using MONITORID = int64_t; +using WORKSPACEID = int64_t; -typedef std::function HOOK_CALLBACK_FN; +using HOOK_CALLBACK_FN = std::function; diff --git a/src/desktop/DesktopTypes.hpp b/src/desktop/DesktopTypes.hpp index 080f13d3..f724c7b9 100644 --- a/src/desktop/DesktopTypes.hpp +++ b/src/desktop/DesktopTypes.hpp @@ -6,21 +6,21 @@ class CLayerSurface; class CMonitor; /* Shared pointer to a workspace */ -typedef SP PHLWORKSPACE; +using PHLWORKSPACE = SP; /* Weak pointer to a workspace */ -typedef WP PHLWORKSPACEREF; +using PHLWORKSPACEREF = WP; /* Shared pointer to a window */ -typedef SP PHLWINDOW; +using PHLWINDOW = SP; /* Weak pointer to a window */ -typedef WP PHLWINDOWREF; +using PHLWINDOWREF = WP; /* Shared pointer to a layer surface */ -typedef SP PHLLS; +using PHLLS = SP; /* Weak pointer to a layer surface */ -typedef WP PHLLSREF; +using PHLLSREF = WP; /* Shared pointer to a monitor */ -typedef SP PHLMONITOR; +using PHLMONITOR = SP; /* Weak pointer to a monitor */ -typedef WP PHLMONITORREF; +using PHLMONITORREF = WP; diff --git a/src/helpers/Format.hpp b/src/helpers/Format.hpp index b1353dc7..fe68f763 100644 --- a/src/helpers/Format.hpp +++ b/src/helpers/Format.hpp @@ -5,8 +5,8 @@ #include "math/Math.hpp" #include -typedef uint32_t DRMFormat; -typedef uint32_t SHMFormat; +using DRMFormat = uint32_t; +using SHMFormat = uint32_t; struct SPixelFormat { DRMFormat drmFormat = 0; /* DRM_FORMAT_INVALID */ @@ -20,7 +20,7 @@ struct SPixelFormat { Vector2D blockSize; }; -typedef Aquamarine::SDRMFormat SDRMFormat; +using SDRMFormat = Aquamarine::SDRMFormat; namespace NFormatUtils { SHMFormat drmToShm(DRMFormat drm); diff --git a/src/layout/IHyprLayout.cpp b/src/layout/IHyprLayout.cpp index 1fe3a936..fbde7344 100644 --- a/src/layout/IHyprLayout.cpp +++ b/src/layout/IHyprLayout.cpp @@ -411,7 +411,7 @@ static void snapResize(double& start, double& end, const double P) { start = P; } -typedef std::function SnapFn; +using SnapFn = std::function; static void performSnap(Vector2D& sourcePos, Vector2D& sourceSize, PHLWINDOW DRAGGINGWINDOW, const eMouseBindMode MODE, const int CORNER, const Vector2D& BEGINSIZE) { static auto SNAPWINDOWGAP = CConfigValue("general:snap:window_gap"); diff --git a/src/managers/HookSystemManager.hpp b/src/managers/HookSystemManager.hpp index 69d54a60..647e9670 100644 --- a/src/managers/HookSystemManager.hpp +++ b/src/managers/HookSystemManager.hpp @@ -11,9 +11,9 @@ #define HANDLE void* -// global typedef for hooked functions. Passes itself as a ptr when called, and `data` additionally. +// global type alias for hooked functions. Passes itself as a ptr when called, and `data` additionally. -typedef std::function HOOK_CALLBACK_FN; +using HOOK_CALLBACK_FN = std::function; struct SCallbackFNPtr { WP fn; diff --git a/src/managers/XWaylandManager.hpp b/src/managers/XWaylandManager.hpp index e4f1e17a..59eee4c5 100644 --- a/src/managers/XWaylandManager.hpp +++ b/src/managers/XWaylandManager.hpp @@ -4,7 +4,7 @@ #include class CWindow; // because clangd -typedef SP PHLWINDOW; +using PHLWINDOW = SP; class CWLSurfaceResource; class CHyprXWaylandManager { diff --git a/src/plugins/PluginAPI.hpp b/src/plugins/PluginAPI.hpp index 0f333294..00a1e8b2 100644 --- a/src/plugins/PluginAPI.hpp +++ b/src/plugins/PluginAPI.hpp @@ -31,12 +31,12 @@ Feel like the API is missing something you'd like to use in your plugin? Open an #include #include -typedef struct { +using PLUGIN_DESCRIPTION_INFO = struct { std::string name; std::string description; std::string author; std::string version; -} PLUGIN_DESCRIPTION_INFO; +}; struct SFunctionMatch { void* address = nullptr; @@ -83,7 +83,7 @@ class CWindow; This function should not be modified, see the example plugin. */ -typedef REQUIRED std::string (*PPLUGIN_API_VERSION_FUNC)(); +using PPLUGIN_API_VERSION_FUNC = REQUIRED std::string (*)(); #define PLUGIN_API_VERSION pluginAPIVersion #define PLUGIN_API_VERSION_FUNC_STR "pluginAPIVersion" @@ -93,7 +93,7 @@ typedef REQUIRED std::string (*PPLUGIN_API_VERSION_FUNC)(); Keep in mind this is executed synchronously, and as such any blocking calls to hyprland might hang. (e.g. system("hyprctl ...")) */ -typedef REQUIRED PLUGIN_DESCRIPTION_INFO (*PPLUGIN_INIT_FUNC)(HANDLE); +using PPLUGIN_INIT_FUNC = REQUIRED PLUGIN_DESCRIPTION_INFO (*)(HANDLE); #define PLUGIN_INIT pluginInit #define PLUGIN_INIT_FUNC_STR "pluginInit" @@ -103,7 +103,7 @@ typedef REQUIRED PLUGIN_DESCRIPTION_INFO (*PPLUGIN_INIT_FUNC)(HANDLE); Hooks are unloaded after exit. */ -typedef OPTIONAL void (*PPLUGIN_EXIT_FUNC)(); +using PPLUGIN_EXIT_FUNC = OPTIONAL void (*)(); #define PLUGIN_EXIT pluginExit #define PLUGIN_EXIT_FUNC_STR "pluginExit" diff --git a/src/protocols/types/ColorManagement.hpp b/src/protocols/types/ColorManagement.hpp index 48d8dd31..2dd1c075 100644 --- a/src/protocols/types/ColorManagement.hpp +++ b/src/protocols/types/ColorManagement.hpp @@ -54,7 +54,7 @@ namespace NColorManagement { return (eTransferFunction)tf; } - typedef Hyprgraphics::SPCPRimaries SPCPRimaries; + using SPCPRimaries = Hyprgraphics::SPCPRimaries; namespace NColorPrimaries { static const auto DEFAULT_PRIMARIES = SPCPRimaries{}; diff --git a/src/xwayland/XSurface.hpp b/src/xwayland/XSurface.hpp index dc43acbb..ec71aad3 100644 --- a/src/xwayland/XSurface.hpp +++ b/src/xwayland/XSurface.hpp @@ -9,9 +9,9 @@ class CWLSurfaceResource; class CXWaylandSurfaceResource; #ifdef NO_XWAYLAND -typedef uint32_t xcb_pixmap_t; -typedef uint32_t xcb_window_t; -typedef struct { +using xcb_pixmap_t = uint32_t; +using xcb_window_t = uint32_t; +using xcb_icccm_wm_hints_t = struct { int32_t flags; uint32_t input; int32_t initial_state; @@ -20,8 +20,8 @@ typedef struct { int32_t icon_x, icon_y; xcb_pixmap_t icon_mask; xcb_window_t window_group; -} xcb_icccm_wm_hints_t; -typedef struct { +}; +using xcb_size_hints_t = struct { uint32_t flags; int32_t x, y; int32_t width, height; @@ -32,7 +32,7 @@ typedef struct { int32_t max_aspect_num, max_aspect_den; int32_t base_width, base_height; uint32_t win_gravity; -} xcb_size_hints_t; +}; #else #include #endif From 69c2b2926e128f1fd09080aed43944987a42026f Mon Sep 17 00:00:00 2001 From: Kamikadze <40305144+Kam1k4dze@users.noreply.github.com> Date: Sat, 31 May 2025 23:49:50 +0500 Subject: [PATCH 054/901] internal: refactor to use empty() (#10599) --- src/config/ConfigManager.cpp | 22 +++++++++---------- src/debug/HyprCtl.cpp | 8 +++---- src/debug/HyprDebugOverlay.cpp | 8 +++---- src/debug/HyprNotificationOverlay.cpp | 4 ++-- src/desktop/Window.cpp | 4 ++-- src/events/Windows.cpp | 4 ++-- src/helpers/MiscFunctions.cpp | 2 +- src/helpers/Monitor.cpp | 2 +- src/hyprerror/HyprError.cpp | 4 ++-- src/layout/MasterLayout.cpp | 2 +- src/managers/AnimationManager.cpp | 4 ++-- src/managers/CursorManager.cpp | 8 +++---- src/managers/KeybindManager.cpp | 10 ++++----- src/managers/ProtocolManager.cpp | 2 +- src/managers/SeatManager.cpp | 2 +- src/managers/input/InputManager.cpp | 10 ++++----- src/plugins/HookSystem.cpp | 2 +- src/render/OpenGL.cpp | 12 +++++----- src/render/Renderer.cpp | 2 +- .../decorations/CHyprGroupBarDecoration.cpp | 2 +- 20 files changed, 57 insertions(+), 57 deletions(-) diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 3ab53a3c..f7fed52f 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -100,7 +100,7 @@ static Hyprlang::CParseResult configHandleGradientSet(const char* VALUE, void** } } - if (DATA->m_colors.size() == 0) { + if (DATA->m_colors.empty()) { Debug::log(WARN, "Error parsing gradient {}", V); if (parseError.empty()) parseError = "Error parsing gradient " + V + ": No colors?"; @@ -2093,7 +2093,7 @@ std::optional CConfigManager::handleMonitor(const std::string& comm int argno = 4; - while (ARGS[argno] != "") { + while (!ARGS[argno].empty()) { if (ARGS[argno] == "mirror") { newrule.mirrorOf = ARGS[argno + 1]; argno++; @@ -2185,23 +2185,23 @@ std::optional CConfigManager::handleBezier(const std::string& comma std::string bezierName = ARGS[0]; - if (ARGS[1] == "") + if (ARGS[1].empty()) return "too few arguments"; float p1x = std::stof(ARGS[1]); - if (ARGS[2] == "") + if (ARGS[2].empty()) return "too few arguments"; float p1y = std::stof(ARGS[2]); - if (ARGS[3] == "") + if (ARGS[3].empty()) return "too few arguments"; float p2x = std::stof(ARGS[3]); - if (ARGS[4] == "") + if (ARGS[4].empty()) return "too few arguments"; float p2y = std::stof(ARGS[4]); - if (ARGS[5] != "") + if (!ARGS[5].empty()) return "too many arguments"; g_pAnimationManager->addBezierWithName(bezierName, Vector2D(p1x, p1y), Vector2D(p2x, p2y)); @@ -2256,10 +2256,10 @@ std::optional CConfigManager::handleAnimation(const std::string& co return "no such bezier"; } - if (ARGS[4] != "") { + if (!ARGS[4].empty()) { auto ERR = g_pAnimationManager->styleValidInConfigVar(ANIMNAME, ARGS[4]); - if (ERR != "") + if (!ERR.empty()) return ERR; } @@ -2384,12 +2384,12 @@ std::optional CConfigManager::handleBind(const std::string& command return "Invalid dispatcher, requested \"" + HANDLER + "\" does not exist"; } - if (MOD == 0 && MODSTR != "") { + if (MOD == 0 && !MODSTR.empty()) { Debug::log(ERR, "Invalid mod: {}", MODSTR); return "Invalid mod, requested mod \"" + MODSTR + "\" is not a valid mod."; } - if ((KEY != "") || multiKey) { + if ((!KEY.empty()) || multiKey) { SParsedKey parsedKey = parseKey(KEY); if (parsedKey.catchAll && m_currentSubmap.empty()) { diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp index c8cc5c59..77f54c2b 100644 --- a/src/debug/HyprCtl.cpp +++ b/src/debug/HyprCtl.cpp @@ -516,7 +516,7 @@ static std::string layersRequest(eHyprCtlOutputFormat format, std::string reques trimTrailingComma(result); - if (level.size() > 0) + if (!level.empty()) result += "\n "; result += "],"; @@ -1144,7 +1144,7 @@ static std::string dispatchKeyword(eHyprCtlOutputFormat format, std::string in) Debug::log(LOG, "Hyprctl: keyword {} : {}", COMMAND, VALUE); - if (retval == "") + if (retval.empty()) return "ok"; return retval; @@ -1528,7 +1528,7 @@ static std::string dispatchPlugin(eHyprCtlOutputFormat format, std::string reque if (format == eHyprCtlOutputFormat::FORMAT_JSON) { result += "["; - if (PLUGINS.size() == 0) + if (PLUGINS.empty()) return "[]"; for (auto const& p : PLUGINS) { @@ -1546,7 +1546,7 @@ static std::string dispatchPlugin(eHyprCtlOutputFormat format, std::string reque trimTrailingComma(result); result += "]"; } else { - if (PLUGINS.size() == 0) + if (PLUGINS.empty()) return "no plugins loaded"; for (auto const& p : PLUGINS) { diff --git a/src/debug/HyprDebugOverlay.cpp b/src/debug/HyprDebugOverlay.cpp index 332800dd..6c5d8000 100644 --- a/src/debug/HyprDebugOverlay.cpp +++ b/src/debug/HyprDebugOverlay.cpp @@ -83,7 +83,7 @@ int CHyprMonitorDebugOverlay::draw(int offset) { avgFrametime += ft; } float varFrametime = maxFrametime - minFrametime; - avgFrametime /= m_lastFrametimes.size() == 0 ? 1 : m_lastFrametimes.size(); + avgFrametime /= m_lastFrametimes.empty() ? 1 : m_lastFrametimes.size(); float avgRenderTime = 0; float maxRenderTime = 0; @@ -96,7 +96,7 @@ int CHyprMonitorDebugOverlay::draw(int offset) { avgRenderTime += rt; } float varRenderTime = maxRenderTime - minRenderTime; - avgRenderTime /= m_lastRenderTimes.size() == 0 ? 1 : m_lastRenderTimes.size(); + avgRenderTime /= m_lastRenderTimes.empty() ? 1 : m_lastRenderTimes.size(); float avgRenderTimeNoOverlay = 0; float maxRenderTimeNoOverlay = 0; @@ -109,7 +109,7 @@ int CHyprMonitorDebugOverlay::draw(int offset) { avgRenderTimeNoOverlay += rt; } float varRenderTimeNoOverlay = maxRenderTimeNoOverlay - minRenderTimeNoOverlay; - avgRenderTimeNoOverlay /= m_lastRenderTimes.size() == 0 ? 1 : m_lastRenderTimes.size(); + avgRenderTimeNoOverlay /= m_lastRenderTimes.empty() ? 1 : m_lastRenderTimes.size(); float avgAnimMgrTick = 0; float maxAnimMgrTick = 0; @@ -122,7 +122,7 @@ int CHyprMonitorDebugOverlay::draw(int offset) { avgAnimMgrTick += at; } float varAnimMgrTick = maxAnimMgrTick - minAnimMgrTick; - avgAnimMgrTick /= m_lastAnimationTicks.size() == 0 ? 1 : m_lastAnimationTicks.size(); + avgAnimMgrTick /= m_lastAnimationTicks.empty() ? 1 : m_lastAnimationTicks.size(); const float FPS = 1.f / (avgFrametime / 1000.f); // frametimes are in ms const float idealFPS = m_lastFrametimes.size(); diff --git a/src/debug/HyprNotificationOverlay.cpp b/src/debug/HyprNotificationOverlay.cpp index bfa5c4e4..c50abfe6 100644 --- a/src/debug/HyprNotificationOverlay.cpp +++ b/src/debug/HyprNotificationOverlay.cpp @@ -23,7 +23,7 @@ static inline auto iconBackendFromLayout(PangoLayout* layout) { CHyprNotificationOverlay::CHyprNotificationOverlay() { static auto P = g_pHookSystem->hookDynamic("focusedMon", [&](void* self, SCallbackInfo& info, std::any param) { - if (m_notifications.size() == 0) + if (m_notifications.empty()) return; g_pHyprRenderer->damageBox(m_lastDamage); @@ -210,7 +210,7 @@ void CHyprNotificationOverlay::draw(PHLMONITOR pMonitor) { } // Draw the notifications - if (m_notifications.size() == 0) + if (m_notifications.empty()) return; // Render to the monitor diff --git a/src/desktop/Window.cpp b/src/desktop/Window.cpp index cc3c9390..555b99f0 100644 --- a/src/desktop/Window.cpp +++ b/src/desktop/Window.cpp @@ -1624,13 +1624,13 @@ PHLWINDOW CWindow::getSwallower() { if (!(*PSWALLOWREGEX).empty()) std::erase_if(candidates, [&](const auto& other) { return !RE2::FullMatch(other->m_class, *PSWALLOWREGEX); }); - if (candidates.size() == 0) + if (candidates.empty()) return nullptr; if (!(*PSWALLOWEXREGEX).empty()) std::erase_if(candidates, [&](const auto& other) { return RE2::FullMatch(other->m_title, *PSWALLOWEXREGEX); }); - if (candidates.size() == 0) + if (candidates.empty()) return nullptr; if (candidates.size() == 1) diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index b019adff..da1e5263 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -418,8 +418,8 @@ void Events::listener_mapWindow(void* owner, void* data) { PWINDOW->m_swallowed->m_currentlySwallowed = true; // emit the IPC event before the layout might focus the window to avoid a focus event first - g_pEventManager->postEvent( - SHyprIPCEvent{"openwindow", std::format("{:x},{},{},{}", PWINDOW, requestedWorkspace != "" ? requestedWorkspace : PWORKSPACE->m_name, PWINDOW->m_class, PWINDOW->m_title)}); + g_pEventManager->postEvent(SHyprIPCEvent{ + "openwindow", std::format("{:x},{},{},{}", PWINDOW, !requestedWorkspace.empty() ? requestedWorkspace : PWORKSPACE->m_name, PWINDOW->m_class, PWINDOW->m_title)}); if (PWINDOW->m_isFloating) { g_pLayoutManager->getCurrentLayout()->onWindowCreated(PWINDOW); diff --git a/src/helpers/MiscFunctions.cpp b/src/helpers/MiscFunctions.cpp index ddd16144..8069d414 100644 --- a/src/helpers/MiscFunctions.cpp +++ b/src/helpers/MiscFunctions.cpp @@ -326,7 +326,7 @@ SWorkspaceIDName getWorkspaceIDNameFromString(const std::string& in) { finalWSID = curID; } if (finalWSID <= 0 || invalidWSes.contains(finalWSID)) { - if (namedWSes.size()) { + if (!namedWSes.empty()) { // Go to the named workspaces // Need remainingWSes more auto namedWSIdx = namedWSes.size() - remainingWSes; diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index 5afd0123..b0b31526 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -988,7 +988,7 @@ void CMonitor::setupDefaultWS(const SMonitorRule& monitorRule) { g_pLayoutManager->getCurrentLayout()->recalculateMonitor(m_id); PNEWWORKSPACE->startAnim(true, true, true); } else { - if (newDefaultWorkspaceName == "") + if (newDefaultWorkspaceName.empty()) newDefaultWorkspaceName = std::to_string(wsID); PNEWWORKSPACE = g_pCompositor->m_workspaces.emplace_back(CWorkspace::create(wsID, m_self.lock(), newDefaultWorkspaceName)); diff --git a/src/hyprerror/HyprError.cpp b/src/hyprerror/HyprError.cpp index 22744c93..b6080306 100644 --- a/src/hyprerror/HyprError.cpp +++ b/src/hyprerror/HyprError.cpp @@ -165,8 +165,8 @@ void CHyprError::createQueued() { } void CHyprError::draw() { - if (!m_isCreated || m_queued != "") { - if (m_queued != "") + if (!m_isCreated || !m_queued.empty()) { + if (!m_queued.empty()) createQueued(); return; } diff --git a/src/layout/MasterLayout.cpp b/src/layout/MasterLayout.cpp index cb1313a8..abdf8032 100644 --- a/src/layout/MasterLayout.cpp +++ b/src/layout/MasterLayout.cpp @@ -1359,7 +1359,7 @@ void CHyprMasterLayout::runOrientationCycle(SLayoutMessageHeader& header, CVarLi if (vars != nullptr) buildOrientationCycleVectorFromVars(cycle, *vars); - if (cycle.size() == 0) + if (cycle.empty()) buildOrientationCycleVectorFromEOperation(cycle); const auto PWINDOW = header.pWindow; diff --git a/src/managers/AnimationManager.cpp b/src/managers/AnimationManager.cpp index f935d3dc..d1da1a36 100644 --- a/src/managers/AnimationManager.cpp +++ b/src/managers/AnimationManager.cpp @@ -306,7 +306,7 @@ void CHyprAnimationManager::animationSlide(PHLWINDOW pWindow, std::string force, Vector2D posOffset; - if (force != "") { + if (!force.empty()) { if (force == "bottom") posOffset = Vector2D(GOALPOS.x, PMONITOR->m_position.y + PMONITOR->m_size.y); else if (force == "left") @@ -490,7 +490,7 @@ std::string CHyprAnimationManager::styleValidInConfigVar(const std::string& conf return ""; return "unknown style"; } else if (config.starts_with("layers")) { - if (style == "fade" || style == "" || style == "slide") + if (style.empty() || style == "fade" || style == "slide") return ""; else if (style.starts_with("popin")) { // try parsing diff --git a/src/managers/CursorManager.cpp b/src/managers/CursorManager.cpp index 9211fc20..cb46dd65 100644 --- a/src/managers/CursorManager.cpp +++ b/src/managers/CursorManager.cpp @@ -183,7 +183,7 @@ void CCursorManager::setCursorFromName(const std::string& name) { auto setHyprCursor = [this](auto const& name) { m_currentCursorShapeData = m_hyprcursor->getShape(name.c_str(), m_currentStyleInfo); - if (m_currentCursorShapeData.images.size() < 1) { + if (m_currentCursorShapeData.images.empty()) { // try with '_' first (old hc, etc) std::string newName = name; std::ranges::replace(newName, '-', '_'); @@ -191,18 +191,18 @@ void CCursorManager::setCursorFromName(const std::string& name) { m_currentCursorShapeData = m_hyprcursor->getShape(newName.c_str(), m_currentStyleInfo); } - if (m_currentCursorShapeData.images.size() < 1) { + if (m_currentCursorShapeData.images.empty()) { // fallback to a default if available constexpr const std::array fallbackShapes = {"default", "left_ptr", "left-ptr"}; for (auto const& s : fallbackShapes) { m_currentCursorShapeData = m_hyprcursor->getShape(s, m_currentStyleInfo); - if (m_currentCursorShapeData.images.size() > 0) + if (!m_currentCursorShapeData.images.empty()) break; } - if (m_currentCursorShapeData.images.size() < 1) { + if (m_currentCursorShapeData.images.empty()) { Debug::log(ERR, "BUG THIS: No fallback found for a cursor in setCursorFromName"); return false; } diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index 58951281..976e292d 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -164,7 +164,7 @@ CKeybindManager::CKeybindManager() { m_repeatKeyTimer = makeShared( std::nullopt, [this](SP self, void* data) { - if (m_activeKeybinds.size() == 0 || g_pSeatManager->m_keyboard.expired()) + if (m_activeKeybinds.empty() || g_pSeatManager->m_keyboard.expired()) return; const auto PACTIVEKEEB = g_pSeatManager->m_keyboard.lock(); @@ -288,7 +288,7 @@ void CKeybindManager::updateXKBTranslationState() { xkb_rule_names rules = {.rules = RULES.c_str(), .model = MODEL.c_str(), .layout = LAYOUT.c_str(), .variant = VARIANT.c_str(), .options = OPTIONS.c_str()}; const auto PCONTEXT = xkb_context_new(XKB_CONTEXT_NO_FLAGS); - FILE* const KEYMAPFILE = FILEPATH == "" ? nullptr : fopen(absolutePath(FILEPATH, g_pConfigManager->m_configCurrentPath).c_str(), "r"); + FILE* const KEYMAPFILE = FILEPATH.empty() ? nullptr : fopen(absolutePath(FILEPATH, g_pConfigManager->m_configCurrentPath).c_str(), "r"); auto PKEYMAP = KEYMAPFILE ? xkb_keymap_new_from_file(PCONTEXT, KEYMAPFILE, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS) : xkb_keymap_new_from_names(PCONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS); @@ -630,7 +630,7 @@ eMultiKeyCase CKeybindManager::mkKeysymSetMatches(const std::set k if (boundKeysNotPressed.empty() && pressedKeysNotBound.empty()) return MK_FULL_MATCH; - if (boundKeysNotPressed.size() && pressedKeysNotBound.empty()) + if (!boundKeysNotPressed.empty() && pressedKeysNotBound.empty()) return MK_PARTIAL_MATCH; return MK_NO_MATCH; @@ -2398,7 +2398,7 @@ SDispatchResult CKeybindManager::toggleSwallow(std::string args) { } SDispatchResult CKeybindManager::setSubmap(std::string submap) { - if (submap == "reset" || submap == "") { + if (submap == "reset" || submap.empty()) { m_currentSelectedSubmap = ""; Debug::log(LOG, "Reset active submap to the default one."); g_pEventManager->postEvent(SHyprIPCEvent{"submap", ""}); @@ -2576,7 +2576,7 @@ SDispatchResult CKeybindManager::sendshortcut(std::string args) { //if regexp is not empty, send shortcut to current window //else, dont change focus - if (regexp != "") { + if (!regexp.empty()) { PWINDOW = g_pCompositor->getWindowByRegex(regexp); if (!PWINDOW) { diff --git a/src/managers/ProtocolManager.cpp b/src/managers/ProtocolManager.cpp index ab542fc2..942e7954 100644 --- a/src/managers/ProtocolManager.cpp +++ b/src/managers/ProtocolManager.cpp @@ -209,7 +209,7 @@ CProtocolManager::CProtocolManager() { break; } - if (g_pHyprOpenGL->getDRMFormats().size() > 0) { + if (!g_pHyprOpenGL->getDRMFormats().empty()) { PROTO::mesaDRM = makeUnique(&wl_drm_interface, 2, "MesaDRM"); PROTO::linuxDma = makeUnique(&zwp_linux_dmabuf_v1_interface, 5, "LinuxDMABUF"); } else diff --git a/src/managers/SeatManager.cpp b/src/managers/SeatManager.cpp index a7660854..9fe2b26b 100644 --- a/src/managers/SeatManager.cpp +++ b/src/managers/SeatManager.cpp @@ -493,7 +493,7 @@ void CSeatManager::refocusGrab() { if (!m_seatGrab) return; - if (m_seatGrab->m_surfs.size() > 0) { + if (!m_seatGrab->m_surfs.empty()) { // try to find a surf in focus first const auto MOUSE = g_pInputManager->getMouseCoordsInternal(); for (auto const& s : m_seatGrab->m_surfs) { diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index cc0485d8..70f92023 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -1082,7 +1082,7 @@ void CInputManager::applyConfigToKeyboard(SP pKeyboard) { pKeyboard->m_allowed = PERM == PERMISSION_RULE_ALLOW_MODE_ALLOW; try { - if (NUMLOCKON == pKeyboard->m_numlockOn && REPEATDELAY == pKeyboard->m_repeatDelay && REPEATRATE == pKeyboard->m_repeatRate && RULES != "" && + if (NUMLOCKON == pKeyboard->m_numlockOn && REPEATDELAY == pKeyboard->m_repeatDelay && REPEATRATE == pKeyboard->m_repeatRate && !RULES.empty() && RULES == pKeyboard->m_currentRules.rules && MODEL == pKeyboard->m_currentRules.model && LAYOUT == pKeyboard->m_currentRules.layout && VARIANT == pKeyboard->m_currentRules.variant && OPTIONS == pKeyboard->m_currentRules.options && FILEPATH == pKeyboard->m_xkbFilePath) { Debug::log(LOG, "Not applying config to keyboard, it did not change."); @@ -1205,7 +1205,7 @@ void CInputManager::setPointerConfigs() { libinput_device_config_middle_emulation_set_enabled(LIBINPUTDEV, LIBINPUT_CONFIG_MIDDLE_EMULATION_DISABLED); const auto TAP_MAP = g_pConfigManager->getDeviceString(devname, "tap_button_map", "input:touchpad:tap_button_map"); - if (TAP_MAP == "" || TAP_MAP == "lrm") + if (TAP_MAP.empty() || TAP_MAP == "lrm") libinput_device_config_tap_set_button_map(LIBINPUTDEV, LIBINPUT_CONFIG_TAP_MAP_LRM); else if (TAP_MAP == "lmr") libinput_device_config_tap_set_button_map(LIBINPUTDEV, LIBINPUT_CONFIG_TAP_MAP_LMR); @@ -1214,7 +1214,7 @@ void CInputManager::setPointerConfigs() { } const auto SCROLLMETHOD = g_pConfigManager->getDeviceString(devname, "scroll_method", "input:scroll_method"); - if (SCROLLMETHOD == "") { + if (SCROLLMETHOD.empty()) { libinput_device_config_scroll_set_method(LIBINPUTDEV, libinput_device_config_scroll_get_default_method(LIBINPUTDEV)); } else if (SCROLLMETHOD == "no_scroll") { libinput_device_config_scroll_set_method(LIBINPUTDEV, LIBINPUT_CONFIG_SCROLL_NO_SCROLL); @@ -1330,7 +1330,7 @@ void CInputManager::destroyKeyboard(SP pKeyboard) { std::erase_if(m_keyboards, [pKeyboard](const auto& other) { return other == pKeyboard; }); - if (m_keyboards.size() > 0) { + if (!m_keyboards.empty()) { bool found = false; for (auto const& k : m_keyboards | std::views::reverse) { if (!k) @@ -1354,7 +1354,7 @@ void CInputManager::destroyPointer(SP mouse) { std::erase_if(m_pointers, [mouse](const auto& other) { return other == mouse; }); - g_pSeatManager->setMouse(m_pointers.size() > 0 ? m_pointers.front() : nullptr); + g_pSeatManager->setMouse(!m_pointers.empty() ? m_pointers.front() : nullptr); if (!g_pSeatManager->m_mouse.expired()) unconstrainMouse(); diff --git a/src/plugins/HookSystem.cpp b/src/plugins/HookSystem.cpp index 8bb660e6..f39eb145 100644 --- a/src/plugins/HookSystem.cpp +++ b/src/plugins/HookSystem.cpp @@ -167,7 +167,7 @@ bool CFunctionHook::hook() { const auto PROBEFIXEDASM = fixInstructionProbeRIPCalls(probe); - if (PROBEFIXEDASM.bytes.size() == 0) { + if (PROBEFIXEDASM.bytes.empty()) { Debug::log(ERR, "[functionhook] failed, unsupported asm / failed assembling:\n{}", probe.assembly); return false; } diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 89d769b3..d589e3cf 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -415,7 +415,7 @@ std::optional> CHyprOpenGLImpl::getModsForFormat(EGLint fo } // if the driver doesn't mark linear as external, add it. It's allowed unless the driver says otherwise. (e.g. nvidia) - if (!linearIsExternal && std::ranges::find(mods, DRM_FORMAT_MOD_LINEAR) == mods.end() && mods.size() == 0) + if (!linearIsExternal && std::ranges::find(mods, DRM_FORMAT_MOD_LINEAR) == mods.end() && mods.empty()) mods.push_back(DRM_FORMAT_MOD_LINEAR); return result; @@ -444,7 +444,7 @@ void CHyprOpenGLImpl::initDRMFormats() { m_proc.eglQueryDmaBufFormatsEXT(m_eglDisplay, len, formats.data(), &len); } - if (formats.size() == 0) { + if (formats.empty()) { Debug::log(ERR, "EGL: Failed to get formats, DMABufs will not work."); return; } @@ -466,7 +466,7 @@ void CHyprOpenGLImpl::initDRMFormats() { } else mods = {DRM_FORMAT_MOD_LINEAR}; - m_hasModifiers = m_hasModifiers || mods.size() > 0; + m_hasModifiers = m_hasModifiers || !mods.empty(); // EGL can always do implicit modifiers. mods.push_back(DRM_FORMAT_MOD_INVALID); @@ -506,7 +506,7 @@ void CHyprOpenGLImpl::initDRMFormats() { Debug::log(LOG, "EGL: {} formats found in total. Some modifiers may be omitted as they are external-only.", dmaFormats.size()); - if (dmaFormats.size() == 0) + if (dmaFormats.empty()) Debug::log(WARN, "EGL: WARNING: No dmabuf formats were found, dmabuf will be disabled. This will degrade performance, but is most likely a driver issue or a very old GPU."); @@ -1193,7 +1193,7 @@ void CHyprOpenGLImpl::applyScreenShader(const std::string& path) { m_finalScreenShader.destroy(); - if (path == "" || path == STRVAL_EMPTY) + if (path.empty() || path == STRVAL_EMPTY) return; std::ifstream infile(absolutePath(path, g_pConfigManager->getMainConfigPath())); @@ -2362,7 +2362,7 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr glUniform4fv(m_shaders->m_shBORDER1.gradient, grad1.m_colorsOkLabA.size() / 4, (float*)grad1.m_colorsOkLabA.data()); glUniform1i(m_shaders->m_shBORDER1.gradientLength, grad1.m_colorsOkLabA.size() / 4); glUniform1f(m_shaders->m_shBORDER1.angle, (int)(grad1.m_angle / (PI / 180.0)) % 360 * (PI / 180.0)); - if (grad2.m_colorsOkLabA.size() > 0) + if (!grad2.m_colorsOkLabA.empty()) glUniform4fv(m_shaders->m_shBORDER1.gradient2, grad2.m_colorsOkLabA.size() / 4, (float*)grad2.m_colorsOkLabA.data()); glUniform1i(m_shaders->m_shBORDER1.gradient2Length, grad2.m_colorsOkLabA.size() / 4); glUniform1f(m_shaders->m_shBORDER1.angle2, (int)(grad2.m_angle / (PI / 180.0)) % 360 * (PI / 180.0)); diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 28f078aa..71d22d3c 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -2077,7 +2077,7 @@ std::tuple CHyprRenderer::getRenderTimes(PHLMONITOR pMonito minRenderTime = rt; avgRenderTime += rt; } - avgRenderTime /= POVERLAY->m_lastRenderTimes.size() == 0 ? 1 : POVERLAY->m_lastRenderTimes.size(); + avgRenderTime /= POVERLAY->m_lastRenderTimes.empty() ? 1 : POVERLAY->m_lastRenderTimes.size(); return std::make_tuple<>(avgRenderTime, maxRenderTime, minRenderTime); } diff --git a/src/render/decorations/CHyprGroupBarDecoration.cpp b/src/render/decorations/CHyprGroupBarDecoration.cpp index 65d7d7ff..7a6eebba 100644 --- a/src/render/decorations/CHyprGroupBarDecoration.cpp +++ b/src/render/decorations/CHyprGroupBarDecoration.cpp @@ -81,7 +81,7 @@ void CHyprGroupBarDecoration::updateWindow(PHLWINDOW pWindow) { damageEntire(); - if (m_dwGroupMembers.size() == 0) { + if (m_dwGroupMembers.empty()) { m_window->removeWindowDeco(this); return; } From 82b854954230a45d590c1287a8c2c1f0076f3392 Mon Sep 17 00:00:00 2001 From: vaxerski Date: Sun, 1 Jun 2025 21:53:20 +0200 Subject: [PATCH 055/901] hyprpm: refuse adding a new repo without update --- hyprpm/src/core/PluginManager.cpp | 5 +++++ src/xwayland/Dnd.cpp | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/hyprpm/src/core/PluginManager.cpp b/hyprpm/src/core/PluginManager.cpp index 90eba579..b7316fdb 100644 --- a/hyprpm/src/core/PluginManager.cpp +++ b/hyprpm/src/core/PluginManager.cpp @@ -159,6 +159,11 @@ bool CPluginManager::addNewPluginRepo(const std::string& url, const std::string& DataState::updateGlobalState(GLOBALSTATE); } + if (GLOBALSTATE.headersHashCompiled.empty()) { + std::println("\n{}", failureString("Cannot find headers in the global state. Try running hyprpm update first.")); + return false; + } + std::cout << Colors::GREEN << "✔" << Colors::RESET << Colors::RED << " adding a new plugin repository " << Colors::RESET << "from " << url << "\n " << Colors::RED << "MAKE SURE" << Colors::RESET << " that you trust the authors. " << Colors::RED << "DO NOT" << Colors::RESET << " install random plugins without verifying the code and author.\n " diff --git a/src/xwayland/Dnd.cpp b/src/xwayland/Dnd.cpp index e4c60920..9d2012fb 100644 --- a/src/xwayland/Dnd.cpp +++ b/src/xwayland/Dnd.cpp @@ -286,8 +286,8 @@ void CX11DataDevice::forceCleanupDnd() { if (m_lastOffer) { auto source = m_lastOffer->getSource(); if (source) { - source->cancelled(); source->sendDndFinished(); + source->cancelled(); } } From 2d1c6f88d2202ae40671277759b1edc3ecc51c45 Mon Sep 17 00:00:00 2001 From: Jasson Date: Sun, 1 Jun 2025 16:02:17 -0400 Subject: [PATCH 056/901] xwm: Refactored functions in XWM.cpp (#10569) * Refactored SXSelection::onSelection in XWM.cpp - Made the function more readable and less redundant - Extracted repeated conditions into booleans. - Reduced nested conditionals - Reused (conn) pointer * Refectd readProp * Refactor initSelection --- src/xwayland/XWM.cpp | 261 ++++++++++++++++++++++++------------------- 1 file changed, 147 insertions(+), 114 deletions(-) diff --git a/src/xwayland/XWM.cpp b/src/xwayland/XWM.cpp index 76ae1d88..5b423dca 100644 --- a/src/xwayland/XWM.cpp +++ b/src/xwayland/XWM.cpp @@ -1,5 +1,6 @@ #include "helpers/math/Math.hpp" #include +#include #ifndef NO_XWAYLAND #include @@ -198,104 +199,125 @@ void CXWM::readProp(SP XSURF, uint32_t atom, xcb_get_property_ if (Debug::m_trace) propName = getAtomName(atom); - if (atom == XCB_ATOM_WM_CLASS) { - size_t len = xcb_get_property_value_length(reply); - char* string = (char*)xcb_get_property_value(reply); - XSURF->m_state.appid = std::string{string, len}; - if (std::ranges::count(XSURF->m_state.appid, '\000') == 2) - XSURF->m_state.appid = XSURF->m_state.appid.substr(XSURF->m_state.appid.find_first_of('\000') + 1); // fuck you X + const auto valueLen = xcb_get_property_value_length(reply); + const auto* value = (const char*)xcb_get_property_value(reply); + + auto handleWMClass = [&]() { + XSURF->m_state.appid = std::string{value, valueLen}; + if (std::count(XSURF->m_state.appid.begin(), XSURF->m_state.appid.end(), '\000') == 2) + XSURF->m_state.appid = XSURF->m_state.appid.substr(XSURF->m_state.appid.find_first_of('\000') + 1); + if (!XSURF->m_state.appid.empty()) XSURF->m_state.appid.pop_back(); XSURF->m_events.metadataChanged.emit(); - } else if (atom == XCB_ATOM_WM_NAME || atom == HYPRATOMS["_NET_WM_NAME"]) { - size_t len = xcb_get_property_value_length(reply); - char* string = (char*)xcb_get_property_value(reply); + }; + + auto handleWMName = [&]() { if (reply->type != HYPRATOMS["UTF8_STRING"] && reply->type != HYPRATOMS["TEXT"] && reply->type != XCB_ATOM_STRING) return; - XSURF->m_state.title = std::string{string, len}; + XSURF->m_state.title = std::string{value, valueLen}; XSURF->m_events.metadataChanged.emit(); - } else if (atom == HYPRATOMS["_NET_WM_WINDOW_TYPE"]) { - xcb_atom_t* atomsArr = (xcb_atom_t*)xcb_get_property_value(reply); - size_t atomsNo = reply->value_len; - XSURF->m_atoms.clear(); - for (size_t i = 0; i < atomsNo; ++i) { - XSURF->m_atoms.push_back(atomsArr[i]); - } - } else if (atom == HYPRATOMS["_NET_WM_STATE"]) { - xcb_atom_t* atoms = (xcb_atom_t*)xcb_get_property_value(reply); + }; + + auto handleWindowType = [&]() { + auto* atomsArr = (xcb_atom_t*)value; + XSURF->m_atoms.assign(atomsArr, atomsArr + reply->value_len); + }; + + auto handleWMState = [&]() { + auto* atoms = (xcb_atom_t*)value; for (uint32_t i = 0; i < reply->value_len; i++) { if (atoms[i] == HYPRATOMS["_NET_WM_STATE_MODAL"]) XSURF->m_modal = true; } - } else if (atom == HYPRATOMS["WM_HINTS"]) { - if (reply->value_len != 0) { - XSURF->m_hints = makeUnique(); - xcb_icccm_get_wm_hints_from_reply(XSURF->m_hints.get(), reply); + }; - if (!(XSURF->m_hints->flags & XCB_ICCCM_WM_HINT_INPUT)) - XSURF->m_hints->input = true; - } - } else if (atom == HYPRATOMS["WM_WINDOW_ROLE"]) { - size_t len = xcb_get_property_value_length(reply); + auto handleWMHints = [&]() { + if (reply->value_len == 0) + return; + XSURF->m_hints = makeUnique(); + xcb_icccm_get_wm_hints_from_reply(XSURF->m_hints.get(), reply); + if (!(XSURF->m_hints->flags & XCB_ICCCM_WM_HINT_INPUT)) + XSURF->m_hints->input = true; + }; - if (len <= 0) + auto handleWMRole = [&]() { + if (valueLen <= 0) XSURF->m_role = ""; else { - XSURF->m_role = std::string{(char*)xcb_get_property_value(reply), len}; + XSURF->m_role = std::string{value, valueLen}; XSURF->m_role = XSURF->m_role.substr(0, XSURF->m_role.find_first_of('\000')); } - } else if (atom == XCB_ATOM_WM_TRANSIENT_FOR) { - if (reply->type == XCB_ATOM_WINDOW) { - const auto XID = (xcb_window_t*)xcb_get_property_value(reply); - XSURF->m_transient = XID; - if (XID) { - if (const auto NEWXSURF = windowForXID(*XID); NEWXSURF && !lookupParentExists(XSURF, NEWXSURF)) { - XSURF->m_parent = NEWXSURF; - NEWXSURF->m_children.emplace_back(XSURF); - } else - Debug::log(LOG, "[xwm] Denying transient because it would create a loop"); - } + }; + + auto handleTransientFor = [&]() { + if (reply->type != XCB_ATOM_WINDOW) + return; + const auto XID = (xcb_window_t*)value; + XSURF->m_transient = XID; + if (!XID) + return; + + if (const auto NEWXSURF = windowForXID(*XID); NEWXSURF && !lookupParentExists(XSURF, NEWXSURF)) { + XSURF->m_parent = NEWXSURF; + NEWXSURF->m_children.emplace_back(XSURF); + } else + Debug::log(LOG, "[xwm] Denying transient because it would create a loop"); + }; + + auto handleSizeHints = [&]() { + if (reply->type != HYPRATOMS["WM_SIZE_HINTS"] || reply->value_len == 0) + return; + + XSURF->m_sizeHints = makeUnique(); + std::memset(XSURF->m_sizeHints.get(), 0, sizeof(xcb_size_hints_t)); + xcb_icccm_get_wm_size_hints_from_reply(XSURF->m_sizeHints.get(), reply); + + const int32_t FLAGS = XSURF->m_sizeHints->flags; + const bool HASMIN = FLAGS & XCB_ICCCM_SIZE_HINT_P_MIN_SIZE; + const bool HASBASE = FLAGS & XCB_ICCCM_SIZE_HINT_BASE_SIZE; + + if (!HASMIN && !HASBASE) { + XSURF->m_sizeHints->min_width = XSURF->m_sizeHints->min_height = -1; + XSURF->m_sizeHints->base_width = XSURF->m_sizeHints->base_height = -1; + } else if (!HASBASE) { + XSURF->m_sizeHints->base_width = XSURF->m_sizeHints->min_width; + XSURF->m_sizeHints->base_height = XSURF->m_sizeHints->min_height; + } else if (!HASMIN) { + XSURF->m_sizeHints->min_width = XSURF->m_sizeHints->base_width; + XSURF->m_sizeHints->min_height = XSURF->m_sizeHints->base_height; } - } else if (atom == HYPRATOMS["WM_NORMAL_HINTS"]) { - if (reply->type == HYPRATOMS["WM_SIZE_HINTS"] && reply->value_len > 0) { - XSURF->m_sizeHints = makeUnique(); - std::memset(XSURF->m_sizeHints.get(), 0, sizeof(xcb_size_hints_t)); - xcb_icccm_get_wm_size_hints_from_reply(XSURF->m_sizeHints.get(), reply); + if (!(FLAGS & XCB_ICCCM_SIZE_HINT_P_MAX_SIZE)) + XSURF->m_sizeHints->max_width = XSURF->m_sizeHints->max_height = -1; + }; - const int32_t FLAGS = XSURF->m_sizeHints->flags; - const bool HASMIN = (FLAGS & XCB_ICCCM_SIZE_HINT_P_MIN_SIZE); - const bool HASBASE = (FLAGS & XCB_ICCCM_SIZE_HINT_BASE_SIZE); + auto handleWMProtocols = [&]() { + if (reply->type != XCB_ATOM_ATOM) + return; + auto* atoms = (xcb_atom_t*)value; + XSURF->m_protocols.assign(atoms, atoms + reply->value_len); + }; - if (!HASMIN && !HASBASE) { - XSURF->m_sizeHints->min_width = -1; - XSURF->m_sizeHints->min_height = -1; - XSURF->m_sizeHints->base_width = -1; - XSURF->m_sizeHints->base_height = -1; - } else if (!HASBASE) { - XSURF->m_sizeHints->base_width = XSURF->m_sizeHints->min_width; - XSURF->m_sizeHints->base_height = XSURF->m_sizeHints->min_height; - } else if (!HASMIN) { - XSURF->m_sizeHints->min_width = XSURF->m_sizeHints->base_width; - XSURF->m_sizeHints->min_height = XSURF->m_sizeHints->base_height; - } - - if (!(FLAGS & XCB_ICCCM_SIZE_HINT_P_MAX_SIZE)) { - XSURF->m_sizeHints->max_width = -1; - XSURF->m_sizeHints->max_height = -1; - } - } - } else if (atom == HYPRATOMS["WM_PROTOCOLS"]) { - if (reply->type == XCB_ATOM_ATOM) { - auto atoms = (xcb_atom_t*)xcb_get_property_value(reply); - std::vector vec; - vec.reserve(reply->value_len); - for (size_t i = 0; i < reply->value_len; ++i) { - vec.emplace_back(atoms[i]); - } - XSURF->m_protocols = vec; - } - } else { + if (atom == XCB_ATOM_WM_CLASS) + handleWMClass(); + else if (atom == XCB_ATOM_WM_NAME || atom == HYPRATOMS["_NET_WM_NAME"]) + handleWMName(); + else if (atom == HYPRATOMS["_NET_WM_WINDOW_TYPE"]) + handleWindowType(); + else if (atom == HYPRATOMS["_NET_WM_STATE"]) + handleWMState(); + else if (atom == HYPRATOMS["WM_HINTS"]) + handleWMHints(); + else if (atom == HYPRATOMS["WM_WINDOW_ROLE"]) + handleWMRole(); + else if (atom == XCB_ATOM_WM_TRANSIENT_FOR) + handleTransientFor(); + else if (atom == HYPRATOMS["WM_NORMAL_HINTS"]) + handleSizeHints(); + else if (atom == HYPRATOMS["WM_PROTOCOLS"]) + handleWMProtocols(); + else { Debug::log(TRACE, "[xwm] Unhandled prop {} -> {}", atom, propName); return; } @@ -757,7 +779,7 @@ bool CXWM::handleSelectionEvent(xcb_generic_event_t* e) { if (e->response_type - m_xfixes->first_event == XCB_XFIXES_SELECTION_NOTIFY) return handleSelectionXFixesNotify((xcb_xfixes_selection_notify_event_t*)e); - return 0; + return false; } int CXWM::onEvent(int fd, uint32_t mask) { @@ -772,14 +794,14 @@ int CXWM::onEvent(int fd, uint32_t mask) { return 0; } - int count = 0; + int processedEventCount = 0; while (42069) { xcb_generic_event_t* event = xcb_poll_for_event(m_connection); if (!event) break; - count++; + processedEventCount++; if (handleSelectionEvent(event)) { free(event); @@ -806,10 +828,10 @@ int CXWM::onEvent(int fd, uint32_t mask) { free(event); } - if (count) + if (processedEventCount) xcb_flush(m_connection); - return count; + return processedEventCount; } void CXWM::gatherResources() { @@ -1171,35 +1193,37 @@ void CXWM::updateOverrideRedirect(SP surf, bool overrideRedire } void CXWM::initSelection() { - m_clipboard.window = xcb_generate_id(m_connection); - uint32_t mask[1] = {XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_PROPERTY_CHANGE}; - xcb_create_window(m_connection, XCB_COPY_FROM_PARENT, m_clipboard.window, m_screen->root, 0, 0, 10, 10, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT, m_screen->root_visual, - XCB_CW_EVENT_MASK, mask); - xcb_set_selection_owner(m_connection, m_clipboard.window, HYPRATOMS["CLIPBOARD_MANAGER"], XCB_TIME_CURRENT_TIME); - - uint32_t mask2 = + const uint32_t windowMask = XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_PROPERTY_CHANGE; + const uint32_t xfixesMask = XCB_XFIXES_SELECTION_EVENT_MASK_SET_SELECTION_OWNER | XCB_XFIXES_SELECTION_EVENT_MASK_SELECTION_WINDOW_DESTROY | XCB_XFIXES_SELECTION_EVENT_MASK_SELECTION_CLIENT_CLOSE; - xcb_xfixes_select_selection_input(m_connection, m_clipboard.window, HYPRATOMS["CLIPBOARD"], mask2); - m_clipboard.listeners.setSelection = g_pSeatManager->m_events.setSelection.registerListener([this](std::any d) { m_clipboard.onSelection(); }); - m_clipboard.listeners.keyboardFocusChange = g_pSeatManager->m_events.keyboardFocusChange.registerListener([this](std::any d) { m_clipboard.onKeyboardFocus(); }); + auto createSelectionWindow = [&](xcb_window_t& window, const std::string& atomName, bool inputOnly = false) { + window = xcb_generate_id(m_connection); + const uint16_t width = inputOnly ? 8192 : 10; + const uint16_t height = inputOnly ? 8192 : 10; - m_primarySelection.window = xcb_generate_id(m_connection); - xcb_create_window(m_connection, XCB_COPY_FROM_PARENT, m_primarySelection.window, m_screen->root, 0, 0, 10, 10, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT, m_screen->root_visual, - XCB_CW_EVENT_MASK, mask); - xcb_set_selection_owner(m_connection, m_primarySelection.window, HYPRATOMS["PRIMARY"], XCB_TIME_CURRENT_TIME); + xcb_create_window(m_connection, XCB_COPY_FROM_PARENT, window, m_screen->root, 0, 0, width, height, 0, + inputOnly ? XCB_WINDOW_CLASS_INPUT_ONLY : XCB_WINDOW_CLASS_INPUT_OUTPUT, m_screen->root_visual, XCB_CW_EVENT_MASK, &windowMask); - xcb_xfixes_select_selection_input(m_connection, m_primarySelection.window, HYPRATOMS["PRIMARY"], mask2); + if (!inputOnly) { + xcb_set_selection_owner(m_connection, window, HYPRATOMS[atomName], XCB_TIME_CURRENT_TIME); + xcb_xfixes_select_selection_input(m_connection, window, HYPRATOMS[atomName], xfixesMask); + } - m_primarySelection.listeners.setSelection = g_pSeatManager->m_events.setPrimarySelection.registerListener([this](std::any d) { m_primarySelection.onSelection(); }); - m_primarySelection.listeners.keyboardFocusChange = g_pSeatManager->m_events.keyboardFocusChange.registerListener([this](std::any d) { m_primarySelection.onKeyboardFocus(); }); + return window; + }; - m_dndSelection.window = xcb_generate_id(m_connection); - xcb_create_window(m_connection, XCB_COPY_FROM_PARENT, m_dndSelection.window, m_screen->root, 0, 0, 8192, 8192, 0, XCB_WINDOW_CLASS_INPUT_ONLY, m_screen->root_visual, - XCB_CW_EVENT_MASK, mask); + createSelectionWindow(m_clipboard.window, "CLIPBOARD_MANAGER"); + m_clipboard.listeners.setSelection = g_pSeatManager->m_events.setSelection.registerListener([this](std::any) { m_clipboard.onSelection(); }); + m_clipboard.listeners.keyboardFocusChange = g_pSeatManager->m_events.keyboardFocusChange.registerListener([this](std::any) { m_clipboard.onKeyboardFocus(); }); - uint32_t val1 = XDND_VERSION; - xcb_change_property(m_connection, XCB_PROP_MODE_REPLACE, m_dndSelection.window, HYPRATOMS["XdndAware"], XCB_ATOM_ATOM, 32, 1, &val1); + createSelectionWindow(m_primarySelection.window, "PRIMARY"); + m_primarySelection.listeners.setSelection = g_pSeatManager->m_events.setPrimarySelection.registerListener([this](std::any) { m_primarySelection.onSelection(); }); + m_primarySelection.listeners.keyboardFocusChange = g_pSeatManager->m_events.keyboardFocusChange.registerListener([this](std::any) { m_primarySelection.onKeyboardFocus(); }); + + createSelectionWindow(m_dndSelection.window, "XdndAware", true); + const uint32_t xdndVersion = XDND_VERSION; + xcb_change_property(m_connection, XCB_PROP_MODE_REPLACE, m_dndSelection.window, HYPRATOMS["XdndAware"], XCB_ATOM_ATOM, 32, 1, &xdndVersion); } void CXWM::setClipboardToWayland(SXSelection& sel) { @@ -1332,18 +1356,27 @@ SP CXWM::createX11DataOffer(SP surf, SPm_wm->m_clipboard && g_pSeatManager->m_selection.currentSelection && g_pSeatManager->m_selection.currentSelection->type() == DATA_SOURCE_TYPE_X11) || - (this == &g_pXWayland->m_wm->m_primarySelection && g_pSeatManager->m_selection.currentPrimarySelection && - g_pSeatManager->m_selection.currentPrimarySelection->type() == DATA_SOURCE_TYPE_X11)) + const bool isClipboard = this == &g_pXWayland->m_wm->m_clipboard; + const bool isPrimary = this == &g_pXWayland->m_wm->m_primarySelection; + + auto currentSel = g_pSeatManager->m_selection.currentSelection; + auto currentPrimSel = g_pSeatManager->m_selection.currentPrimarySelection; + + const bool isX11Clipboard = isClipboard && currentSel && currentSel->type() == DATA_SOURCE_TYPE_X11; + const bool isX11Primary = isPrimary && currentPrimSel && currentPrimSel->type() == DATA_SOURCE_TYPE_X11; + + if (isX11Clipboard || isX11Primary) return; - if (this == &g_pXWayland->m_wm->m_clipboard && g_pSeatManager->m_selection.currentSelection) { - xcb_set_selection_owner(g_pXWayland->m_wm->m_connection, g_pXWayland->m_wm->m_clipboard.window, HYPRATOMS["CLIPBOARD"], XCB_TIME_CURRENT_TIME); - xcb_flush(g_pXWayland->m_wm->m_connection); + xcb_connection_t* conn = g_pXWayland->m_wm->m_connection; + + if (isClipboard && currentSel) { + xcb_set_selection_owner(conn, g_pXWayland->m_wm->m_clipboard.window, HYPRATOMS["CLIPBOARD"], XCB_TIME_CURRENT_TIME); + xcb_flush(conn); g_pXWayland->m_wm->m_clipboard.notifyOnFocus = true; - } else if (this == &g_pXWayland->m_wm->m_primarySelection && g_pSeatManager->m_selection.currentPrimarySelection) { - xcb_set_selection_owner(g_pXWayland->m_wm->m_connection, g_pXWayland->m_wm->m_primarySelection.window, HYPRATOMS["PRIMARY"], XCB_TIME_CURRENT_TIME); - xcb_flush(g_pXWayland->m_wm->m_connection); + } else if (isPrimary && currentPrimSel) { + xcb_set_selection_owner(conn, g_pXWayland->m_wm->m_primarySelection.window, HYPRATOMS["PRIMARY"], XCB_TIME_CURRENT_TIME); + xcb_flush(conn); g_pXWayland->m_wm->m_primarySelection.notifyOnFocus = true; } } From 16c62a6dbb5f8eee4dcfe903e743f6f144971c06 Mon Sep 17 00:00:00 2001 From: Kamikadze <40305144+Kam1k4dze@users.noreply.github.com> Date: Mon, 2 Jun 2025 01:03:53 +0500 Subject: [PATCH 057/901] internal: Fix HyprError not displaying at startup (#10606) --- src/render/OpenGL.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index d589e3cf..817944ef 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -1183,7 +1183,6 @@ bool CHyprOpenGLImpl::initShaders() { m_shadersInitialized = true; Debug::log(LOG, "Shaders initialized successfully."); - g_pHyprError->destroy(); return true; } From ef2c73af80d37265babc3287b3e5502a40c39374 Mon Sep 17 00:00:00 2001 From: Kamikadze <40305144+Kam1k4dze@users.noreply.github.com> Date: Mon, 2 Jun 2025 22:36:44 +0500 Subject: [PATCH 058/901] internal: embed example config (#10608) --- src/config/ConfigManager.cpp | 2 +- src/config/defaultConfig.hpp | 313 +---------------------------------- 2 files changed, 8 insertions(+), 307 deletions(-) diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index f7fed52f..8dce9f30 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -849,7 +849,7 @@ std::optional CConfigManager::generateConfig(std::string configPath Debug::log(WARN, "No config file found; attempting to generate."); std::ofstream ofs; ofs.open(configPath, std::ios::trunc); - ofs << AUTOCONFIG; + ofs << AUTOGENERATED_PREFIX << EXAMPLE_CONFIG; ofs.close(); if (!std::filesystem::exists(configPath)) diff --git a/src/config/defaultConfig.hpp b/src/config/defaultConfig.hpp index a9ea6694..8bdfea39 100644 --- a/src/config/defaultConfig.hpp +++ b/src/config/defaultConfig.hpp @@ -2,316 +2,17 @@ #include -inline const std::string AUTOCONFIG = R"#( +inline constexpr std::string_view AUTOGENERATED_PREFIX = R"#( # ####################################################################################### # AUTOGENERATED HYPRLAND CONFIG. -# PLEASE USE THE CONFIG PROVIDED IN THE GIT REPO /examples/hyprland.conf AND EDIT IT, -# OR EDIT THIS ONE ACCORDING TO THE WIKI INSTRUCTIONS. +# EDIT THIS CONFIG ACCORDING TO THE WIKI INSTRUCTIONS. # ####################################################################################### autogenerated = 1 # remove this line to remove the warning -# This is an example Hyprland config file. -# Refer to the wiki for more information. -# https://wiki.hyprland.org/Configuring/ - -# Please note not all available settings / options are set here. -# For a full list, see the wiki - -# You can split this configuration into multiple files -# Create your files separately and then link them to this file like this: -# source = ~/.config/hypr/myColors.conf - - -################ -### MONITORS ### -################ - -# See https://wiki.hyprland.org/Configuring/Monitors/ -monitor=,preferred,auto,auto - - -################### -### MY PROGRAMS ### -################### - -# See https://wiki.hyprland.org/Configuring/Keywords/ - -# Set programs that you use -$terminal = kitty -$fileManager = dolphin -$menu = wofi --show drun - - -################# -### AUTOSTART ### -################# - -# Autostart necessary processes (like notifications daemons, status bars, etc.) -# Or execute your favorite apps at launch like this: - -# exec-once = $terminal -# exec-once = nm-applet & -# exec-once = waybar & hyprpaper & firefox - - -############################# -### ENVIRONMENT VARIABLES ### -############################# - -# See https://wiki.hyprland.org/Configuring/Environment-variables/ - -env = XCURSOR_SIZE,24 -env = HYPRCURSOR_SIZE,24 - - -################### -### PERMISSIONS ### -################### - -# See https://wiki.hyprland.org/Configuring/Permissions/ -# Please note permission changes here require a Hyprland restart and are not applied on-the-fly -# for security reasons - -# ecosystem { -# enforce_permissions = 1 -# } - -# permission = /usr/(bin|local/bin)/grim, screencopy, allow -# permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow -# permission = /usr/(bin|local/bin)/hyprpm, plugin, allow - - -##################### -### LOOK AND FEEL ### -##################### - -# Refer to https://wiki.hyprland.org/Configuring/Variables/ - -# https://wiki.hyprland.org/Configuring/Variables/#general -general { - gaps_in = 5 - gaps_out = 20 - - border_size = 2 - - # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors - col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg - col.inactive_border = rgba(595959aa) - - # Set to true enable resizing windows by clicking and dragging on borders and gaps - resize_on_border = false - - # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on - allow_tearing = false - - layout = dwindle -} - -# https://wiki.hyprland.org/Configuring/Variables/#decoration -decoration { - rounding = 10 - rounding_power = 2 - - # Change transparency of focused and unfocused windows - active_opacity = 1.0 - inactive_opacity = 1.0 - - shadow { - enabled = true - range = 4 - render_power = 3 - color = rgba(1a1a1aee) - } - - # https://wiki.hyprland.org/Configuring/Variables/#blur - blur { - enabled = true - size = 3 - passes = 1 - - vibrancy = 0.1696 - } -} - -# https://wiki.hyprland.org/Configuring/Variables/#animations -animations { - enabled = yes, please :) - - # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more - - bezier = easeOutQuint,0.23,1,0.32,1 - bezier = easeInOutCubic,0.65,0.05,0.36,1 - bezier = linear,0,0,1,1 - bezier = almostLinear,0.5,0.5,0.75,1.0 - bezier = quick,0.15,0,0.1,1 - - animation = global, 1, 10, default - animation = border, 1, 5.39, easeOutQuint - animation = windows, 1, 4.79, easeOutQuint - animation = windowsIn, 1, 4.1, easeOutQuint, popin 87% - animation = windowsOut, 1, 1.49, linear, popin 87% - animation = fadeIn, 1, 1.73, almostLinear - animation = fadeOut, 1, 1.46, almostLinear - animation = fade, 1, 3.03, quick - animation = layers, 1, 3.81, easeOutQuint - animation = layersIn, 1, 4, easeOutQuint, fade - animation = layersOut, 1, 1.5, linear, fade - animation = fadeLayersIn, 1, 1.79, almostLinear - animation = fadeLayersOut, 1, 1.39, almostLinear - animation = workspaces, 1, 1.94, almostLinear, fade - animation = workspacesIn, 1, 1.21, almostLinear, fade - animation = workspacesOut, 1, 1.94, almostLinear, fade -} - -# Ref https://wiki.hyprland.org/Configuring/Workspace-Rules/ -# "Smart gaps" / "No gaps when only" -# uncomment all if you wish to use that. -# workspace = w[tv1], gapsout:0, gapsin:0 -# workspace = f[1], gapsout:0, gapsin:0 -# windowrule = bordersize 0, floating:0, onworkspace:w[tv1] -# windowrule = rounding 0, floating:0, onworkspace:w[tv1] -# windowrule = bordersize 0, floating:0, onworkspace:f[1] -# windowrule = rounding 0, floating:0, onworkspace:f[1] - -# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more -dwindle { - pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below - preserve_split = true # You probably want this -} - -# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more -master { - new_status = master -} - -# https://wiki.hyprland.org/Configuring/Variables/#misc -misc { - force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers - disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :( -} - - -############# -### INPUT ### -############# - -# https://wiki.hyprland.org/Configuring/Variables/#input -input { - kb_layout = us - kb_variant = - kb_model = - kb_options = - kb_rules = - - follow_mouse = 1 - - sensitivity = 0 # -1.0 - 1.0, 0 means no modification. - - touchpad { - natural_scroll = false - } -} - -# https://wiki.hyprland.org/Configuring/Variables/#gestures -gestures { - workspace_swipe = false -} - -# Example per-device config -# See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more -device { - name = epic-mouse-v1 - sensitivity = -0.5 -} - - -################### -### KEYBINDINGS ### -################### - -# See https://wiki.hyprland.org/Configuring/Keywords/ -$mainMod = SUPER # Sets "Windows" key as main modifier - -# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more -bind = $mainMod, Q, exec, $terminal -bind = $mainMod, C, killactive, -bind = $mainMod, M, exit, -bind = $mainMod, E, exec, $fileManager -bind = $mainMod, V, togglefloating, -bind = $mainMod, R, exec, $menu -bind = $mainMod, P, pseudo, # dwindle -bind = $mainMod, J, togglesplit, # dwindle - -# Move focus with mainMod + arrow keys -bind = $mainMod, left, movefocus, l -bind = $mainMod, right, movefocus, r -bind = $mainMod, up, movefocus, u -bind = $mainMod, down, movefocus, d - -# Switch workspaces with mainMod + [0-9] -bind = $mainMod, 1, workspace, 1 -bind = $mainMod, 2, workspace, 2 -bind = $mainMod, 3, workspace, 3 -bind = $mainMod, 4, workspace, 4 -bind = $mainMod, 5, workspace, 5 -bind = $mainMod, 6, workspace, 6 -bind = $mainMod, 7, workspace, 7 -bind = $mainMod, 8, workspace, 8 -bind = $mainMod, 9, workspace, 9 -bind = $mainMod, 0, workspace, 10 - -# Move active window to a workspace with mainMod + SHIFT + [0-9] -bind = $mainMod SHIFT, 1, movetoworkspace, 1 -bind = $mainMod SHIFT, 2, movetoworkspace, 2 -bind = $mainMod SHIFT, 3, movetoworkspace, 3 -bind = $mainMod SHIFT, 4, movetoworkspace, 4 -bind = $mainMod SHIFT, 5, movetoworkspace, 5 -bind = $mainMod SHIFT, 6, movetoworkspace, 6 -bind = $mainMod SHIFT, 7, movetoworkspace, 7 -bind = $mainMod SHIFT, 8, movetoworkspace, 8 -bind = $mainMod SHIFT, 9, movetoworkspace, 9 -bind = $mainMod SHIFT, 0, movetoworkspace, 10 - -# Example special workspace (scratchpad) -bind = $mainMod, S, togglespecialworkspace, magic -bind = $mainMod SHIFT, S, movetoworkspace, special:magic - -# Scroll through existing workspaces with mainMod + scroll -bind = $mainMod, mouse_down, workspace, e+1 -bind = $mainMod, mouse_up, workspace, e-1 - -# Move/resize windows with mainMod + LMB/RMB and dragging -bindm = $mainMod, mouse:272, movewindow -bindm = $mainMod, mouse:273, resizewindow - -# Laptop multimedia keys for volume and LCD brightness -bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+ -bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- -bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle -bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle -bindel = ,XF86MonBrightnessUp, exec, brightnessctl -e4 -n2 set 5%+ -bindel = ,XF86MonBrightnessDown, exec, brightnessctl -e4 -n2 set 5%- - -# Requires playerctl -bindl = , XF86AudioNext, exec, playerctl next -bindl = , XF86AudioPause, exec, playerctl play-pause -bindl = , XF86AudioPlay, exec, playerctl play-pause -bindl = , XF86AudioPrev, exec, playerctl previous - -############################## -### WINDOWS AND WORKSPACES ### -############################## - -# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more -# See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules - -# Example windowrule -# windowrule = float,class:^(kitty)$,title:^(kitty)$ - -# Ignore maximize requests from apps. You'll probably like this. -windowrule = suppressevent maximize, class:.* - -# Fix some dragging issues with XWayland -windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0 )#"; +inline constexpr char EXAMPLE_CONFIG_BYTES[] = { +#embed "../../example/hyprland.conf" +}; + +inline constexpr std::string_view EXAMPLE_CONFIG = {EXAMPLE_CONFIG_BYTES, sizeof(EXAMPLE_CONFIG_BYTES)}; From b1d0a727cc594e5329c5971d73391c7529e1c80e Mon Sep 17 00:00:00 2001 From: sam Date: Tue, 3 Jun 2025 02:22:51 +0800 Subject: [PATCH 059/901] internal: Center window on parent if available (#10582) Fixes #10537 --- src/layout/IHyprLayout.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/layout/IHyprLayout.cpp b/src/layout/IHyprLayout.cpp index fbde7344..40794b3e 100644 --- a/src/layout/IHyprLayout.cpp +++ b/src/layout/IHyprLayout.cpp @@ -158,6 +158,7 @@ void IHyprLayout::onWindowCreatedFloating(PHLWINDOW pWindow) { } // TODO: detect a popup in a more consistent way. + bool centeredOnParent = false; if ((desiredGeometry.x == 0 && desiredGeometry.y == 0) || !visible || !pWindow->m_isX11) { // if the pos isn't set, fall back to the center placement if it's not a child auto pos = PMONITOR->m_position + PMONITOR->m_size / 2.F - desiredGeometry.size() / 2.F; @@ -168,10 +169,11 @@ void IHyprLayout::onWindowCreatedFloating(PHLWINDOW pWindow) { *pWindow->m_realPosition = PARENT->m_realPosition->goal() + PARENT->m_realSize->goal() / 2.F - desiredGeometry.size() / 2.F; pWindow->m_workspace = PARENT->m_workspace; pWindow->m_monitor = PARENT->m_monitor; + centeredOnParent = true; } } - - *pWindow->m_realPosition = pos; + if (!centeredOnParent) + *pWindow->m_realPosition = pos; } else { // if it is, we respect where it wants to put itself, but apply monitor offset if outside // most of these are popups From b5c0d0b8aa8bb095ac447bf6c73486cb1c172b6e Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Wed, 4 Jun 2025 02:48:56 +0800 Subject: [PATCH 060/901] keybinds: add an option to respect gaps out for floating to movewindow (#9360) --- src/config/ConfigDescriptions.hpp | 7 +++++++ src/config/ConfigManager.cpp | 3 +++ src/config/ConfigManager.hpp | 1 + src/managers/KeybindManager.cpp | 21 +++++++++++++++------ 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/config/ConfigDescriptions.hpp b/src/config/ConfigDescriptions.hpp index a77cf757..98214284 100644 --- a/src/config/ConfigDescriptions.hpp +++ b/src/config/ConfigDescriptions.hpp @@ -32,6 +32,13 @@ inline static const std::vector CONFIG_OPTIONS = { .type = CONFIG_OPTION_STRING_SHORT, .data = SConfigOptionDescription::SStringData{"20"}, }, + SConfigOptionDescription{ + .value = "general:float_gaps", + .description = "gaps between windows and monitor edges for floating windows\n\nsupports css style gaps (top, right, bottom, left -> 5 10 15 20). \n-1 means default " + "gaps_in/gaps_out\n0 means no gaps", + .type = CONFIG_OPTION_STRING_SHORT, + .data = SConfigOptionDescription::SStringData{"0"}, + }, SConfigOptionDescription{ .value = "general:gaps_workspaces", .description = "gaps between workspaces. Stacks with gaps_out.", diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 8dce9f30..e2fb26ab 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -444,6 +444,7 @@ CConfigManager::CConfigManager() { registerConfigVar("general:no_border_on_floating", Hyprlang::INT{0}); registerConfigVar("general:gaps_in", Hyprlang::CConfigCustomValueType{configHandleGapSet, configHandleGapDestroy, "5"}); registerConfigVar("general:gaps_out", Hyprlang::CConfigCustomValueType{configHandleGapSet, configHandleGapDestroy, "20"}); + registerConfigVar("general:float_gaps", Hyprlang::CConfigCustomValueType{configHandleGapSet, configHandleGapDestroy, "0"}); registerConfigVar("general:gaps_workspaces", Hyprlang::INT{0}); registerConfigVar("general:no_focus_fallback", Hyprlang::INT{0}); registerConfigVar("general:resize_on_border", Hyprlang::INT{0}); @@ -1318,6 +1319,8 @@ SWorkspaceRule CConfigManager::mergeWorkspaceRules(const SWorkspaceRule& rule1, mergedRule.gapsIn = rule2.gapsIn; if (rule2.gapsOut.has_value()) mergedRule.gapsOut = rule2.gapsOut; + if (rule2.floatGaps) + mergedRule.floatGaps = rule2.floatGaps; if (rule2.borderSize.has_value()) mergedRule.borderSize = rule2.borderSize; if (rule2.noBorder.has_value()) diff --git a/src/config/ConfigManager.hpp b/src/config/ConfigManager.hpp index 5cb95bac..134292e5 100644 --- a/src/config/ConfigManager.hpp +++ b/src/config/ConfigManager.hpp @@ -36,6 +36,7 @@ struct SWorkspaceRule { bool isPersistent = false; std::optional gapsIn; std::optional gapsOut; + std::optional floatGaps = gapsOut; std::optional borderSize; std::optional decorate; std::optional noRounding; diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index 976e292d..43558d9d 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -1682,16 +1682,25 @@ SDispatchResult CKeybindManager::moveActiveTo(std::string args) { if (PLASTWINDOW->m_isFloating) { std::optional vPosx, vPosy; - const auto PMONITOR = PLASTWINDOW->m_monitor.lock(); - const auto BORDERSIZE = PLASTWINDOW->getRealBorderSize(); + const auto PMONITOR = PLASTWINDOW->m_monitor.lock(); + const auto BORDERSIZE = PLASTWINDOW->getRealBorderSize(); + static auto PGAPSCUSTOMDATA = CConfigValue("general:float_gaps"); + static auto PGAPSOUTDATA = CConfigValue("general:gaps_out"); + auto* PGAPSOUT = (CCssGapData*)PGAPSCUSTOMDATA.ptr()->getData(); + if (PGAPSOUT->m_left < 0 || PGAPSOUT->m_right < 0 || PGAPSOUT->m_top < 0 || PGAPSOUT->m_bottom < 0) + PGAPSOUT = (CCssGapData*)PGAPSOUTDATA.ptr()->getData(); switch (arg) { - case 'l': vPosx = PMONITOR->m_reservedTopLeft.x + BORDERSIZE + PMONITOR->m_position.x; break; - case 'r': vPosx = PMONITOR->m_size.x - PMONITOR->m_reservedBottomRight.x - PLASTWINDOW->m_realSize->goal().x - BORDERSIZE + PMONITOR->m_position.x; break; + case 'l': vPosx = PMONITOR->m_reservedTopLeft.x + BORDERSIZE + PMONITOR->m_position.x + PGAPSOUT->m_left; break; + case 'r': + vPosx = PMONITOR->m_size.x - PMONITOR->m_reservedBottomRight.x - PLASTWINDOW->m_realSize->goal().x - BORDERSIZE + PMONITOR->m_position.x - PGAPSOUT->m_right; + break; case 't': - case 'u': vPosy = PMONITOR->m_reservedTopLeft.y + BORDERSIZE + PMONITOR->m_position.y; break; + case 'u': vPosy = PMONITOR->m_reservedTopLeft.y + BORDERSIZE + PMONITOR->m_position.y + PGAPSOUT->m_top; break; case 'b': - case 'd': vPosy = PMONITOR->m_size.y - PMONITOR->m_reservedBottomRight.y - PLASTWINDOW->m_realSize->goal().y - BORDERSIZE + PMONITOR->m_position.y; break; + case 'd': + vPosy = PMONITOR->m_size.y - PMONITOR->m_reservedBottomRight.y - PLASTWINDOW->m_realSize->goal().y - BORDERSIZE + PMONITOR->m_position.y - PGAPSOUT->m_bottom; + break; } *PLASTWINDOW->m_realPosition = Vector2D(vPosx.value_or(PLASTWINDOW->m_realPosition->goal().x), vPosy.value_or(PLASTWINDOW->m_realPosition->goal().y)); From d9f7448d82132f4c1c07105f4bc3a4f717915d30 Mon Sep 17 00:00:00 2001 From: vaxerski Date: Wed, 4 Jun 2025 16:54:12 +0200 Subject: [PATCH 061/901] xwayland: pad pid with leading zeroes in lockfile fixes #10652 --- src/xwayland/Server.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/xwayland/Server.cpp b/src/xwayland/Server.cpp index 814bd20c..0cc16fef 100644 --- a/src/xwayland/Server.cpp +++ b/src/xwayland/Server.cpp @@ -199,8 +199,9 @@ bool CXWaylandServer::tryOpenSockets() { continue; } - const std::string pidStr = std::to_string(getpid()); - if (write(fd.get(), pidStr.c_str(), pidStr.length()) != (long)pidStr.length()) { + const std::string pidStr = std::format("{:010d}\n", getpid()); + ASSERT(pidStr.length() == 11); + if (write(fd.get(), pidStr.c_str(), 11) != 11L) { safeRemove(lockPath); continue; } From d7a87ce6e2535f1029fc93b062d2828e8549c525 Mon Sep 17 00:00:00 2001 From: Jasson Date: Wed, 4 Jun 2025 11:00:55 -0400 Subject: [PATCH 062/901] xwayland: fix xwayland -> wayland clipboard (#10646) --- src/xwayland/XWM.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/xwayland/XWM.cpp b/src/xwayland/XWM.cpp index 5b423dca..1da8c71e 100644 --- a/src/xwayland/XWM.cpp +++ b/src/xwayland/XWM.cpp @@ -1214,6 +1214,7 @@ void CXWM::initSelection() { }; createSelectionWindow(m_clipboard.window, "CLIPBOARD_MANAGER"); + createSelectionWindow(m_clipboard.window, "CLIPBOARD"); m_clipboard.listeners.setSelection = g_pSeatManager->m_events.setSelection.registerListener([this](std::any) { m_clipboard.onSelection(); }); m_clipboard.listeners.keyboardFocusChange = g_pSeatManager->m_events.keyboardFocusChange.registerListener([this](std::any) { m_clipboard.onKeyboardFocus(); }); From 59c886d85500cf4c8ae11eaf2ebe50ec25b596f6 Mon Sep 17 00:00:00 2001 From: sam Date: Thu, 5 Jun 2025 22:19:54 +0800 Subject: [PATCH 063/901] internal: Catch filesystem exceptions while iterating RunTimeDir (#10648) --- hyprctl/main.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/hyprctl/main.cpp b/hyprctl/main.cpp index 25a4eef3..4a8b9819 100644 --- a/hyprctl/main.cpp +++ b/hyprctl/main.cpp @@ -72,10 +72,13 @@ std::vector instances() { return {}; } catch (std::exception& e) { return {}; } - for (const auto& el : std::filesystem::directory_iterator(getRuntimeDir())) { + std::error_code ec; + std::filesystem::directory_iterator it = std::filesystem::directory_iterator(getRuntimeDir(), std::filesystem::directory_options::skip_permission_denied, ec); + if (ec) + return {}; + for (const auto& el : it) { if (!el.is_directory() || !std::filesystem::exists(el.path().string() + "/hyprland.lock")) continue; - // read lock SInstanceData* data = &result.emplace_back(); data->id = el.path().filename().string(); From abdfc5ea40c0793117f34bf6c465840500cf7cb0 Mon Sep 17 00:00:00 2001 From: UjinT34 <41110182+UjinT34@users.noreply.github.com> Date: Thu, 5 Jun 2025 17:56:46 +0300 Subject: [PATCH 064/901] config: add a new monitor v2 config syntax (#9761) --- src/config/ConfigManager.cpp | 443 ++++++++++++++++++++++------------- src/config/ConfigManager.hpp | 33 +++ src/debug/HyprCtl.cpp | 3 + 3 files changed, 322 insertions(+), 157 deletions(-) diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index e2fb26ab..735d9703 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -791,6 +791,20 @@ CConfigManager::CConfigManager() { m_config->addSpecialConfigValue("device", "flip_y", Hyprlang::INT{0}); // only for touchpads m_config->addSpecialConfigValue("device", "keybinds", Hyprlang::INT{1}); // enable/disable keybinds + m_config->addSpecialCategory("monitorv2", {.key = "output"}); + m_config->addSpecialConfigValue("monitorv2", "disabled", Hyprlang::INT{0}); + m_config->addSpecialConfigValue("monitorv2", "mode", {"preferred"}); + m_config->addSpecialConfigValue("monitorv2", "position", {"auto"}); + m_config->addSpecialConfigValue("monitorv2", "scale", Hyprlang::FLOAT{1.0}); + m_config->addSpecialConfigValue("monitorv2", "addreserved", {STRVAL_EMPTY}); + m_config->addSpecialConfigValue("monitorv2", "mirror", {STRVAL_EMPTY}); + m_config->addSpecialConfigValue("monitorv2", "bitdepth", {STRVAL_EMPTY}); // TODO use correct type + m_config->addSpecialConfigValue("monitorv2", "cm", {"auto"}); + m_config->addSpecialConfigValue("monitorv2", "sdrbrightness", Hyprlang::FLOAT{1.0}); + m_config->addSpecialConfigValue("monitorv2", "sdrsaturation", Hyprlang::FLOAT{1.0}); + m_config->addSpecialConfigValue("monitorv2", "vrr", Hyprlang::INT{0}); + m_config->addSpecialConfigValue("monitorv2", "transform", {STRVAL_EMPTY}); // TODO use correct type + // keywords m_config->registerHandler(&::handleExec, "exec", {false}); m_config->registerHandler(&::handleRawExec, "execr", {false}); @@ -918,8 +932,9 @@ void CConfigManager::reload() { resetHLConfig(); m_configCurrentPath = getMainConfigPath(); const auto ERR = m_config->parse(); - m_lastConfigVerificationWasSuccessful = !ERR.error; - postConfigReload(ERR); + const auto monitorError = handleMonitorv2(); + m_lastConfigVerificationWasSuccessful = !ERR.error && !monitorError.error; + postConfigReload(ERR.error || !monitorError.error ? ERR : monitorError); } std::string CConfigManager::verify() { @@ -1009,6 +1024,68 @@ void CConfigManager::updateWatcher() { g_pConfigWatcher->setWatchList(*PDISABLEAUTORELOAD ? std::vector{} : m_configPaths); } +std::optional CConfigManager::handleMonitorv2(const std::string& output) { + auto parser = CMonitorRuleParser(output); + auto VAL = m_config->getSpecialConfigValuePtr("monitorv2", "disabled", output.c_str()); + if (VAL && VAL->m_bSetByUser && std::any_cast(VAL->getValue())) + parser.setDisabled(); + VAL = m_config->getSpecialConfigValuePtr("monitorv2", "mode", output.c_str()); + if (VAL && VAL->m_bSetByUser) + parser.parseMode(std::any_cast(VAL->getValue())); + VAL = m_config->getSpecialConfigValuePtr("monitorv2", "position", output.c_str()); + if (VAL && VAL->m_bSetByUser) + parser.parsePosition(std::any_cast(VAL->getValue())); + VAL = m_config->getSpecialConfigValuePtr("monitorv2", "scale", output.c_str()); + if (VAL && VAL->m_bSetByUser) + parser.rule().scale = std::any_cast(VAL->getValue()); + VAL = m_config->getSpecialConfigValuePtr("monitorv2", "addreserved", output.c_str()); + if (VAL && VAL->m_bSetByUser) { + const auto ARGS = CVarList(std::any_cast(VAL->getValue())); + parser.setReserved({.top = std::stoi(ARGS[0]), .bottom = std::stoi(ARGS[1]), .left = std::stoi(ARGS[2]), .right = std::stoi(ARGS[3])}); + } + VAL = m_config->getSpecialConfigValuePtr("monitorv2", "mirror", output.c_str()); + if (VAL && VAL->m_bSetByUser) + parser.setMirror(std::any_cast(VAL->getValue())); + VAL = m_config->getSpecialConfigValuePtr("monitorv2", "bitdepth", output.c_str()); + if (VAL && VAL->m_bSetByUser) + parser.parseBitdepth(std::any_cast(VAL->getValue())); + VAL = m_config->getSpecialConfigValuePtr("monitorv2", "cm", output.c_str()); + if (VAL && VAL->m_bSetByUser) + parser.parseCM(std::any_cast(VAL->getValue())); + VAL = m_config->getSpecialConfigValuePtr("monitorv2", "sdrbrightness", output.c_str()); + if (VAL && VAL->m_bSetByUser) + parser.rule().sdrBrightness = std::any_cast(VAL->getValue()); + VAL = m_config->getSpecialConfigValuePtr("monitorv2", "sdrsaturation", output.c_str()); + if (VAL && VAL->m_bSetByUser) + parser.rule().sdrSaturation = std::any_cast(VAL->getValue()); + VAL = m_config->getSpecialConfigValuePtr("monitorv2", "vrr", output.c_str()); + if (VAL && VAL->m_bSetByUser) + parser.rule().vrr = std::any_cast(VAL->getValue()); + VAL = m_config->getSpecialConfigValuePtr("monitorv2", "transform", output.c_str()); + if (VAL && VAL->m_bSetByUser) + parser.parseTransform(std::any_cast(VAL->getValue())); + + auto newrule = parser.rule(); + + std::erase_if(m_monitorRules, [&](const auto& other) { return other.name == newrule.name; }); + + m_monitorRules.push_back(newrule); + + return parser.getError(); +} + +Hyprlang::CParseResult CConfigManager::handleMonitorv2() { + Hyprlang::CParseResult result; + for (const auto& output : m_config->listKeysForSpecialCategory("monitorv2")) { + const auto error = handleMonitorv2(output); + if (error.has_value()) { + result.setError(error.value().c_str()); + return result; + } + } + return result; +} + void CConfigManager::postConfigReload(const Hyprlang::CParseResult& result) { static const auto PENABLEEXPLICIT = CConfigValue("render:explicit_sync"); static int prevEnabledExplicit = *PENABLEEXPLICIT; @@ -1607,6 +1684,7 @@ void CConfigManager::dispatchExecShutdown() { } void CConfigManager::performMonitorReload() { + handleMonitorv2(); bool overAgain = false; @@ -1956,30 +2034,207 @@ static bool parseModeLine(const std::string& modeline, drmModeModeInfo& mode) { return true; } +CMonitorRuleParser::CMonitorRuleParser(const std::string& name) { + m_rule.name = name; +} + +const std::string& CMonitorRuleParser::name() { + return m_rule.name; +} + +SMonitorRule& CMonitorRuleParser::rule() { + return m_rule; +} + +std::optional CMonitorRuleParser::getError() { + if (m_error.empty()) + return {}; + return m_error; +} + +bool CMonitorRuleParser::parseMode(const std::string& value) { + if (value.starts_with("pref")) + m_rule.resolution = Vector2D(); + else if (value.starts_with("highrr")) + m_rule.resolution = Vector2D(-1, -1); + else if (value.starts_with("highres")) + m_rule.resolution = Vector2D(-1, -2); + else if (parseModeLine(value, m_rule.drmMode)) { + m_rule.resolution = Vector2D(m_rule.drmMode.hdisplay, m_rule.drmMode.vdisplay); + m_rule.refreshRate = float(m_rule.drmMode.vrefresh) / 1000; + } else { + + if (!value.contains("x")) { + m_error += "invalid resolution "; + m_rule.resolution = Vector2D(); + return false; + } else { + try { + m_rule.resolution.x = stoi(value.substr(0, value.find_first_of('x'))); + m_rule.resolution.y = stoi(value.substr(value.find_first_of('x') + 1, value.find_first_of('@'))); + + if (value.contains("@")) + m_rule.refreshRate = stof(value.substr(value.find_first_of('@') + 1)); + } catch (...) { + m_error += "invalid resolution "; + m_rule.resolution = Vector2D(); + return false; + } + } + } + return true; +} + +bool CMonitorRuleParser::parsePosition(const std::string& value, bool isFirst) { + if (value.starts_with("auto")) { + m_rule.offset = Vector2D(-INT32_MAX, -INT32_MAX); + // If this is the first monitor rule needs to be on the right. + if (value == "auto-right" || value == "auto" || isFirst) + m_rule.autoDir = eAutoDirs::DIR_AUTO_RIGHT; + else if (value == "auto-left") + m_rule.autoDir = eAutoDirs::DIR_AUTO_LEFT; + else if (value == "auto-up") + m_rule.autoDir = eAutoDirs::DIR_AUTO_UP; + else if (value == "auto-down") + m_rule.autoDir = eAutoDirs::DIR_AUTO_DOWN; + else { + Debug::log(WARN, + "Invalid auto direction. Valid options are 'auto'," + "'auto-up', 'auto-down', 'auto-left', and 'auto-right'."); + m_error += "invalid auto direction "; + return false; + } + } else { + if (!value.contains("x")) { + m_error += "invalid offset "; + m_rule.offset = Vector2D(-INT32_MAX, -INT32_MAX); + return false; + } else { + m_rule.offset.x = stoi(value.substr(0, value.find_first_of('x'))); + m_rule.offset.y = stoi(value.substr(value.find_first_of('x') + 1)); + } + } + return true; +} + +bool CMonitorRuleParser::parseScale(const std::string& value) { + if (value.starts_with("auto")) + m_rule.scale = -1; + else { + if (!isNumber(value, true)) { + m_error += "invalid scale "; + return false; + } else { + m_rule.scale = stof(value); + + if (m_rule.scale < 0.25f) { + m_error += "invalid scale "; + m_rule.scale = 1; + return false; + } + } + } + return true; +} + +bool CMonitorRuleParser::parseTransform(const std::string& value) { + const auto TSF = std::stoi(value); + if (std::clamp(TSF, 0, 7) != TSF) { + Debug::log(ERR, "Invalid transform {} in monitor", TSF); + m_error += "invalid transform "; + return false; + } + m_rule.transform = (wl_output_transform)TSF; + return true; +} + +bool CMonitorRuleParser::parseBitdepth(const std::string& value) { + m_rule.enable10bit = value == "10"; + return true; +} + +bool CMonitorRuleParser::parseCM(const std::string& value) { + if (value == "auto") + m_rule.cmType = CM_AUTO; + else if (value == "srgb") + m_rule.cmType = CM_SRGB; + else if (value == "wide") + m_rule.cmType = CM_WIDE; + else if (value == "edid") + m_rule.cmType = CM_EDID; + else if (value == "hdr") + m_rule.cmType = CM_HDR; + else if (value == "hdredid") + m_rule.cmType = CM_HDR_EDID; + else { + m_error += "invalid cm "; + return false; + } + return true; +} + +bool CMonitorRuleParser::parseSDRBrightness(const std::string& value) { + try { + m_rule.sdrBrightness = stof(value); + } catch (...) { + m_error += "invalid sdrbrightness "; + return false; + } + return true; +} + +bool CMonitorRuleParser::parseSDRSaturation(const std::string& value) { + try { + m_rule.sdrSaturation = stof(value); + } catch (...) { + m_error += "invalid sdrsaturation "; + return false; + } + return true; +} + +bool CMonitorRuleParser::parseVRR(const std::string& value) { + if (!isNumber(value)) { + m_error += "invalid vrr "; + return false; + } + + m_rule.vrr = std::stoi(value); + return true; +} + +void CMonitorRuleParser::setDisabled() { + m_rule.disabled = true; +} + +void CMonitorRuleParser::setMirror(const std::string& value) { + m_rule.mirrorOf = value; +} + +bool CMonitorRuleParser::setReserved(const SMonitorAdditionalReservedArea& value) { + g_pConfigManager->m_mAdditionalReservedAreas[name()] = value; + return true; +} + std::optional CConfigManager::handleMonitor(const std::string& command, const std::string& args) { // get the monitor config - SMonitorRule newrule; + const auto ARGS = CVarList(args); - const auto ARGS = CVarList(args); - - newrule.name = ARGS[0]; + auto parser = CMonitorRuleParser(ARGS[0]); if (ARGS[1] == "disable" || ARGS[1] == "disabled" || ARGS[1] == "addreserved" || ARGS[1] == "transform") { if (ARGS[1] == "disable" || ARGS[1] == "disabled") - newrule.disabled = true; + parser.setDisabled(); else if (ARGS[1] == "transform") { - const auto TSF = std::stoi(ARGS[2]); - if (std::clamp(TSF, 0, 7) != TSF) { - Debug::log(ERR, "Invalid transform {} in monitor", TSF); - return "invalid transform"; - } + if (!parser.parseTransform(ARGS[2])) + return parser.getError(); - const auto TRANSFORM = (wl_output_transform)TSF; + const auto TRANSFORM = parser.rule().transform; // overwrite if exists for (auto& r : m_monitorRules) { - if (r.name == newrule.name) { + if (r.name == parser.name()) { r.transform = TRANSFORM; return {}; } @@ -1987,179 +2242,53 @@ std::optional CConfigManager::handleMonitor(const std::string& comm return {}; } else if (ARGS[1] == "addreserved") { - int top = std::stoi(ARGS[2]); - - int bottom = std::stoi(ARGS[3]); - - int left = std::stoi(ARGS[4]); - - int right = std::stoi(ARGS[5]); - - m_mAdditionalReservedAreas[newrule.name] = {top, bottom, left, right}; - + parser.setReserved({.top = std::stoi(ARGS[2]), .bottom = std::stoi(ARGS[3]), .left = std::stoi(ARGS[4]), .right = std::stoi(ARGS[5])}); return {}; } else { Debug::log(ERR, "ConfigManager parseMonitor, curitem bogus???"); return "parse error: curitem bogus"; } - std::erase_if(m_monitorRules, [&](const auto& other) { return other.name == newrule.name; }); + std::erase_if(m_monitorRules, [&](const auto& other) { return other.name == parser.name(); }); - m_monitorRules.push_back(newrule); + m_monitorRules.push_back(parser.rule()); return {}; } - std::string error = ""; - - if (ARGS[1].starts_with("pref")) { - newrule.resolution = Vector2D(); - } else if (ARGS[1].starts_with("highrr")) { - newrule.resolution = Vector2D(-1, -1); - } else if (ARGS[1].starts_with("highres")) { - newrule.resolution = Vector2D(-1, -2); - } else if (ARGS[1].starts_with("maxwidth")) { - newrule.resolution = Vector2D(-1, -3); - } else if (parseModeLine(ARGS[1], newrule.drmMode)) { - newrule.resolution = Vector2D(newrule.drmMode.hdisplay, newrule.drmMode.vdisplay); - newrule.refreshRate = float(newrule.drmMode.vrefresh) / 1000; - } else { - - if (!ARGS[1].contains("x")) { - error += "invalid resolution "; - newrule.resolution = Vector2D(); - } else { - try { - newrule.resolution.x = stoi(ARGS[1].substr(0, ARGS[1].find_first_of('x'))); - newrule.resolution.y = stoi(ARGS[1].substr(ARGS[1].find_first_of('x') + 1, ARGS[1].find_first_of('@'))); - - if (ARGS[1].contains("@")) - newrule.refreshRate = stof(ARGS[1].substr(ARGS[1].find_first_of('@') + 1)); - } catch (...) { - error += "invalid resolution "; - newrule.resolution = Vector2D(); - } - } - } - - if (ARGS[2].starts_with("auto")) { - newrule.offset = Vector2D(-INT32_MAX, -INT32_MAX); - // If this is the first monitor rule needs to be on the right. - if (ARGS[2] == "auto-right" || ARGS[2] == "auto" || m_monitorRules.empty()) - newrule.autoDir = eAutoDirs::DIR_AUTO_RIGHT; - else if (ARGS[2] == "auto-left") - newrule.autoDir = eAutoDirs::DIR_AUTO_LEFT; - else if (ARGS[2] == "auto-up") - newrule.autoDir = eAutoDirs::DIR_AUTO_UP; - else if (ARGS[2] == "auto-down") - newrule.autoDir = eAutoDirs::DIR_AUTO_DOWN; - else if (ARGS[2] == "auto-center-right") - newrule.autoDir = eAutoDirs::DIR_AUTO_CENTER_RIGHT; - else if (ARGS[2] == "auto-center-left") - newrule.autoDir = eAutoDirs::DIR_AUTO_CENTER_LEFT; - else if (ARGS[2] == "auto-center-up") - newrule.autoDir = eAutoDirs::DIR_AUTO_CENTER_UP; - else if (ARGS[2] == "auto-center-down") - newrule.autoDir = eAutoDirs::DIR_AUTO_CENTER_DOWN; - else { - Debug::log(WARN, - "Invalid auto direction. Valid options are 'auto'," - "'auto-up', 'auto-down', 'auto-left', 'auto-right'," - "'auto-center-up', 'auto-center-down'," - "'auto-center-left', and 'auto-center-right'."); - error += "invalid auto direction "; - } - } else { - if (!ARGS[2].contains("x")) { - error += "invalid offset "; - newrule.offset = Vector2D(-INT32_MAX, -INT32_MAX); - } else { - newrule.offset.x = stoi(ARGS[2].substr(0, ARGS[2].find_first_of('x'))); - newrule.offset.y = stoi(ARGS[2].substr(ARGS[2].find_first_of('x') + 1)); - } - } - - if (ARGS[3].starts_with("auto")) { - newrule.scale = -1; - } else { - if (!isNumber(ARGS[3], true)) - error += "invalid scale "; - else { - newrule.scale = stof(ARGS[3]); - - if (newrule.scale < 0.25f) { - error += "invalid scale "; - newrule.scale = 1; - } - } - } + parser.parseMode(ARGS[1]); + parser.parsePosition(ARGS[2]); + parser.parseScale(ARGS[3]); int argno = 4; while (!ARGS[argno].empty()) { if (ARGS[argno] == "mirror") { - newrule.mirrorOf = ARGS[argno + 1]; + parser.setMirror(ARGS[argno + 1]); argno++; } else if (ARGS[argno] == "bitdepth") { - newrule.enable10bit = ARGS[argno + 1] == "10"; + parser.parseBitdepth(ARGS[argno + 1]); argno++; } else if (ARGS[argno] == "cm") { - if (ARGS[argno + 1] == "auto") - newrule.cmType = CM_AUTO; - else if (ARGS[argno + 1] == "srgb") - newrule.cmType = CM_SRGB; - else if (ARGS[argno + 1] == "wide") - newrule.cmType = CM_WIDE; - else if (ARGS[argno + 1] == "edid") - newrule.cmType = CM_EDID; - else if (ARGS[argno + 1] == "hdr") - newrule.cmType = CM_HDR; - else if (ARGS[argno + 1] == "hdredid") - newrule.cmType = CM_HDR_EDID; - else - error = "invalid cm "; + parser.parseCM(ARGS[argno + 1]); argno++; } else if (ARGS[argno] == "sdrsaturation") { - try { - newrule.sdrSaturation = stof(ARGS[argno + 1]); - } catch (...) { error = "invalid sdrsaturation "; } + parser.parseSDRSaturation(ARGS[argno + 1]); argno++; } else if (ARGS[argno] == "sdrbrightness") { - try { - newrule.sdrBrightness = stof(ARGS[argno + 1]); - } catch (...) { error = "invalid sdrbrightness "; } + parser.parseSDRBrightness(ARGS[argno + 1]); argno++; } else if (ARGS[argno] == "transform") { - if (!isNumber(ARGS[argno + 1])) { - error = "invalid transform "; - argno++; - continue; - } - - const auto NUM = std::stoi(ARGS[argno + 1]); - - if (NUM < 0 || NUM > 7) { - error = "invalid transform "; - argno++; - continue; - } - - newrule.transform = (wl_output_transform)std::stoi(ARGS[argno + 1]); + parser.parseTransform(ARGS[argno + 1]); argno++; } else if (ARGS[argno] == "vrr") { - if (!isNumber(ARGS[argno + 1])) { - error = "invalid vrr "; - argno++; - continue; - } - - newrule.vrr = std::stoi(ARGS[argno + 1]); + parser.parseVRR(ARGS[argno + 1]); argno++; } else if (ARGS[argno] == "workspace") { const auto& [id, name] = getWorkspaceIDNameFromString(ARGS[argno + 1]); SWorkspaceRule wsRule; - wsRule.monitor = newrule.name; + wsRule.monitor = parser.name(); wsRule.workspaceString = ARGS[argno + 1]; wsRule.workspaceId = id; wsRule.workspaceName = name; @@ -2174,13 +2303,13 @@ std::optional CConfigManager::handleMonitor(const std::string& comm argno++; } + auto newrule = parser.rule(); + std::erase_if(m_monitorRules, [&](const auto& other) { return other.name == newrule.name; }); m_monitorRules.push_back(newrule); - if (error.empty()) - return {}; - return error; + return parser.getError(); } std::optional CConfigManager::handleBezier(const std::string& command, const std::string& args) { diff --git a/src/config/ConfigManager.hpp b/src/config/ConfigManager.hpp index 134292e5..2d8446b5 100644 --- a/src/config/ConfigManager.hpp +++ b/src/config/ConfigManager.hpp @@ -27,6 +27,8 @@ #define HANDLE void* +class CConfigManager; + struct SWorkspaceRule { std::string monitor = ""; std::string workspaceString = ""; @@ -170,6 +172,32 @@ namespace std { }; } +class CMonitorRuleParser { + public: + CMonitorRuleParser(const std::string& name); + + const std::string& name(); + SMonitorRule& rule(); + std::optional getError(); + bool parseMode(const std::string& value); + bool parsePosition(const std::string& value, bool isFirst = false); + bool parseScale(const std::string& value); + bool parseTransform(const std::string& value); + bool parseBitdepth(const std::string& value); + bool parseCM(const std::string& value); + bool parseSDRBrightness(const std::string& value); + bool parseSDRSaturation(const std::string& value); + bool parseVRR(const std::string& value); + + void setDisabled(); + void setMirror(const std::string& value); + bool setReserved(const SMonitorAdditionalReservedArea& value); + + private: + SMonitorRule m_rule; + std::string m_error = ""; +}; + class CConfigManager { public: CConfigManager(); @@ -257,6 +285,9 @@ class CConfigManager { std::optional handlePlugin(const std::string&, const std::string&); std::optional handlePermission(const std::string&, const std::string&); + std::optional handleMonitorv2(const std::string& output); + Hyprlang::CParseResult handleMonitorv2(); + std::string m_configCurrentPath; bool m_wantsMonitorReload = false; @@ -307,6 +338,7 @@ class CConfigManager { std::optional resetHLConfig(); std::optional generateConfig(std::string configPath); std::optional verifyConfigExists(); + void postConfigReload(const Hyprlang::CParseResult& result); SWorkspaceRule mergeWorkspaceRules(const SWorkspaceRule&, const SWorkspaceRule&); @@ -319,6 +351,7 @@ class CConfigManager { std::unordered_map m_mStoredFloatingSizes; friend struct SConfigOptionDescription; + friend class CMonitorRuleParser; }; inline UP g_pConfigManager; diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp index 77f54c2b..11f8b39a 100644 --- a/src/debug/HyprCtl.cpp +++ b/src/debug/HyprCtl.cpp @@ -1109,6 +1109,9 @@ static std::string dispatchKeyword(eHyprCtlOutputFormat format, std::string in) if (COMMAND == "monitor" || COMMAND == "source") g_pConfigManager->m_wantsMonitorReload = true; // for monitor keywords + if (COMMAND.contains("monitorv2")) + g_pEventLoopManager->doLater([] { g_pConfigManager->m_wantsMonitorReload = true; }); + if (COMMAND.contains("input") || COMMAND.contains("device") || COMMAND == "source") { g_pInputManager->setKeyboardLayout(); // update kb layout g_pInputManager->setPointerConfigs(); // update mouse cfgs From 423b69f5d3c76762e05c1511a10942714dea4e8e Mon Sep 17 00:00:00 2001 From: Eric Li Date: Thu, 5 Jun 2025 16:17:04 -0400 Subject: [PATCH 065/901] config: add group: selector (#10588) --- src/config/ConfigManager.cpp | 19 +++++++++++++++++-- src/desktop/WindowRule.hpp | 3 ++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 735d9703..025be9f7 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -1434,6 +1434,7 @@ std::vector> CConfigManager::getMatchingRules(PHLWINDOW pWindow, // since some rules will be applied later, we need to store some flags bool hasFloating = pWindow->m_isFloating; bool hasFullscreen = pWindow->isFullscreen(); + bool isGrouped = pWindow->m_groupData.pNextWindow; // local tags for dynamic tag rule match auto tags = pWindow->m_tags; @@ -1482,6 +1483,11 @@ std::vector> CConfigManager::getMatchingRules(PHLWINDOW pWindow, continue; } + if (rule->m_group != -1) { + if (rule->m_group != isGrouped) + continue; + } + if (!rule->m_fullscreenState.empty()) { const auto ARGS = CVarList(rule->m_fullscreenState, 2, ' '); // @@ -2576,6 +2582,7 @@ std::optional CConfigManager::handleWindowRule(const std::string& c const auto ONWORKSPACEPOS = VALUE.find("onworkspace:"); const auto CONTENTTYPEPOS = VALUE.find("content:"); const auto XDGTAGPOS = VALUE.find("xdgTag:"); + const auto GROUPPOS = VALUE.find("group:"); // find workspacepos that isn't onworkspacepos size_t WORKSPACEPOS = std::string::npos; @@ -2588,8 +2595,8 @@ std::optional CConfigManager::handleWindowRule(const std::string& c currentPos = VALUE.find("workspace:", currentPos + 1); } - const auto checkPos = std::unordered_set{TAGPOS, TITLEPOS, CLASSPOS, INITIALTITLEPOS, INITIALCLASSPOS, X11POS, FLOATPOS, FULLSCREENPOS, - PINNEDPOS, FULLSCREENSTATEPOS, WORKSPACEPOS, FOCUSPOS, ONWORKSPACEPOS, CONTENTTYPEPOS, XDGTAGPOS}; + const auto checkPos = std::unordered_set{TAGPOS, TITLEPOS, CLASSPOS, INITIALTITLEPOS, INITIALCLASSPOS, X11POS, FLOATPOS, FULLSCREENPOS, + PINNEDPOS, FULLSCREENSTATEPOS, WORKSPACEPOS, FOCUSPOS, ONWORKSPACEPOS, CONTENTTYPEPOS, XDGTAGPOS, GROUPPOS}; if (checkPos.size() == 1 && checkPos.contains(std::string::npos)) { Debug::log(ERR, "Invalid rulev2 syntax: {}", VALUE); return "Invalid rulev2 syntax: " + VALUE; @@ -2630,6 +2637,8 @@ std::optional CConfigManager::handleWindowRule(const std::string& c min = CONTENTTYPEPOS; if (XDGTAGPOS > pos && XDGTAGPOS < min) min = XDGTAGPOS; + if (GROUPPOS > pos && GROUPPOS < min) + min = GROUPPOS; result = result.substr(0, min - pos); @@ -2694,6 +2703,9 @@ std::optional CConfigManager::handleWindowRule(const std::string& c if (XDGTAGPOS != std::string::npos) rule->m_xdgTag = extract(XDGTAGPOS + 8); + if (GROUPPOS != std::string::npos) + rule->m_group = extract(GROUPPOS + 6) == "1" ? 1 : 0; + if (RULE == "unset") { std::erase_if(m_windowRules, [&](const auto& other) { if (!other->m_v2) @@ -2741,6 +2753,9 @@ std::optional CConfigManager::handleWindowRule(const std::string& c if (!rule->m_contentType.empty() && rule->m_contentType != other->m_contentType) return false; + if (rule->m_group != -1 && rule->m_group != other->m_group) + return false; + return true; } }); diff --git a/src/desktop/WindowRule.hpp b/src/desktop/WindowRule.hpp index 9af3909a..b828c8ee 100644 --- a/src/desktop/WindowRule.hpp +++ b/src/desktop/WindowRule.hpp @@ -58,6 +58,7 @@ class CWindowRule { int m_fullscreen = -1; int m_pinned = -1; int m_focus = -1; + int m_group = -1; std::string m_fullscreenState = ""; // empty means any std::string m_onWorkspace = ""; // empty means any std::string m_workspace = ""; // empty means any @@ -70,4 +71,4 @@ class CWindowRule { CRuleRegexContainer m_initialTitleRegex; CRuleRegexContainer m_initialClassRegex; CRuleRegexContainer m_v1Regex; -}; \ No newline at end of file +}; From fb7548cb41d82f12db2d51b50af29abe4704a1a4 Mon Sep 17 00:00:00 2001 From: XPhyro Date: Thu, 5 Jun 2025 23:29:01 +0300 Subject: [PATCH 066/901] screencopy: fix applying `noscreenshare` to invisible special workspaces (#10628) --- src/protocols/Screencopy.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/protocols/Screencopy.cpp b/src/protocols/Screencopy.cpp index 8002776a..3ad57ed7 100644 --- a/src/protocols/Screencopy.cpp +++ b/src/protocols/Screencopy.cpp @@ -206,7 +206,7 @@ void CScreencopyFrame::renderMon() { if (!w->m_windowData.noScreenShare.valueOrDefault()) continue; - if (!g_pHyprRenderer->shouldRenderWindow(w)) + if (!g_pHyprRenderer->shouldRenderWindow(w, m_monitor.lock())) continue; const auto PWORKSPACE = w->m_workspace; From d6fbd89336f2f0b631856e6a68a9d62c772ef50f Mon Sep 17 00:00:00 2001 From: Friday Date: Thu, 5 Jun 2025 22:02:58 +0100 Subject: [PATCH 067/901] nix: use gcc15-built dependencies --- flake.lock | 66 +++++++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/flake.lock b/flake.lock index 01b437e6..ba7d34bf 100644 --- a/flake.lock +++ b/flake.lock @@ -16,11 +16,11 @@ ] }, "locked": { - "lastModified": 1747864449, - "narHash": "sha256-PIjVAWghZhr3L0EFM2UObhX84UQxIACbON0IC0zzSKA=", + "lastModified": 1749155310, + "narHash": "sha256-t0HfHg/1+TbSra5s6nNM0o4tnb3uqWedShSpZXsUMYY=", "owner": "hyprwm", "repo": "aquamarine", - "rev": "389372c5f4dc1ac0e7645ed29a35fd6d71672ef5", + "rev": "94981cf75a9f11da0b6dd6a1abbd7c50a36ab2d3", "type": "github" }, "original": { @@ -79,11 +79,11 @@ ] }, "locked": { - "lastModified": 1745948457, - "narHash": "sha256-lzTV10FJTCGNtMdgW5YAhCAqezeAzKOd/97HbQK8GTU=", + "lastModified": 1749155331, + "narHash": "sha256-XR9fsI0zwLiFWfqi/pdS/VD+YNorKb3XIykgTg4l1nA=", "owner": "hyprwm", "repo": "hyprcursor", - "rev": "ac903e80b33ba6a88df83d02232483d99f327573", + "rev": "45fcc10b4c282746d93ec406a740c43b48b4ef80", "type": "github" }, "original": { @@ -105,11 +105,11 @@ ] }, "locked": { - "lastModified": 1745015490, - "narHash": "sha256-apEJ9zoSzmslhJ2vOKFcXTMZLUFYzh1ghfB6Rbw3Low=", + "lastModified": 1749145600, + "narHash": "sha256-v2kY5RDk9oyo1x9m8u83GdklC96xlJ7ka1rrvZoYL78=", "owner": "hyprwm", "repo": "hyprgraphics", - "rev": "60754910946b4e2dc1377b967b7156cb989c5873", + "rev": "80b754e38e836777ad3a9d5d1ffc3491b0332471", "type": "github" }, "original": { @@ -128,11 +128,11 @@ ] }, "locked": { - "lastModified": 1743714874, - "narHash": "sha256-yt8F7NhMFCFHUHy/lNjH/pjZyIDFNk52Q4tivQ31WFo=", + "lastModified": 1749046714, + "narHash": "sha256-kymV5FMnddYGI+UjwIw8ceDjdeg7ToDVjbHCvUlhn14=", "owner": "hyprwm", "repo": "hyprland-protocols", - "rev": "3a5c2bda1c1a4e55cc1330c782547695a93f05b2", + "rev": "613878cb6f459c5e323aaafe1e6f388ac8a36330", "type": "github" }, "original": { @@ -157,11 +157,11 @@ ] }, "locked": { - "lastModified": 1737634706, - "narHash": "sha256-nGCibkfsXz7ARx5R+SnisRtMq21IQIhazp6viBU8I/A=", + "lastModified": 1749154592, + "narHash": "sha256-DO7z5CeT/ddSGDEnK9mAXm1qlGL47L3VAHLlLXoCjhE=", "owner": "hyprwm", "repo": "hyprland-qt-support", - "rev": "8810df502cdee755993cb803eba7b23f189db795", + "rev": "4c8053c3c888138a30c3a6c45c2e45f5484f2074", "type": "github" }, "original": { @@ -189,11 +189,11 @@ ] }, "locked": { - "lastModified": 1745951494, - "narHash": "sha256-2dModE32doiyQMmd6EDAQeZnz+5LOs6KXyE0qX76WIg=", + "lastModified": 1749155776, + "narHash": "sha256-t1PM0wxQLQwv2F2AW23uA7pm5giwmcgYEWbNIRct9r4=", "owner": "hyprwm", "repo": "hyprland-qtutils", - "rev": "4be1d324faf8d6e82c2be9f8510d299984dfdd2e", + "rev": "396e8aa1c06274835b69da7f9a015fff9a9b7522", "type": "github" }, "original": { @@ -215,11 +215,11 @@ ] }, "locked": { - "lastModified": 1747484975, - "narHash": "sha256-+LAQ81HBwG0lwshHlWe0kfWg4KcChIPpnwtnwqmnoEU=", + "lastModified": 1749145882, + "narHash": "sha256-qr0KXeczF8Sma3Ae7+dR2NHhvG7YeLBJv19W4oMu6ZE=", "owner": "hyprwm", "repo": "hyprlang", - "rev": "163c83b3db48a17c113729c220a60b94596c9291", + "rev": "1bfb84f54d50c7ae6558c794d3cfd5f6a7e6e676", "type": "github" }, "original": { @@ -238,11 +238,11 @@ ] }, "locked": { - "lastModified": 1746635225, - "narHash": "sha256-W9G9bb0zRYDBRseHbVez0J8qVpD5QbizX67H/vsudhM=", + "lastModified": 1749135356, + "narHash": "sha256-Q8mAKMDsFbCEuq7zoSlcTuxgbIBVhfIYpX0RjE32PS0=", "owner": "hyprwm", "repo": "hyprutils", - "rev": "674ea57373f08b7609ce93baff131117a0dfe70d", + "rev": "e36db00dfb3a3d3fdcc4069cb292ff60d2699ccb", "type": "github" }, "original": { @@ -261,11 +261,11 @@ ] }, "locked": { - "lastModified": 1747584298, - "narHash": "sha256-PH9qZqWLHvSBQiUnA0NzAyQA3tu2no2z8kz0ZeHWj4w=", + "lastModified": 1749145760, + "narHash": "sha256-IHaGWpGrv7seFWdw/1A+wHtTsPlOGIKMrk1TUIYJEFI=", "owner": "hyprwm", "repo": "hyprwayland-scanner", - "rev": "e511882b9c2e1d7a75d45d8fddd2160daeafcbc3", + "rev": "817918315ea016cc2d94004bfb3223b5fd9dfcc6", "type": "github" }, "original": { @@ -276,11 +276,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1748460289, - "narHash": "sha256-7doLyJBzCllvqX4gszYtmZUToxKvMUrg45EUWaUYmBg=", + "lastModified": 1748929857, + "narHash": "sha256-lcZQ8RhsmhsK8u7LIFsJhsLh/pzR9yZ8yqpTzyGdj+Q=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "96ec055edbe5ee227f28cdbc3f1ddf1df5965102", + "rev": "c2a03962b8e24e669fb37b7df10e7c79531ff1a4", "type": "github" }, "original": { @@ -365,11 +365,11 @@ ] }, "locked": { - "lastModified": 1745871725, - "narHash": "sha256-M24SNc2flblWGXFkGQfqSlEOzAGZnMc9QG3GH4K/KbE=", + "lastModified": 1749155346, + "narHash": "sha256-KIkJu3zF8MF3DuGwzAmo3Ww9wsWXolwV30SjJRTAxYE=", "owner": "hyprwm", "repo": "xdg-desktop-portal-hyprland", - "rev": "76bbf1a6b1378e4ab5230bad00ad04bc287c969e", + "rev": "44bf29f1df45786098920c655af523535a9191ae", "type": "github" }, "original": { From c35c2fea409a845b1023151a2b642f4aa077dacc Mon Sep 17 00:00:00 2001 From: UjinT34 <41110182+UjinT34@users.noreply.github.com> Date: Fri, 6 Jun 2025 10:01:19 +0300 Subject: [PATCH 068/901] config: Restore auto-center-* for monitors (#10660) --- src/config/ConfigManager.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 025be9f7..0632018c 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -2103,10 +2103,20 @@ bool CMonitorRuleParser::parsePosition(const std::string& value, bool isFirst) { m_rule.autoDir = eAutoDirs::DIR_AUTO_UP; else if (value == "auto-down") m_rule.autoDir = eAutoDirs::DIR_AUTO_DOWN; + else if (value == "auto-center-right") + m_rule.autoDir = eAutoDirs::DIR_AUTO_CENTER_RIGHT; + else if (value == "auto-center-left") + m_rule.autoDir = eAutoDirs::DIR_AUTO_CENTER_LEFT; + else if (value == "auto-center-up") + m_rule.autoDir = eAutoDirs::DIR_AUTO_CENTER_UP; + else if (value == "auto-center-down") + m_rule.autoDir = eAutoDirs::DIR_AUTO_CENTER_DOWN; else { Debug::log(WARN, "Invalid auto direction. Valid options are 'auto'," - "'auto-up', 'auto-down', 'auto-left', and 'auto-right'."); + "'auto-up', 'auto-down', 'auto-left', 'auto-right'," + "'auto-center-up', 'auto-center-down'," + "'auto-center-left', and 'auto-center-right'."); m_error += "invalid auto direction "; return false; } From 456c820d52263579e4afdc3429fdaecab12f37a5 Mon Sep 17 00:00:00 2001 From: vaxerski Date: Fri, 6 Jun 2025 15:11:12 +0200 Subject: [PATCH 069/901] assets: update header --- assets/header.svg | 128 ++++++++++++++++++++++------------------------ 1 file changed, 60 insertions(+), 68 deletions(-) diff --git a/assets/header.svg b/assets/header.svg index c8cf8222..a2b32551 100644 --- a/assets/header.svg +++ b/assets/header.svg @@ -1,72 +1,64 @@ - - -
- - - -

Hyprland

-
-
-
-
+ .st4 { + fill: url(#e); + } + + .st5 { + fill: url(#f); + } + + .st6 { + fill: url(#g); + } + + .st7 { + fill: url(#h); + } + + .st8 { + fill: url(#i); + } +