summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2025-02-15 00:18:43 +0000
committerVaxry <vaxry@vaxry.net>2025-02-15 00:18:43 +0000
commit1309b59f2cb5179a4c59c111c35c7feede535eb6 (patch)
treed86f631bb3cea78d709955af22e8d79bbd73fc3a /src
parentfb36815b0146d7b494cd648be0dfaa67a14d164a (diff)
monitor: report a scheduled frame when tearing on cursor move
Diffstat (limited to 'src')
-rw-r--r--src/helpers/Monitor.cpp18
-rw-r--r--src/helpers/Monitor.hpp1
-rw-r--r--src/managers/PointerManager.cpp10
3 files changed, 28 insertions, 1 deletions
diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp
index fead5db9..24db3ea4 100644
--- a/src/helpers/Monitor.cpp
+++ b/src/helpers/Monitor.cpp
@@ -1441,6 +1441,24 @@ void CMonitor::onMonitorFrame() {
g_pHyprRenderer->renderMonitor(self.lock());
}
+void CMonitor::onCursorMovedOnMonitor() {
+ if (!tearingState.activelyTearing || !solitaryClient || !g_pHyprRenderer->shouldRenderCursor())
+ return;
+
+ // submit a frame immediately. This will only update the cursor pos.
+ // output->state->setBuffer(output->state->state().buffer);
+ // output->state->addDamage(CRegion{});
+ // output->state->setPresentationMode(Aquamarine::eOutputPresentationMode::AQ_OUTPUT_PRESENTATION_IMMEDIATE);
+ // if (!output->commit())
+ // Debug::log(ERR, "onCursorMovedOnMonitor: tearing and wanted to update cursor, failed.");
+
+ // FIXME: try to do the above. We currently can't just render because drm is a fucking bitch
+ // and throws a "nO pRoP cAn Be ChAnGeD dUrInG AsYnC fLiP" on crtc_x
+ // this will throw too but fix it if we use sw cursors
+
+ tearingState.frameScheduledWhileBusy = true;
+}
+
CMonitorState::CMonitorState(CMonitor* owner) : m_pOwner(owner) {
;
}
diff --git a/src/helpers/Monitor.hpp b/src/helpers/Monitor.hpp
index c67bccc5..690b8c4a 100644
--- a/src/helpers/Monitor.hpp
+++ b/src/helpers/Monitor.hpp
@@ -186,6 +186,7 @@ class CMonitor {
void scheduleDone();
bool attemptDirectScanout();
void setCTM(const Mat3x3& ctm);
+ void onCursorMovedOnMonitor();
void debugLastPresentation(const std::string& message);
void onMonitorFrame();
diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp
index 1c8e9976..24f2b35d 100644
--- a/src/managers/PointerManager.cpp
+++ b/src/managers/PointerManager.cpp
@@ -17,6 +17,9 @@
#include <cstring>
#include <gbm.h>
#include <cairo/cairo.h>
+#include <hyprutils/utils/ScopeGuard.hpp>
+
+using namespace Hyprutils::Utils;
CPointerManager::CPointerManager() {
hooks.monitorAdded = g_pHookSystem->hookDynamic("monitorAdded", [this](void* self, SCallbackInfo& info, std::any data) {
@@ -310,7 +313,12 @@ void CPointerManager::onCursorMoved() {
recalc = true;
}
- if (state->hardwareFailed || !state->entered)
+ if (!state->entered)
+ continue;
+
+ CScopeGuard x([m] { m->onCursorMovedOnMonitor(); });
+
+ if (state->hardwareFailed)
continue;
const auto CURSORPOS = getCursorPosForMonitor(m);