Новый аналог Punto Switcher для linux: xswitcher

Прекращение поддержки xneur вызвало у меня определённые страдания в последние полгода (с появлением OpenSUSE 15.1 на моих десктопах: при включённом xneur окна теряют фокус и забавно мерцают в такт ввода с клавиатуры).

«А, блин, опять не в той раскладке начал набирать» — в моей работе встречается до неприличия часто. И позитива не добавляет.


В то же время, я (как инженер-конструктор) могу достаточно ясно сформулировать чего хочу. А хотел я (сначала от Punto Switcher, а затем, спасибо Windows Vista, окончательно пересев на Linux, от xneur) ровно одного. Осознав, что на экране белиберда не в той раскладке (такое обычно случается в конце набора нового слова), топнуть по «Pause/Break». И получить то что печатал.

На данный момент изделие имеет оптимальное (с точки зрения меня) отношение функциональность/сложность. Пора делиться.

TL.DR


Дальше пойдут всякие технические подробности, поэтому сначала — ссылка «на потрогать» для нетерпеливых.

На данный момент захардкожено следующее поведение:

  • «Pause/Break»: забивает (Backspace) последнее слово, переключает раскладку в активном окне (между 0 и 1) и набирает ещё раз.
  • «Левый Ctrl без ничего»: переключает раскладку в активном окне (между 0 и 1).
  • «Левый Shift без ничего»: включает в активном окне раскладку №0.
  • «Правый Shift без ничего»: включает в активном окне раскладку №1.

С этого момента я планирую кастомизировать поведение. Без обратной связи — не интересно (меня и так устраивает). Полагаю, на Хабре найдётся достаточный процент аудитории с аналогичными проблемами.

N.B. Т.к. в текущей версии кейлоггер прикручивается к "/dev/input/", xswitcher должен запускаться с рутовыми правами:

chown root:root xswitcher
chmod +xs xswitcher

Обратите внимание: владельцем файла с suid должен быть root, т.к. кто владелец — в того suid и превратит при запуске.

Параноики (я не исключение) могут клонировать из GIT и собрать на месте. Примерно так:

go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"

### X11 headers for OpenSUSE/deb-based
zypper install libX11-devel libXmu-devel
apt-get install libx11-dev libxmu-dev

cd "x switcher/src/"
go build -o xswitcher -ldflags "-s -w" --tags static_all src/*.go

Автозапуск добавлять по вкусу (в зависимости от DE).

Работает, «каши не просит» (≈30 секунд CPU в сутки, ≈12 МБ в RSS).

Подробности


Теперь — подробности.

Весь репозиторий изначально был посвящён моему пет-проекту, а другой заводить — пока лень. Так что, всё свалено в кучу (просто по папкам) и накрыто AGPL («патент наоборот»).

Код xswitcher написан на golang, с минимальными вкраплениями C. Предполагается, что такой подход даст наименьшие трудозатраты (пока так и есть). Сохраняя возможность подключать недостающее посредством cgo.

По тексту разложены комментарии, откуда чего позаимствовал и зачем. Т.к. код xneur меня «не вдохновил», за отправную точку взял loloswitcher.

Использование "/dev/input/" имеет как свои плюсы (всё видно в т.ч. зажатую клавишу с автоповтором), так и минусы. Минусы такие:

  • Автоповтор (события с кодом «2») не коррелирует с повтором с иксах.
  • Не видно ввода через интерфейсы X11 (так например VNC работает).
  • Нужен рут.

С другой стороны, можно подписываться на события X через «XSelectExtensionEvent()». Подсмотреть можно в коде xinput. Для go ничего подобного не нашёл, а черновая реализация дала с ходу сотню строчек C-кода. Пока отложил в сторону.

Вывод «обратно» пока сделан через прикручивание виртуальной клавиатуры. Спасибо автору keybd_event, но там слишком высокоуровневая абстракция и дальше придётся переделывать. У меня, например, правая Win-клавиша 3-й ряд выбирает. А обратно транслируется только левая Win.

Известные ошибки


  • Ничего не знаем про «композитный» ввод (пример: ½). Прямо сейчас оно не нужно.
  • Неверно воспроизводим правую Win. В моём случае ломает расстановку акце́нтов.
  • Нет внятного разбора ввода. Вместо этого — несколько функций: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Спасибо nsmcan за внимательность: исправил в коде и здесь. С определённой вероятностью можно отхватить баги при замене.
    В этом месте я не знаю «как надо» и буду рад любым предложениям.
  • (О ужас) конкурентное использование каналов (keyboardEvents, miceEvents).

Заключение


Код — простейший процедурный. И туп как я. Так что, тешу себя надеждой что дописать желаемое сможет практически любой технарь. И данное изделие благодаря этому не сгинет без поддержки подобно большинству just-for-fun.

Удачи!
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 87

    +1
    Вот бы еще кто Punto Switch допилил, чтобы при использовании Caps Lock в качестве
    кнопки-переключалки он в случайный момент времени не вспоминал о исходном ее назначении, и не отказывался переключать раскладку. Регистр меняет, раскладку нет.
    Приходится выгружать :(
    Или я что-то не так делаю?
      0
      У меня такая ситуация наблюдается с рабочим ноутбуком, где стоят дефолтные настройки винды и где работают всякие McAfee. А вот на личном компьютере где стоит Windows 10 ltsc с «правильными настройками» никаких проблем с Punto Switcher не наблюдал ни разу.
      Может тут конечно и виноват Punto Switcher, но это проблема видимо проявляется только с определенными настройками системы.
        0
        У меня и W7 и Win10 (был, пока не достал окончательно). Возможно, что и с параметрами настройки систем что-то, но уж очень они «по умолчанию» в моем случае :)

        PS. А вот в OpenSuse (любимый дистр!:) никаких проблем «из коробки» с переключалками не наблюдалось уже лет 15. Но мне и автозамена без надобности, ради которой аффтар все и затеял.
        +1

        Попробуйте отключить в настройках «Исправлять две заглавные буквы в начале слова» и «Исправлять случайное нажатие Caps Lock», а в винде настроить отключение режима Caps Lock клавишей Shift. Это в комбинации решило похожую проблему у меня: при полностью отключенной клавише Caps Lock, сам Caps Lock иногда включается, а выключить нельзя (клавиша же отключена).

          0
          Ооо, спасибо большое, попробую!
            0

            У меня с дефолтными настройками Shift + Caps Lock позволяет использовать обычную функцию капс лока.

            0
            Ещё в Пунто при назначении Капса на переключение языка перестает работать индикатор на клаве. Я писал в ТП Яндекса, они ответили, что если Капс переназначен, то и индикатор не работает. Было давненько, может и исправили.
              0
              Выявил, что у меня такое наблюдается только с программой keepassxc, если встать на поле ввода пароля для разблокировки БД и переключить раскладку caps`ом. punto на рабочем АРМе держу только из-за того переключения, на домашней машинке под linux привык к такому переключению.
              Посчитал, что «враждуют» между собой hook`и keepassxc`а punto`а.
                0
                Нет, не оно. Я keepass не юзаю.
                Я тоже сначала думал, что это Remote Desktop Manager виновен, но потом эффект появился на той машине, где его сроду не было. Так что это что-то «тама унутре» неучтено.
                Коллега сверху по треду предложил некое сильное шаманство, вот, тестирую :)
                0
                Такие баги часто происходят при использовании RDP
                  0

                  У меня года 3 стоит переключение на Caps Lock, такого нет. Windows 10 последний, почти все настройки по умолчанию.

                  +5
                  xneur я сколько в своей жизни ни ставил — сносил всегда или сразу, или через день-два

                  возможно виноваты мои кривые руки, но заставить его работать без багов я не смог

                  В целом я просто выработал привычку смотреть на индикатор Caps Lock боковым зрением перед вводом, чтобы определить раскладку. Горит — значит русская. Переключение тоже по Caps. Плюс каждое окно запоминает раскладку (kbdd)

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

                  Надеюсь, что на Хабре найдутся менее ленивые параноики

                  Может быть, заглядывая в будущее, кто-то возьмется аналог Punto Switcher ваять в виде расширения для Wayland, хотя, поговаривают, там это как-то архитектурно непросто.
                    +5

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


                    Во Вьетнаме залил клавиатуру. В ближайшей мастерской мне ее поменяли, но естественно, на клавиатуру без русских букв. Так вот, разницу даже не заметил, потому что давно перестал смотреть на клавиатуру при наборе.

                      +7
                      Когда смотришь на экран при наборе, надобность в перекодировке никогда не возникает.

                      Печатаю вслепую последние лет, наверное, 12. Потребность в перекодировке возникает по 100 раз на дню. На клавиатуру не смотрю. Просто я успеваю набрать слово\два\три прежде, чем до меня доходит, что раскладка была не та. Я довольно быстро печатаю. И пока я печатаю я не сказать чтобы анализирую что там за буквы на экране появляются. Голова в мыслях.


                      Полагаю, я далеко не один такой. Печать вслепую среди программистов, имхо, это скорее правило, а не особенность.

                        +2
                        Я думал, я один такой ) Причем, у меня нет русских символов на клавиатуре вообще, многие не понимают, мол если я не смотрю на клавиатуру, когда пишу, значит я должен видеть, что пишу не в той раскладке. Но очень часто в мыслях ты в экран вообще не смотришь, взгляд просто в никуда (даже если направлен на текст), сидишь, думаешь, руки сами печатают мысли, порой так уже и энтер нажимаешь, если сообщение короткое.
                        Но справедливости ради, проблема с раскладкой происходит в 100 раз реже, чем когда я еще не владел слепой печатью.
                        +1
                        Иногда приходится смотреть не в монитор, даже когда печатаешь вслепую, например при перепечатывании рукописного текста. Буквально вчера этим занимался.
                          0

                          Я печатаю вслепую, но переключением раскладки пользуюсь постоянно.


                          Быстрее нажать Caps Lock для исправления последнего слова (одна кнопка), чем стирать, менять раскладку и писать заново (много кнопок).


                          Иногда печатаю вслепую, но смотрю не на текст, а в другое место.

                        0
                        А изменение раскладки в выделенном фрагменте планируется — по типу того, как сделано в Caramba Switcher (новый проект Сергея Москалёва)?
                          0
                          Под ВЫН есть програмка SNOOP, которая по заданной кнопке выполняет трансляцию выделенного фрагмента по заданной таблице. Таблиц там в комплекте идёт сразу пачка типа рус/лат, КАПС/строчные и т.д. Ну и свои можно лепить любые.
                          Когда на Лин перешел — очень её не хватало. Да и сейчас не хватает, если честно. Но как эту задачу тут решить я вообще не представляю.
                            0
                            «В лоб» попадались скрипты с использованием xinput-tools и башатины. Посмотрите посвящённые xneur темы: когда автор заявил что «всё» — появились и попытки сделать новый инструмент.
                            Технически — ничего сложного. Всё можно подглядеть в коде xinput.
                            Я пока сделал инструмент для того что больше всего «доставляло».
                            Дальше можно накинуть кучу биндингов на X11, но есть нюанс: на замену иксам навязывают сборки с wayland (в которых «из коробки» не заметно нужных интерфейсов) и не понятно чем всё закончится.
                            • Таблицы под винду были отлично реализованы в FAR manager. Под linux он тоже работает. Я так и не отказался от его редактора: слишком привык к той эргономике. Плагины, хоткеи — и вот оно.
                              0
                              А где автор xneur заявил что «всё»? Или имеются в виду предыдущие авторы?
                                0
                                Железобетонного пруфа не дам, но где-то в недрах этого форума. AFAIR.
                                Высказывание в том духе что «свободное время закончилось». А если формально «не первый автор а последний соавтор» — мне от этого не легче.

                                Лично меня добила невозможность завести xneur в моих последних системах (до этого как-то получалось, хотя коллеги с debian «приплыли» годом ранее).
                          0
                          Пунто очень актуальна в планшетах с внешней клавиатурой. Там нет индикатора раскладки и никогда не знаешь на каком языке работаешь. Есть какое-нибудь решение?
                            +1
                            Пытался использовать Punto ещё под окошками, но забросил — слишком люблю пароли из длинных русских фраз набирать при включенной английской раскладке. А свитчер, естественно, их пытается перекодировать, после чего уже без бутылки не разберешься — где пароль запомнен так, как задумывалось, а где с перекодировкой на русский.

                            P.S. Ну и, да, неприятно как-то, что в системе, как минимум, на один кейлоггер больше стало. :)
                              +3

                              Я для себя проблему раскладок давно решил, сделав раскладку фиксированной. Caps — английская, Shift-Caps русская.


                              Теперь я всегда выставляю раскладку перед началом ввода. Повторное нажатие кнопки раскладки ничего не меняет, т.е. нажимать кнопку можно всегда. Идеально для ввода паролей и общей sanity. Нажал кнопку — точно знаешь, что русский (английский). Можно даже не присматриваться к вводимому.

                                +1
                                Давно уже топлю за такой способ переключения. Ctrl+Shift+1 — Английская, Ctrl+Shift+2 — Русская.

                                Окружающие называют меня извращенцем. Смеюсь с них в правильной раскладке.
                                  0
                                  Весьма неторопливый способ переключения.
                                  Наверное, для чего-то редкого можно и так (а можно и мышкой: я так pinyin в fcitx включаю и не жалуюсь).
                                0
                                Тоже был раздражен от xneur, приходилось как-то выкручиваться. Позже понадобился третий язык и стало вообще кисло.

                                Оказалось, что можно жить и без подобных помогалок:

                                1. Назначить однокнопочное переключение между языками,
                                2. Ограничить число раскладок, входящих в кольцо переключения,
                                3. Назначить отдельные клавиши на включение определённой раскладки.

                                После некоторого периода экспериментов оказалось удобно переключать языки по правой клавише «Alt». Экспериментировал с CapsLock, но туда идёт слабый духом мизинец, он часто жмёт ненужную «Tab», тогда как «Alt Gr» прямо под уверенным большим пальцем, легко нащупывается даже вслепую с помощью края длинной «Space».

                                Клавиши отдельных языков (после ряда экспериментов):
                                > русская = ScrollLock,
                                > английская = Pause/Break.

                                Помогает и неочевидный факт: румынский алфавит основан на латинице, поэтому даже в терминале для вписывания англоязычных слов достаточно переключаться только между русской и румынской раскладками. Недостаток: в румынской клавиатуре нет ординарной кавычки и седильи (~), поэтому если таки нужны английские штуки вроде «doesn't» — бацаю средним пальцем правой руки по «Pause/Break».

                                Сейчас настройки клавиатуры вот такие.
                                  0

                                  В случае английского, русского и украинского "неочевидный" факт скорее мешает, когда увидел в терминале киррилицу, переключаешь в кольце и уже не смотришь, что там латиница или вторая киррлица

                                  0
                                  На маке для себя решил проблему некорректной раскладки альтернативным способом:
                                  левый Cmd переключает раскладку на латиницу, правый Cmd на кириллицу.

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

                                  На Windows было тоже самое только с клавишами Ctrl.
                                    0
                                    С помощью какой программы можно добиться такого поведения на маке?
                                      0

                                      Karabiner-Elements. Там Complex Modifications и дальше поиск по "Change input source".
                                      Заодно посмотрите Ukelele. Это про кастомные раскладки клавиатуры. Тоже полезная штука.

                                    +1
                                    имхо — xneur и т.п. не зря вымерло, оно просто не нужно, простой скрипт .sh (коих в гуголе множество) легко меняет раскладку выделенного используя обычные утилиты типа xdotool, при этом не требует root, автозапуска, памяти… т.к. активируется только на время надобности через хоткей.
                                      +1

                                      Подскажите, пожалуйста, ссылку на один из .sh скриптов. Как их искать, по какому запросу?

                                        0
                                        К примеру «linux скрипт изменения раскладки»
                                        Вторая ссылка
                                      0
                                      О, как раз вовремя! Очень привык к переключению раскладки на основе Shift. Однократное нажатие на левый Shift — русская раскладка, однократное нажатие на правый Shift — английская. Очень удобно когда владеешь слепым набором на двух раскладках — нажал на правый Shift и сходу набираешь на английском, нажал на левый — на русском. На Win проблем нет — задачу решает AutoHotkey. На Ubuntu 16.04 проблем тоже не было — два простеньких скрипта и бинд на Shift-ы и все как часы. После перехода на 18.04 и до сих пор никак не могу решить эту проблему.

                                      UPD. Попытался проверить под Ubuntu 18.04 — не работает.
                                        0

                                        В гноме 3 не работает. Пересел недавно опять на кеды, там ок.

                                          0
                                          Давайте попробуем отдебажить. «Не работать» должно ровно в одном случае: wayland без слоя совместимости с X11.
                                          Запускаете софтину в терминале.
                                          • Если рушится, там написано почему. Например, «keypanic: permission error» указывает на недостаток привилегий. В сложном случае придётся разбираться с (неотключаемым толком в ubuntu) apparmor.
                                          • После старта в stdout выводятся по строкам подключаемые устройства. Логично ожидать хотя бы одну строчку с «keyboard:» и одну с «mouse:». Если пусто, то есть ли "/dev/input/event*" (захардкоженный в переменную «DEV_INPUT»)?
                                            0
                                            Скачав бинарник и запустив его увидел следующее:
                                            panic: permission error for /dev/uinput try cmd : sudo chmod +0666 /dev/uinput

                                            Ну что же, попробуем дать необходимые права подумал я:
                                            sudo chmod +0666 /dev/uinput

                                            После этого попытался запустить еще раз и в stdout уже была тишина…
                                            Если пусто, то есть ли "/dev/input/event*" (захардкоженный в переменную «DEV_INPUT»)?

                                            Да, все есть. Выполнив:
                                            ls -al /dev/input/by-path/

                                            Вывод (часть вырезал):
                                            pci-0000:00:14.0-usb-0:3:1.2-event-mouse -> ../event12
                                            pci-0000:00:14.0-usb-0:3:1.2-mouse -> ../mouse2
                                            pci-0000:00:14.0-usb-0:4:1.0-event-mouse -> ../event4
                                            pci-0000:00:14.0-usb-0:4:1.0-mouse -> ../mouse0
                                            pci-0000:00:1a.0-usb-0:1.4:1.0-event -> ../event11
                                            platform-i8042-serio-0-event-kbd -> ../event3
                                            platform-i8042-serio-1-event-mouse -> ../event5
                                            platform-PNP0C14:00-event -> ../event6
                                            platform-i8042-serio-1-mouse -> ../mouse1

                                              0
                                              Не надо так делать. Надо или запускать от рута (т.к. внутри кондовый кейлоггер на devfs), или дать suid-bit.
                                              Ровно та же техника что и в loloswitcher.
                                              • Проверил, про «chmod +xs xswitcher» в статье — не забыл.
                                                0
                                                Попробовал, поменял права, но увы, результат прежний. К слову, loloswitcher тоже не работает. Точнее, если нажать несколько раз какой-то из shift-ов то раскладка на мгновение изменится, но только лишь на мгновение…
                                                  0
                                                  1. Аналогичную проблему прорешали вот в этой ветке. Вкратце, владельцем бинарника с suid должен быть root.
                                                  2. «раскладка на мгновение изменится» — чётко указывает на наличие «конкурента».
                                                  …А не ibus ли у Вас? Само окно дёргать локалью не обучено (как правило). Кто-то должен ему «помогать».
                                                    0
                                                    Удалось запустить бинарник и получить вывод:
                                                    keyboard: Power Button
                                                    keyboard: Laptop_Integrated_Webcam_HD: In
                                                    mouse: Logitech K400 Plus
                                                    keyboard: Power Button
                                                    keyboard: AT Translated Set 2 keyboard
                                                    mouse: HP Wireless Optical Mobile Mouse
                                                    mouse: SynPS/2 Synaptics TouchPad
                                                    keyboard: Dell WMI hotkeys


                                                    Да, действительно, есть какой-то конкурент, ибо поведение xswitcher ровно такое же как и loloswitcher. Подскажите, как вычислить конкурента и запретить ему конкурировать?
                                                      0
                                                      «Алгоритм поиска неисправности» — штука довольно универсальная.
                                                      Для начала надо осмотреться и понять что вообще запущено. Я бы для этого перезагрузил систему и постарался выключить всё лишнее. Под подозрением — всё на электроне. Однако, главные подозреваемые — ibus или fcitx.

                                                      Если всё ещё не отпустило, придётся всё-таки разбираться с поназапущенным.
                                                      Примерно так:
                                                      ps -el | awk '{if ($3 != 0) print $14}' | sort -u | egrep -v '^(ps|CMD|awk|bash|grep|sort|akonadi)'

                                                      …И дальше по каждому пункту выяснить что это такое.

                                                      • Возможно также что в системе так отрабатывается настройка «сохранять (помнить) раскладку для каждого окна».
                                                      • Сам на такое нарвался на своей старой OpenSUSE 15.0 (1.5 года поддержки — реально мало, мне ещё работать надо кроме того что софт по кругу переставлять): там и xneur и loloswitcher работали и «а чего оно тут глючит?».
                                                        0
                                                        Попробовал отключить настройку input-source per window — не помогло. Как разобраться с ibus пока не понял, его демоны перезапускаются почти сразу после их завершения. Я сменил метод ввода, перезапустил сессию, однако при проверке выяснил что ibus был выбран автоматически как основной метод ввода, опять все демоны его запущены. Руки тянутся сделать apt purge ibus, но не хотелось бы радикальных мер.
                                                          0
                                                          UPD. Отключение ibus проблему не решило.
                                                            0
                                                            Тупой вопрос: а как у Вас настроен переключатель в иксах?
                                                            Если на те же кнопки, то они таки пересекаются.
                                                            • У себя в KDE я давно поотключал все варианты кроме ctrl+alt+k «на всякий случай». Но не факт что все сами догадаются. Надо будет добавить в FAQ.
                                                              0
                                                              Вот сейчас настроено все так: левые Alt+Shift — раскладка 1 (ru), правые Alt+Shift — раскладка 2 (us).
                                                                0
                                                                Насколько я в курсе, X-server так не умеет. Что об этом думает «setxkbmap -query»? У меня например вот так (раскладки есть, способ смены — не задан):
                                                                # setxkbmap -query
                                                                No protocol specified
                                                                rules:      evdev
                                                                model:      pc104
                                                                layout:     us,ru
                                                                options:    terminate:ctrl_alt_bksp,misc:typo,compose:ralt,grp_led:scroll,lv3:rwin_switch

                                                                Как я понимаю, у Вас гном. Попробуйте пошерстить в этом районе.
                                                                * Там же подсказывают про «gnome-tweak-tool». Может и поможет…
                                                                  0
                                                                  Да, gnome.
                                                                  # setxkbmap -query
                                                                  rules:      evdev
                                                                  model:      pc105
                                                                  layout:     us,ru,us
                                                                  variant:    ,,
                                                                  options:    grp_led:scroll
                                                                  

                                                                  Сейчас гляну, спасибо!
                                                                    0
                                                                    К слову, для изменения раскладки по Alt-Shift я обращаюсь через D-Bus, использую такой скрипт:
                                                                    !/bin/bash
                                                                    
                                                                    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()"
                                                                    

                                                                    В качестве параметра передается 0 — первая раскладка, 1 — вторая. При попытке изменить раскладку с помощью setxkbmap в дальнейшем стандартный механизм перестает работать.
                                                                      0
                                                                      Тут я не понял: а кто этот скрипт запускает?
                                                                      Должен же кто-то «висеть» на шине событий (не важно, evdev или XEvent или гномо-специфика) и ловить этот самый alt+shift.
                                                                      Со своей стороны, могу предложить повесить на выход xswitcher запуск внешних сценариев. Мне не трудно. Но, должен предупредить: из того что я мерил, по dbus тормоза достигают 300мс на одно переключение. А до переключения нельзя перевводить текст.

                                                                      Альтернативно, попробуйте совсем выключить игры с dbus. Возможно, такой метод как раз и «лочит» локаль в окне.
                                                                      * За кадром остаётся вопрос, почему «layout: us,ru,us» (раскладка №2 дублирует раскладку №0).
                                                                        0
                                                                        Да, я понимаю что должно что-то слушать и дергать скрипт по событию, но что это понять не могу. Я просто добавил custom hotkeys в системе и повесил на них вызов скрипта с разными параметрами.
                                                                        image
                                                                        Переключение через D-Bus очень долгое, это по сути мучение, но если появится возможно дергать внешний скрипт — в целом не будет лишним.
                                                                        Отключал все хоткеи с shift-ом, результат тот же(.
                                                                        Почему три раскладки отобразилось в душе не знаю, настроено ровно две. Проверил через gsettings увидел [('xkb', 'us'), ('xkb', 'ru')]. Во всех GUI тоже стоит две.
                                                                        В общем, я в замешательстве, уже подумываю кеды поставить.
                                              0
                                              Могу посоветовать LoLo Switcher.
                                              Использую Punto Switcher на Windows в основном, чтобы переключать раскладки: левый Ctrl — английская, правый Ctrl — русская. Когда переходил на Linux, перебрал несколько программ, но все было не то. Попробовал собрать LoLoSwitcher и сижу на нем уже два года. Собирается и настраивается легко, работает безупречно. Только не хватает изменения ошибочно набранного текста по клавише Break.
                                              Но альтернативы — это хорошо! Больше софта под Linux хорошего и разного!

                                              UPD. Если кто-то заинтересовался LoLo Switcher — вот еще полезная ссылка.
                                                0
                                                спасибо Windows Vista, окончательно пересев на Linux...

                                                Мне тоже Виста в своё время помогла на Линукс перейти: сижу, верстаю макет, утром его сдать уже надо. После очередного зависания решил, что так не может больше продолжаться, скачал первый попавшийся дистрибутив (Mandriva), установил, доделал работу, не смотря на то, что Линукс первый раз в жизни видел. С тех пор уже 10 лет на Линуксе сижу — спасибо Майкрософт, что привели меня к нему.

                                                  –1
                                                  Есть у меня такое ощущение (по собственному опыту), что подобные утилиты имеют смысл пока не вырабатался навык печати не глядя на клавиатуру.
                                                    0
                                                    Со всеми переключателями раскладки текста под Linux проблема в том, что под Wayland они просто не могут работать, при ограничениях введенных на уровне дизайна Wayland.
                                                      0
                                                      Иногда замечаешь что набрал, когда уже набрано целое предложение, поэтому второй распространенный режим «сменить раскладку выделенного текста». Думаю этого (и дефолтного режима смены раскладки последнего слова) будет достаточно для 99.9% случаев.
                                                        0
                                                        Посмотрите вот в этом районе.
                                                        Полагаю, что-нибудь из предложенного вполне реально доработать под свои нужды и повесить на хоткей.
                                                        Для терминалов это всё не годится, поэтому — мимо меня.
                                                        0
                                                        Что меня больше всего удивило в этой статье, это то что инженеру-конструктору удался переход на Linux. Какой софт в работе используете, если не секрет?
                                                          0
                                                          «Системы массового обслуживания» в моём случае представляют собой аппаратно-программные комплексы. «Вот на тех железках крутится (ок, linux, но случается и xen или ещё что). А теперь сделаем из этого…» CAD'ы т.о. остались для меня в прошлом, если Вы об этом. Программирования достаточно много, но оно никогда не самоцель.
                                                          0
                                                          Что насчет андроида?
                                                            0
                                                            Привет.
                                                            Компиляция по инструкции прошла успешно
                                                            файл лежит тут /home/user/xswitcher/xswitcher

                                                            Как его запустить, чтобы работало переключение?
                                                            Сижу на Ubuntu
                                                              0
                                                              Примерно так:
                                                              sudo chmod +xs /home/user/xswitcher/xswitcher
                                                              /home/user/xswitcher/xswitcher

                                                              Если что-то не так, см. коммент выше.

                                                              Убедившись что работает, можно и в автозапуск. Как это сделать для ubuntu, лучше посмотреть на профильных ресурсах.
                                                                0
                                                                Не получилось

                                                                ewgenk@ewgenk-K53SJ:~$ sudo chmod +xs /home/ewgenk/xswitcher/xswitcher
                                                                [sudo] пароль для ewgenk: 
                                                                ewgenk@ewgenk-K53SJ:~$ /home/ewgenk/xswitcher/xswitcher
                                                                panic: permission error for /dev/uinput try cmd : sudo chmod +0666 /dev/uinput
                                                                
                                                                goroutine 1 [running]:
                                                                main.main()
                                                                	/home/ewgenk/xswitcher/src/main.go:636 +0xb66
                                                                ewgenk@ewgenk-K53SJ:~$ 
                                                                
                                                                


                                                                Потом написал
                                                                sudo chmod +0666 /dev/uinput
                                                                

                                                                Папки /dev/uinput у меня нет


                                                                Потом снова запустил
                                                                /home/ewgenk/xswitcher/xswitcher
                                                                


                                                                Комп завис. Перезагрузил его
                                                                  0
                                                                  Что-то мне подсказывает что владелец файла — не root.
                                                                  1. Проверяем что работает:
                                                                  sudo /home/ewgenk/xswitcher/xswitcher

                                                                  2. Если таки да, то:
                                                                  sudo chown root:root /home/ewgenk/xswitcher/xswitcher

                                                                  Я просто некоторые вещи стал считать очевидными, а это не так. Добавлю по итогам howto в статью.
                                                                    0
                                                                    FIX: под номером 1 я глупость ляпнул. Потому что из-под sudo не будет XOpenDisplay() работать. Как и многое другое. Ни в каком виде, так уж его написали.
                                                                    Предварительно проверять (1) можно так (должен быть рабочий рут-аккаунт):
                                                                    su
                                                                    ### enter root password
                                                                    /home/ewgenk/xswitcher/xswitcher

                                                                    Про suid, однако, всё верно.
                                                                      0
                                                                      Не сработало
                                                                      ewgenk@ewgenk-K53SJ:~/xswitcher$ /home/ewgenk/xswitcher/xswitcher
                                                                      panic: permission error for /dev/uinput try cmd : sudo chmod +0666 /dev/uinput
                                                                      
                                                                      goroutine 1 [running]:
                                                                      main.main()
                                                                      	/home/ewgenk/xswitcher/src/main.go:636 +0xb66
                                                                      ewgenk@ewgenk-K53SJ:~/xswitcher$ 
                                                                      
                                                                        0
                                                                        Покажите что выводит
                                                                        sudo ls -lah /home/ewgenk/xswitcher/xswitcher
                                                                          0
                                                                          ewgenk@ewgenk-K53SJ:~/xswitcher$ sudo ls -lah /home/ewgenk/xswitcher/xswitcher
                                                                          [sudo] пароль для ewgenk: 
                                                                          -rwsr-sr-x 1 ewgenk ewgenk 2,0M апр  7 10:29 /home/ewgenk/xswitcher/xswitcher
                                                                          ewgenk@ewgenk-K53SJ:~/xswitcher$ 
                                                                          
                                                                            0
                                                                            Вот это: ewgenk ewgenk
                                                                            Должен быть root:root
                                                                            sudo chown root:root /home/ewgenk/xswitcher/xswitcher

                                                                            Без этого suid даёт права ewgenk (которые и без того есть).
                                                              0
                                                              Не сработало
                                                              ewgenk@ewgenk-K53SJ:~$ sudo /home/ewgenk/xswitcher/xswitcher
                                                              [sudo] пароль для ewgenk: 
                                                              panic: permission error for /dev/uinput try cmd : sudo chmod +0666 /dev/uinput
                                                              
                                                              goroutine 1 [running]:
                                                              main.main()
                                                              	/home/ewgenk/xswitcher/src/main.go:636 +0xb66
                                                              ewgenk@ewgenk-K53SJ:~$ 
                                                              
                                                                0
                                                                См. выше.
                                                                Извините, ляпнул про sudo не подумав. Хотя уж пора бы запомнить.
                                                                Однако, крайне странно видеть вновь «permission error». Рухнуть после выдачи прав должно было на XOpenDisplay().
                                                                Включена какая-то защита?
                                                                Показывает ли
                                                                sudo ls -lah /dev/uinput

                                                                наличие устройства на месте?
                                                                  0
                                                                  ewgenk@ewgenk-K53SJ:~/xswitcher$ sudo ls -lah /dev/uinput
                                                                  crw------- 1 root root 10, 223 апр  7 21:05 /dev/uinput
                                                                  ewgenk@ewgenk-K53SJ:~/xswitcher$ 
                                                                  


                                                                  Ноутбук со встроенной клавиатурой + мышка
                                                                    0
                                                                    Полагаю, вопрос решён выше.
                                                                    Предварительный набросок HowTo:
                                                                    1. Из-под sudo работать не может, т.к. sudo обрезает контекст X'ов.
                                                                    2. Либо запускать из-под su (для отладки), либо навешивать suid. Обязателен владелец бинарника root. Ссылка «что такое suid».
                                                                    3. Чек-лист «если ничего не выходит читайте документацию».
                                                                0
                                                                У меня заработало почти всё (все переключения раскладок и половина «исправления набранного»).
                                                                Не работает только преобразование из английских букв в русские («обратный перевод производился чётко»): видно, что буквы стираются и перенабираются, но остаются те же самые.

                                                                Куда смотреть в поисках источника проблемы?
                                                                Может, дело в том, что «setxkbmap -query» выдаёт только одну раскладку?:
                                                                rules: evdev
                                                                model: pc105
                                                                layout: us

                                                                Для переключения обычно использую Alt+Shift с лампочкой для индикации, при старте системы запускается:
                                                                setxkbmap -v -option grp:switch,grp:alt_shift_toggle,grp_led:scroll us,ru
                                                                  0
                                                                  Да, иксы должны знать про обе раскладки (за номером 0 и 1). Потому что переключалка идёт к ним и требует «поставь локаль №n». А как её поставить, если нет в списке?
                                                                  • Не понятно как оно по Alt+Shift переключает. Где-то пропущен нюанс.

                                                                  В похожую ситуацию я влипал когда пробовал прикрутить доморощенные скрипты.
                                                                  Типа вот такого вредного совета.
                                                                  • Наверное, для подобных случаев надо прикрутить возможность запускать внешние скрипты вместо встроенного «дёрни за иксы». +Опция «дождаться завершения».
                                                                  0

                                                                  Скажите, пожалуйста, есть смысл пробовать запускать, если в системе три языка (en, ru, ua) с циклическим переключением?

                                                                    0
                                                                    Опишите подробнее, что Вы ожидаете.
                                                                    Я закладывал свой кейс: «2 основных языка (0 и 1 локали) и ещё какие-то (e.g. китайский) редко».
                                                                    Возможно, для Вашего случая есть вариант настроить хоткей для перекидывания порядка. Например, (en, ru, ua) vs (en, ua, ru).
                                                                    Если (зачем-то) надо гонять именно по кольцу, это несложно устроить. Но предложите как это должно управляться.
                                                                    Я, как закончу собирать «хотелки» — попробую сделать второй «подход к снаряду».
                                                                      0

                                                                      Я как раз хочу избавиться от кольца. Caps — en 50%, Shift+Caps — ru 40%, Ctrl+Caps — ua 10%

                                                                        0

                                                                        Я на линуксе использую только en и ua для английского, немецкого, русского и украинского. Русские буквы и немецкие умляуты набираю с compose-клавиши, назначил на PrtSc. Английский у меня на капсе, а украинский на шрифт+капс, и не надо думать и смотреть индикаторы.
                                                                        Вот кстати конфиг для иксов


                                                                        Section "InputClass"
                                                                                Identifier "system-keyboard"
                                                                                MatchIsKeyboard "on"
                                                                                Option "XkbModel" "pc104"
                                                                                Option "XkbLayout" "us,ua"
                                                                                Option "XkbOptions" "grp:shift_caps_switch,compose:prsc"
                                                                        EndSection
                                                                    0
                                                                    Статья, видимо, написана для фанатов gxneur (или скорее для фанатов автопереключения раскладки), к коим я отношу и себя. Спасибо автору, буду пробовать. Все люди и потребности у них разные. Мне вот нужно, чтобы автоматически и не надо переубеждать.
                                                                      0
                                                                      Вроде бы наоборот. Но без xneur, действительно, «котлеты подгорели».
                                                                      Вкручивать автопереключение я лично не планирую, но (как обычно) есть минимум два выхода:
                                                                      • Взять имеющийся код и приделать свою функцию проверки. Или из xneur вытащить библиотеку. Но есть нюанс: xswitcher прямо сейчас включен уровнем ниже, и скен-коды от клавиатуры — совсем не то же что события из иксов. Будет желание — могу поделиться кусочком где я к иксам попробовал привернуть. «Много букв», на C.
                                                                      • Поучаствовать во второй части. И предложить приемлемый интерфейс для прикручивания «плагинов». Я совсем не против, но пока просто не знаю «как». Будет интерфейс (API) и желающие — появятся и плагины.

                                                                        0
                                                                        Неплохо было бы повторить функционал этой программы github.com/alexzh2/SimpleSwitcher, под ubuntu очень не хватает
                                                                          0
                                                                          Выше в комментариях приводили ссылку на сборник скриптов.
                                                                          Или распишите, что конкретно хочется. По Вашей ссылке — куча C++ кода под винду и отсутствие руководства по эксплуатации. Я такое не осилю.
                                                                            0
                                                                            Для Ubuntu 19.10 [pause] меняет слово как и ожидается, однако не переключает раскладку.
                                                                            Ctrl, Shift также раскладку не трогают.
                                                                            PuntoSwitcher под виндой работал быстрее, тут же надо секундочку-другую подождать, но в убунту все что связано со вводом с клавиатуры как-то неторопливо.
                                                                              0
                                                                              Есть две «жадные» до раскладки утилиты: ibus и fcitx. Подозреваю, что в ubuntu ibus вкрутили.
                                                                              Посмотрите комментарии к «предыдущей серии» (если хотите их забороть). Тормоза в этом случае «рассосутся».
                                                                              Если, наоборот, хочется «подружить» — нужно отыскать правильный интерфейс к смене раскладки (где-то в районе dbus копать).
                                                                              • Лично мне оказалось удобно выкинуть всё и оставить только индикатор раскладки. fcitx запускаю «руками», когда случается необходимость в «китайской грамоте».

                                                                            Only users with full accounts can post comments. Log in, please.