aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTom Englund <[email protected]>2024-10-27 18:51:26 +0100
committerGitHub <[email protected]>2024-10-27 17:51:26 +0000
commitf9b52203f58bcb716144d89ee9f85fe12ebfe94d (patch)
tree4ecf23106134d32a5411a185d7081f986cd0c33c
parenta3d3b4fd64a51a8c1663b450bd2a408f1f0fa9b3 (diff)
downloadHyprland-f9b52203f58bcb716144d89ee9f85fe12ebfe94d.tar.gz
Hyprland-f9b52203f58bcb716144d89ee9f85fe12ebfe94d.zip
internal: optimize cursor move a bit (#8264)
* window: inline and const getWindowMainSurfaceBox getWindowMainSurfaceBox gets called a lot of times from deep down from mousemoveunified, profiling mousemoveunified it spends quite a lot of cpu time in here, let the compiler optimize the call to getWindowMainSurfaceBox by inlining and making it const. reducing the overhead. * inputmgr: return early and use std::any_of return early in mousemoveunified to reduce the amount of unnecessery calls to various pointers when not needed, also make isconstrained use std::any_of instead of for loop to use the STL optimized paths with hopes and dreams marginally faster. * decoration: return early, reduce temporar copy return earlier and reduce the temp copies by using one .lock instead of two
-rw-r--r--src/desktop/Window.cpp4
-rw-r--r--src/desktop/Window.hpp10
-rw-r--r--src/managers/input/InputManager.cpp35
-rw-r--r--src/render/decorations/DecorationPositioner.cpp12
4 files changed, 26 insertions, 35 deletions
diff --git a/src/desktop/Window.cpp b/src/desktop/Window.cpp
index 1297bb83..0772b676 100644
--- a/src/desktop/Window.cpp
+++ b/src/desktop/Window.cpp
@@ -240,10 +240,6 @@ CBox CWindow::getWindowBoxUnified(uint64_t properties) {
return box;
}
-CBox CWindow::getWindowMainSurfaceBox() {
- return {m_vRealPosition.value().x, m_vRealPosition.value().y, m_vRealSize.value().x, m_vRealSize.value().y};
-}
-
SBoxExtents CWindow::getFullWindowReservedArea() {
return g_pDecorationPositioner->getWindowDecorationReserved(m_pSelf.lock());
}
diff --git a/src/desktop/Window.hpp b/src/desktop/Window.hpp
index 9867a8c9..64f39558 100644
--- a/src/desktop/Window.hpp
+++ b/src/desktop/Window.hpp
@@ -396,10 +396,12 @@ class CWindow {
}
// methods
- CBox getFullWindowBoundingBox();
- SBoxExtents getFullWindowExtents();
- CBox getWindowBoxUnified(uint64_t props);
- CBox getWindowMainSurfaceBox();
+ CBox getFullWindowBoundingBox();
+ SBoxExtents getFullWindowExtents();
+ CBox getWindowBoxUnified(uint64_t props);
+ inline CBox getWindowMainSurfaceBox() const {
+ return {m_vRealPosition.value().x, m_vRealPosition.value().y, m_vRealSize.value().x, m_vRealSize.value().y};
+ }
CBox getWindowIdealBoundingBoxIgnoreReserved();
void addWindowDeco(std::unique_ptr<IHyprWindowDecoration> deco);
void updateWindowDecos();
diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp
index 6f7d8017..028286bf 100644
--- a/src/managers/input/InputManager.cpp
+++ b/src/managers/input/InputManager.cpp
@@ -139,6 +139,15 @@ void CInputManager::sendMotionEventsToFocused() {
}
void CInputManager::mouseMoveUnified(uint32_t time, bool refocus) {
+ if (!g_pCompositor->m_bReadyToProcess || g_pCompositor->m_bIsShuttingDown || g_pCompositor->m_bUnsafeState)
+ return;
+
+ Vector2D const mouseCoords = getMouseCoordsInternal();
+ auto const MOUSECOORDSFLOORED = mouseCoords.floor();
+
+ if (MOUSECOORDSFLOORED == m_vLastCursorPosFloored && !refocus)
+ return;
+
static auto PFOLLOWMOUSE = CConfigValue<Hyprlang::INT>("input:follow_mouse");
static auto PMOUSEREFOCUS = CConfigValue<Hyprlang::INT>("input:mouse_refocus");
static auto PFOLLOWONDND = CConfigValue<Hyprlang::INT>("misc:always_follow_on_dnd");
@@ -159,15 +168,6 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus) {
PHLWINDOW pFoundWindow;
PHLLS pFoundLayerSurface;
- if (!g_pCompositor->m_bReadyToProcess || g_pCompositor->m_bIsShuttingDown || g_pCompositor->m_bUnsafeState)
- return;
-
- Vector2D mouseCoords = getMouseCoordsInternal();
- const auto MOUSECOORDSFLOORED = mouseCoords.floor();
-
- if (MOUSECOORDSFLOORED == m_vLastCursorPosFloored && !refocus)
- return;
-
EMIT_HOOK_EVENT_CANCELLABLE("mouseMove", MOUSECOORDSFLOORED);
m_vLastCursorPosFloored = MOUSECOORDSFLOORED;
@@ -1418,19 +1418,10 @@ void CInputManager::unconstrainMouse() {
}
bool CInputManager::isConstrained() {
- for (auto const& c : m_vConstraints) {
- const auto C = c.lock();
-
- if (!C)
- continue;
-
- if (!C->isActive() || C->owner()->resource() != g_pCompositor->m_pLastFocus)
- continue;
-
- return true;
- }
-
- return false;
+ return std::any_of(m_vConstraints.begin(), m_vConstraints.end(), [](auto const& c) {
+ const auto constraint = c.lock();
+ return constraint && constraint->isActive() && constraint->owner()->resource() == g_pCompositor->m_pLastFocus;
+ });
}
bool CInputManager::isLocked() {
diff --git a/src/render/decorations/DecorationPositioner.cpp b/src/render/decorations/DecorationPositioner.cpp
index 4666a59e..3eb45546 100644
--- a/src/render/decorations/DecorationPositioner.cpp
+++ b/src/render/decorations/DecorationPositioner.cpp
@@ -297,13 +297,14 @@ SBoxExtents CDecorationPositioner::getWindowDecorationExtents(PHLWINDOW pWindow,
CBox accum = pWindow->getWindowMainSurfaceBox();
for (auto const& data : m_vWindowPositioningDatas) {
- if (data->pWindow.lock() != pWindow)
+ if (!data->pDecoration)
continue;
- if (!data->pWindow.lock() || !data->pDecoration)
+ if (!(data->pDecoration->getDecorationFlags() & DECORATION_ALLOWS_MOUSE_INPUT) && inputOnly)
continue;
- if (!(data->pDecoration->getDecorationFlags() & DECORATION_ALLOWS_MOUSE_INPUT) && inputOnly)
+ auto const window = data->pWindow.lock();
+ if (!window || window != pWindow)
continue;
CBox decoBox;
@@ -373,9 +374,10 @@ CBox CDecorationPositioner::getBoxWithIncludedDecos(PHLWINDOW pWindow) {
}
CBox CDecorationPositioner::getWindowDecorationBox(IHyprWindowDecoration* deco) {
- const auto DATA = getDataFor(deco, deco->m_pWindow.lock());
+ auto const window = deco->m_pWindow.lock();
+ const auto DATA = getDataFor(deco, window);
CBox box = DATA->lastReply.assignedGeometry;
- box.translate(getEdgeDefinedPoint(DATA->positioningInfo.edges, deco->m_pWindow.lock()));
+ box.translate(getEdgeDefinedPoint(DATA->positioningInfo.edges, window));
return box;
}