带有XCB

问题描述 投票:0回答:2

这可能是一个过时的问题,但我发现它仍然有效。 您可以通过XCB启用XKB扩展,然后获取KeyMap,它是通过XCB API(或更具体地说是从XKB KeyMap的状态)进行布局的布局和适当的Keysym。 links:

libxkbCommon快速启动

X11支持
keyboard xcb
2个回答
4
投票
xcb_x11

调用之前创建扩展名)。 (使用设备ID,您可以调用

xkb_x11_keymap_new_from_device

返回

xkb_keymap

指针)。

或使用Xlib的

XKeysymToString()

中找到它,而且我认为没有该功能的XCB端口的存在,但是您可以基于

1
投票
的XCB端口,但是您可以基于

/* 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。东西)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.