LINUX.ORG.RU

i3 и отображение текущей раскладки в i3status?

 ,


0

1

Была тема на форуме. i3 и отображение текущей раскладки. Но я так и не понял, как встроить в i3status.conf прилагавшийся скрипт:

while :
do
    read line
    LG=$(setxkbmap -query | awk '/layout/{print $2}') 
    case "$(xset -q|grep LED| awk '{ print $10 }')" in
        "00000000") LG="US" ;;
        "00001004") LG="RU" ;;
    esac
    echo "LG: $LG | $line" || exit 1
done

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

Очень нужно умение встроить индикацию раскладки в i3status, на новой клавиатуре раскладка почти не видна… Помимо вышеупомянутого скрипта, нашёл ещё на гите скрипт https://github.com/porras/i3-keyboard-layout и хотя это «переключалка» раскладок, но он и в трее показывает раскладку тоже, можно смирится, что переключением будут заниматься два способа: через localectl и новый i3-keyboard-layout, но там возник другой вопрос, не принимает в ~/.config/i3/config строчку следующего вида:

status_command i3status -c ~/.config/i3/i3status.conf | i3-keyboard-layout i3status

?



Последнее исправление: Dimez (всего исправлений: 1)

расскажу как сделано у меня. строку статуса я генерирую своим собственным скриптом на питоне. в конфиге i3 это записано вот так:

bar {
    status_command statusbar.py
}

основной цикл statusbar.py выглядит так:

while True:
    refresh_statusbar()
    if select([xkb.stdout], [], [], statusbar_refresh_time_s)[0]:
        layout_val = xkb.stdout.readline()

где refresh_statusbar() пересчитывает показатели и печатает строку статуса, а xkb — это сабпроцесс самописной сишной утилиты, выводящей текущую раскладку в свой stdout, при её изменении.

таким образом, получается, что, если раскладка в течение statusbar_refresh_time_s (стоит аргументом timeout у select()) не была переключена, то в xkb.stdout ничего не выводится и select() возвращает пустой список (интерпретируется как False), то есть происходит обычное обновление строки статуса через заданный интервал, а если раскладка была переключена, то select() возвращает список с дескриптором (интерпретируется как True) и происходит моментальное обновление строки статуса, не дожидаясь таймаута.

на деле это выглядит так, что переключение раскладки отображается в строке статуса мгновенно.

самописную сишную утилиту могу скинуть, если надо, там 30 строчек всего. statusbar.py я скинуть постесняюсь, там много неочевидных вещей и довольно индивидуальный набор показателей, который не всем подойдёт, да и в целом скрипт выглядит довольно неряшливо, похож на черновик :) но я с этим «черновиком» уже лет 10. хотел переписать на go, но после того, как изучил go понял, что мне этого не хочется.

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

setxkbmap -layout «us,ru» -option -option grp:caps_toggle -option grp_led:caps

Ну, про то я давно уже знаю. Более того, раскладку я настраиваю с помощью localectl:

localectl set-x11-keymap «us,ru» «» «» «grp:ctrl_shift_toggle,grp_led:scroll»

Вопрос именно про отображение типа раскладки в панели. Пока что вижу в десктопах только iBus, но не хочу: глючно и тяжело. Реальнее отображение общесистемной раскладки. Только в LXQT увидел значок отображения раскладки.

moskvich
() автор топика
20 июня 2025 г.
Ответ на: комментарий от moskvich
Gemini, Трей по-умолчанию есть в sway, и даже отображается blueman-tray, а xxkb - нет. А почему собственно???

Вы задали очень хороший вопрос, который подводит нас к ключевому различию между X11 и Wayland. Вот почему blueman-applet (часть Blueman) отображается в трее Sway, а xxkb — нет:

  • Wayland и X11-приложения (XWayland):
    • Sway – это композитор Wayland. Он работает на более современном протоколе отображения, который не является X11.
    • Однако, для обратной совместимости, Sway (и другие Wayland-композиторы) используют слой совместимости под названием XWayland. Это позволяет запускать старые X11-приложения в среде Wayland.
    • Когда вы запускаете X11-приложение под Sway, оно фактически запускается через XWayland.
  • Стандарты системного трея:
    • В X11 исторически использовался протокол XEmbed для системного трея. Это старый, но широко используемый способ для приложений отображать значки в трее. xxkb использует именно этот протокол.
    • В Wayland и более современных средах рабочего стола (таких как KDE Plasma, GNOME, и, соответственно, Sway) используется более новый стандарт, называемый StatusNotifierItem (SNI). SNI основан на D-Bus и является более современным и безопасным способом для приложений взаимодействовать с системным треем.
  • Причина неработоспособности xxkb:
    • xxkb является чистым X11-приложением и полагается на протокол XEmbed.
    • Swaybar (панель Sway), которая предоставляет системный трей, не поддерживает XEmbed. Swaybar поддерживает только более современный протокол SNI.
    • Поэтому, когда xxkb пытается разместить свой значок в трее, Swaybar его просто игнорирует, потому что не понимает протокол XEmbed.
  • Почему blueman-applet отображается:
    • Вероятно, blueman-applet (или его компоненты) был обновлен для поддержки протокола StatusNotifierItem (SNI), либо он использует какую-то прослойку (например, xembed-sni-proxy), которая конвертирует XEmbed в SNI. Многие современные GTK- и Qt-приложения уже перешли на использование SNI, чтобы быть совместимыми с Wayland. Что делать, если вы хотите отображать раскладку клавиатуры в Sway: Как я уже упоминал, Sway напрямую управляет раскладкой клавиатуры через xkb_layout и xkb_options в вашем конфиге. Для отображения текущей раскладки вам следует использовать:
  • Waybar: Это популярная статус-панель для Wayland, которая отлично интегрируется со Sway. Waybar имеет встроенные модули для отображения текущей раскладки клавиатуры. Вам просто нужно добавить соответствующий модуль в конфигурацию Waybar. Пример части конфига Waybar:
   "modules-right": [
    "tray",
    "pulseaudio",
    "backlight",
    "keyboard-state", // Вот этот модуль!
    "clock"
],
"keyboard-state": {
    "numlock": true,
    "capslock": true,
    "layout-indicator": {
        "on-click": "swaymsg input type:keyboard xkb_switch_layout next"
    },
    "block": {
        "format": "{name} {layout}"
    }
},
  • Собственный скрипт: Вы можете написать небольшой скрипт, который будет получать текущую раскладку клавиатуры с помощью swaymsg и выводить её для вашей панели (например, если вы используете i3status или аналогичный инструмент, который запускает внешний скрипт).

Таким образом, проблема xxkb заключается в несовместимости протоколов трея между старым X11 и современным Wayland.

alx777 ★★
()