Ungrabbing keyboard 不是 ungrabbing keys - 由 api 设计?

Ungrabbing keyboard is not ungrabbing keys - by api design?

我正在使用 xcb_grab_key_checked 获取密钥:

xcb_void_cookie_t grabc = xcb_grab_key_checked(connection, 1, rootwin, grabmodflag, keycode, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
xcb_generic_error_t *grabe = xcb_request_check(connection, grabc);
if (grabe == NULL) debug_log("succeessfully grabbed");

为了取消所有这些键,我使用 xcb_ungrab_keyboard_checked:

xcb_void_cookie_t ungrabc = xcb_ungrab_keyboard_checked(connection, XCB_CURRENT_TIME);
xcb_generic_error_t* ungrabe = xcb_request_check(connection, ungrabc);
if (ungrabe == NULL) debug_log("succesfully ungrabbed");

然而它似乎并没有取消抓取钥匙。这是设计使然吗?

是的,这是设计使然。抓键和抓键盘是截然不同的操作。抓住键盘并不意味着抓住所有按键。

抓取一个键,实际上就是让那个键发起键盘抓取。按键抓取通常用于实现热键。键盘抓取将所有按键事件转移到客户端。键盘抓取是短暂的(tje 最后一次,例如,当显示 pop-up 菜单时),键抓取是长期的(热键很少更改)。