从狗东买了一个低端蓝牙键盘, 按键布局是 mac 风格的, 第一行的按键全部需要组合 Fn 键才能使用, esc 键要组合这个接受不了, 没有 home/end/pageU/pageD 这些键,找了一些 remap 软件,只能把常用的键互换位置,均检测不到 fn 键,好像 fn 键组合键的键码是硬件上产生的,驱动只能检测到组合过的码。
有软件上的解决方法吗?
如果没有,只能硬件上来搞个反相器在 fn 上了 -,-!!
1
BOYPT 2016-03-23 09:49:05 +08:00
黑进去键盘的固件里面改
|
3
redsonic 2016-03-23 11:44:42 +08:00
fn 会产生 scancode ,只是内核不会把它送给终端及终端上的应用程序,所以那些软件都看不到。如果 LZ 用的是 linux ,可以把 linux 上面 mac 键盘的驱动移植一部分到你那个通用键盘驱动里面, mac 的键盘驱动是可以通过 /sys/module/hid_apple/parameters/fnmode 这个 entry 修改 fn 键的默认状态。
drivers/hid/hid-apple.c static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input, struct hid_usage *usage, __s32 value) { struct apple_sc *asc = hid_get_drvdata(hid); const struct apple_key_translation *trans, *table; if (usage->code == KEY_FN) { asc->fn_on = !!value; input_event(input, usage->type, usage->code, value); return 1; } if (fnmode) { int do_translate; if (hid->product >= USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI && hid->product <= USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) table = macbookair_fn_keys; else if (hid->product < 0x21d || hid->product >= 0x300) table = powerbook_fn_keys; else table = apple_fn_keys; trans = apple_find_translation (table, usage->code); if (trans) { if (test_bit(usage->code, asc->pressed_fn)) do_translate = 1; else if (trans->flags & APPLE_FLAG_FKEY) do_translate = (fnmode == 2 && asc->fn_on) || (fnmode == 1 && !asc->fn_on); else do_translate = asc->fn_on; if (do_translate) { if (value) set_bit(usage->code, asc->pressed_fn); else clear_bit(usage->code, asc->pressed_fn); input_event(input, usage->type, trans->to, value); return 1; } } |
5
raiz OP |