蓝牙键盘按键 remap ?

2016-03-23 09:45:53 +08:00
 raiz

从狗东买了一个低端蓝牙键盘, 按键布局是 mac 风格的, 第一行的按键全部需要组合 Fn 键才能使用, esc 键要组合这个接受不了, 没有 home/end/pageU/pageD 这些键,找了一些 remap 软件,只能把常用的键互换位置,均检测不到 fn 键,好像 fn 键组合键的键码是硬件上产生的,驱动只能检测到组合过的码。

有软件上的解决方法吗?

如果没有,只能硬件上来搞个反相器在 fn 上了 -,-!!

1526 次点击
所在节点    问与答
7 条回复
BOYPT
2016-03-23 09:49:05 +08:00
黑进去键盘的固件里面改
raiz
2016-03-23 10:33:37 +08:00
@BOYPT 低端到连驱动都是通用的
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;
}
}
BOYPT
2016-03-23 13:10:36 +08:00
@raiz 蓝牙键盘必须通用的吧
raiz
2016-03-24 10:45:38 +08:00
@BOYPT 我看到有些雷蛇的鼠标有自己的客户端可以个性化设置。 蓝牙键盘没有这类玩意吗?
@redsonic 我是 用 windows 哈哈
BOYPT
2016-03-24 10:48:09 +08:00
@raiz 嗯我的机械键盘也有个小工具可以定义组合键什么的,是 USB 键盘;蓝牙键盘可能不支持自定义的通信吧,因为有专门的 HID 协议
redsonic
2016-03-24 12:28:57 +08:00
@BOYPT
@raiz
雷蛇那个应该不是通用驱动的,否则不会接收客户端程序的私有指令。 其实蓝牙键盘的堆栈是下层蓝牙协议栈,上层 HID ,只要厂商在 HID 层开发指令和驱动就能实现,和无线不无线没关系。其实最好的方案就是 hhkb 和 minila 之类的,直接弄个硬件开关,这样通用驱动也能切换。提主纠结这个不如直接买个大厂的,用着顺手 夸张一点终生都不会换。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/265656

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX