From a558bcdfbffe41ac92302456468609e62bca2282 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Wed, 13 Apr 2022 20:19:40 +0200 Subject: [PATCH] added follow_mouse --- example/hyprland.conf | 2 ++ src/Compositor.cpp | 3 +++ src/config/ConfigManager.cpp | 2 ++ src/managers/InputManager.cpp | 22 ++++++++++++++++------ src/managers/InputManager.hpp | 2 +- 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/example/hyprland.conf b/example/hyprland.conf index d7f68b46..a698f3ab 100644 --- a/example/hyprland.conf +++ b/example/hyprland.conf @@ -12,6 +12,8 @@ input { kb_model= kb_options= kb_rules= + + follow_mouse=1 } general { diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 88553570..d9e3ebf2 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -380,6 +380,9 @@ void CCompositor::focusWindow(CWindow* pWindow, wlr_surface* pSurface) { g_pXWaylandManager->activateWindow(pWindow, true); + // do pointer focus too + wlr_seat_pointer_notify_enter(m_sSeat.seat, PWINDOWSURFACE, 0, 0); + m_pLastWindow = pWindow; } diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 7a9a1e60..14f20470 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -46,6 +46,8 @@ CConfigManager::CConfigManager() { configValues["input:kb_rules"].strValue = ""; configValues["input:kb_model"].strValue = ""; + configValues["input:follow_mouse"].intValue = 1; + configValues["autogenerated"].intValue = 0; } diff --git a/src/managers/InputManager.cpp b/src/managers/InputManager.cpp index 93f842a4..c45a5530 100644 --- a/src/managers/InputManager.cpp +++ b/src/managers/InputManager.cpp @@ -16,11 +16,12 @@ void CInputManager::onMouseWarp(wlr_pointer_motion_absolute_event* e) { mouseMoveUnified(e->time_msec); } -void CInputManager::mouseMoveUnified(uint32_t time) { +void CInputManager::mouseMoveUnified(uint32_t time, bool refocus) { // update stuff updateDragIcon(); + g_pLayoutManager->getCurrentLayout()->onMouseMove(getMouseCoordsInternal()); // focus wlr_surface* foundSurface = nullptr; @@ -110,15 +111,24 @@ void CInputManager::mouseMoveUnified(uint32_t time) { Vector2D surfaceLocal = surfacePos == Vector2D(-1337, -1337) ? surfaceCoords : Vector2D(g_pCompositor->m_sWLRCursor->x, g_pCompositor->m_sWLRCursor->y) - surfacePos; - if (pFoundWindow) - g_pCompositor->focusWindow(pFoundWindow, foundSurface); + if (pFoundWindow) { + if (g_pConfigManager->getInt("input:follow_mouse") == 0 && !refocus) { + if (pFoundWindow != g_pCompositor->m_pLastWindow && g_pCompositor->windowValidMapped(g_pCompositor->m_pLastWindow) && (g_pCompositor->m_pLastWindow->m_bIsFloating != pFoundWindow->m_bIsFloating)) { + // enter if change floating style + g_pCompositor->focusWindow(pFoundWindow, foundSurface); + wlr_seat_pointer_notify_enter(g_pCompositor->m_sSeat.seat, foundSurface, surfaceLocal.x, surfaceLocal.y); + } + wlr_seat_pointer_notify_motion(g_pCompositor->m_sSeat.seat, time, surfaceLocal.x, surfaceLocal.y); + return; // don't enter any new surfaces + } else { + g_pCompositor->focusWindow(pFoundWindow, foundSurface); + } + } else g_pCompositor->focusSurface(foundSurface); wlr_seat_pointer_notify_enter(g_pCompositor->m_sSeat.seat, foundSurface, surfaceLocal.x, surfaceLocal.y); wlr_seat_pointer_notify_motion(g_pCompositor->m_sSeat.seat, time, surfaceLocal.x, surfaceLocal.y); - - g_pLayoutManager->getCurrentLayout()->onMouseMove(getMouseCoordsInternal()); } void CInputManager::onMouseButton(wlr_pointer_button_event* e) { @@ -288,7 +298,7 @@ void CInputManager::onKeyboardMod(void* data, SKeyboard* pKeyboard) { } void CInputManager::refocus() { - mouseMoveUnified(0); + mouseMoveUnified(0, true); } void CInputManager::updateDragIcon() { diff --git a/src/managers/InputManager.hpp b/src/managers/InputManager.hpp index 6775abee..c0d2c708 100644 --- a/src/managers/InputManager.hpp +++ b/src/managers/InputManager.hpp @@ -37,7 +37,7 @@ private: std::list m_lKeyboards; - void mouseMoveUnified(uint32_t); + void mouseMoveUnified(uint32_t, bool refocus = false); };