KiCad PCB EDA Suite
Loading...
Searching...
No Matches
TOOL_DISPATCHER Class Reference

#include <tool_dispatcher.h>

Inheritance diagram for TOOL_DISPATCHER:

Classes

struct  BUTTON_STATE
 Store information about a mouse button state. More...
 

Public Member Functions

 TOOL_DISPATCHER (TOOL_MANAGER *aToolMgr)
 
virtual ~TOOL_DISPATCHER ()
 
virtual void ResetState ()
 Bring the dispatcher to its initial state.
 
virtual void DispatchWxEvent (wxEvent &aEvent)
 Process wxEvents (mostly UI events), translate them to TOOL_EVENTs, and make tools handle those.
 
std::optional< TOOL_EVENTGetToolEvent (wxKeyEvent *aKeyEvent, bool *aSpecialKeyFlag)
 Map a wxWidgets key event to a TOOL_EVENT.
 

Static Public Member Functions

static bool ShouldDropAutoRepeat (int aKeyCode, wxLongLong aNowMs, bool aKeyIsDown, int &aLastKey, wxLongLong &aLastTimeMs)
 Pure decision used to discard backlogged OS key auto-repeat events.
 

Static Public Attributes

static const int AutoRepeatWindowMs = 250
 The maximum gap (ms) between two events of the same key for them to count as one OS auto-repeat burst rather than two deliberate key presses.
 

Private Member Functions

bool handleMouseButton (wxEvent &aEvent, int aIndex, bool aMotion)
 Handles mouse related events (click, motion, dragging).
 
void flushPendingClicks ()
 Processes any pending mouse clicks that have been physically completed but not yet dispatched.
 
bool isStaleAutoRepeat (const wxKeyEvent &aKeyEvent)
 Decide whether a keyboard event must be dropped because it is a backlogged OS key auto-repeat event delivered after the key was physically released.
 
KIGFX::VIEWgetView ()
 Returns the instance of VIEW, used by the application.
 

Static Private Member Functions

static int decodeModifiers (const wxKeyboardState *aState)
 Returns the state of key modifiers (Alt, Ctrl and so on) as OR'ed list of bits (MD_CTRL, MD_ALT ...)
 

Private Attributes

int m_sysDragMinX
 Minimum distance before drag is activated in the X axis.
 
int m_sysDragMinY
 Maximum distance before drag is activated in the Y axis.
 
VECTOR2D m_lastMousePos
 The last mouse cursor position (in world coordinates).
 
VECTOR2D m_lastMousePosScreen
 The last mouse cursor position (in screen coordinates).
 
std::vector< BUTTON_STATE * > m_buttons
 
int m_lastKeyCode
 Key code of the key that was last processed, or 0 when no key is armed.
 
wxLongLong m_lastKeyTime
 Local time (ms) at which m_lastKeyCode was last processed.
 
TOOL_MANAGERm_toolMgr
 Instance of tool manager that cooperates with the dispatcher.
 

Static Private Attributes

static const int DragTimeThreshold = 300
 The time threshold for a mouse button press that distinguishes between a single mouse click and a beginning of drag event (expressed in milliseconds).
 
static const int DragDistanceThreshold = 8
 The distance threshold for mouse cursor that distinguishes between a single mouse click and a beginning of drag event (expressed in screen pixels).
 

Detailed Description

  • takes wx events,
  • fixes all wx quirks (mouse warping, panning, ordering problems, etc)
  • translates coordinates to world space
  • low-level input conditioning (drag/click threshold), updating mouse position during view auto-scroll/pan.
  • issues TOOL_EVENTS to the tool manager

Definition at line 49 of file tool_dispatcher.h.

Constructor & Destructor Documentation

◆ TOOL_DISPATCHER()

TOOL_DISPATCHER::TOOL_DISPATCHER ( TOOL_MANAGER * aToolMgr)
Parameters
aToolMgrtool manager instance the events will be sent to.

Definition at line 127 of file tool_dispatcher.cpp.

References BUT_AUX1, BUT_AUX2, BUT_LEFT, BUT_MIDDLE, BUT_RIGHT, DragDistanceThreshold, m_buttons, m_lastKeyCode, m_lastKeyTime, m_sysDragMinX, m_sysDragMinY, m_toolMgr, and ResetState().

◆ ~TOOL_DISPATCHER()

TOOL_DISPATCHER::~TOOL_DISPATCHER ( )
virtual

Definition at line 153 of file tool_dispatcher.cpp.

References m_buttons.

Member Function Documentation

◆ decodeModifiers()

int TOOL_DISPATCHER::decodeModifiers ( const wxKeyboardState * aState)
staticprivate

Returns the state of key modifiers (Alt, Ctrl and so on) as OR'ed list of bits (MD_CTRL, MD_ALT ...)

Definition at line 159 of file tool_dispatcher.cpp.

References MD_ALT, MD_ALTGR, MD_CTRL, MD_META, MD_SHIFT, and MD_SUPER.

Referenced by DispatchWxEvent(), GetToolEvent(), and handleMouseButton().

◆ DispatchWxEvent()

◆ flushPendingClicks()

void TOOL_DISPATCHER::flushPendingClicks ( )
private

Processes any pending mouse clicks that have been physically completed but not yet dispatched.

This ensures clicks are processed before cancel events when both happen in quick succession.

Definition at line 478 of file tool_dispatcher.cpp.

References m_buttons, m_toolMgr, TOOL_EVENT::SetMousePosition(), TA_MOUSE_CLICK, and TC_MOUSE.

Referenced by DispatchWxEvent().

◆ GetToolEvent()

std::optional< TOOL_EVENT > TOOL_DISPATCHER::GetToolEvent ( wxKeyEvent * aKeyEvent,
bool * aSpecialKeyFlag )

◆ getView()

KIGFX::VIEW * TOOL_DISPATCHER::getView ( )
private

Returns the instance of VIEW, used by the application.

Definition at line 207 of file tool_dispatcher.cpp.

References m_toolMgr.

◆ handleMouseButton()

◆ isStaleAutoRepeat()

bool TOOL_DISPATCHER::isStaleAutoRepeat ( const wxKeyEvent & aKeyEvent)
private

Decide whether a keyboard event must be dropped because it is a backlogged OS key auto-repeat event delivered after the key was physically released.

On Linux a hotkey whose action is slower than the OS auto-repeat interval lets repeat events accumulate in the wx event queue; once the key is released the queue keeps draining and the action keeps running. The first event of a burst always runs (so a quick tap still works), but later repeats only run while the key is still held down.

Definition at line 512 of file tool_dispatcher.cpp.

References m_lastKeyCode, m_lastKeyTime, and ShouldDropAutoRepeat().

Referenced by DispatchWxEvent().

◆ ResetState()

void TOOL_DISPATCHER::ResetState ( )
virtual

Bring the dispatcher to its initial state.

Definition at line 197 of file tool_dispatcher.cpp.

References m_buttons, m_lastKeyCode, and m_lastKeyTime.

Referenced by TOOL_DISPATCHER().

◆ ShouldDropAutoRepeat()

bool TOOL_DISPATCHER::ShouldDropAutoRepeat ( int aKeyCode,
wxLongLong aNowMs,
bool aKeyIsDown,
int & aLastKey,
wxLongLong & aLastTimeMs )
static

Pure decision used to discard backlogged OS key auto-repeat events.

A repeat event is stale (and must be dropped) only when it belongs to the same burst as the previously processed event (same key seen less than AutoRepeatWindowMs ago) and the key is no longer physically held. The leading edge of every press is kept, so a quick tap whose key has already bounced up still runs once.

Parameters
aKeyCodekey code of the current event.
aNowMscurrent time in milliseconds.
aKeyIsDownwhether the key is currently physically pressed.
aLastKeyin/out key code of the previously processed event; updated to aKeyCode.
aLastTimeMsin/out time of the previously processed event; updated to aNowMs.
Returns
true when the event is a stale auto-repeat that should be dropped.

Definition at line 500 of file tool_dispatcher.cpp.

References AutoRepeatWindowMs.

Referenced by BOOST_AUTO_TEST_CASE(), BOOST_AUTO_TEST_CASE(), BOOST_AUTO_TEST_CASE(), BOOST_AUTO_TEST_CASE(), BOOST_AUTO_TEST_CASE(), and isStaleAutoRepeat().

Member Data Documentation

◆ AutoRepeatWindowMs

const int TOOL_DISPATCHER::AutoRepeatWindowMs = 250
static

The maximum gap (ms) between two events of the same key for them to count as one OS auto-repeat burst rather than two deliberate key presses.

Definition at line 79 of file tool_dispatcher.h.

Referenced by BOOST_AUTO_TEST_CASE(), and ShouldDropAutoRepeat().

◆ DragDistanceThreshold

const int TOOL_DISPATCHER::DragDistanceThreshold = 8
staticprivate

The distance threshold for mouse cursor that distinguishes between a single mouse click and a beginning of drag event (expressed in screen pixels).

System drag preferences take precedence if available

Definition at line 132 of file tool_dispatcher.h.

Referenced by TOOL_DISPATCHER().

◆ DragTimeThreshold

const int TOOL_DISPATCHER::DragTimeThreshold = 300
staticprivate

The time threshold for a mouse button press that distinguishes between a single mouse click and a beginning of drag event (expressed in milliseconds).

Definition at line 127 of file tool_dispatcher.h.

Referenced by handleMouseButton().

◆ m_buttons

std::vector<BUTTON_STATE*> TOOL_DISPATCHER::m_buttons
private

◆ m_lastKeyCode

int TOOL_DISPATCHER::m_lastKeyCode
private

Key code of the key that was last processed, or 0 when no key is armed.

Used together with m_lastKeyTime to drop stale auto-repeat events that arrive after the key was released while still letting the leading edge of every fresh press through.

Definition at line 147 of file tool_dispatcher.h.

Referenced by isStaleAutoRepeat(), ResetState(), and TOOL_DISPATCHER().

◆ m_lastKeyTime

wxLongLong TOOL_DISPATCHER::m_lastKeyTime
private

Local time (ms) at which m_lastKeyCode was last processed.

Definition at line 150 of file tool_dispatcher.h.

Referenced by isStaleAutoRepeat(), ResetState(), and TOOL_DISPATCHER().

◆ m_lastMousePos

VECTOR2D TOOL_DISPATCHER::m_lastMousePos
private

The last mouse cursor position (in world coordinates).

Definition at line 137 of file tool_dispatcher.h.

Referenced by DispatchWxEvent(), and handleMouseButton().

◆ m_lastMousePosScreen

VECTOR2D TOOL_DISPATCHER::m_lastMousePosScreen
private

The last mouse cursor position (in screen coordinates).

Definition at line 138 of file tool_dispatcher.h.

Referenced by DispatchWxEvent(), and handleMouseButton().

◆ m_sysDragMinX

int TOOL_DISPATCHER::m_sysDragMinX
private

Minimum distance before drag is activated in the X axis.

Definition at line 134 of file tool_dispatcher.h.

Referenced by handleMouseButton(), and TOOL_DISPATCHER().

◆ m_sysDragMinY

int TOOL_DISPATCHER::m_sysDragMinY
private

Maximum distance before drag is activated in the Y axis.

Definition at line 135 of file tool_dispatcher.h.

Referenced by handleMouseButton(), and TOOL_DISPATCHER().

◆ m_toolMgr

TOOL_MANAGER* TOOL_DISPATCHER::m_toolMgr
private

Instance of tool manager that cooperates with the dispatcher.

Definition at line 153 of file tool_dispatcher.h.

Referenced by DispatchWxEvent(), flushPendingClicks(), getView(), handleMouseButton(), and TOOL_DISPATCHER().


The documentation for this class was generated from the following files: