LINUX.ORG.RU

GNOME, X11, переключать по caps lock две раскладки из трёх

 , , , ,


0

1

У меня было две раскладки, которые переключались по caps lock. Я хочу добавить третью, но так, чтобы она не мешала двум основным. Один из двух вариантов подойдёт, лучше первый:

  1. Caps lock переключает только между первыми двумя. Третью можно включить каким-нибудь способом (из меню мышкой или проклацать по super+space — удобство вообще не важно).
  2. Caps lock переключает между двумя последними в использовании. По super+space можно выбрать любую.

Вообще говоря, super+space работает как раз по второму варианту — он переключает между двумя последними использованными, а если удержать super, появляется меню для выбора любой. Но caps lock почему-то тупо крутит их по кругу, а не повторяет это поведение. Может, есть способ исправить?

Я видел интересный способ здесь, который бы решил вопрос по первому сценарию, но к моему удивлению, ISO_Prev_Group и ISO_First_Group просто игнорируются! Я пытался даже отредактировать системные раскладки в /usr/share/X11/xkb/ и опытным путём понял, что эти два кода не имеют эффекта в гноме. Кто-то знает, с чем это может быть связано, куда копать, как исправить?

★★★★★

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

Выдели для каждой раскладки свою клавишу.

Спасибо за совет, но я предельно ясно описал в ОП, что требуется — и это не отдельные клавиши под разные раскладки. Это мало того что неудобно, так ещё и где я столько лишних клавиш найду?

gentoo_root ★★★★★
() автор топика

В «гноме» наврядли так можно. Вот в KDE я что-то подобное видел, вроде бы «spare layouts» или что-то такое.

P.S. Добавь тег «хочется странного».

Korchevatel ★★★★★
()

Попробуй установить конфигуратор IBus и там пошариться.

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

я предельно ясно описал в ОП, что требуется — и это не отдельные клавиши под разные раскладки.

Ну, как тебе сказать… Представь, некто говорит: «Неудобно молотком шурупы закручивать. Нет ли молотка с крестиком?» Ты ему говоришь: «Возьми отвёртку.» А тот: «Нет, мне нужен именно молоток, но с крестиком.»

…то мало того что неудобно…

Сознайся, ты ж ведь не пробовал.

так ещё и где я столько лишних клавиш найду?

Два шифта, два контрола, два альта, капс лок — семь клавиш. И это не считая того, что можно использовать одну из окошек и меню.

Ладно, я тебе предложил вариант, а ты можешь или пользовать его, или продолжать бороться с иксами.

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

Это мало того что неудобно, так ещё и где я столько лишних клавиш найду?

Как раз это самое удобное, не надо думать какая раскладка, просто перед написанием нажимаешь хоткей на нужную раскладку и пишешь. Например, CapsLock на первую, Shift+CapsLock - на вторую, а третью, включать, например, через цикличное переключение.

Средствами иксов вполне легко реализуется командой типа такого

setxkbmap -layout us,ru,ar -option grp:shift_caps_switch,grp_led:caps,grp:win_space_toggle

Можно аналогичные настройки сделать через Gnome Tweak Tool. Но лично у меня в гноме это не заработало (убунту 20.04). Мой гном игнорит и эту команду и настройки раскладки через Gnome Tweak Tool. В cinnamon все работает.

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

Это ещё большой вопрос, какой из этих способов здесь молоток, а какой микроскоп.

Два шифта, два контрола, два альта

Есть у меня привычка зажимать модификаторы и рассчитывать, что ничего не произойдёт, если я их отпущу, так и не нажав никакой хоткей. Это естественные ожидания от модификаторов. Я не готов, если это будет сопровождаться хаотичными переключениями раскладок.

Я просто хочу себе клавишу РУС/ЛАТ на месте капслока, а редкие раскладки готов включать более неудобными способами (но не настолько неудобными, как добавление её в настройках каждый раз). Мне это очень привычно, переучиваться на другие способы и менять шило на мыло не хочу.

Ладно, я тебе предложил вариант, а ты можешь или пользовать его, или продолжать бороться с иксами.

Спасибо за вариант, но я пока не сдаюсь :D

Кстати, в гноме какой-то версии, наверное, под вейлендом, я сталкивался с тем, что при быстром наборе на не очень быстром компьютере переключение раскладок запаздывало, и несколько символов набирались в старой. Такой софт, который слушает события в фоне и делает действия асинхронно с обработкой нажатий иксами, будет с большой вероятностью обладать тем же недостатком. Я уже в своё время нажрался какого-то костыля под макось, который делал переключение по капслоку и лагал подобным образом.

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

Можно аналогичные настройки сделать

Но лично у меня в гноме это не заработало

Вся суть этого треда :D

Те настройки, которые я хочу, тоже можно сделать, но в гноме это не заработало.

Тут какое-то хитрое взаимодействие иксов и гнома/ibus, которое нам мешает и которое я пока не понимаю.

setxkbmap -layout us,ru,ar -option grp:shift_caps_switch,grp_led:caps,grp:win_space_toggle

BTW, мне кажется, команда должна как-то иначе выглядеть — эта вроде просто включит два хоткея для цикличного переключения: shift+caps и super+space.

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

Есть у меня привычка…

Если ты ходил по ссылке и прочитал хотя бы первый абзац, то понял бы, что привычка твоя не пострадает, так как к переключению раскладки приводит только удар по клавише. Последовательность «нажал, подумал, отпустил» — раскладку не переключает.

Мне это очень привычно, переучиваться на другие способы и менять шило на мыло не хочу.

Ты не ответил на вопрос — пробовал ли ты назначить каждой раскладке свою клавишу. Моя догадка, что не пробовал.

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

Включатели и переключатели раскладок — это не шило и мыло, это божий дар и яичница.

Такой софт, который слушает события в фоне… будет с большой вероятностью…

Смешно, ей-богу. Ты, который ни разу не запускал софтину, рассказываешь свои предположения о её мнимых недостатках человеку [мне], который этой софтиной ежедневно пользуется уже более семи лет.

Ладно, я дал тебе отличный совет, который ты, в силу ограниченности твоего опыта, не понимаешь. Ну, ок. Удачи в борьбе с иксами и человеческими ограничениями.

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

привычка твоя не пострадает

Ты не поверишь, у меня есть ещё и привычка долбить клавишу-модификатор много раз :D. По крайней мере, когда я сажусь за какую-нибудь венду, там постоянно вылазят эти окошки, которые активируются по восьмикратному нажатию на шифт и по удержанию шифта сколько-то секунд (это разные окошки).

Люди, которые используют переключатель раскладки точно так же не понимают, насколько включатели удобнее переключателей.

Окей, позволь мне дальше заблуждаться, жить в неведении, страдать от Даннинга-Крюгера и не осознавать всего удобства включателей. Я так привык, и мне достаточно хорошо, чтобы ничего не хотелось менять.

К тому же, на работе приходится пользоваться другими ОС, и если лагающие костыли для капслока ещё можно присрать и туда, то чем более кастомный способ переключения, тем меньше шансов хоть как-то завести его на оффтопик-системах.

Ты, который ни разу не запускал софтину, рассказываешь

Успокойся, я всего лишь предположил наиболее вероятный принцип её работы, исходя из своего опыта использования подобного софта под линуксом и не под линуксом. Раз у тебя есть семилетний опыт пользования именно этой софтиной, может, расскажешь, как возможно избежать вышеописанного race condition, если иксы обрабатывают клавиши сами по себе и шлют их в окно, а софтина в параллельном треде переключает раскладку?

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

BTW, мне кажется, команда должна как-то иначе выглядеть — эта вроде просто включит два хоткея для цикличного переключения: shift+caps и super+space.

Нет. Вот описание из /usr/share/X11/xkb/rules/base.lst (там можно найти все варианты).

grp:shift_caps_switch Caps Lock to first layout; Shift+Caps Lock to last layout

Только все-таки не «last layout», а «second layout». Во всяком случае у меня работает именно так.

grp:win_space_toggle Win+Space

Первая опция - не цикличное переключение. Я использую этот способ переключения постоянно.

Вторую опцию я просто вставил в команду для проверки. У меня отрабатывает именно так, как я написал: добавляется layout «ar» (что-то арабское, так у меня две раскладки, для проверки вставил), первые две включаются через Caps и Shift+Caps, Win+Space переключает по кругу.

Вся суть этого треда :D

Я не осилил, мне кажется, что они просто это сломали. Пару часов провел в гугле, подтверждение проблемы нашел, даже на лоре есть темы, решения не нашел. Забил, так как основное DE - Cinnamon, Гном хотел попробовать «на поиграться», посмотреть, до какого состояния юзабельности его можно довести. Так как «играться» с непривычной раскладкой люто бесит, я просто забил.

another ★★★★★
()

Короче, нашёл причину этого дебильного поведения:

https://gitlab.gnome.org/GNOME/mutter/-/blob/6eeeffdc680a41057da1ab4d1b75185d...

Mutter творит какую-то очень кастомную фигню. Он пытается распарсить выбранный метод переключения раскладок, грабит соответствующие модификаторы, а когда их нажимают, эмитит сигнал, который потом ловится гном-шелом, и последний переключает раскладку на следующую:

https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/ed628b90d7f8a66bb0b2850566c...

В этом всём бардаке вообще нет места всяким ISO_Prev_Group, ISO_First_Group и т.п. Более того, нет места даже кастомным методам переключения, потому что всё захардкожено. Собственно, они даже стандартные не осилили сделать, например, есть метод shifts_toggle, который переключает вперёд по LeftShift+RightShift и назад по RightShift+LeftShift — и вторая комбинация в гноме не работает.

Я так понимаю, это сделано для унификации кода с wayland, отсюда неутешительные выводы (поправьте, если где не прав):

  1. Под вейлендом переключение раскладок будет всегда работать, как помойка, и будет зависеть от оконного менеджера.
  2. Говно из mutter не отключается.
  3. Исправить это не представляется возможным, потому что «фикс» заключается в «интеграции» в mutter всего кода из иксов, который парсит конфиги xkb, а это по определению не может быть фиксом, потому что развалится при первом же изменении этого кода в иксах.
  4. Говнокод в гноме стал ещё более tightly coupled между компонентами, а границы responsibility размыты донельзя. Mutter, gnome-shell, gnome-settings-daemon, ibus (в одностороннем порядке) знают слишком много про реализации друг друга и опираются на это. Заменить один из компонентов (например, mutter) не представляется возможным, поскольку другие лезут ему внутрь и поскольку mutter — это не только оконный менеджер, а ещё миллион других обязанностей (переключение раскладок, лол).
  5. Возможно, весь этот код можно выкинуть насильно из mutter, иксы будут сами справляться переключать раскладки, но с большой вероятностью что-то отломается (индикатор или что-то ещё), учитывая то, что в gnome 3 никогда нормально переключение не работало даже в стоке. Заапстримить это не получится (не зря же они старались и делали общую кодовую базу для x11 и wayland), да и без толку — под вейлендом оно будет работать всё так же криво.

Самый простой костыль — запатчить js из gnome-shell.

Тему отмечаю как решённую, потому что нормального решения тут уже не выйдет, а костыль есть.

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

Да, фигня там какая-то. Например, если выбрать Allow different sources for each window, то при вызове Overview, сначала переключается раскладка, а потом срабатывает Overview, что приводит к небольшому заиканию интерфейса, а какой прикол в том, чтобы юзать Use the same source for all windows, я не понимаю.

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

какой прикол в том, чтобы юзать Use the same source for all windows, я не понимаю.

Я, например, юзаю. Не нужно запоминать, какая раскладка в каком окне, достаточно помнить просто глобально текущую, это довольно просто и также избавляет от необходимости смотреть на индикатор.

Больше интересно, как работают те, у кого разные раскладки в разных окнах. Например, какие есть юзкейсы поочерёдно набирать на разных языках в разных окнах; удобно ли запоминать раскладки в каждом окне или смотреть на индикатор после alt+tab.

Ну и вообще у меня бо́льшую часть времени активна латиница, кроме тех моментов, когда нужно набрать что-то кириллицей, и я её сразу выключаю после набора. Третья раскладка (из-за которой случился этот тред) нужна лишь в 0.5% случаев.

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

Я, например, юзаю. Не нужно запоминать, какая раскладка в каком окне, достаточно помнить просто глобально текущую, это довольно просто и также избавляет от необходимости смотреть на индикатор.

Ага, вот я сейчас пытаюсь освоить этот дзен, что-то туго идёт, видимо ещё не привыкну никак держать в голове текущую.

Больше интересно, как работают те, у кого разные раскладки в разных окнах. Например, какие есть юзкейсы поочерёдно набирать на разных языках в разных окнах; удобно ли запоминать раскладки в каждом окне или смотреть на индикатор после alt+tab.

У меня была главная идея, чтобы любая программа и овервью по умолчанию получают «US», а программ требующих с порога «RU» не особо много, может вацап, телега да и всё. Таким образом при вызове программ или овервью ты гарантированно получаешь «US», а остальное как пойдёт, а юзкейс похож на твой, ибо тоже

у меня бо́льшую часть времени активна латиница, кроме тех моментов, когда нужно набрать что-то кириллицей

papin-aziat ★★★★★
()
Ответ на: комментарий от gentoo_root

То, что ты хочешь (я особо не вчитывался), можно реализовать своими скриптами (не знаю, можно ли в гноме назначить Капслок, у меня на Капслоке дополнительный Контрол), причем довольно простыми. На случай, если ты захочешь это делать, могу поделиться гномовской магией для получения текущей раскладки и переключения:

# получить номер текущей раскладки в виде "(true, '0')", где 0 -- номер раскладки
gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval "imports.ui.status.keyboard.getInputSourceManager().currentSource.index"

# установить раскладку с номером 0 или любой другой -- 1, 2, 3
gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval "imports.ui.status.keyboard.getInputSourceManager().inputSources[0].activate()"

Магия переключает штатными гномовскими средствами, поэтому без изменений работает хоть в иксах, хоть в вейланде. Например, у меня был скрипт, хотя почему был, он у меня и сейчас меняет раскладку в neovim и vscode-vim (если в Insert mode русский, например, при переключении в Normal mode чтобы был английский, а при переключении в Insert вернулся русский):

$ cat $(which gnome_keyboard_layout)
#!/bin/sh

# Returns the number of current keyboard layout if script is
# running without an argument.
#
# Sets the keyboard layout, if script is running with argument (number
# of keyboard layout).

HELP1="Returns the number of current keyboard layout if script is running without an argument."
HELP2="Sets the keyboard layout, if script is running with argument (number of keyboard layout)."

GET_KL=$(gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval "imports.ui.status.keyboard.getInputSourceManager().currentSource.index")

if [ "$GET_KL" == "(true, '0')" ]; then
    KL=0
elif [ "$GET_KL" == "(true, '1')" ]; then
    KL=1
elif [ "$GET_KL" == "(true, '2')" ]; then
    KL=2
fi

if [ "$1" == "-h" ]; then
    echo $HELP1
    echo $HELP2
elif [ "$1" == "0" ]; then
    gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval "imports.ui.status.keyboard.getInputSourceManager().inputSources[0].activate()"
elif [ "$1" == "1" ]; then
    gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval "imports.ui.status.keyboard.getInputSourceManager().inputSources[1].activate()"
elif [ "$1" == "2" ]; then
    gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval "imports.ui.status.keyboard.getInputSourceManager().inputSources[2].activate()"
else
    echo $KL
fi
Im_not_a_robot ★★★★★
()
Последнее исправление: Im_not_a_robot (всего исправлений: 2)
Ответ на: комментарий от Im_not_a_robot

Ну или покороче без копипасты:

#!/bin/sh

# Returns the number of current keyboard layout if script is
# running without an argument.
#
# Sets the keyboard layout, if script is running with argument (number
# of keyboard layout).

HELP="
Returns the number of current keyboard layout if script is running without an argument.\n\
Sets the keyboard layout, if script is running with argument (number of keyboard layout).
"

GET_KL=$(gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval "imports.ui.status.keyboard.getInputSourceManager().currentSource.index")

if [ "$GET_KL" == "(true, '0')" ]; then
    KL=0
elif [ "$GET_KL" == "(true, '1')" ]; then
    KL=1
elif [ "$GET_KL" == "(true, '2')" ]; then
    KL=2
fi

if [ "$1" == "-h" ]; then
    echo -e $HELP
elif [ "$1" == "0" ] || [ "$1" == "1" ] || [ "$2" == "2" ]; then
    gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval "imports.ui.status.keyboard.getInputSourceManager().inputSources[$1].activate()"
else
    echo $KL
fi
Im_not_a_robot ★★★★★
()
Ответ на: комментарий от Im_not_a_robot

Спасибо за скрипт, но я уже решил эту проблему, написав экстеншон (который, кстати, обращается к тем же объектам, но напрямую из js).

Со скриптом будут две проблемы: я плохо представляю, как повесить его на caps lock (через настройки гнома добавить такой хоткей не выйдет), и он будет работать медленнее и асинхронно, так что возможна ситуация, когда первые несколько клавиш, нажатых после переключения раскладки, введутся в старой раскладке. Насколько я понимаю, mutter для избежания этого как-то фризит клавиатуру, пока обрабатывается переключение в js гном-шелла.

По-настоящему надо не скрипты или экстеншоны городить, а пофиксить mutter, чтобы он не делал вышеизложенный треш, и тогда стандартный механизм из xkb просто работал бы.

gentoo_root ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.