如何获取当前活跃键盘的按键映射并与特定键盘布局对比
如何获取当前活跃键盘的按键映射并与特定键盘布局对比
嘿,我来帮你搞定这个问题!你已经知道怎么生成指定键盘布局(比如冰岛语Dvorak)的按键映射了,现在就差获取当前正在使用的活跃键盘布局的keymap对吧?
其实你不用找什么xkb_keymap_new_from_default()函数,libxkbcommon已经提供了更准确的方式来获取当前活跃的键盘映射,主要分两种场景:
场景1:你在X11环境下(大多数桌面系统都是)
如果你已经连接到了X服务器,最可靠的方式是通过xkb_state对象来获取当前活跃的keymap——因为xkb_state会实时关联用户当前切换的键盘布局,代码示例如下:
// 初始化xkb上下文 struct xkb_context *ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS); if (!ctx) { fprintf(stderr, "Failed to create xkb context\n"); return 1; } // 连接到X Display(如果还没连接的话) Display *dpy = XOpenDisplay(NULL); if (!dpy) { fprintf(stderr, "Failed to open X display\n"); xkb_context_unref(ctx); return 1; } // 使用核心键盘设备ID int device_id = XkbUseCoreKbd; // 创建关联当前键盘布局的xkb_state struct xkb_state *state = xkb_state_new_from_device(ctx, dpy, device_id); if (!state) { fprintf(stderr, "Failed to create xkb state\n"); XCloseDisplay(dpy); xkb_context_unref(ctx); return 1; } // 关键一步:从state中获取当前活跃的keymap struct xkb_keymap *current_keymap = xkb_state_get_keymap(state); // 现在你可以拿着current_keymap和你之前生成的keymap_is做对比啦!
场景2:只想获取系统默认的键盘布局(非实时活跃)
如果你的场景不需要跟踪用户手动切换的布局,只是想拿到系统默认的键盘映射,那可以直接给xkb_keymap_new_from_names传空的RMLVO参数,它会自动加载系统默认配置:
struct xkb_keymap *default_keymap = xkb_keymap_new_from_names(ctx, NULL, XKB_KEYMAP_COMPILE_NO_FLAGS);
不过要注意,这个方法拿到的是系统初始默认布局,不是用户当前正在用的(比如用户切换到其他布局后,这个方法就获取不到实时状态了),所以更推荐第一种场景的实现方式。
拿到两个keymap之后,你就可以通过libxkbcommon的API(比如xkb_keymap_key_get_syms等)来对比每个按键的映射差异啦。
备注:内容来源于stack exchange,提问作者user3443063
相关产品推荐
相关产品推荐

