diff --git a/final/fconfig.h b/final/fconfig.h index 00e74e1d..5433779b 100644 --- a/final/fconfig.h +++ b/final/fconfig.h @@ -1,6 +1,6 @@ #ifndef _FINAL_FCONFIG_H #define _FINAL_FCONFIG_H 1 - + /* final/fconfig.h. Generated automatically at end of configure. */ /* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ @@ -338,6 +338,6 @@ #ifndef F_VERSION #define F_VERSION "0.9.0" #endif - + /* once: _FINAL_FCONFIG_H */ #endif diff --git a/final/input/fmouse.cpp b/final/input/fmouse.cpp index 2faf9831..4282cb59 100644 --- a/final/input/fmouse.cpp +++ b/final/input/fmouse.cpp @@ -707,10 +707,29 @@ void FMouseX11::setMoveState (const FPoint& mouse_position, int btn) noexcept } //---------------------------------------------------------------------- -void FMouseX11::setButtonState (const int btn, const TimeValue& time) noexcept +bool FMouseX11::isMouseClickButton (const int btn) const noexcept { - // Get the x11 mouse button state + return btn == button1_pressed + || btn == button2_pressed + || btn == button3_pressed + || btn == button1_pressed_move + || btn == button2_pressed_move + || btn == button3_pressed_move; +} + +//---------------------------------------------------------------------- +bool FMouseX11::isMouseWheelButton (const int btn) const noexcept +{ + return btn == button_up + || btn == button_down + || btn == button_left + || btn == button_right; +} +//---------------------------------------------------------------------- +void FMouseX11::handleMouseClickButton ( int btn + , const TimeValue& time) noexcept +{ switch ( btn ) { case button1_pressed: @@ -730,27 +749,31 @@ void FMouseX11::setButtonState (const int btn, const TimeValue& time) noexcept getButtonState().right_button = State::Pressed; break; - case all_buttons_released: - handleButtonRelease(); - break; + default: + break; + } +} + +//---------------------------------------------------------------------- +void FMouseX11::handleMouseWheelButton (int btn) noexcept +{ + resetMousePressedTime(); + switch ( btn ) + { case button_up: - resetMousePressedTime(); getButtonState().wheel_up = true; break; case button_down: - resetMousePressedTime(); getButtonState().wheel_down = true; break; case button_left: - resetMousePressedTime(); getButtonState().wheel_left = true; break; case button_right: - resetMousePressedTime(); getButtonState().wheel_right = true; break; @@ -759,6 +782,25 @@ void FMouseX11::setButtonState (const int btn, const TimeValue& time) noexcept } } +//---------------------------------------------------------------------- +void FMouseX11::setButtonState (const int btn, const TimeValue& time) noexcept +{ + // Get the x11 mouse button state + + if ( isMouseClickButton(btn) ) + { + handleMouseClickButton (btn, time); + } + else if ( btn == all_buttons_released ) + { + handleButtonRelease(); + } + else if ( isMouseWheelButton(btn) ) + { + handleMouseWheelButton(btn); + } +} + //---------------------------------------------------------------------- void FMouseX11::handleButton1Pressed (const TimeValue& time) noexcept { @@ -947,11 +989,29 @@ void FMouseSGR::setMoveState (const FPoint& mouse_position, int btn) noexcept } //---------------------------------------------------------------------- -void FMouseSGR::setPressedButtonState ( const int btn - , const TimeValue& time ) noexcept +bool FMouseSGR::isMouseClickButton (const int btn) const noexcept { - // Gets the extended x11 mouse mode (SGR) status for pressed buttons + return btn == button1 + || btn == button2 + || btn == button3 + || btn == button1_move + || btn == button2_move + || btn == button3_move; +} + +//---------------------------------------------------------------------- +bool FMouseSGR::isMouseWheelButton (const int btn) const noexcept +{ + return btn == button_up + || btn == button_down + || btn == button_left + || btn == button_right; +} +//---------------------------------------------------------------------- +void FMouseSGR::handleMouseClickButton ( int btn + , const TimeValue& time) noexcept +{ switch ( btn ) { case button1: @@ -971,23 +1031,31 @@ void FMouseSGR::setPressedButtonState ( const int btn getButtonState().right_button = State::Pressed; break; + default: + break; + } +} + +//---------------------------------------------------------------------- +void FMouseSGR::handleMouseWheelButton (int btn) noexcept +{ + resetMousePressedTime(); + + switch ( btn ) + { case button_up: - resetMousePressedTime(); getButtonState().wheel_up = true; break; case button_down: - resetMousePressedTime(); getButtonState().wheel_down = true; break; case button_left: - resetMousePressedTime(); getButtonState().wheel_left = true; break; case button_right: - resetMousePressedTime(); getButtonState().wheel_right = true; break; @@ -996,6 +1064,22 @@ void FMouseSGR::setPressedButtonState ( const int btn } } +//---------------------------------------------------------------------- +void FMouseSGR::setPressedButtonState ( const int btn + , const TimeValue& time ) noexcept +{ + // Gets the extended x11 mouse mode (SGR) status for pressed buttons + + if ( isMouseClickButton(btn) ) + { + handleMouseClickButton (btn, time); + } + else if ( isMouseWheelButton(btn) ) + { + handleMouseWheelButton(btn); + } +} + //---------------------------------------------------------------------- void FMouseSGR::handleButton1Pressed (const TimeValue& time) noexcept { @@ -1202,93 +1286,127 @@ void FMouseUrxvt::setMoveState (const FPoint& mouse_position, int btn) noexcept } //---------------------------------------------------------------------- -void FMouseUrxvt::setButtonState (const int btn, const TimeValue& time) noexcept +bool FMouseUrxvt::isMouseClickButton (const int btn) const noexcept { - // Get the urxvt mouse button state + return btn == button1_pressed + || btn == button2_pressed + || btn == button3_pressed + || btn == button1_pressed_move + || btn == button2_pressed_move + || btn == button3_pressed_move; +} + +//---------------------------------------------------------------------- +bool FMouseUrxvt::isMouseWheelButton (const int btn) const noexcept +{ + return btn == button_up + || btn == button_down + || btn == button_left + || btn == button_right; +} +//---------------------------------------------------------------------- +void FMouseUrxvt::handleMouseClickButton ( int btn + , const TimeValue& time) noexcept +{ const auto& mouse_position = getPos(); - switch ( btn ) + if ( btn == button1_pressed || btn == button1_pressed_move ) + { + if ( mouse_position == getNewPos() + && urxvt_button_state == all_buttons_released + && ! isDblclickTimeout(getMousePressedTime()) ) + { + resetMousePressedTime(); + getButtonState().left_button = State::DoubleClick; + } + else + { + setMousePressedTime(time); // save click time + getButtonState().left_button = State::Pressed; + } + } + else if ( btn == button2_pressed || btn == button2_pressed_move ) + { + resetMousePressedTime(); + getButtonState().middle_button = State::Pressed; + } + else if ( btn == button3_pressed || btn == button3_pressed_move ) + { + resetMousePressedTime(); + getButtonState().right_button = State::Pressed; + } +} + +//---------------------------------------------------------------------- +void FMouseUrxvt::handleButtonRelease() noexcept +{ + switch ( urxvt_button_state & button_mask ) { case button1_pressed: case button1_pressed_move: - if ( mouse_position == getNewPos() - && urxvt_button_state == all_buttons_released - && ! isDblclickTimeout(getMousePressedTime()) ) - { - resetMousePressedTime(); - getButtonState().left_button = State::DoubleClick; - } - else - { - setMousePressedTime (time); // save click time - getButtonState().left_button = State::Pressed; - } + getButtonState().left_button = State::Released; break; case button2_pressed: case button2_pressed_move: - resetMousePressedTime(); - getButtonState().middle_button = State::Pressed; + getButtonState().middle_button = State::Released; break; case button3_pressed: case button3_pressed_move: - resetMousePressedTime(); - getButtonState().right_button = State::Pressed; + getButtonState().right_button = State::Released; break; - case all_buttons_released: - handleButtonRelease(); + default: break; + } +} +//---------------------------------------------------------------------- +void FMouseUrxvt::handleMouseWheelButton (int btn) noexcept +{ + resetMousePressedTime(); + + switch ( btn ) + { case button_up: - resetMousePressedTime(); getButtonState().wheel_up = true; break; case button_down: - resetMousePressedTime(); getButtonState().wheel_down = true; break; case button_left: - resetMousePressedTime(); getButtonState().wheel_left = true; break; case button_right: - resetMousePressedTime(); getButtonState().wheel_right = true; break; - default: - break; + default: + break; } } //---------------------------------------------------------------------- -void FMouseUrxvt::handleButtonRelease() noexcept +void FMouseUrxvt::setButtonState (const int btn, const TimeValue& time) noexcept { - switch ( urxvt_button_state & button_mask ) - { - case button1_pressed: - case button1_pressed_move: - getButtonState().left_button = State::Released; - break; - - case button2_pressed: - case button2_pressed_move: - getButtonState().middle_button = State::Released; - break; - - case button3_pressed: - case button3_pressed_move: - getButtonState().right_button = State::Released; - break; + // Get the urxvt mouse button state - default: - break; + if ( isMouseClickButton(btn) ) + { + handleMouseClickButton (btn, time); + } + else if ( btn == all_buttons_released ) + { + handleButtonRelease(); + } + else if ( isMouseWheelButton(btn) ) + { + handleMouseWheelButton(btn); } } diff --git a/final/input/fmouse.h b/final/input/fmouse.h index dfd2fd78..b387b5c4 100644 --- a/final/input/fmouse.h +++ b/final/input/fmouse.h @@ -368,6 +368,10 @@ class FMouseX11 final : public FMouse // Methods void setKeyState (int) noexcept; void setMoveState (const FPoint&, int) noexcept; + bool isMouseClickButton (const int) const noexcept; + bool isMouseWheelButton (const int) const noexcept; + void handleMouseClickButton (int, const TimeValue&) noexcept; + void handleMouseWheelButton (int) noexcept; void setButtonState (const int, const TimeValue&) noexcept; void handleButton1Pressed (const TimeValue& time) noexcept; void handleButtonRelease() noexcept; @@ -427,6 +431,10 @@ class FMouseSGR final : public FMouse // Methods void setKeyState (int) noexcept; void setMoveState (const FPoint&, int) noexcept; + bool isMouseClickButton (const int) const noexcept; + bool isMouseWheelButton (const int) const noexcept; + void handleMouseClickButton (int, const TimeValue&) noexcept; + void handleMouseWheelButton (int) noexcept; void setPressedButtonState (const int, const TimeValue&) noexcept; void handleButton1Pressed (const TimeValue& time) noexcept; void setReleasedButtonState (const int) noexcept; @@ -485,8 +493,12 @@ class FMouseUrxvt final : public FMouse // Methods void setKeyState (int) noexcept; void setMoveState (const FPoint&, int) noexcept; - void setButtonState (const int, const TimeValue&) noexcept; + bool isMouseClickButton (const int) const noexcept; + bool isMouseWheelButton (const int) const noexcept; + void handleMouseClickButton (int, const TimeValue&) noexcept; void handleButtonRelease() noexcept; + void handleMouseWheelButton (int) noexcept; + void setButtonState (const int, const TimeValue&) noexcept; // Data members std::array urxvt_mouse{};