diff options
Diffstat (limited to 'src/managers/input/InputManager.cpp')
| -rw-r--r-- | src/managers/input/InputManager.cpp | 96 |
1 files changed, 91 insertions, 5 deletions
diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index f99c6ab4..e5780608 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -164,7 +164,10 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus) { foundSurface = g_pCompositor->vectorToLayerSurface(mouseCoords, &PMONITOR->m_aLayerSurfaceLists[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND], &surfaceCoords); if (!foundSurface) { - wlr_xcursor_manager_set_cursor_image(g_pCompositor->m_sWLRXCursorMgr, "left_ptr", g_pCompositor->m_sWLRCursor); + if (m_ecbClickBehavior == CLICKMODE_KILL) + wlr_xcursor_manager_set_cursor_image(g_pCompositor->m_sWLRXCursorMgr, "crosshair", g_pCompositor->m_sWLRCursor); + else + wlr_xcursor_manager_set_cursor_image(g_pCompositor->m_sWLRXCursorMgr, "left_ptr", g_pCompositor->m_sWLRCursor); wlr_seat_pointer_clear_focus(g_pCompositor->m_sSeat.seat); @@ -211,10 +214,70 @@ void CInputManager::onMouseButton(wlr_pointer_button_event* e) { m_tmrLastCursorMovement.reset(); + switch (m_ecbClickBehavior) { + case CLICKMODE_DEFAULT: + processMouseDownNormal(e); + break; + case CLICKMODE_KILL: + processMouseDownKill(e); + break; + default: + break; + } +} + +void CInputManager::processMouseRequest(wlr_seat_pointer_request_set_cursor_event* e) { + if (!g_pHyprRenderer->shouldRenderCursor()) + return; + + if (!e->surface) { + g_pHyprRenderer->m_bWindowRequestedCursorHide = true; + } else { + g_pHyprRenderer->m_bWindowRequestedCursorHide = false; + } + + if (m_ecbClickBehavior == CLICKMODE_KILL) { + wlr_xcursor_manager_set_cursor_image(g_pCompositor->m_sWLRXCursorMgr, "crosshair", g_pCompositor->m_sWLRCursor); + return; + } + + if (e->seat_client == g_pCompositor->m_sSeat.seat->pointer_state.focused_client) + wlr_cursor_set_surface(g_pCompositor->m_sWLRCursor, e->surface, e->hotspot_x, e->hotspot_y); +} + +eClickBehaviorMode CInputManager::getClickMode() { + return m_ecbClickBehavior; +} + +void CInputManager::setClickMode(eClickBehaviorMode mode) { + switch (mode) { + case CLICKMODE_DEFAULT: + Debug::log(LOG, "SetClickMode: DEFAULT"); + m_ecbClickBehavior = CLICKMODE_DEFAULT; + wlr_xcursor_manager_set_cursor_image(g_pCompositor->m_sWLRXCursorMgr, "left_ptr", g_pCompositor->m_sWLRCursor); + break; + + case CLICKMODE_KILL: + Debug::log(LOG, "SetClickMode: KILL"); + m_ecbClickBehavior = CLICKMODE_KILL; + + // remove constraints + g_pCompositor->m_sSeat.mouse->constraintActive = false; + refocus(); + + // set cursor + wlr_xcursor_manager_set_cursor_image(g_pCompositor->m_sWLRXCursorMgr, "crosshair", g_pCompositor->m_sWLRCursor); + break; + default: + break; + } +} + +void CInputManager::processMouseDownNormal(wlr_pointer_button_event* e) { const auto PKEYBOARD = wlr_seat_get_keyboard(g_pCompositor->m_sSeat.seat); - if (!PKEYBOARD) { // ??? - Debug::log(ERR, "No active keyboard in onMouseButton??"); + if (!PKEYBOARD) { // ??? + Debug::log(ERR, "No active keyboard in processMouseDownNormal??"); return; } @@ -242,7 +305,7 @@ void CInputManager::onMouseButton(wlr_pointer_button_event* e) { currentlyDraggedWindow = nullptr; dragButton = -1; } - + break; } @@ -250,7 +313,30 @@ void CInputManager::onMouseButton(wlr_pointer_button_event* e) { if (g_pCompositor->doesSeatAcceptInput(g_pCompositor->m_pLastFocus)) { wlr_seat_pointer_notify_button(g_pCompositor->m_sSeat.seat, e->time_msec, e->button, e->state); } - +} + +void CInputManager::processMouseDownKill(wlr_pointer_button_event* e) { + switch (e->state) { + case WLR_BUTTON_PRESSED: { + const auto PWINDOW = g_pCompositor->m_pLastWindow; + + if (!g_pCompositor->windowValidMapped(PWINDOW)){ + Debug::log(ERR, "Cannot kill invalid window!"); + break; + } + + // kill the mf + kill(PWINDOW->getPID(), SIGKILL); + break; + } + case WLR_BUTTON_RELEASED: + break; + default: + break; + } + + // reset click behavior mode + m_ecbClickBehavior = CLICKMODE_DEFAULT; } Vector2D CInputManager::getMouseCoordsInternal() { |
