キーボードでマウスを操る 【qmk使用】

キーボードとマウスの間を右手が行ったり来たりするのはどうにも不便だと ずっと思っていました。

マウスポインターをキーボードで操作すればマウスの使用頻度も減るかと思い、
自作キーボードの qmkファームウェアを いじってみました。

キーボードでマウスを16方向へ動かす

デフォルトでも上下左右の4方向へは動かせますが、それでは使い勝手が悪いので、 16方向へ動くようにしてみました。

16方向へマウスを動かすイメージ

予め決めた場所へマウスをジャンプ

 パソコン画面 のイメージ

画面の4隅や「真ん中よりも少し右」など好きな場所にマウスポインターを一瞬でジャンプできるようにしてみました。

ファームウェアの実装

上下左右 (0°、90°)に移動

キー配置の定義で KC_MS_U, KC_MS_D, KC_MS_L, KC_MS_R, がそれぞれ上下左右です。

斜め45°に移動

次のようになります。

const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
switch(id) {
case 0:
if (record->event.pressed) {
register_code(KC_RSFT);
} else {
unregister_code(KC_RSFT);
}
break;
case A_MUL: //右上45度
if (record->event.pressed) {
mousekey_on(KC_MS_UP);
mousekey_on(KC_MS_LEFT);
} else {
mousekey_off(KC_MS_UP);
mousekey_off(KC_MS_LEFT);
}
mousekey_send();
break;
}
case A_MUR: //左上45度
if (record->event.pressed) {
mousekey_on(KC_MS_UP);
mousekey_on(KC_MS_RIGHT);
} else {
mousekey_off(KC_MS_UP);
mousekey_off(KC_MS_RIGHT);
}
mousekey_send();
break;
}

引用元 https://git.asami.chiba.jp/asami-t/qmkgit/blob/7fe0756b6a7613d92c9fed8b5ad0bd1c904e18ca/keyboards/kinesis/keymaps/milestogo/keymap.c
(2020.8.4現在 このページは消えています。)

その他の方向

次のように x, yを指定すれば好みの方向にマウスポインターを動かせます。
xは+で右方向の移動、yは+が下方向の移動になります。

void mouse_move(int8_t x, int8_t y){
report_mouse_t report = {0};
report.x = x;
report.y = y;
host_mouse_send(&report);
}

しかし、これだけではマウスは1回だけ動いて止まってしまうので、
タイマーを使って繰り返します。

void settimer_mousemove(keyrecord_t *record,  int flag){
     if (record->event.pressed) {
          mouse_timer = timer_read();  //start timer
          mouse_flag = flag;
     } else {
          mouse_flag = 0;
          mouse_count = 0;
     }
}
void matrix_scan_user (void) {
          if(timer_elapsed(mouse_timer) > interval) {
               switch(mouse_flag) {
               case  A_MLUL:
                    mouse_move(-3, -1);
                    break;
               case  A_MULU:
                    mouse_move(-1, -3);
                    break;
                 ……………

この方法の問題点はドラッグ操作ができないことです。

画面の4隅にマウスポインターをジャンプさせる

 マウスポインターの画面上の現在位置をキーボードのマイコンは知ることができませんから、 位置は気にせず画面サイズよりも大きな移動を行えば画面の端までマウスポインターを 瞬間移動させることができます。
先ほどの関数を使って mouse_move(9999, 9999) とやりたいところですが、
引数は -127~ 128の範囲でしか指定できませんので、何度か繰り返して画面の端まで マウスポインターを持っていきます。

画面上の予め決めた場所にマウスを瞬間移動

一旦画面の4隅のどれかにマウスポインターをジャンプさせて、 それから必要なだけ移動させます。

ソースコード全体

私が自先キーボード Dactyl manuform で使っている keymap.c を公開します。
私のコンパイル環境では次のパスに置いているものです。
qmk_firmware/keyboards/handwired/dactyl_manuform/4×6/keymaps/dvorak/keymap.c

使いごこち

文章入力中に、ちょっとだけマウスを使うためにわざわざ右手をキーボードから離す、 ということをしなくても済むようになりました。
マウスを一切使わないか、というとそんなことはなく、例えば文字入力せずwebを見るだけのときはマウスを使った方が便利です。