From 3e29d68d5a830c542643a52d4be726661eaa85e7 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Sat, 20 Dec 2025 19:13:54 +0000 Subject: [PATCH] expo: fix a few crash points fixes #494 --- hyprexpo/ExpoGesture.cpp | 7 ++++++- hyprexpo/overview.cpp | 28 +++++++++++++++++----------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/hyprexpo/ExpoGesture.cpp b/hyprexpo/ExpoGesture.cpp index b34d935..8b729e9 100644 --- a/hyprexpo/ExpoGesture.cpp +++ b/hyprexpo/ExpoGesture.cpp @@ -26,6 +26,9 @@ void CExpoGesture::update(const ITrackpadGesture::STrackpadGestureUpdate& e) { return; } + if (!g_pOverview) + return; + m_lastDelta += distance(e); if (m_lastDelta <= 0.01) // plugin will crash if swipe ends at <= 0 @@ -35,7 +38,9 @@ void CExpoGesture::update(const ITrackpadGesture::STrackpadGestureUpdate& e) { } void CExpoGesture::end(const ITrackpadGesture::STrackpadGestureEnd& e) { + if (!g_pOverview) + return; + g_pOverview->setClosing(false); g_pOverview->onSwipeEnd(); - g_pOverview->resetSwipe(); } diff --git a/hyprexpo/overview.cpp b/hyprexpo/overview.cpp index 3b10480..5721948 100644 --- a/hyprexpo/overview.cpp +++ b/hyprexpo/overview.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #undef private #include "OverviewPassElement.hpp" @@ -18,10 +19,6 @@ static void damageMonitor(WP thispt g_pOverview->damage(); } -static void removeOverview(WP thisptr) { - g_pOverview.reset(); -} - COverview::~COverview() { g_pHyprRenderer->makeEGLCurrent(); images.clear(); // otherwise we get a vram leak @@ -250,6 +247,9 @@ void COverview::selectHoveredWorkspace() { } void COverview::redrawID(int id, bool forcelowres) { + if (!pMonitor) + return; + if (pMonitor->m_activeWorkspace != startedOn && !closing) { // likely user changed. onWorkspaceChange(); @@ -321,6 +321,8 @@ void COverview::redrawID(int id, bool forcelowres) { } void COverview::redrawAll(bool forcelowres) { + if (!pMonitor) + return; for (size_t i = 0; i < (size_t)(SIDE_LENGTH * SIDE_LENGTH); ++i) { redrawID(i, forcelowres); } @@ -362,11 +364,12 @@ void COverview::close() { Vector2D tileSize = (pMonitor->m_size / SIDE_LENGTH); + size->warp(); + pos->warp(); + *size = pMonitor->m_size * pMonitor->m_size / tileSize; *pos = (-((pMonitor->m_size / (double)SIDE_LENGTH) * Vector2D{ID % SIDE_LENGTH, ID / SIDE_LENGTH}) * pMonitor->m_scale) * (pMonitor->m_size / tileSize); - size->setCallbackOnEnd(removeOverview); - closing = true; redrawAll(); @@ -393,6 +396,8 @@ void COverview::close() { startedOn = pMonitor->m_activeWorkspace; } + + size->setCallbackOnEnd([](auto) { g_pEventLoopManager->doLater([] { g_pOverview.reset(); }); }); } void COverview::onPreRender() { @@ -417,7 +422,8 @@ void COverview::onWorkspaceChange() { } closeOnID = openedID; - close(); + if (!closing) + close(); } void COverview::render() { @@ -469,9 +475,6 @@ void COverview::resetSwipe() { void COverview::onSwipeUpdate(double delta) { m_isSwiping = true; - if (swipeWasCommenced) - return; - static auto* const* PDISTANCE = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprexpo:gesture_distance")->getDataStaticPtr(); const float PERC = closing ? std::clamp(delta / (double)**PDISTANCE, 0.0, 1.0) : 1.0 - std::clamp(delta / (double)**PDISTANCE, 0.0, 1.0); @@ -491,6 +494,9 @@ void COverview::onSwipeUpdate(double delta) { } void COverview::onSwipeEnd() { + if (closing || !m_isSwiping) + return; + const auto SIZEMIN = pMonitor->m_size; const auto SIZEMAX = pMonitor->m_size * pMonitor->m_size / (pMonitor->m_size / SIDE_LENGTH); const auto PERC = (size->value() - SIZEMIN).x / (SIZEMAX - SIZEMIN).x; @@ -503,6 +509,6 @@ void COverview::onSwipeEnd() { size->setCallbackOnEnd([this](WP thisptr) { redrawAll(true); }); - swipeWasCommenced = true; + swipeWasCommenced = false; m_isSwiping = false; }