fix conflicts of scrolling and mid mouse key

This commit is contained in:
cuu 2021-12-22 00:01:15 +08:00
parent bd0fcf9fb0
commit c66b85c04a
4 changed files with 31 additions and 7 deletions

View File

@ -241,7 +241,7 @@ void keyboard_action(DEVTERM*dv,uint8_t row,uint8_t col,uint8_t mode) {
void keypad_action(DEVTERM*dv,uint8_t col,uint8_t mode) { void keypad_action(DEVTERM*dv,uint8_t col,uint8_t mode) {
uint16_t k; uint16_t k;
k = keys_maps[col]; k = keys_maps[col];
if(k == EMP){ if(k == EMP){
@ -398,8 +398,12 @@ void keypad_action(DEVTERM*dv,uint8_t col,uint8_t mode) {
if(mode == KEY_PRESSED) { if(mode == KEY_PRESSED) {
dv->state->pressMiddleClick(); dv->state->pressMiddleClick();
}else { }else {
if(dv->state->getScrolled() == false){
//if no scrolling happend ,do as a normal mid mouse key click
dv->Mouse->click(MOUSE_MIDDLE);
}
dv->state->releaseMiddleClick(); dv->state->releaseMiddleClick();
dv->Mouse->click(MOUSE_MIDDLE);
} }
break; break;

View File

@ -25,9 +25,12 @@ class State
void pressMiddleClick(); void pressMiddleClick();
bool releaseMiddleClick(); bool releaseMiddleClick();
bool getScrolled();
void setScrolled();
TrackballMode moveTrackball(); TrackballMode moveTrackball();
private: private:
bool middleClick; bool middleClick;
bool scrolled;
Timeout<uint16_t, MIDDLE_CLICK_TIMEOUT_MS> middleClickTimeout; Timeout<uint16_t, MIDDLE_CLICK_TIMEOUT_MS> middleClickTimeout;
}; };

View File

@ -6,7 +6,8 @@
State::State() State::State()
: fn(false), : fn(false),
middleClick(false) middleClick(false),
scrolled(false)
{ {
} }
@ -14,6 +15,15 @@ void State::tick(millis_t delta)
{ {
middleClickTimeout.updateTime(delta); middleClickTimeout.updateTime(delta);
} }
void State::setScrolled() {
if(middleClick==true){
scrolled = true;
}
}
bool State::getScrolled() {
return scrolled;
}
void State::pressMiddleClick() { void State::pressMiddleClick() {
middleClick = true; middleClick = true;
@ -22,6 +32,7 @@ void State::pressMiddleClick() {
bool State::releaseMiddleClick() { bool State::releaseMiddleClick() {
middleClick = false; middleClick = false;
scrolled = false;
const auto timeout = middleClickTimeout.get(); const auto timeout = middleClickTimeout.get();
return !timeout; return !timeout;
} }

View File

@ -35,8 +35,8 @@ static float rateToVelocityCurve(float input) {
return std::pow(std::abs(input) / 50, 1.4); return std::pow(std::abs(input) / 50, 1.4);
} }
template<Axis AXIS, int8_t Direction> template<Axis AXIS, int8_t Direction >
static void interrupt() { static void interrupt( ) {
distances[AXIS] += Direction; distances[AXIS] += Direction;
rateMeter[AXIS].onInterrupt(); rateMeter[AXIS].onInterrupt();
glider[AXIS].setDirection(Direction); glider[AXIS].setDirection(Direction);
@ -53,11 +53,14 @@ static void interrupt() {
if (AXIS == AXIS_X) { if (AXIS == AXIS_X) {
glider[AXIS_X].update(vx, std::sqrt(rateMeter[AXIS_X].delta())); glider[AXIS_X].update(vx, std::sqrt(rateMeter[AXIS_X].delta()));
glider[AXIS_Y].updateSpeed(vy); glider[AXIS_Y].updateSpeed(vy);
} else { } else {
glider[AXIS_X].updateSpeed(vx); glider[AXIS_X].updateSpeed(vx);
glider[AXIS_Y].update(vy, std::sqrt(rateMeter[AXIS_Y].delta())); glider[AXIS_Y].update(vy, std::sqrt(rateMeter[AXIS_Y].delta()));
} }
} }
void trackball_task(DEVTERM*dv) { void trackball_task(DEVTERM*dv) {
@ -94,6 +97,9 @@ void trackball_task(DEVTERM*dv) {
wheelBuffer += distances[AXIS_Y]; wheelBuffer += distances[AXIS_Y];
w = wheelBuffer / WHEEL_DENOM; w = wheelBuffer / WHEEL_DENOM;
wheelBuffer -= w * WHEEL_DENOM; wheelBuffer -= w * WHEEL_DENOM;
if(w != 0){
dv->state->setScrolled();
}
break; break;
} }
} }
@ -108,14 +114,14 @@ void trackball_task(DEVTERM*dv) {
} }
void trackball_init(DEVTERM*){ void trackball_init(DEVTERM*dv){
pinMode(LEFT_PIN, INPUT); pinMode(LEFT_PIN, INPUT);
pinMode(UP_PIN, INPUT); pinMode(UP_PIN, INPUT);
pinMode(RIGHT_PIN, INPUT); pinMode(RIGHT_PIN, INPUT);
pinMode(DOWN_PIN, INPUT); pinMode(DOWN_PIN, INPUT);
attachInterrupt(LEFT_PIN, &interrupt<AXIS_X, -1>, ExtIntTriggerMode::CHANGE); attachInterrupt(LEFT_PIN, &interrupt<AXIS_X,-1> , ExtIntTriggerMode::CHANGE);
attachInterrupt(RIGHT_PIN, &interrupt<AXIS_X, 1>, ExtIntTriggerMode::CHANGE); attachInterrupt(RIGHT_PIN, &interrupt<AXIS_X, 1>, ExtIntTriggerMode::CHANGE);
attachInterrupt(UP_PIN, &interrupt<AXIS_Y, -1>, ExtIntTriggerMode::CHANGE); attachInterrupt(UP_PIN, &interrupt<AXIS_Y, -1>, ExtIntTriggerMode::CHANGE);
attachInterrupt(DOWN_PIN, &interrupt<AXIS_Y, 1>, ExtIntTriggerMode::CHANGE); attachInterrupt(DOWN_PIN, &interrupt<AXIS_Y, 1>, ExtIntTriggerMode::CHANGE);