summaryrefslogtreecommitdiff
path: root/src/managers/PointerManager.cpp
diff options
context:
space:
mode:
authorTom Englund <tomenglund26@gmail.com>2024-08-11 20:42:18 +0200
committerGitHub <noreply@github.com>2024-08-11 19:42:18 +0100
commit511eea71c60e10f3d3d757a376f1ca98b9034ae0 (patch)
treeb31a26540f649a136ae76fa4d258c04c0902a88c /src/managers/PointerManager.cpp
parent01ff5fdf6a00a9231bd3b56400d8bcab378c4257 (diff)
pointermgr: fix initial cursorwarp (#7286)
change the hook to monitorAdded instead of newMonitor so its finalized in the compositor and added to vMonitors, move the checkDefaultCursorWarp to PointerManager and check for it upon mode change. and also ensure it doesnt go out of bounds by replacing it in the middle again on resolution changes.
Diffstat (limited to 'src/managers/PointerManager.cpp')
-rw-r--r--src/managers/PointerManager.cpp48
1 files changed, 44 insertions, 4 deletions
diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp
index 3ba34c11..72ff5ae7 100644
--- a/src/managers/PointerManager.cpp
+++ b/src/managers/PointerManager.cpp
@@ -11,13 +11,21 @@
#include <gbm.h>
CPointerManager::CPointerManager() {
- hooks.monitorAdded = g_pHookSystem->hookDynamic("newMonitor", [this](void* self, SCallbackInfo& info, std::any data) {
- auto PMONITOR = std::any_cast<SP<CMonitor>>(data);
+ hooks.monitorAdded = g_pHookSystem->hookDynamic("monitorAdded", [this](void* self, SCallbackInfo& info, std::any data) {
+ auto PMONITOR = std::any_cast<CMonitor*>(data)->self.lock();
onMonitorLayoutChange();
- PMONITOR->events.modeChanged.registerStaticListener([this](void* owner, std::any data) { g_pEventLoopManager->doLater([this]() { onMonitorLayoutChange(); }); }, nullptr);
- PMONITOR->events.disconnect.registerStaticListener([this](void* owner, std::any data) { g_pEventLoopManager->doLater([this]() { onMonitorLayoutChange(); }); }, nullptr);
+ PMONITOR->events.modeChanged.registerStaticListener(
+ [this, PMONITOR](void* owner, std::any data) {
+ g_pEventLoopManager->doLater([this, PMONITOR]() {
+ onMonitorLayoutChange();
+ checkDefaultCursorWarp(PMONITOR, PMONITOR->output->name);
+ });
+ },
+ nullptr);
+ PMONITOR->events.disconnect.registerStaticListener(
+ [this, PMONITOR](void* owner, std::any data) { g_pEventLoopManager->doLater([this, PMONITOR]() { onMonitorLayoutChange(); }); }, nullptr);
PMONITOR->events.destroy.registerStaticListener(
[this](void* owner, std::any data) {
if (g_pCompositor && !g_pCompositor->m_bIsShuttingDown)
@@ -35,6 +43,38 @@ CPointerManager::CPointerManager() {
});
}
+void CPointerManager::checkDefaultCursorWarp(SP<CMonitor> monitor, std::string monitorName) {
+ static auto PCURSORMONITOR = CConfigValue<std::string>("cursor:default_monitor");
+ static bool cursorDefaultDone = false;
+ static bool firstLaunch = true;
+
+ const auto POS = monitor->middle();
+
+ // by default, cursor should be set to first monitor detected
+ // this is needed as a default if the monitor given in config above doesn't exist
+ if (firstLaunch) {
+ firstLaunch = false;
+ g_pCompositor->warpCursorTo(POS, true);
+ g_pInputManager->refocus();
+ return;
+ }
+
+ if (!cursorDefaultDone && *PCURSORMONITOR != STRVAL_EMPTY) {
+ if (*PCURSORMONITOR == monitorName) {
+ cursorDefaultDone = true;
+ g_pCompositor->warpCursorTo(POS, true);
+ g_pInputManager->refocus();
+ return;
+ }
+ }
+
+ // modechange happend check if cursor is on that monitor and warp it to middle to not place it out of bounds if resolution changed.
+ if (g_pCompositor->getMonitorFromCursor() == monitor.get()) {
+ g_pCompositor->warpCursorTo(POS, true);
+ g_pInputManager->refocus();
+ }
+}
+
void CPointerManager::lockSoftwareAll() {
for (auto& state : monitorStates)
state->softwareLocks++;