TapDanceの設定(その4・凝った設定)
前置き
TapDanceの設定で使うACTION_TAP_DANCE_FN_ADVANCED関数やACTION_TAP_DANCE_FN_ADVANCED_TIME関数を利用すると、次のような複雑な処理も設定できるようになる。
1回タイプなら無変換/英数を入力
2連打ならWindowsキーを入力。そのまま押し続ければ「Windows+E」のようなショートカットキーも入力できる。
1回タイプしてから押し続けるとLowerレイヤーに切り替え
参考として、この設定の方法も紹介する。
設定の手順
これまでと同様に独自設定のキーコードを定義する。
code:keymap.c
//Tap Dance Declarations
enum {
TD_LBRC_LPRN = 0,
TD_SCLN_COLN,
TD_PERIOD_COMMA, //ここまではこれまで説明してきたキーコード
TRD_MHEN_LOWER
};
それから、この処理を行う関数を事前に宣言する。
code:keymap.c
//for the x tap dance. Put it here so it can be used in any keymap
void triple_functions_each_tap (qk_tap_dance_state_t *state, void *user_data);
void triple_functions_finished (qk_tap_dance_state_t *state, void *user_data);
void triple_functions_reset (qk_tap_dance_state_t *state, void *user_data);
そして、実際の処理を行う関数を定義する。まずは、キータイプの都度実行される関数を記述する。
code:keymap.c
void triple_functions_each_tap (qk_tap_dance_state_t *state, void *user_data) {
switch (state->keycode) {
case TD(TRD_MHEN_LOWER):
if (state->count == 1) {
// キーが一回押されたらとりあえずLOWERレイヤーをオンにする
layer_on(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else if (state->count == 2) {
layer_off(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
register_code(KC_LGUI);
}
break;
}
}
キーがタップされた時点でLOWERレイヤーを有効にするので、そのままキーを押し続ければLOWERレイヤーのキーをタイプできる。一方、キーを2連打した場合、Winwodsキーを入力するために、まずLOWERレイヤーをオフにして、それからWindowsキーを入力している。
続いて、TAPPING_TERMで設定した時間が経過した時点か、別のキーをタイプした際に実行される関数を記述する。
code:keymap.c
void triple_functions_finished (qk_tap_dance_state_t *state, void *user_data) {
switch (state->keycode) {
case TD(TRD_MHEN_LOWER):
if (state->count == 1 && !state->pressed) {
// 「キー押下が1回・押し続けていない」場合にタップと判断している。
layer_off(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
register_code(KC_LANG2); // for macOS
register_code(KC_MHEN);
}
break;
}
}
void triple_functions_reset (qk_tap_dance_state_t *state, void *user_data) {
switch (state->keycode) {
case TD(TRD_MHEN_LOWER):
if (state->count == 1 && !state->pressed) {
unregister_code(KC_LANG2); // for macOS
unregister_code(KC_MHEN);
}
if (state->count == 2) {
unregister_code(KC_LGUI);
}
// レイヤーがオフにならないことがあるので、確実にレイヤーをオフにするため、ここでもlayer_offメソッドを実行する。
layer_off(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
break;
}
}
関数の引数であるstate変数に格納されている値を使って、タップなのか2連打なのかを判断して、タップならtriple_functions_each_tap関数でオンにしたLOWERレイヤーをオフにしてMacの英数キーと無変換キーを順番に入力している。一方、2連打の場合は、LOWERレイヤーはすでにオフになっているので、triple_functions_reset関数でunregister_code(KC_LGUI)を実行してKeyUpを行ってキー操作を完結させている。
この設定を行なった場合のキー入力の流れは次のとおり。
1回タイプの場合
(キータイプ)
|
| (triple_functions_each_tap関数を実行)
|
LOWERレイヤーをオン
|
| (TAPPING_TERMの設定時間が経過)
| (triple_functions_finished関数を実行)
|
LOWERレイヤーをオフにして無変換/英数キーをKeyDown
|
| (triple_functions_reset関数を実行)
|
無変換/英数キーをKeyUp
1回タイプしてから押し続ける場合
(キータイプ)
|
| (triple_functions_each_tap関数を実行)
|
LOWERレイヤーをオン
|
| (キーを離すまでLOWERレイヤーをオン)
|
キーを離したらLOWERレイヤーをオフにする
2連打の場合
(キータイプ)
|
| (triple_functions_each_tap関数を実行)
|
LOWERレイヤーをオン
|
(キータイプ)
|
| (triple_functions_each_tap関数を実行)
|
Windowsキーを押下
|
| (TAPPING_TERMの設定時間が経過)
| (triple_functions_finished関数を実行)
|
何もしない(処理を記述していない)
|
| (triple_functions_reset関数を実行)
|
WindowsキーをKeyUp