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
() автор топика
12 июня 2020 г.

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

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 ★★★★★
()

Кек:

case XCB_KEY_RELEASE: {
    xcb_key_release_event_t *kr = (xcb_key_release_event_t *)event;
    
    switch (kr->detail) {
        /* ESC */
        case 9: {
            free (event);
            xcb_disconnect (connection);
            return 0;
        }
    }
    free (event);
}

https://xcb.freedesktop.org/tutorial/fonts/

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

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

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

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

saahriktu ★★★★★
()
23 октября 2020 г.
Ответ на: комментарий от svv20624

Ну уж посильнее твой аргументации, хотя прости бью по больному, её ведь нет.

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

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

Wayland ещё хуже. Там вообще полный бардак и каждая desktop environment реализует свой Wayland сервер и непонятно какие там специфические баги и насколько он совместим с другими. Не все Wayland серверы поддерживают server side decorations. Из другой важной функциональности много чего является опциональным и не реализовано во всех серверах.

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

Wayland ещё маргинальнее Haiku. Его уже 8 лет пилят, а так и не сделали в основных дистрибутивах по умолчанию и там до сих пор ничего нормально не работает.

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

Wayland хотя бы не имеет тиринга из-за Race Conditions в своих эталонных реалзациях. Уже за это одно иксы и всю их инфраструктуру можно смело отправлять в /dev/null. Они не UNIX-Way’ны, они даже не могут делать нормально то, для чего они предназначались. RedHat потихоньку выкидывает этот хлам из нашего бренного мира, как выкинул уже такую же гору костылей, изоленты и подпорок сравнимую с X.Org – SysVinit. Так что пожелаем ему удачи.

Кстати, человек (Julien Danjou) который учавствовал в разработке сабжевого XCB, рожденного в муках, давно написал разгромную статью с критикой всего того говна и X.Org-дури:

https://julien.danjou.info/thoughts-and-rambling-on-the-x-protocol/

Некоторые его прогнозы спустя десятилетия начинают сбываться. Julien Danjou далеко не ноунейм и кроме XCB у него за плечами один из самых популярных WM для иксов – Awesome.

EXL ★★★★★
()
Ответ на: комментарий от X512
  • В последнем Debian по умолчанию Wayland-сеанс.
  • В Fedora уже как года два по умолчанию Wayland-сеанс.
  • В CentOS 8 и RHEL 8 по умолчанию Wayland-сеанс.
  • SUSE SLE одни из первых Enterprise-дистров заюзали Wayland по умолчанию.
  • В LTS-версиях Ubuntu по умолчанию X.Org, в не LTS, насколько я помню – Wayland.

Каких еще умолчаний надо-то? Остался лишь KDE но и они потихоньку перелазят. В Fedora в следующем релизе по умолчанию KDE будет на Wayland.

P.S. А пилят его куда больше 8 лет.

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

нет ничего маргинальнее настолько непопулярной ос. его хоть можно запустить на обычном линуксе с обычными de

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

Wayland хотя бы не имеет тиринга из-за Race Conditions в своих эталонных реалзациях. Уже за это одно иксы и всю их инфраструктуру можно смело отправлять в /dev/null.

Проблемы эстетов, не волнующие обычного пользователя. В Wayland намного больше более серьёзных проблем.

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

Проблемы эстетов, не волнующие

весь лор засран срачами про тиринг. давай уже плыви отсюда, ихтиандр фигов

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

В Wayland намного больше более серьёзных проблем.

Главное что он выполняет хорошо то, для чего он был предназначен: рисует картинку без разрывов и гонок состояний. Остальное приложится.

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

Главное что он выполняет хорошо то, для чего он был предназначен: рисует картинку без разрывов и гонок состояний.

GUI сервер - это не только рисование картинки, это ещё распределение ввода, обработка поведения окон, взаимодействие между окнами, декорации, drag&drop, скриншоты и запись видео экрана и окон и т.д..

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

В LTS-версиях Ubuntu по умолчанию X.Org, в не LTS, насколько я помню – Wayland.

Ubuntu 20.10 LiveUSB. Используется Xorg:

systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager───2*[{NetworkManager}]
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─acpid
        ├─avahi-daemon───avahi-daemon
        ├─bluetoothd
        ├─colord───2*[{colord}]
        ├─cron
        ├─cups-browsed───2*[{cups-browsed}]
        ├─cupsd
        ├─dbus-daemon
        ├─gdm3─┬─gdm-session-wor─┬─gdm-x-session─┬─Xorg───9*[{Xorg}]
        │      │                 │               ├─gnome-session-b─┬─ssh-agent
        │      │                 │               │                 └─2*[{gnome-session-b}]
        │      │                 │               └─2*[{gdm-x-session}]
        │      │                 └─2*[{gdm-session-wor}]
        │      └─2*[{gdm3}]

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.