diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index 1fc84aa9..7a864f26 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -37,7 +37,6 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus) { static auto* const PFOLLOWONDND = &g_pConfigManager->getConfigValuePtr("misc:always_follow_on_dnd")->intValue; static auto* const PHOGFOCUS = &g_pConfigManager->getConfigValuePtr("misc:layers_hog_keyboard_focus")->intValue; static auto* const PFLOATBEHAVIOR = &g_pConfigManager->getConfigValuePtr("input:float_switch_override_focus")->intValue; - static auto* const PROUNDING = &g_pConfigManager->getConfigValuePtr("decoration:rounding")->intValue; static auto* const PRESIZEONBORDER = &g_pConfigManager->getConfigValuePtr("general:resize_on_borders")->intValue; static auto* const PBORDERSIZE = &g_pConfigManager->getConfigValuePtr("general:border_size")->intValue; static auto* const PBORDERGRABEXTEND = &g_pConfigManager->getConfigValuePtr("general:extend_border_grab_area")->intValue; @@ -199,54 +198,6 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus) { } else { pFoundWindow = g_pCompositor->vectorToWindowIdeal(mouseCoords); - // TODO check if is being dragged, skip setting cursor icon if so - if (*PRESIZEONBORDER) { - const auto CORNER = *PROUNDING + *PBORDERSIZE + 10; - wlr_box box = {pFoundWindow->m_vRealPosition.vec().x, pFoundWindow->m_vRealPosition.vec().y, pFoundWindow->m_vRealSize.vec().x, pFoundWindow->m_vRealSize.vec().y}; - if (wlr_box_contains_point(&box, mouseCoords.x, mouseCoords.y)) { - if (pFoundWindow->isInCurvedCorner(mouseCoords.x, mouseCoords.y)) { - if (mouseCoords.y < box.y + CORNER) { - if (mouseCoords.x < box.x + CORNER) - setCursorImageUntilUnset("top_left_corner"); - else - setCursorImageUntilUnset("top_right_corner"); - } else { - if (mouseCoords.x < box.x + CORNER) - setCursorImageUntilUnset("bottom_left_corner"); - else - setCursorImageUntilUnset("bottom_right_corner"); - } - } else { - unsetCursorImage(); - } - } else { - // give a small leeway (10 px) for corner icon - if (mouseCoords.y < box.y + CORNER) { - if (mouseCoords.x < box.x + CORNER) - setCursorImageUntilUnset("top_left_corner"); - else if (mouseCoords.x > box.x + box.width - CORNER) - setCursorImageUntilUnset("top_right_corner"); - else - setCursorImageUntilUnset("top_side"); - } else if (mouseCoords.y > box.y + box.height - CORNER) { - if (mouseCoords.x < box.x) - setCursorImageUntilUnset("bottom_left_corner"); - else if (mouseCoords.x > box.x + box.width - CORNER) - setCursorImageUntilUnset("bottom_right_corner"); - else - setCursorImageUntilUnset("bottom_side"); - } else { - if (mouseCoords.x < box.x + CORNER) - setCursorImageUntilUnset("left_side"); - else if (mouseCoords.x > box.x + box.width - CORNER) - setCursorImageUntilUnset("right_side"); - else { - // unreachable - } - } - } - } - // TODO: this causes crashes, sometimes. ??? // if (refocus && !pFoundWindow) { // pFoundWindow = g_pCompositor->getFirstWindowOnWorkspace(PMONITOR->activeWorkspace); @@ -357,6 +308,11 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus) { g_pCompositor->focusWindow(pFoundWindow, foundSurface); } + // change cursor icon if hovering over border + if (*PRESIZEONBORDER && !pFoundWindow->m_bIsFullscreen && !g_pKeybindManager->m_bIsMouseBindActive) { + setCursorIconOnBorder(pFoundWindow); + } + m_bLastFocusOnLS = false; } else { if (pFoundLayerSurface && pFoundLayerSurface->layerSurface->current.keyboard_interactive && *PFOLLOWMOUSE != 3 && allowKeyboardRefocus) { @@ -1362,3 +1318,50 @@ SConstraint* CInputManager::constraintFromWlr(wlr_pointer_constraint_v1* constra return nullptr; } + +void CInputManager::setCursorIconOnBorder(CWindow* w) { + static auto* const PROUNDING = &g_pConfigManager->getConfigValuePtr("decoration:rounding")->intValue; + static const auto* PBORDERSIZE = &g_pConfigManager->getConfigValuePtr("general:border_size")->intValue; + // give a small leeway (10 px) for corner icon + const auto CORNER = *PROUNDING + *PBORDERSIZE + 10; + const auto mouseCoords = getMouseCoordsInternal(); + wlr_box box = {w->m_vRealPosition.vec().x, w->m_vRealPosition.vec().y, w->m_vRealSize.vec().x, w->m_vRealSize.vec().y}; + if (wlr_box_contains_point(&box, mouseCoords.x, mouseCoords.y)) { + if (w->isInCurvedCorner(mouseCoords.x, mouseCoords.y)) { + if (mouseCoords.y < box.y + CORNER) { + if (mouseCoords.x < box.x + CORNER) + setCursorImageUntilUnset("top_left_corner"); + else + setCursorImageUntilUnset("top_right_corner"); + } else { + if (mouseCoords.x < box.x + CORNER) + setCursorImageUntilUnset("bottom_left_corner"); + else + setCursorImageUntilUnset("bottom_right_corner"); + } + } else { + unsetCursorImage(); + } + } else { + if (mouseCoords.y < box.y + CORNER) { + if (mouseCoords.x < box.x + CORNER) + setCursorImageUntilUnset("top_left_corner"); + else if (mouseCoords.x > box.x + box.width - CORNER) + setCursorImageUntilUnset("top_right_corner"); + else + setCursorImageUntilUnset("top_side"); + } else if (mouseCoords.y > box.y + box.height - CORNER) { + if (mouseCoords.x < box.x) + setCursorImageUntilUnset("bottom_left_corner"); + else if (mouseCoords.x > box.x + box.width - CORNER) + setCursorImageUntilUnset("bottom_right_corner"); + else + setCursorImageUntilUnset("bottom_side"); + } else { + if (mouseCoords.x < box.x + CORNER) + setCursorImageUntilUnset("left_side"); + else if (mouseCoords.x > box.x + box.width - CORNER) + setCursorImageUntilUnset("right_side"); + } + } +} diff --git a/src/managers/input/InputManager.hpp b/src/managers/input/InputManager.hpp index 91783f38..622918e8 100644 --- a/src/managers/input/InputManager.hpp +++ b/src/managers/input/InputManager.hpp @@ -7,14 +7,12 @@ #include "../../helpers/Timer.hpp" #include "InputMethodRelay.hpp" -enum eClickBehaviorMode -{ +enum eClickBehaviorMode { CLICKMODE_DEFAULT = 0, CLICKMODE_KILL }; -enum eMouseBindMode -{ +enum eMouseBindMode { MBIND_INVALID = -1, MBIND_MOVE = 0, MBIND_RESIZE @@ -169,6 +167,8 @@ class CInputManager { // swipe void beginWorkspaceSwipe(); + void setCursorIconOnBorder(CWindow* w); + friend class CKeybindManager; };