C语言 与QMK修饰符键斗争



当我尝试在旋转编码器上使用修饰符键时,我得到了这个错误,如下所示:

bool encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) { /* First encoder */
if (clockwise) {
tap_code(QK_LCTL | KC_F24);
} else {
tap_code(QK_LCTL | KC_F23);
}
}
return false;
}

错误:

Compiling: keyboards/planck/keymaps/dawz/keymap.c                                                  keyboards/planck/keymaps/dawz/keymap.c: In function 'encoder_update_user':
keyboards/planck/keymaps/dawz/keymap.c:68:22: error: unsigned conversion from 'int' to 'uint8_t' {aka 'unsigned char'} changes value from '371' to '115' [-Werror=overflow]
68 |             tap_code(QK_LCTL | KC_F24);
|                      ^~~~~~~~~~~~~~~~
keyboards/planck/keymaps/dawz/keymap.c:70:22: error: unsigned conversion from 'int' to 'uint8_t' {aka 'unsigned char'} changes value from '370' to '114' [-Werror=overflow]
70 |             tap_code(QK_LCTL | KC_F23);
|                      ^~~~~~~~~~~~~~~~
cc1.exe: all warnings being treated as errors
[ERRORS]
|
|
|
make[1]: *** [tmk_core/rules.mk:443: .build/obj_planck_rev6_drop_dawz/keyboards/planck/keymaps/dawz/keymap.o] Error 1
Make finished with errors
make: *** [Makefile:539: planck/rev6_drop:dawz] Error 1

编码器工作时,我放入一个常规的键码,如KC_VOLUP或KC_VOLDOWN,但我试图使用Ctrl+F23F24,所以我可以使用旋钮作为一个语音计宏按钮控制器。

可以表示" Ctrl +(基本键)"使用宏LCTL(kc)的组合(以及其他mod的类似宏),但技术上是,这创建了一个16位的密钥代码。因此,不要使用tap_code(),它被限制为8位基本密钥码,而要使用tap_code16()点击它:

// Copyright 2022 Google LLC.
// SPDX-License-Identifier: Apache-2.0
bool encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) {
tap_code16(clockwise ? LCTL(KC_F24) : LCTL(KC_F23));
} 
return false;
}

另见QMK编码器文档。

您可以分解按组合键的方式:

  1. 按住修改键
  2. 按某个键(通常是字母或数字)
  3. 释放修改键

那么你可以表示整个过程:

bool encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) { /* First encoder */
if (clockwise) {
register_code(QK_LCTL);   // Press and keep holding down
tap_code(KC_F24);         // Press and release
unregister_code(QK_LCTL); // Release
} else {
register_code(QK_LCTL);
tap_code(KC_F23);
unregister_code(QK_LCTL);
}
}
return false;
}

这种方法似乎很愚蠢,但你可以实现更复杂的情况,如Ctrl+Alt+Shift+A或一些很难用键码完成的事情。

我在我的一个自制键盘上做了这个,它工作得很好。

如果你想在这里对编码器使用修饰键,你应该尝试使用tap_code16()而不是tap_code()。

试试这个:

bool encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) { /* First encoder */
if (clockwise) {
tap_code16(QK_LCTL | KC_F24);
} else {
tap_code16(QK_LCTL | KC_F23);
}
}
return false;
}

QMK文档

最新更新