LINUX.ORG.RU

XCB keycode в ASCII вопрос

 


2

1

делаю

event = xcb_poll_for_event(...)
....
const xcb_key_release_event_t *key = (const xcb_key_release_event_t *)event;
switch (key->detail){кнопки...}

как из кодов key->detail сделать коды ASCII как в javascript или в виндовс

без подключения x11 (оно deprecated и на С++)

только Си

в доках стоит «TODO: Talk about getting the ASCII code from the key code.»

прочие интернет туториалы останавливаются на

You might expect that detail would identify the key using ASCII or Unicode. Alas, this is not the case. To determine the pressed key, an application needs to call functions from the xcb_keysyms.h header. These functions aren’t documented and I can find few examples of their use. Therefore, this article won’t explain them in any detail.

единственное что удалось нагуглить из qt5 чтото похожее на рабочее решение

тоесть мне проще вручную кнопочки забиндить по кодам чем искать чтото готовое?

Попробуй xcb_key_symbols_get_keysym или смотри тут: https://github.com/i3/i3/blob/next/src/bindings.c

без подключения x11 (оно deprecated и на С++)

Что? Если ты про libX11, то оно на C. И хоть и deprecated в пользу XCB, имеет хотя бы внятную документацию. Чтобы пользоваться XCB, зачастую нужно разбираться в кишках протокола X11, а то и в сорцы лезть.

NeXTSTEP ★★ ()
Ответ на: комментарий от anonymous

что ты хотел

как из кодов key->detail сделать коды ASCII

эти key->detail это физические номера клавиш на клавиатуре, которые разные между разными клавиатурами(и количеством кнопок)

очевидно их нужно привязывать к карте клавиш xkeymap и дальше конвертировать в ASCII

и нет ни 1 примера такого, приходится каждому проекту самому костылять (в qt свой костыль, в VLC свой, в Хроме свой)

когда эта операция не должна занимать больше 1 сек у кодера, но этожи опенсурс да

svv20624 ()
Ответ на: комментарий от svv20624

очевидно их нужно привязывать к карте клавиш xkeymap и дальше конвертировать в ASCII

в VLC это сделано циклом прохода по всем клавишам https://github.com/videolan/vlc/blob/master/modules/control/globalhotkeys/xcb.c#L397

программирование циклами в 2020, ух крутота

svv20624 ()

кароче делается просто, сначала xcb_key_symbols_t* keySymbols = xcb_key_symbols_alloc(connection);

потом засунуть в свою карту(массив) символов в цикле (вместо XK_A все нужные кнопки по одной) и сделать их привязку к ASCII (ручками) xcb_keycode_t* keysyms=xcb_key_symbols_get_keycode(keySymbols, XK_A);

в конце xcb_key_symbols_free(keySymbols);

и по key->detail ищется нужный элемент в сгенерированном(выше) массиве

svv20624 ()

С такой же задачей столкнулся и тоже со всеми этими:

TODO: Talk about getting the ASCII code from the key code.

В официальной документации и:

You might expect that detail would identify the key using ASCII or Unicode. Alas, this is not the case. To determine the pressed key, an application needs to call functions from the xcb_keysyms.h header. These functions aren’t documented and I can find few examples of their use. Therefore, this article won’t explain them in any detail.

В туториалах.

Лол и за это говно (иксы и все его подобные недокументированные либы) ещё местные клоуны «иксовые утята» глотки рвут.

Очень хорошо, что RedHat закопает X.Org со всем этим говном вроде Xlib (X11), Xt, Xaw, Xm, xcb, xkb…

EXL ★★★★★ ()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от svv20624

Я у себя так сделал:

xcb_key_symbols_t *key_symbols = xcb_key_symbols_alloc(connection);
int done = 0;
xcb_generic_event_t *event = NULL;
while (!done && (event = xcb_wait_for_event(connection))) {
    switch (event->response_type & ~0x80) {
        case XCB_EXPOSE:
            draw(connection, window, gcontext);
            xcb_flush(connection);
            break;
        case XCB_KEY_PRESS: {
            xcb_key_press_event_t *keypress_event = (xcb_key_press_event_t *)(event);
            xcb_keysym_t keysym = xcb_key_symbols_get_keysym(key_symbols, keypress_event->detail, 0);
            switch (keysym) {
                case XK_q:
                    done = 1;
                    break;
                default:
                    e_key_event(keysym);
                    break;
            }
            xcb_clear_area(connection, 1, window, 0, 0, HEIGHT, WIDTH);
            xcb_flush(connection);
            break;
        }
    }
    free(event);
}
xcb_key_symbols_free(key_symbols);

Но мне нужны были не ASCII, а иксовые keysyms. Значения из keypress_event->detail с ними не совпадали.

Ты ещё забыл упомянуть, что нужно подрубить либу libxcb-keysyms для того, чтобы, <вырезан мат>, нажатия кнопочек обработать. В Fedora/CentOS/RHEL это будет пакет xcb-util-keysyms-devel.

Качество документации XCB ужасное. Вот что за хрень этот col? А хер его знает, с 0-ём вроде работает. С другими значениями некоторые кнопки отдают не свой keysym, а 0.

// #include <xcb/xcb_keysyms.h>
xcb_keysym_t xcb_key_symbols_get_keysym(xcb_key_symbols_t *syms, xcb_keycode_t keycode, int col);

А байтодроч & ~0x80 по маске в switch’е event’ов для чего вообще нужен и почему константой? Везде в доках используется но объяснения не нашёл.

Мне непонятно, почему <вырезан мат> все дропнули libX11 (он же Xlib) и перешли на этот кусок XCB. Действительно, Xlib хотя бы документирован достаточно хорошо. А эту либу написали, проставили везде TODO: и забросили. Сиди и ковыряй исходники Qt, VLC и прочих проектов, чтобы понять как оно работает.

EXL ★★★★★ ()
Ответ на: комментарий от EXL

Лол и за это говно (иксы и все его подобные недокументированные либы) ещё местные клоуны «иксовые утята» глотки рвут.

Ну, иксы хотя бы работают, имеют неплохой функционал из коробки (позволяют делать скриншоты из командой строки, позволяют рисовать примитивами без сторонних библиотек,... и т.д.) и для них уже есть куча готового софта (включая софт, который работает без GTK и Qt, а также WM'ы с хорошей настраиваемостью как, например, тот же FVWM).

Wayland же и софт под него пока ещё только пилят. Вероятно, со временем под него появится достаточно много софта и нетайловых гибких WM'ов (хотя, как быть с тем же скриншотированием из командной строки пока ещё не совсем понятно; видимо, для каждого WM'а придётся писать свою отдельную скриншотилку, которая будет использовать API конкретного WM'а (в то время как в иксах можно пользоваться одной во всех WM'ах)), но пока ещё слишком рано об этом говорить.

saahriktu ★★★★★ ()