自作したキーボードのトラックボールでスクロールできるように実装してみた。KC_MS_WH_UP/DOWN/RIGHT/LEFT
でも意外と問題なかったけど。
サンプルのままだと感度が高すぎるというか、通常のホイールスクロールのように一定量を回転させるとスクロールする動きにしないと使いにくいので、しきい値を設けてそれを上回るとスクロールするようにした。
ついでにQMK Firmwareのレイヤー切り替えキーLT(layer, kc)
の改善策もいれてみた。
https://okapies.hateblo.jp/entry/2019/02/02/133953
#define SCROLL_THRESHOLD 20
bool is_scrolling = false;
int cnt_mouse_y = 0;
static bool is_lower = false;
static bool is_raise = false;
report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) {
if (is_scrolling) {
cnt_mouse_y += mouse_report.y;
int scrolling_y = 0;
if (cnt_mouse_y > SCROLL_THRESHOLD) {
scrolling_y = 1;
cnt_mouse_y = 0;
} else if (cnt_mouse_y < SCROLL_THRESHOLD * (-1)) {
scrolling_y = -1;
cnt_mouse_y = 0;
}
if (cnt_mouse_y != 0) {
is_lower = false;
}
mouse_report.h = 0;
mouse_report.v = scrolling_y * (-1);
mouse_report.x = 0;
mouse_report.y = 0;
}
return mouse_report;
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_ENTER: // lower
if (record->event.pressed) {
is_lower = true;
is_scrolling = true;
cnt_mouse_y = 0;
layer_on(_MOUSE);
} else {
is_scrolling = false;
layer_off(_MOUSE);
if (is_lower) {
register_code(KC_ENTER);
unregister_code(KC_ENTER);
}
is_lower = false;
}
return false;
break;
case RAISE:
if (record->event.pressed) {
layer_on(_RAISE);
is_raise = true;
} else {
layer_off(_RAISE);
is_raise = false;
}
return false;
break;
default:
if (record->event.pressed) {
is_lower = false;
is_raise = false;
}
break;
}
return true;
}
期待通りの動作になった!レイヤー切り替えもいい感じ。
とりあえず右手小指(Enter)押下中に有効になるようにして動かしているけど悪くないかも。