トラックボールでスクロール実装(QMK Firmware)

自作したキーボードのトラックボールでスクロールできるように実装してみた。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)押下中に有効になるようにして動かしているけど悪くないかも。

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA