Hyprland/src/managers/input/InputManager.hpp

251 lines
8.6 KiB
C++
Raw Normal View History

2022-03-17 15:53:45 +01:00
#pragma once
2022-06-09 12:46:55 +02:00
#include "../../defines.hpp"
2022-03-18 23:25:26 +01:00
#include <list>
2022-06-09 12:46:55 +02:00
#include "../../helpers/WLClasses.hpp"
#include "../../Window.hpp"
2022-06-24 23:27:02 +02:00
#include "../../helpers/Timer.hpp"
2022-08-05 13:03:37 +02:00
#include "InputMethodRelay.hpp"
2022-03-17 15:53:45 +01:00
enum eClickBehaviorMode {
2022-06-27 13:42:20 +02:00
CLICKMODE_DEFAULT = 0,
CLICKMODE_KILL
};
enum eMouseBindMode {
2023-08-08 18:52:20 +02:00
MBIND_INVALID = -1,
MBIND_MOVE = 0,
MBIND_RESIZE = 1,
MBIND_RESIZE_BLOCK_RATIO = 2,
MBIND_RESIZE_FORCE_RATIO = 3
2022-09-19 20:04:48 +02:00
};
enum eBorderIconDirection {
2023-02-18 23:35:31 +01:00
BORDERICON_NONE,
BORDERICON_UP,
BORDERICON_DOWN,
BORDERICON_LEFT,
BORDERICON_RIGHT,
BORDERICON_UP_LEFT,
BORDERICON_DOWN_LEFT,
BORDERICON_UP_RIGHT,
BORDERICON_DOWN_RIGHT,
};
2022-08-07 21:17:03 +02:00
struct STouchData {
CWindow* touchFocusWindow = nullptr;
SLayerSurface* touchFocusLS = nullptr;
wlr_surface* touchFocusSurface = nullptr;
Vector2D touchSurfaceOrigin;
2022-08-07 21:17:03 +02:00
};
// The third row is always 0 0 1 and is not expected by `libinput_device_config_calibration_set_matrix`
2023-01-17 11:47:39 +01:00
static const float MATRICES[8][6] = {{// normal
1, 0, 0, 0, 1, 0},
{// rotation 90°
0, -1, 1, 1, 0, 0},
{// rotation 180°
-1, 0, 1, 0, -1, 1},
{// rotation 270°
0, 1, 0, -1, 0, 1},
{// flipped
-1, 0, 1, 0, 1, 0},
{// flipped + rotation 90°
0, 1, 0, 1, 0, 0},
{// flipped + rotation 180°
1, 0, 0, 0, -1, 1},
{// flipped + rotation 270°
0, -1, 1, -1, 0, 1}};
class CKeybindManager;
2022-03-17 15:53:45 +01:00
class CInputManager {
public:
~CInputManager();
void onMouseMoved(wlr_pointer_motion_event*);
void onMouseWarp(wlr_pointer_motion_absolute_event*);
void onMouseButton(wlr_pointer_button_event*);
void onMouseWheel(wlr_pointer_axis_event*);
void onKeyboardKey(wlr_keyboard_key_event*, SKeyboard*);
void onKeyboardMod(void*, SKeyboard*);
void newKeyboard(wlr_input_device*);
void newVirtualKeyboard(wlr_input_device*);
void newMouse(wlr_input_device*, bool virt = false);
void newTouchDevice(wlr_input_device*);
void newSwitch(wlr_input_device*);
void destroyTouchDevice(STouchDevice*);
void destroyKeyboard(SKeyboard*);
void destroyMouse(wlr_input_device*);
void destroySwitch(SSwitchDevice*);
void constrainMouse(SMouse*, wlr_pointer_constraint_v1*);
void warpMouseToConstraintMiddle(SConstraint*);
void recheckConstraint(SMouse*);
void unconstrainMouse();
SConstraint* constraintFromWlr(wlr_pointer_constraint_v1*);
std::string getActiveLayoutForKeyboard(SKeyboard*);
Vector2D getMouseCoordsInternal();
void refocus();
void simulateMouseMovement();
void sendMotionEventsToFocused();
void setKeyboardLayout();
void setPointerConfigs();
void setTouchDeviceConfigs(STouchDevice* dev = nullptr);
2022-12-21 16:11:39 +01:00
void setTabletConfigs();
void updateDragIcon();
void updateCapabilities();
void setClickMode(eClickBehaviorMode);
2022-06-27 13:42:20 +02:00
eClickBehaviorMode getClickMode();
2023-07-24 18:50:17 +02:00
void processMouseRequest(wlr_seat_pointer_request_set_cursor_event* e);
void processMouseRequest(wlr_cursor_shape_manager_v1_request_set_shape_event* e);
2022-06-27 13:42:20 +02:00
void onTouchDown(wlr_touch_down_event*);
void onTouchUp(wlr_touch_up_event*);
void onTouchMove(wlr_touch_motion_event*);
2022-08-07 21:17:03 +02:00
void onPointerHoldBegin(wlr_pointer_hold_begin_event*);
void onPointerHoldEnd(wlr_pointer_hold_end_event*);
2022-09-22 22:14:02 +02:00
STouchData m_sTouchData;
2022-03-20 11:14:24 +01:00
// for dragging floating windows
2023-05-31 20:59:38 +02:00
CWindow* currentlyDraggedWindow = nullptr;
eMouseBindMode dragMode = MBIND_INVALID;
bool m_bWasDraggingWindow = false;
2023-05-31 20:59:38 +02:00
// for refocus to be forced
CWindow* m_pForcedFocus = nullptr;
2022-03-20 11:14:24 +01:00
SDrag m_sDrag;
2022-03-31 17:25:23 +02:00
std::list<SConstraint> m_lConstraints;
std::list<SKeyboard> m_lKeyboards;
std::list<SMouse> m_lMice;
2022-06-09 12:46:55 +02:00
// tablets
std::list<STablet> m_lTablets;
std::list<STabletTool> m_lTabletTools;
std::list<STabletPad> m_lTabletPads;
2022-06-09 12:46:55 +02:00
// idle inhibitors
std::list<SIdleInhibitor> m_lIdleInhibitors;
// Touch devices
std::list<STouchDevice> m_lTouchDevices;
2022-10-04 21:07:21 +02:00
// Switches
std::list<SSwitchDevice> m_lSwitches;
void newTabletTool(wlr_input_device*);
void newTabletPad(wlr_input_device*);
void focusTablet(STablet*, wlr_tablet_tool*, bool motion = false);
void newIdleInhibitor(wlr_idle_inhibitor_v1*);
void recheckIdleInhibitorStatus();
2022-06-09 12:46:55 +02:00
void onSwipeBegin(wlr_pointer_swipe_begin_event*);
void onSwipeEnd(wlr_pointer_swipe_end_event*);
void onSwipeUpdate(wlr_pointer_swipe_update_event*);
2022-07-07 11:52:12 +02:00
SSwipeGesture m_sActiveSwipe;
2022-06-09 12:46:55 +02:00
SKeyboard* m_pActiveKeyboard = nullptr;
CTimer m_tmrLastCursorMovement;
2022-06-24 23:27:02 +02:00
CInputMethodRelay m_sIMERelay;
2022-08-05 13:03:37 +02:00
void updateKeyboardsLeds(wlr_input_device* pKeyboard);
2022-07-20 22:45:06 +02:00
// for shared mods
uint32_t accumulateModsFromAllKBs();
2022-07-20 22:45:06 +02:00
2022-11-07 23:22:13 +01:00
// for virtual keyboards: whether we should respect them as normal ones
bool shouldIgnoreVirtualKeyboard(SKeyboard*);
2022-11-07 23:22:13 +01:00
// for special cursors that we choose
void setCursorImageUntilUnset(std::string);
void unsetCursorImage();
std::string deviceNameToInternalString(std::string);
std::string getNameForNewDevice(std::string);
2022-12-03 16:56:07 +01:00
2023-01-11 18:38:54 +01:00
void releaseAllMouseButtons();
// for some bugs in follow mouse 0
bool m_bLastFocusOnLS = false;
2023-01-17 11:47:39 +01:00
// for hiding cursor on touch
bool m_bLastInputTouch = false;
// for tracking mouse refocus
CWindow* m_pLastMouseFocus = nullptr;
wlr_surface* m_pLastMouseSurface = nullptr;
private:
bool m_bCursorImageOverridden = false;
2023-03-30 01:34:24 +02:00
eBorderIconDirection m_eBorderIconDirection = BORDERICON_NONE;
2022-06-27 13:42:20 +02:00
// for click behavior override
eClickBehaviorMode m_ecbClickBehavior = CLICKMODE_DEFAULT;
bool m_bEmptyFocusCursorSet = false;
Vector2D m_vLastCursorPosFloored = Vector2D();
2022-06-27 13:42:20 +02:00
2023-01-11 18:38:54 +01:00
void processMouseDownNormal(wlr_pointer_button_event* e);
void processMouseDownKill(wlr_pointer_button_event* e);
2022-06-27 13:42:20 +02:00
2023-07-24 18:50:17 +02:00
bool cursorImageUnlocked();
2023-01-11 18:38:54 +01:00
void disableAllKeyboards(bool virt = false);
2023-01-11 18:38:54 +01:00
uint32_t m_uiCapabilities = 0;
2022-06-09 12:46:55 +02:00
2023-01-11 18:38:54 +01:00
void mouseMoveUnified(uint32_t, bool refocus = false);
2022-06-09 12:46:55 +02:00
2023-01-11 18:38:54 +01:00
STabletTool* ensureTabletToolPresent(wlr_tablet_tool*);
2023-01-11 18:38:54 +01:00
void applyConfigToKeyboard(SKeyboard*);
// this will be set after a refocus()
wlr_surface* m_pFoundSurfaceToFocus = nullptr;
SLayerSurface* m_pFoundLSToFocus = nullptr;
CWindow* m_pFoundWindowToFocus = nullptr;
2022-11-03 14:34:06 +01:00
2023-04-02 14:30:45 +02:00
// for holding focus on buttons held
bool m_bFocusHeldByButtons = false;
bool m_bRefocusHeldByButtons = false;
2023-01-11 18:38:54 +01:00
// for releasing mouse buttons
std::list<uint32_t> m_lCurrentlyHeldButtons;
2022-11-03 14:34:06 +01:00
// swipe
void beginWorkspaceSwipe();
2023-02-18 23:35:31 +01:00
void setBorderCursorIcon(eBorderIconDirection);
void setCursorIconOnBorder(CWindow* w);
// temporary. Obeys setUntilUnset.
void setCursorImageOverride(const std::string& name);
// cursor surface
struct cursorSI {
bool hidden = false; // null surface = hidden
CWLSurface wlSurface;
Vector2D vHotspot;
std::string name; // if not empty, means set by name.
bool inUse = false;
} m_sCursorSurfaceInfo;
void restoreCursorIconToApp(); // no-op if restored
friend class CKeybindManager;
friend class CWLSurface;
2022-03-17 15:53:45 +01:00
};
2022-09-25 20:07:48 +02:00
inline std::unique_ptr<CInputManager> g_pInputManager;