Skip to content

Commit

Permalink
Implemented New MK_COMBINED Functionality (qmk#9557)
Browse files Browse the repository at this point in the history
* implemented new mousekey_combined functionality

* minor formatting change to documentation

* Update tmk_core/common/mousekey.c

Co-authored-by: Ryan <[email protected]>

* Update tmk_core/common/mousekey.c

Co-authored-by: Ryan <[email protected]>

* Update tmk_core/common/mousekey.c

Co-authored-by: Ryan <[email protected]>

* Update tmk_core/common/mousekey.c

Co-authored-by: Ryan <[email protected]>

* Update docs/feature_mouse_keys.md

Co-authored-by: Nick Brassel <[email protected]>

* Update docs/feature_mouse_keys.md

Co-authored-by: Nick Brassel <[email protected]>

* Update docs/feature_mouse_keys.md

Co-authored-by: Nick Brassel <[email protected]>

* Update docs/feature_mouse_keys.md

Co-authored-by: Nick Brassel <[email protected]>

Co-authored-by: Nathan Vercaemert <[email protected]>
Co-authored-by: Ryan <[email protected]>
Co-authored-by: Nick Brassel <[email protected]>
  • Loading branch information
4 people authored Jul 20, 2020
1 parent 2e08c72 commit 19006c9
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 16 deletions.
22 changes: 21 additions & 1 deletion docs/feature_mouse_keys.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,11 @@ In your keymap you can use the following keycodes to map key presses to mouse ac

## Configuring mouse keys

Mouse keys supports two different modes to move the cursor:
Mouse keys supports three different modes to move the cursor:

* **Accelerated (default):** Holding movement keys accelerates the cursor until it reaches its maximum speed.
* **Constant:** Holding movement keys moves the cursor at constant speeds.
* **Combined:** Holding movement keys accelerates the cursor until it reaches its maximum speed, but holding acceleration and movement keys simultaneously moves the cursor at constant speeds.

The same principle applies to scrolling.

Expand Down Expand Up @@ -120,3 +121,22 @@ Use the following settings if you want to adjust cursor movement or scrolling:
|`MK_W_INTERVAL_1` |120 |Time between scroll steps (`KC_ACL1`) |
|`MK_W_OFFSET_2` |1 |Scroll steps per scroll action (`KC_ACL2`) |
|`MK_W_INTERVAL_2` |20 |Time between scroll steps (`KC_ACL2`) |

### Combined mode

This mode functions like **Accelerated** mode, however, you can hold `KC_ACL0`, `KC_ACL1` and `KC_ACL2`
to momentarily (while held) set the cursor and scroll speeds to constant speeds. When no acceleration
keys are held, this mode is identical to **Accelerated** mode, and can be modified using all of the
relevant settings.

* **KC_ACL0:** This acceleration sets your cursor to the slowest possible speed. This is useful for very
small and detailed movements of the cursor.
* **KC_ACL1:** This acceleration sets your cursor to half the maximum (user defined) speed.
* **KC_ACL2:** This acceleration sets your cursor to the maximum (computer defined) speed. This is
useful for moving the cursor large distances without much accuracy.

To use constant speed mode, you must at least define `MK_COMBINED` in your keymap’s `config.h` file:

```c
#define MK_COMBINED
```
72 changes: 57 additions & 15 deletions tmk_core/common/mousekey.c
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
/*
Copyright 2011 Jun Wako <[email protected]>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
* Copyright 2011 Jun Wako <[email protected]>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include <stdint.h>
#include "keycode.h"
Expand Down Expand Up @@ -66,6 +66,8 @@ uint8_t mk_wheel_interval = MOUSEKEY_WHEEL_INTERVAL;
uint8_t mk_wheel_max_speed = MOUSEKEY_WHEEL_MAX_SPEED;
uint8_t mk_wheel_time_to_max = MOUSEKEY_WHEEL_TIME_TO_MAX;

#ifndef MK_COMBINED

static uint8_t move_unit(void) {
uint16_t unit;
if (mousekey_accel & (1 << 0)) {
Expand Down Expand Up @@ -102,6 +104,46 @@ static uint8_t wheel_unit(void) {
return (unit > MOUSEKEY_WHEEL_MAX ? MOUSEKEY_WHEEL_MAX : (unit == 0 ? 1 : unit));
}

#else /* #ifndef MK_COMBINED */

static uint8_t move_unit(void) {
uint16_t unit;
if (mousekey_accel & (1 << 0)) {
unit = 1;
} else if (mousekey_accel & (1 << 1)) {
unit = (MOUSEKEY_MOVE_DELTA * mk_max_speed) / 2;
} else if (mousekey_accel & (1 << 2)) {
unit = MOUSEKEY_MOVE_MAX;
} else if (mousekey_repeat == 0) {
unit = MOUSEKEY_MOVE_DELTA;
} else if (mousekey_repeat >= mk_time_to_max) {
unit = MOUSEKEY_MOVE_DELTA * mk_max_speed;
} else {
unit = (MOUSEKEY_MOVE_DELTA * mk_max_speed * mousekey_repeat) / mk_time_to_max;
}
return (unit > MOUSEKEY_MOVE_MAX ? MOUSEKEY_MOVE_MAX : (unit == 0 ? 1 : unit));
}

static uint8_t wheel_unit(void) {
uint16_t unit;
if (mousekey_accel & (1 << 0)) {
unit = 1;
} else if (mousekey_accel & (1 << 1)) {
unit = (MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed) / 2;
} else if (mousekey_accel & (1 << 2)) {
unit = MOUSEKEY_WHEEL_MAX;
} else if (mousekey_repeat == 0) {
unit = MOUSEKEY_WHEEL_DELTA;
} else if (mousekey_repeat >= mk_wheel_time_to_max) {
unit = MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed;
} else {
unit = (MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed * mousekey_repeat) / mk_wheel_time_to_max;
}
return (unit > MOUSEKEY_WHEEL_MAX ? MOUSEKEY_WHEEL_MAX : (unit == 0 ? 1 : unit));
}

#endif /* #ifndef MK_COMBINED */

void mousekey_task(void) {
// report cursor and scroll movement independently
report_mouse_t const tmpmr = mouse_report;
Expand Down

0 comments on commit 19006c9

Please sign in to comment.