这可能是一个过时的问题,但我发现它仍然有效。 您可以通过XCB启用XKB扩展,然后获取KeyMap,它是通过XCB API(或更具体地说是从XKB KeyMap的状态)进行布局的布局和适当的Keysym。 links:
libxkbCommon快速启动 X11支持
xcb_x11
调用之前创建扩展名)。 (使用设备ID,您可以调用
xkb_x11_keymap_new_from_device
返回
xkb_keymap
指针)。
xkb_state_key_get_sym()
)在这里您可以使用XKB_STATE获取相应键的符号。
我不得不承认,我实际上还没有完全完成此操作(仅到Keymap/Layout/State Thing)。但这应该足以让您入门。 :)
xmodmap -pk
xmodmap -pke
。也就是说,给定任何密钥代码,它为您提供了与该键代码关联的密钥。
(除了它仅显示键符值,而不是键符名称,您可以在
/usr/include/X11/keysymdef.h
XKeysymToString()
/*
gcc keymap.c -o keymap -lxcb && ./keymap
*/
#include <stdlib.h>
#include <stdio.h>
#include <xcb/xcb.h>
void xcb_show_keyboard_mapping(xcb_connection_t* connection, const xcb_setup_t* setup){
xcb_get_keyboard_mapping_reply_t* keyboard_mapping =
xcb_get_keyboard_mapping_reply(
connection,
xcb_get_keyboard_mapping(
connection,
setup->min_keycode,
setup->max_keycode - setup->min_keycode + 1),
NULL);
int nkeycodes = keyboard_mapping->length / keyboard_mapping->keysyms_per_keycode;
int nkeysyms = keyboard_mapping->length;
xcb_keysym_t* keysyms = (xcb_keysym_t*)(keyboard_mapping + 1); // `xcb_keycode_t` is just a `typedef u8`, and `xcb_keysym_t` is just a `typedef u32`
printf("nkeycodes %u nkeysyms %u keysyms_per_keycode %u\n\n", nkeycodes, nkeysyms, keyboard_mapping->keysyms_per_keycode);
for(int keycode_idx=0; keycode_idx < nkeycodes; ++keycode_idx){
printf("keycode %3u ", setup->min_keycode + keycode_idx);
for(int keysym_idx=0; keysym_idx < keyboard_mapping->keysyms_per_keycode; ++keysym_idx){
printf(" %8x", keysyms[keysym_idx + keycode_idx * keyboard_mapping->keysyms_per_keycode]);
}
putchar('\n');
}
free(keyboard_mapping);
}
int main(){
xcb_connection_t* connection = xcb_connect(NULL, NULL);
const xcb_setup_t* setup = xcb_get_setup(connection);
xcb_show_keyboard_mapping(connection, setup);
xcb_disconnect(connection);
}
。
xcb_key_symbols_get_keycode()
如果您想要相反的映射(Keysyms-to-keycodes),您可能想要
keysymdef.h
,我不知道。
,不,您不需要XKB来处理键盘工作。您可能想要的大多数事情都可以使用Core X协议来完成,包括但不限于修改上述键代码到键盘映射,抓住键盘,抓住鼠标,使用所有8个修饰符发送键盘,发送键盘/鼠标输入,并写下“ pseudo unicode”(ie。东西)