|
@@ -35,7 +35,7 @@ static report_mouse_t mouse_report = {0};
|
|
static void mousekey_debug(void);
|
|
static void mousekey_debug(void);
|
|
static uint8_t mousekey_accel = 0;
|
|
static uint8_t mousekey_accel = 0;
|
|
static uint8_t mousekey_repeat = 0;
|
|
static uint8_t mousekey_repeat = 0;
|
|
-static uint16_t last_timer = 0;
|
|
|
|
|
|
+static uint8_t mousekey_wheel_repeat = 0;
|
|
|
|
|
|
#ifndef MK_3_SPEED
|
|
#ifndef MK_3_SPEED
|
|
|
|
|
|
@@ -94,12 +94,12 @@ static uint8_t wheel_unit(void) {
|
|
unit = (MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed) / 2;
|
|
unit = (MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed) / 2;
|
|
} else if (mousekey_accel & (1 << 2)) {
|
|
} else if (mousekey_accel & (1 << 2)) {
|
|
unit = (MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed);
|
|
unit = (MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed);
|
|
- } else if (mousekey_repeat == 0) {
|
|
|
|
|
|
+ } else if (mousekey_wheel_repeat == 0) {
|
|
unit = MOUSEKEY_WHEEL_DELTA;
|
|
unit = MOUSEKEY_WHEEL_DELTA;
|
|
- } else if (mousekey_repeat >= mk_wheel_time_to_max) {
|
|
|
|
|
|
+ } else if (mousekey_wheel_repeat >= mk_wheel_time_to_max) {
|
|
unit = MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed;
|
|
unit = MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed;
|
|
} else {
|
|
} else {
|
|
- unit = (MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed * mousekey_repeat) / mk_wheel_time_to_max;
|
|
|
|
|
|
+ unit = (MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed * mousekey_wheel_repeat) / mk_wheel_time_to_max;
|
|
}
|
|
}
|
|
return (unit > MOUSEKEY_WHEEL_MAX ? MOUSEKEY_WHEEL_MAX : (unit == 0 ? 1 : unit));
|
|
return (unit > MOUSEKEY_WHEEL_MAX ? MOUSEKEY_WHEEL_MAX : (unit == 0 ? 1 : unit));
|
|
}
|
|
}
|
|
@@ -147,14 +147,17 @@ static uint8_t wheel_unit(void) {
|
|
void mousekey_task(void) {
|
|
void mousekey_task(void) {
|
|
// report cursor and scroll movement independently
|
|
// report cursor and scroll movement independently
|
|
report_mouse_t const tmpmr = mouse_report;
|
|
report_mouse_t const tmpmr = mouse_report;
|
|
- if ((mouse_report.x || mouse_report.y) && timer_elapsed(last_timer_c) > (mousekey_repeat ? mk_interval : mk_delay * 10)) {
|
|
|
|
|
|
+
|
|
|
|
+ mouse_report.x = 0;
|
|
|
|
+ mouse_report.y = 0;
|
|
|
|
+ mouse_report.v = 0;
|
|
|
|
+ mouse_report.h = 0;
|
|
|
|
+
|
|
|
|
+ if ((tmpmr.x || tmpmr.y) && timer_elapsed(last_timer_c) > (mousekey_repeat ? mk_interval : mk_delay * 10)) {
|
|
if (mousekey_repeat != UINT8_MAX) mousekey_repeat++;
|
|
if (mousekey_repeat != UINT8_MAX) mousekey_repeat++;
|
|
- mouse_report.v = 0;
|
|
|
|
- mouse_report.h = 0;
|
|
|
|
- if (mouse_report.x > 0) mouse_report.x = move_unit();
|
|
|
|
- if (mouse_report.x < 0) mouse_report.x = move_unit() * -1;
|
|
|
|
- if (mouse_report.y > 0) mouse_report.y = move_unit();
|
|
|
|
- if (mouse_report.y < 0) mouse_report.y = move_unit() * -1;
|
|
|
|
|
|
+ if (tmpmr.x != 0) mouse_report.x = move_unit() * ((tmpmr.x > 0) ? 1 : -1);
|
|
|
|
+ if (tmpmr.y != 0) mouse_report.y = move_unit() * ((tmpmr.y > 0) ? 1 : -1);
|
|
|
|
+
|
|
/* diagonal move [1/sqrt(2)] */
|
|
/* diagonal move [1/sqrt(2)] */
|
|
if (mouse_report.x && mouse_report.y) {
|
|
if (mouse_report.x && mouse_report.y) {
|
|
mouse_report.x = times_inv_sqrt2(mouse_report.x);
|
|
mouse_report.x = times_inv_sqrt2(mouse_report.x);
|
|
@@ -166,18 +169,12 @@ void mousekey_task(void) {
|
|
mouse_report.y = 1;
|
|
mouse_report.y = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- mousekey_send();
|
|
|
|
- last_timer_c = last_timer;
|
|
|
|
- mouse_report = tmpmr;
|
|
|
|
}
|
|
}
|
|
- if ((mouse_report.v || mouse_report.h) && timer_elapsed(last_timer_w) > (mousekey_repeat ? mk_wheel_interval : mk_wheel_delay * 10)) {
|
|
|
|
- if (mousekey_repeat != UINT8_MAX) mousekey_repeat++;
|
|
|
|
- mouse_report.x = 0;
|
|
|
|
- mouse_report.y = 0;
|
|
|
|
- if (mouse_report.v > 0) mouse_report.v = wheel_unit();
|
|
|
|
- if (mouse_report.v < 0) mouse_report.v = wheel_unit() * -1;
|
|
|
|
- if (mouse_report.h > 0) mouse_report.h = wheel_unit();
|
|
|
|
- if (mouse_report.h < 0) mouse_report.h = wheel_unit() * -1;
|
|
|
|
|
|
+ if ((tmpmr.v || tmpmr.h) && timer_elapsed(last_timer_w) > (mousekey_wheel_repeat ? mk_wheel_interval : mk_wheel_delay * 10)) {
|
|
|
|
+ if (mousekey_wheel_repeat != UINT8_MAX) mousekey_wheel_repeat++;
|
|
|
|
+ if (tmpmr.v != 0) mouse_report.v = wheel_unit() * ((tmpmr.v > 0) ? 1 : -1);
|
|
|
|
+ if (tmpmr.h != 0) mouse_report.h = wheel_unit() * ((tmpmr.h > 0) ? 1 : -1);
|
|
|
|
+
|
|
/* diagonal move [1/sqrt(2)] */
|
|
/* diagonal move [1/sqrt(2)] */
|
|
if (mouse_report.v && mouse_report.h) {
|
|
if (mouse_report.v && mouse_report.h) {
|
|
mouse_report.v = times_inv_sqrt2(mouse_report.v);
|
|
mouse_report.v = times_inv_sqrt2(mouse_report.v);
|
|
@@ -189,10 +186,10 @@ void mousekey_task(void) {
|
|
mouse_report.h = 1;
|
|
mouse_report.h = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- mousekey_send();
|
|
|
|
- last_timer_w = last_timer;
|
|
|
|
- mouse_report = tmpmr;
|
|
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (mouse_report.x || mouse_report.y || mouse_report.v || mouse_report.h) mousekey_send();
|
|
|
|
+ mouse_report = tmpmr;
|
|
}
|
|
}
|
|
|
|
|
|
void mousekey_on(uint8_t code) {
|
|
void mousekey_on(uint8_t code) {
|
|
@@ -228,6 +225,7 @@ void mousekey_on(uint8_t code) {
|
|
mousekey_accel |= (1 << 1);
|
|
mousekey_accel |= (1 << 1);
|
|
else if (code == KC_MS_ACCEL2)
|
|
else if (code == KC_MS_ACCEL2)
|
|
mousekey_accel |= (1 << 2);
|
|
mousekey_accel |= (1 << 2);
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
void mousekey_off(uint8_t code) {
|
|
void mousekey_off(uint8_t code) {
|
|
@@ -263,7 +261,8 @@ void mousekey_off(uint8_t code) {
|
|
mousekey_accel &= ~(1 << 1);
|
|
mousekey_accel &= ~(1 << 1);
|
|
else if (code == KC_MS_ACCEL2)
|
|
else if (code == KC_MS_ACCEL2)
|
|
mousekey_accel &= ~(1 << 2);
|
|
mousekey_accel &= ~(1 << 2);
|
|
- if (mouse_report.x == 0 && mouse_report.y == 0 && mouse_report.v == 0 && mouse_report.h == 0) mousekey_repeat = 0;
|
|
|
|
|
|
+ if (mouse_report.x == 0 && mouse_report.y == 0) mousekey_repeat = 0;
|
|
|
|
+ if (mouse_report.v == 0 && mouse_report.h == 0) mousekey_wheel_repeat = 0;
|
|
}
|
|
}
|
|
|
|
|
|
#else /* #ifndef MK_3_SPEED */
|
|
#else /* #ifndef MK_3_SPEED */
|
|
@@ -285,20 +284,22 @@ uint16_t w_intervals[mkspd_COUNT] = {MK_W_INTERVAL_UNMOD, MK_W_INTERVAL_0
|
|
void mousekey_task(void) {
|
|
void mousekey_task(void) {
|
|
// report cursor and scroll movement independently
|
|
// report cursor and scroll movement independently
|
|
report_mouse_t const tmpmr = mouse_report;
|
|
report_mouse_t const tmpmr = mouse_report;
|
|
- if ((mouse_report.x || mouse_report.y) && timer_elapsed(last_timer_c) > c_intervals[mk_speed]) {
|
|
|
|
- mouse_report.h = 0;
|
|
|
|
- mouse_report.v = 0;
|
|
|
|
- mousekey_send();
|
|
|
|
- last_timer_c = last_timer;
|
|
|
|
- mouse_report = tmpmr;
|
|
|
|
|
|
+ mouse_report.x = 0;
|
|
|
|
+ mouse_report.y = 0;
|
|
|
|
+ mouse_report.v = 0;
|
|
|
|
+ mouse_report.h = 0;
|
|
|
|
+
|
|
|
|
+ if ((tmpmr.x || tmpmr.y) && timer_elapsed(last_timer_c) > c_intervals[mk_speed]) {
|
|
|
|
+ mouse_report.x = tmpmr.x;
|
|
|
|
+ mouse_report.y = tmpmr.y;
|
|
}
|
|
}
|
|
- if ((mouse_report.h || mouse_report.v) && timer_elapsed(last_timer_w) > w_intervals[mk_speed]) {
|
|
|
|
- mouse_report.x = 0;
|
|
|
|
- mouse_report.y = 0;
|
|
|
|
- mousekey_send();
|
|
|
|
- last_timer_w = last_timer;
|
|
|
|
- mouse_report = tmpmr;
|
|
|
|
|
|
+ if ((tmpmr.h || tmpmr.v) && timer_elapsed(last_timer_w) > w_intervals[mk_speed]) {
|
|
|
|
+ mouse_report.v = tmpmr.v;
|
|
|
|
+ mouse_report.h = tmpmr.h;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (mouse_report.x || mouse_report.y || mouse_report.v || mouse_report.h) mousekey_send();
|
|
|
|
+ mouse_report = tmpmr;
|
|
}
|
|
}
|
|
|
|
|
|
void adjust_speed(void) {
|
|
void adjust_speed(void) {
|
|
@@ -413,13 +414,16 @@ void mousekey_off(uint8_t code) {
|
|
|
|
|
|
void mousekey_send(void) {
|
|
void mousekey_send(void) {
|
|
mousekey_debug();
|
|
mousekey_debug();
|
|
|
|
+ uint16_t time = timer_read();
|
|
|
|
+ if (mouse_report.x || mouse_report.y) last_timer_c = time;
|
|
|
|
+ if (mouse_report.v || mouse_report.h) last_timer_w = time;
|
|
host_mouse_send(&mouse_report);
|
|
host_mouse_send(&mouse_report);
|
|
- last_timer = timer_read();
|
|
|
|
}
|
|
}
|
|
|
|
|
|
void mousekey_clear(void) {
|
|
void mousekey_clear(void) {
|
|
mouse_report = (report_mouse_t){};
|
|
mouse_report = (report_mouse_t){};
|
|
mousekey_repeat = 0;
|
|
mousekey_repeat = 0;
|
|
|
|
+ mousekey_wheel_repeat = 0;
|
|
mousekey_accel = 0;
|
|
mousekey_accel = 0;
|
|
}
|
|
}
|
|
|
|
|