Переключатель раскладки в иксах

Мне нужно переключаться между тремя языками, что гораздо удобнее делать при помощи фиксирующих клавиш, а не при помощи одной комбинации, перебирающей раскладки по кругу. Конкретно, я с незапамятных времён привык, что RShift включает раскладку 1 (us), RCtrl - раскладку 2 (ru), RWin - раскладку 3 (ua). С горем пополам я когда-то определил такое переключение иксовыми средствами, но после этого, естественно, перестали работать такие хоткеи, как RCtrl-Rigt (прыжок на слово вперёд в любом редакторе; очень удобно нажимать одной правой рукой).
Иксовая переключалка работает по нажатию и конфликтует с хоткеями приложений. Как подсказал Koluchka, это Знаменитый древний баг, но в мэйнстриме предложенное решение игнорируется. Кроме того, это решение работает только для двухклавишных комбинаций.
Поэтому я долгое время использовал xneur в режиме чисто ручного переключения - xneur имеет правильную логику распознавания переключающих комбинаций. Но так использовать xneur - это забивание гвоздей микроскопом; кроме того xneur конфликтует со многими приложениями (xterm, к примеру), да и глючноват он. Но как-то жить можно было.

А недавно я случайно наткнулся на функцию XQueryKeymap, которая позволяет подсматривать клавиатуру, не вмешиваясь в поток иксовых событий, и, следовательно, гарантировано никому не мешая. Ну я и сделал на её базе программульку s1kls, которая тупо поллит клавиатуру (период 20 мс) и переключает раскладку по заданным клавишам. Она очень-очень простая: распознавать умеет только одиночные клавиши (скажем, Ctrl-Shift не поймёт) и умеет только устанавливать раскладку (а не переключать по кругу). Если кому надо, то не особо сложно добавить туда и двухклавишные комбинации, и переключение по кругу, но мне - не надо, так что я предпочёл сохранить максимальную простоту.

Зависимостей у этой программы никаких, кроме базовых иксов, так что бинарик запускается где угодно. Я пробовал её на очень слабом компьютере (первый Athlon, 750 МГц, с древней Убунтой) - работает без проблем, никакой заметной загрузки процессора не создаёт.

Писал, в принципе, для себя, но, может, кому пригодится.

Выложено на AUR, имя пакета - s1kls
akorop
Если кому надо, то не особо сложно добавить туда и двухклавишные комбинации, и переключение по кругу
Спасибо за программу, попробую. Но было бы неплохо реализовать такой вариант: мне бóльшее время нужны две раскладки (RU-US), переключаемые по кругу двухклавишной комбинацией (LAlt+Shift), но иногда требуется переключение на сочетание RU-DE (и тоже по кругу). Первоначально я реализовал это при помощи костыля: одним хоткеем загружается 'setxkbmap -layout "de,ru(winkeys)" -model pc105 -option grp:alt_shift_toggle,grp:rctrl_switch,grp_led:scroll,compose:ralt', а другим — 'setxkbmap -layout "us,ru(winkeys)" -model pc105 -option grp:alt_shift_toggle,grp:rctrl_switch,grp_led:scroll,compose:ralt'. Потом перешёл на gxkb; принцип тот же, только загружаются разные конфиги для gxkb. Так вот, если бы можно было сделать в программе два варианта: с помощью LAlt+Shift (например) переключение между RU-US, а с помощью LCtrl+Shift (например) — между RU-DE, это было бы просто идеально. Жалко отдавать функциональные клавиши под раскладку. Как можно заметить, у меня RAlt — клавиша compose, RCtrl — временное переключение раскладки. А уж отказаться от одного из Shift'ов означает отказаться от десятипальцевого метода набора.
konstantinov-ms
akorop
Если кому надо, то не особо сложно добавить туда и двухклавишные комбинации, и переключение по кругу
Спасибо за программу, попробую. Но было бы неплохо реализовать такой вариант: мне бóльшее время нужны две раскладки (RU-US), переключаемые по кругу двухклавишной комбинацией (LAlt+Shift), но иногда требуется переключение на сочетание RU-DE (и тоже по кругу). Первоначально я реализовал это при помощи костыля: одним хоткеем загружается 'setxkbmap -layout "de,ru(winkeys)" -model pc105 -option grp:alt_shift_toggle,grp:rctrl_switch,grp_led:scroll,compose:ralt', а другим — 'setxkbmap -layout "us,ru(winkeys)" -model pc105 -option grp:alt_shift_toggle,grp:rctrl_switch,grp_led:scroll,compose:ralt'. Потом перешёл на gxkb; принцип тот же, только загружаются разные конфиги для gxkb.
Аналогичный костыль и у меня был в OS/2 поначалу. Но потом я перешёл на честное переключение между тремя раскладками, и увидел, что это намного удобнее. Очень быстро вырабатывается привычка на всякий случай тыкать клавишу нужного языка, так что ошибок практически не бывает. Но чтобы такая привычка могла выработаться, нужно, чтобы клавиша всегда обозначала один и тот же язык.
konstantinov-ms
Так вот, если бы можно было сделать в программе два варианта: с помощью LAlt+Shift (например) переключение между RU-US, а с помощью LCtrl+Shift (например) — между RU-DE, это было бы просто идеально.
Хм... Я бы и врагу такого не пожелал.
konstantinov-ms
Жалко отдавать функциональные клавиши под раскладку. Как можно заметить, у меня RAlt — клавиша compose, RCtrl — временное переключение раскладки. А уж отказаться от одного из Shift'ов означает отказаться от десятипальцевого метода набора.
Так ведь не надо же ничего отдавать, если используется переключатель не стандартный иксовый, а с нормальной логикой (то есть xneur или мой). Я для переключения использую правые Ctrl, Shift и Win, и это совершенно не мешает использованию Shift по прямому назначению или всех трёх в составе хоткеев. Например, в текстовом редакторе очень удобно прыгать по словам одной правой рукой (RCtrl+Left, RCtr+Right).
Что касается compose, то ничто не мешает использовать его так же, как и раньше, но в сочетании нестандартной переключалкой. Вот сейчас я (со своей переключалкой) выполнил setxkbmap -option compose:ralt и проверил: RAlt, o, c - ввёлся знак копирайта.
А что касается временного переключения - то это костыль, практически не нужный при использовании фиксирующих клавиш, и временами крайне неудобный. Скажем, если находясь на английской раскладке, нужно ввести русскую букву "Г', то Вам придётся нажать RCtrl, LShift, затем чёрт знает каким пальцем 'Г", и затем всё отпустить. А мне - нажать и отпустить RCtrl, нажать Shift и Г (привычным образом), отпустить их, нажать и отпустить RShift. Формально говоря, у меня движений больше, но у меня всё делается на автомате, как всегда. А у Вас одно движение извращённо топырит пальцы и требует внимания. А поскольку это операция не такая уж частая, то механическое удобство и экономия внимания важнее, чем экономия числа движений. К тому же разница в числе движений сходит на нет, если надо ввести не одну букву, а, скажем, три.
В общем, советую попробовать вот так:
setxkbmap -layout "en,de,ru(winkeys)" -model pc105 -option compose:ralt
s1kls  62 105 134
Теперь RAlt по-прежнему compose, переключение RShift - en, RCtrl - de, RWin - ru. И при этом RShift, RCtrl, RWin можно использовать как угодно ещё. Иксовый ндикатор убран за ненадобностью (да и трудно его осмысленно использовать с двумя латиницами). Если всё-таки хочется индикатора - очень хорош xxkb.
Хм... Почитал, подумал, прикинул. Судя по всему, Ваш способ действительно удобнее. Особенно, если его немного подстроить под себя (я пользуюсь, в основном, ноутбуками, там часто нет клавиши RWin). Да и Shift тоже не хотелось бы задействовать (иногда он нажимается случайно, когда думаешь ввести какой-нибудь символ, потом отпускаешь, передумав, — тогда происходит переключение раскладки, что не всегда удобно). Но можно подобрать для себя удобные кейкоды, посмотрев их в файле /usr/share/X11/xkb/keycodes/evdev. Для себя пока выбрал такую комбинацию:
setxkbmap -layout "us,de,ru(winkeys)" -model pc105 -option compose:ralt
s1kls  37 133 64
Теперь русская раскладка под левым большим пальцем (LAlt); английскую пока повесил на LCtrl, но в процессе эксплуатации посмотрю, насколько это удобно; немецкую — на LWin, поскольку она используется нечасто. Очень понравилось в программе то, что она следует простым и понятным принципам, в которых несложно разобраться и подстроить их под себя. Индикатор мне не особенно и нужен (в нетбуке LED просто отсутствует, а панель большей частью скрыта). Ещё раз спасибо!
Я вот такое использовал для переключения:
https://github.com/scorpp/xkbswitch
Medar
Я вот такое использовал для переключения:
https://github.com/scorpp/xkbswitch
Ctrl-Shift-1, чтобы переключиться на русский, это злая шутка по мотивам Windows? Эта программа может представлять интерес в скриптах, но чтобы её использовать в качестве ручной переключалки, надо уметь повесить её вызов на что-то типа "нажал-отпустил RShift". Чем это сделать?
konstantinov-ms
Да и Shift тоже не хотелось бы задействовать (иногда он нажимается случайно, когда думаешь ввести какой-нибудь символ, потом отпускаешь, передумав, — тогда происходит переключение раскладки, что не всегда удобно).
Если передумание осознаётся, то можно, прежде чем отпускать Shift, ткнуть что-то ещё, скажем, Ctrl. Тогда переключения не будет.
akorop
konstantinov-ms
Да и Shift тоже не хотелось бы задействовать (иногда он нажимается случайно, когда думаешь ввести какой-нибудь символ, потом отпускаешь, передумав, — тогда происходит переключение раскладки, что не всегда удобно).
Если передумание осознаётся, то можно, прежде чем отпускать Shift, ткнуть что-то ещё, скажем, Ctrl. Тогда переключения не будет.
Нет, я, когда работаю, полностью погружаюсь в мысли и не думаю ни о клавиатуре, ни о программе, в которой набираю текст. Уже попробовал с Shift'ом, не получается. Но это не значит, что другим тоже будет неудобно.
Для себя подобрал неплохую комбинацию: LCtrl (us), RCtrl (de), LAlt (ru). Уже даже привык. Действительно удобно.
akorop
Ctrl-Shift-1, чтобы переключиться на русский, это злая шутка по мотивам Windows? Эта программа может представлять интерес в скриптах, но чтобы её использовать в качестве ручной переключалки, надо уметь повесить её вызов на что-то типа "нажал-отпустил RShift". Чем это сделать?
Зачем Ctrl-Shift-1? Я повесил на Ctrl-1=us, Ctrl-2=ru, Ctrl-3=ua. А так можно и на LCtrl (us), RCtrl (de), LAlt (ru) или как кому удобно.
Medar
akorop
Ctrl-Shift-1, чтобы переключиться на русский, это злая шутка по мотивам Windows? Эта программа может представлять интерес в скриптах, но чтобы её использовать в качестве ручной переключалки, надо уметь повесить её вызов на что-то типа "нажал-отпустил RShift". Чем это сделать?
Зачем Ctrl-Shift-1? Я повесил на Ctrl-1=us, Ctrl-2=ru, Ctrl-3=ua.
Ctrl-Shift-1 - это авторский пример. А Ctrl-1 и т.п. не намного лучше.
Medar
А так можно и на LCtrl (us), RCtrl (de), LAlt (ru) или как кому удобно.
Вот это меня бы устроило (при условии, что имеет "правильную" логику, то есть срабатывает по отпусканию, и только если ничего постороннего не было нажато). Так что повторяю вопрос: чем такую привязку сделать? Openbox, вроде, так не умеет.
Собственно, подобная своя программа у меня давным-давно есть, так что вопрос чем привязать - это единственный вопрос. Я её использую для установки английской раскладки при вызове меню openbox горячей клавишей (у меня несколько горячих клавиш для вызова разных меню). А установка определённой раскладки нужна, чтобы работали клавиши-ускорители.
 
Зарегистрироваться или войдите чтобы оставить сообщение.