Как я могу изменить плагин монитора Kbd XMobar так, чтобы нажатие на него повторялось по макетам?

Плагин монитора 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 позволит переключаться между этими двумя макетами, а плагин, как есть, будет отражать, какой макет используется. Но я не хочу сопоставлять какую-либо клавишу с действием переключения раскладки.

Ну, дело не в том, что мне не нужно это решение, но мне интересно узнать, каким будет другое решение.


(Я удалил предыдущий вопрос, потому что конкретный сценарий, который побудил меня его сформулировать, на самом деле усложнил дело. Я отменю его, если ответа на этот вопрос будет недостаточно для этого.)

Обратите внимание, что Kbd предлагает только замену строки для отображения, без фактического переключения, и нет стандартной команды CLI для поворота макета. Но есть множество инструментов, которые заполняют этот пробел, например. xkb-switch (написано на C++) или Rotate-Keyboard-Layout (написано на Python). Приложив некоторые усилия, это также можно сделать в сценарии оболочки, отслеживая вручную и соответственно используя setxkbmap. Какой бы вариант вы ни выбрали, просто используйте эту программу или скрипт в качестве команды в <action=command>, чтобы вызвать ее щелчком мыши.

pmf 13.03.2024 09:23

@pmf, я понимаю вашу точку зрения, и это может быть решением, к которому я в конечном итоге прибегну, но пока я исключаю это, потому что (1) да, я знаю, как это сделать, и (2) я хочу понять, что являются наиболее жизнеспособными и/или подходящими решениями для написания плагина xmobar, который может реагировать на клики своим кодом, а не косвенно через внешнюю команду. Я попытаюсь перефразировать вопрос, чтобы подчеркнуть этот момент.

Enlico 13.03.2024 18:53

@pmf, мне удалось улучшить плагин для переключения клавиатуры :)

Enlico 30.03.2024 08:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На самом деле, лучшее решение — просто жестко запрограммировать действия в момент создания 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.

Другие вопросы по теме