Плагин монитора Kbd можно установить в строку состояния xmobar следующим образом:
Run $ Kbd [("it", "IT"), ("ru(phonetic)", "RU")]
а затем переключите клавиатуру с помощью setxkbmap, монитор отобразит изменение.
Все идет нормально.
Теперь предположим, что
[] выше)даже если для этого потребуется написать плагин MyOwnKbd.
Также предположим, что еще одним требованием является то, что я не хочу, чтобы логика вращения была закодирована во внешнем скрипте.
Поскольку я не хочу привязывать клавишу к переключению между клавиатурами¹, я подумал о том, чтобы разрешить переключение нажатием на сам монитор.
Я знаю, что могу просто обернуть текст монитора <action=`the command`> и </action>, чтобы сделать его кликабельным, но понятия не имею, каким должен быть the command.
Я знаю, что я мог бы написать сценарий оболочки, который определяет состояние клавиатуры и устанавливает другое, но я хочу использовать тот самый список выше, [("it", "IT"), ("ru(phonetic)", "RU")] в качестве источника того, какие раскладки клавиатуры должны проходить при нажатии на монитор, поэтому вопрос становится: могу ли я передать событие щелчка по монитору обратно в бизнес-логику монитора?
Или, если это невозможно, какие еще у меня есть альтернативы?
(¹) Например. я мог бы сделать
setxkbmap -layout it,ru -variant ,phonetic -option 'grp:caps_toggle'
раз и навсегда, и Caps Lock позволит переключаться между этими двумя макетами, а плагин, как есть, будет отражать, какой макет используется. Но я не хочу сопоставлять какую-либо клавишу с действием переключения раскладки.
Ну, дело не в том, что мне не нужно это решение, но мне интересно узнать, каким будет другое решение.
(Я удалил предыдущий вопрос, потому что конкретный сценарий, который побудил меня его сформулировать, на самом деле усложнил дело. Я отменю его, если ответа на этот вопрос будет недостаточно для этого.)
@pmf, я понимаю вашу точку зрения, и это может быть решением, к которому я в конечном итоге прибегну, но пока я исключаю это, потому что (1) да, я знаю, как это сделать, и (2) я хочу понять, что являются наиболее жизнеспособными и/или подходящими решениями для написания плагина xmobar, который может реагировать на клики своим кодом, а не косвенно через внешнюю команду. Я попытаюсь перефразировать вопрос, чтобы подчеркнуть этот момент.
@pmf, мне удалось улучшить плагин для переключения клавиатуры :)





На самом деле, лучшее решение — просто жестко запрограммировать действия в момент создания Kbd:
Run $ Kbd [("it", "<action=`setxkbmap -layout ru -variant phonetic` button=1>it</action>"),
("ru(phonetic)", "<action=`setxkbmap -layout it` button=1>ru</action>")]
В конце концов я сам придумал решение , которое было объединено с PR №696.
Когда я написал
Я знаю, что могу просто обернуть текст монитора
<action=`the command`>и</action>, чтобы сделать его кликабельным, но понятия не имею, какой должна быть команда.
Я совершил ошибку, думая, что мне нужно знать the command, что делает правильные вещи независимо от текущего макета, но это неверно, поскольку я могу просто вычислить другую команду для каждого макета, которая просто переключится на следующий.
Чтобы привести конкретный пример, если я установлю плагин следующим образом:
Run $ Kbd [("it", "IT"), ("ru(phonetic)", "RU"), ("us", "US")]
текст, который я хочу напечатать, когда выбран каждый из трех макетов, выглядит следующим образом:
"<action=`setxkbmap -layout ru -variant phonetic` button=1>IT</action>""<action=`setxkbmap -layout us` button=1>RU</action>""<action=`setxkbmap -layout it` button=1>US</action>"Это позволит переключать раскладки в порядке IT->RU->US. В коде, который я добавил в xmobar, я также обернул их в действия, чтобы перемещаться в противоположном направлении с помощью button=3.
Обратите внимание, что
Kbdпредлагает только замену строки для отображения, без фактического переключения, и нет стандартной команды CLI для поворота макета. Но есть множество инструментов, которые заполняют этот пробел, например. xkb-switch (написано на C++) или Rotate-Keyboard-Layout (написано на Python). Приложив некоторые усилия, это также можно сделать в сценарии оболочки, отслеживая вручную и соответственно используяsetxkbmap. Какой бы вариант вы ни выбрали, просто используйте эту программу или скрипт в качестве команды в<action=command>, чтобы вызвать ее щелчком мыши.