Bug 43925
| Summary: | Не переключает раскадку IBus через клавиатурное сочетание для Education XFCE | ||
|---|---|---|---|
| Product: | Sisyphus | Reporter: | Evgeny Shesteperov <alimektor> |
| Component: | libxfce4ui | Assignee: | Mikhail Efremov <sem> |
| Status: | NEW --- | QA Contact: | qa-sisyphus |
| Severity: | normal | ||
| Priority: | P5 | CC: | aris, boyarsh, cas, karonus, rauty, sem |
| Version: | unstable | ||
| Hardware: | x86_64 | ||
| OS: | Linux | ||
Результат проверки актуальности Состояние: Образ Education XFCE p10 EOL. Sisyphus: ibus 1.5.34, Super+space по умолчанию; параллельно открыт 56102 про хоткеи. Без проверки на текущем XFCE нельзя сказать, жив ли срыв переключения. Рекомендация: ретест Win+Space на XFCE Sisyphus/p11 Sisyphus 2026-09-17, Альт Образование 11.2 XFCE: ibus-1.5.34-alt1, ibus-m17n-1.4.40-alt1, libm17n-db-1.8.6-alt1, branding-alt-education-xfce-settings-11.2-alt1. Шаги из описания повторены (ru-translit (m17n) добавлен, «Использовать системную раскладку» включено, триггер <Super>space): воспроизводится, но причина не в ibus. В Education XFCE голые Super_L/Super_R заняты whisker-меню: $ xfconf-query -c xfce4-keyboard-shortcuts -p /commands/custom/Super_L xfce4-popup-whiskermenu $ rpm -qf /etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml branding-alt-education-xfce-settings-11.2-alt1.x86_64 xfsettingsd захватывает Super, и ibus не видит Super+Space: с привязкой `ibus engine` после Super+Space остаётся xkb:us::eng (текст «privet mir»); после xfconf-query -c xfce4-keyboard-shortcuts -p /commands/custom/Super_L -r (и Super_R) то же нажатие переключает на m17n:ru:translit, «privet» набирается как «привет» и в xterm (XIM через ibus-x11), и в mousepad (с ibus-gtk3): e1 xkb:us::eng → e2 m17n:ru:translit → e3 xkb:us::eng, текст «privet привет mir». Замечание к шагам: `apt-get install ibus-m17n libm17n-db` не ставит ibus-gtk3 (/usr/lib64/gtk-3.0/3.0.0/immodules/ без im-ibus.so), так что GTK-приложения без него ibus не используют вовсе — переключение через трей меняет только глобальный движок. aris@: стоит подумать о Requires/Recommends ibus-gtk3 в ibus. Перевешиваю на branding-alt-education: нужно снять привязку голого Super с whisker-меню либо вызывать меню иначе (xcape / собственная обработка Super в whiskermenu), чтобы не ломать Super+Space. Причина не в ibus и не в конкретном сочетании. Одиночный модификатор как горячая клавиша реализован в libxfce4ui: xfce_shortcuts_grabber_xgrab() делает XGrabKey(xdisplay, g.keycode, g.non_virtual_modifiers | ..., root_window, False, GrabModeAsync, GrabModeAsync) — https://gitlab.xfce.org/xfce/libxfce4ui/-/blob/9e5b8a1efbd887821d451bb68d582bdeee2c5e7b/libxfce4kbd-private/xfce-shortcuts-grabber.c#L273-277 . Для сочетания из одной клавиши Super_L маска модификаторов нулевая, то есть захватывается сама клавиша Super, нажатая без Ctrl, Alt и Shift. Выполнение команды при этом отложено до отпускания клавиши — проверка is_modifier_key() в фильтре событий, https://gitlab.xfce.org/xfce/libxfce4ui/-/blob/9e5b8a1efbd887821d451bb68d582bdeee2c5e7b/libxfce4kbd-private/xfce-shortcuts-grabber.c#L797 — чтобы меню не вылезало при каждом Super+<клавиша>. Пока Super удерживается, клавиатура активно захвачена xfsettingsd, и следующая нажатая клавиша уходит ему, а не приложению в фокусе. ibus ловит свой переключатель пассивным захватом XI2 на корневом окне — XI.grab_keycode(...), строка 245 в ibus/ui/gtk3/keybindingmanager.vala, https://git.altlinux.org/gitoskop/#/srpms/i/ibus.git/-/blob/sisyphus/ibus/ui/gtk3/keybindingmanager.vala — и активироваться в это время не может. (XGrabKey(3): пассивный захват срабатывает только при условии "the keyboard is not grabbed", а активный "terminated automatically when ... the specified key released".) Перезапустить событие тоже не выйдет. XAllowEvents действует только на замороженную клавиатуру, а при GrabModeAsync она не заморожена. С GrabModeSync мимо по другой причине: ReplayKeyboard пропускает пассивные захваты на том же окне и выше по дереву ("ignores any passive grabs at or above ... the grab_window"), а захват ibus висит ровно на корневом окне. Брендинг тут не при чём: то же получит любой, кто назначит одиночный Super через настройки сочетаний клавиш. Апстрим этот сценарий уже видел: issue #29 https://gitlab.xfce.org/xfce/libxfce4ui/-/issues/29 описывает ровно whiskermenu на Super_L плюс переключение метода ввода на Super+space и закрыт как дубликат #1 https://gitlab.xfce.org/xfce/libxfce4ui/-/issues/1 . Исправление #1 отложило одиночный модификатор на отпускание и тем убрало двойное срабатывание, но не то, что чужой захват на Super+<клавиша> перестаёт активироваться. Дефект не только в Альт Образовании. Та же привязка раздаётся в branding-simply-linux (строки 7-8, и в p11, и в Sisyphus), https://git.altlinux.org/gitoskop/#/gears/b/branding-simply-linux.git/-/blob/sisyphus/xfce-settings/etcskel/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml ; в Sisyphus этот файл вообще приходит только из двух пакетов брендинга — нашего и Simply Linux. Конфигурация одна и та же, так что на Simply Linux ожидаемо воспроизводится так же. Убрать привязку в брендинге — не починка. Дефект остаётся, и симптом вернётся у любого, кто назначит одиночный Super себе сам. По сути это отказ от целого класса сочетаний: одиночный модификатор нельзя использовать, не сломав Super+<клавиша> у всех остальных программ. Поэтому перевешиваю на libxfce4ui. Как чинить — вопрос к сопровождающему: очевидного решения средствами X11 нет, возможные пути — отпускать захват после нажатия любой другой клавиши либо перезапускать событие через XTEST. |

Description
Evgeny Shesteperov 2022-10-03 13:46:53 MSK