LINUX.ORG.RU

Переключатель клавиатуры LoLo Switcher v.0.15


0

1

Выпущен первый публичный релиз низкоуровневого переключателя клавиатуры LoLo Switcher v.0.15 для оконной системы X11.

Основные достоинства переключателя:

  • cпособен работать в любых окружениях рабочего стола (KDE3, KDE4, GNOME2, LXDE);
  • работает напрямую с устройством ввода, очень компактен и быстр;
  • поддерживает любые модели клавиатур и джойстиков;
  • способен прозрачно работать параллельно с другими переключателями клавиатуры;
  • содержит встроенные средства диагностики устройств ввода.

Данный переключатель решает застаревшие проблемы, которые вынуждают пользователей Linux безальтернативно использовать клавишу CapsLock как самую беспроблемную. Программа спроектирована так, что её можно настроить на любое устройство ввода (сейчас поддерживается клавиатура и джойстик), на любую комбинацию действий с любой логикой срабатывания.

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

В плане развития указывается на добавление обработки клавиатурных событий среды X11, благодаря чему LoLo Switcher будет полноценным X11-приложением, способным предоставить свой функционал при удалённом подключении к X-серверу. Для этого автору нужна помощь сообщества, так как ему неизвестен работающий способ получения клавиатурных событий от всех окон на рабочем столе.

Автор использует LoLo Switcher для переключения между RUS/LAT с помощью правого и левого SHIFT. Обсуждение такого способа переключения можно найти на ЛОРе.

Официальная страница программы LoLo Switcher

Руководство по конфигурированию LoLo Switcher

Видео с демонстрацией работы LoLo Switcher на YouTube

Новость на сайте автора

Перемещено svu из OpenSource



Последнее исправление: adriano32 (всего исправлений: 3)
Ответ на: комментарий от webhamster

На странице программы я заметил под какими лицензиями она распространяется. Также заметил , что программа находится в разделе «С/С++». Для удобства можете указать в описании программы и ЯП.

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

чтобы человек ее не искал с большой точностью

Пускай win не отличается бОльшим размером, чем другие клавиши, найти её не сложнее, именно благодаря тому, что левый вин в нижнем ряду слева __посередине__ между двумя другими клавишами.

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

Я с тобой согласен лишь в том, что Ctrl+Shift — самая идиотская комбинация клавиш для управления раскладками, которую можно было придумать, хотя возможно это удобно для тех, кому нужно акцентировать внимание, сделать осмысленное действие-паузу, чтобы зафиксировать в голове, что раскладка изменилась, сменилось набор и расположение спецсимволов и т. п.

В остальном — любая одиночная управляющая клавиша, кроме забинденных на действия (типа Esc), может нормально служить для переключения раскладки. И если ты не пользуешься Caps, то почему ты «вынужден им пользоваться», ты просто нашёл ему применение. Если я пользуюсь win, значит я просто не пользуюсь ей в linux и нашёл её применение таким образом. Ты изложил идею использования shift для переключения? да, спасибо, предоставь же теперь каждому сделать свой собственный выбор.

вот сделай ты наглядный пруф-эксперимент, проведя который, человек поймёт что шифт удобней, тогда бы и поговорили о том, что эргономично и стоит ли сменить комбинацию. А так, слова, слова, слова, какие-то туманные умозаключения, в которых много субъективизма..

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

> В остальном — любая одиночная управляющая клавиша, кроме забинденных на действия (типа Esc), может нормально служить для переключения раскладки.

Уточню: может нормально служить только в том случае, если человек пользуется кольцевым переключением.

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

У кольцевого переключения есть проблема: постоянно нужно следить за контекстом, то есть, нужно помнить, какой язык стоит в данный момент. Для меня это проблема. Мне приходится либо скашивать глаза на индикатор, либо что-то писать, увидеть какая раскладка, стереть если не то, и написать заново. Поэтому гораздо проще тыкнуть на клавишу нужного языка (прямое переключение) и быть уверенным, что текст будет написан в той раскладке, которая мне нужна. Времени на это затрачивается меньше, чем тот же поиск взглядом индикатора ракладки и возвращение взгляда на прежнее место.

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

> Что необходимо только для сборки, а что чисто для runtime?

Для сборки нужны заголовки X11, pcre, pthread.

Для рунтайма те же скомпилированные библитеки.

Ты это хотел узнать?

webhamster
() автор топика

Извините, новость уходит на форум. Невозможно всерьез обсуждать прогу такого размера, требующую каких-то телодвижений с правами доступа, да еще и с комментариями на русском языке в ср1251.

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

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

И да, кэпы, я не хочу объединять ua_layout с ru_layout, мне так неудобно.

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

Ага, спасиб, уже нашёл.
Нужно создать файл /etc/udev/rules.d/51-evdev-users.rules следующего содержания

# input
KERNEL=="mouse*|mice|event*", MODE="0644"

Теперь запуск кейлоггера становится тривиальной задачей! =)

Deleted
()
Ответ на: комментарий от webhamster

> У меня создается впечатление, что с переключателями раскладки нет проблем только в Windows.

Есть. Срабатывает не всегда.

blackst0ne ★★★★★
()

Ооооо! Скажи мне, шайтан-джигит, а эта твоя бесовская машина сможет работать на Xvnc без поддержки xkb?

kid_lester
()
Ответ на: комментарий от webhamster

> У меня создается впечатление, что с переключателями раскладки нет проблем только в Windows.

Если бы у меня в Linux было бы такое «с переключателями раскладки нет проблем», какое было в Windows, я бы очень-очень долго ругался бы.

kid_lester
()
Ответ на: комментарий от webhamster

>нет проблем только в Windows.

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

AlexCones ★★★
()

Несколько «за» в пользу CapsLock

1. Она действительно используется, чтобы не было конфликтов с хоткеями WM/DE.

2. Она достаточно удобно расположена. В районе Ctrl+Shift (любимая раскладка на виндокомпах) мизинец лежит только при игре в шутеры, а в шутерах мне переключение раскладки не впилось.

3. Клавиша свободна. Она реально свободна. Функция включения режима ввода БОЛЬШИХ СИМВОЛОВ используется мною чуть чаще, чем никогда. Мне не влом нажать для этого Shift+CapsLock - я это делаю реже, чем переключаю раскладку.

Вывод - ЛоЛо Свичер - не нужен.

Эх, энергию автора, да в мирных целях бы! Например, редактор текстовый написать, чтоб любые кодировки «искаропки» (существующий tea - говнокомбайн).

agentgoblin
()
Ответ на: комментарий от webhamster

Я все еще жду от тебя файлик main.cpp с рабочим примером получения клавиатурных событий от всех окон на рабочем столе.

Ути-пути.

Запускаешь xneur с максимальным уровнем логов. И наблюдаешь такие замечательные строки:

[DBG] 05:09:52 Focused window 35651589
[DBG] 05:09:52 Process new window (ID 35651589) with name 'Lxterminal' (status Processed, mode Default)
[DBG] 05:09:52 Interception of events in the window (ID 35651589) with name 'Lxterminal' ON

Делаешь по сорцам grep 'Focused window' -r . и находишь чудесную функцию focus_get_focus_status() в ./lib/main/focus.c

Потом делаешь grep 'focus_get_focus_status' -r . и находишь функцию program_update() в ./lib/main/program.c

А вызывается program_update() откуда? Правильно: вызывается из program_process_input(), конкретнее — из case-веток для обработки событий FocusOut и ButtonPress

И — о боже — мы нашли алгоритм, отслеживающий поток событий для сфокусированного окна!

geekless ★★
()
Ответ на: комментарий от no-dashi

Например, xneur и так прекрасно работает из-под пользователя и ведёт кейлоги, да ещё и подписывает, что и в каком окне было введено.

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

>редактор текстовый написать, чтоб любые кодировки «искаропки»

Любые кодировки понимать не выйдет в принципе (нужно хотя бы язык знать, да и вообще enca не всесильна), но mousepad уже давно написан.

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

> Извините, новость уходит на форум. Невозможно всерьез обсуждать прогу такого размера, требующую каких-то телодвижений с правами доступа, да еще и с комментариями на русском языке в ср1251.

Хм, там только некоторые файлы в CP1251, остальные в UTF-8. У меня редактор на автопилоте определяет кодировку, так что проблемы с кодировкой проходят мимо меня, я их не замечаю. А если в файле изначально были только английские символы, кодировка автоматом ставится как CP1251, и дальше тянется уже она. Поэтому в исходниках не только UTF-8, надо бы исправить.

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

> В конфиге выставил «EventFilter=» и запустил loloswitcher -t1. Нажимались левый и правый шифты по очереди

Пока все нормально. Теперь следующий шаг. Прописываешь в EventFilter строку:

EventFilter=^1,[0-9]+,[0-9]+;$

И снова запускаешь с опцией -t1. Что показывает при нажатии левого и правого SHIFT?

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

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

Тут уже объяснили, что выставлением прав KERNEL==«mouse*|mice|event*», MODE=«0644» проблему не решишь.

Я забыл сказать, что в LoLo Switcher при выполнении башевых команд, прописанных в опциях CommandX, происходит понижение прав до пользователя, запустившего бинарник loloswitcher. То есть эти команды выполняются от пользователя, а не от рута.

Пруф:

 bool changeAccess=false;
 int uid=getuid();
 int euid=geteuid();

 // Проверяется, работает ли программа в режиме SUID
 if(uid != euid)
  changeAccess=true; // Если установлен бит SUID, надо менять режим доступа

 // Если надо поменять режим доступа, меняется эффективный ID 
 // на ID пользователя, который запустил программу
 if(changeAccess)
  seteuid( uid );

 // printf("Value in thread: getuid()=%d, geteuid()=%d\n", getuid(), geteuid());
 // printf("Run command %s\n", cmd);

 // Команда выполняется
 if(popen(cmd, "r")==NULL)
  printf("Can't run command: %s\n", cmd);

 // Если режим доступа был изменен, эффективный UID возвращается в прежнее состояние
 if(changeAccess)
  seteuid( euid );

Так что тут с безопасностью всенормально.

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

Комментарии на русском - в любом случае моветон. «Проходят мимо меня», «не замечаю» - тоже показательно, в некотором роде.

Про дыру в безопасности и пр. Вам уже рассказали.

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

> поэтому запуск этого демона, как и другого системного процесса, должен происходить от рута.
Вас обманули. Уже давно большинство системных процессов запускаются не от рута. А запускать переключалку от рута - это вообще вершина...

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

> Вот

Харашо. Теперь как минимум мы знаем, что конфиг считывается и опции применяются. Есть доступ к файлу устройства, регвыры работают правильно.

Тут похоже что не переключается сама раскладка.

Показывай -t2 и -t3.

webhamster
() автор топика
Ответ на: комментарий от webhamster
Language layout test.
Layout found:

0 - English (US) (Active)
1 - Russian 

Read config test.

-------------------
Reading config data from file /home/daemonpnz/.config/loloswitcher/config.ini
-------------------
InputDevice: /dev/input/event4
DeviceType: 0
NumberOfLayout: 2
SwitchMethod: 1
EventFilter: ^1,[0-9]+,[0-9]+;$
Sequence0: (?<!1,29,1;|1,29,2;|1,97,1;|1,97,2;|1,56,1;|1,56,2;|1,100,1;|1,100,2;)1,42,1;1,42,0;$
Sequence1: (?<!1,29,1;|1,29,2;|1,97,1;|1,97,2;|1,56,1;|1,56,2;|1,100,1;|1,100,2;)1,54,1;1,54,0;$
Command0: beep -f 440 -l 25
Command1: beep -f 520 -l 25
daemonpnz ★★★★★
()
Ответ на: комментарий от svu

> Комментарии на русском - в любом случае моветон. «Проходят мимо меня», «не замечаю» - тоже показательно, в некотором роде.

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


Про дыру в безопасности и пр. Вам уже рассказали.


Рассказали тому чудаку, который стал писать прописывать в правилах KERNEL==«mouse*|mice|event*», MODE=«0644». При нативном запуске с SUID такой проблемы нет. Во всяком случае, пока вы не продемонстрируете кейлоггинг или превышение превилегий через этот переключатель.

webhamster
() автор топика

Чем оно отличается от xneur switcher?

lexxus-lex ★★★
()
Ответ на: комментарий от daemonpnz

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

А звук слышен при нажатии на SHIFT-ы?

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

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

При нативном запуске с SUID такой проблемы нет

Сама постановка вопроса о необходимости SUID для переключалки - уже дикость и бескультурье. Не везде пользователь - админ. Заниматься анализом кода на предмет дыр - извините, лениво, и это не мой профиль.

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

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

Звуки не слышны. Пробовал сделать такие команды

Command0=echo "command0" >> "/home/daemonpnz/lolo.log"
Command1=echo "command1" >> "/home/daemonpnz/lolo.log"
Файл lolo.log не создаётся, а значит команды не выполняются.

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

> Я про кейлогинг писал, что xneur делает это и без KERNEL==«mouse*|mice|event*», MODE=«0644»

Потому что он работает на уровне X11, а не с девайсом. На уровне X11 например нет события удерживания клавиши. Так что когда я вставлю поддержку инпута из X11, то в таком виде гибкость настройки будет ниже, чем при работе напрямую с девайсом. Это будет выражаться в том, что для режима X11-input станет труднее настроить реацию на переключение раскладки без побочных эффектов (например, сейчас реакция идет на «чистый» тык, а в X11-input чистым нажатием будет считаться и нажатие с удерживанием). И тут нужно будет городить костыли чтобы ловить удерживание клавиш чтоб разгести что действительно происходит с клавиатурой.

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

Нифига не удобно капсом переключать, руки на клавиатуре не так лежат

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

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

>> Это показатель того, что у меня инструментарий настроен настолько хорошо

Это показатель того, что Вам покласть на всех, кто будет иметь дело с Вашим кодом.


Почему покласть? Я написал, что надо будет исправить.


При нативном запуске с SUID такой проблемы нет

Сама постановка вопроса о необходимости SUID для переключалки - уже дикость и бескультурье.


Предложите другой способ доступа к файлу устройства.


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


Если бы иксы предоставляли нужную информацию об устройстве, самой проблемы переключалок просто небылоб. И я бы не писал еще один переключатель. Но архитектура иксов такая, что скрытие аппаратного уровня слишком сильное, отчего становится невозможно сделать некоторые вещи (см. Переключатель клавиатуры LoLo Switcher v.0.15 (комментарий) Отсюда и застаревшие проблемы с переключением раскладки, которые не могут решить и поныне.

Конечно, это ужос, что на дворе XXI век, а мне чтоб раскладку переключить приходится лезть на «уровень ядра» и писать еще один переключатель только из-за того, что кто-то решил что в X11 сигналов нажатия клавиш будет достаточно.


Необходимость делать дыры в секюрити - прямое следствие глубоко некорректного архитектурного решения (обычно так и бывает).


Я вынужден так сделать. Но вы можете предложить другое решение. Касаемо секьюрности предлагаю продемонстрировать дыру, тогда разговор станет предметным.

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

> Звуки не слышны. Пробовал сделать такие команды

Command0=echo «command0» >> «/home/daemonpnz/lolo.log»

Command1=echo «command1» >> «/home/daemonpnz/lolo.log»


Файл lolo.log не создаётся, а значит команды не выполняются.



Хм, очень все это странно. Пока что все указывает на то, что не срабатывают регулярки, отслеживающие поток. Попробуйте такие, минимальные:

Sequence0=1,42,0;$
Sequence1=1,54,0;$

Если работают, то потом такие:

Sequence0=1,42,1;1,42,0;$
Sequence1=1,54,1;1,54,0;$

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

> может есть смысл написать патчи для X11, чем писать отдельную программу?!

Напиши, протолкни. Думаю, что к тому времени вместо X11 уже везде будет стоять Wayland.

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

>А может есть смысл написать патчи для X11, чем писать отдельную программу?!

Для протокола, в смысле расширение? Уже есть XInput2 и прочие.

Для сервера? Никак не проще. Не веришь — попробуй.

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

При

Sequence0=1,42,0;$
Sequence1=1,54,0;$
Срабатывает только Sequence1, да и то при условии, что я буду быстро попеременно нажимать левы/правый шифт.

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

Эм. Сфигали переключалка должна быть реализована в x-сервере и его расширениях? Их всегда нехватало и будет нехватать (ограничение на 4 языка с убогим compose и dead keys без альтернатив для ввода всего, что не влезло в основную раскладку и без намёка на сложные методы ввода — нафиг они нужны?).

Поймать отжатие, думаю, не так сложно. И я не вижу проблемы сделать так:

1. Ловить нажатие. Можно даже поставить grab.

2. Если после нажатия была нажата левая кнопка (т.е. используется как модификатор) — сэмулировать нажатие нужной клавиши с модификатором. Хак, но будет работать.

3. Если кнопка была отпущена без левых нажатий — переключить раскладку.

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

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

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

> При

Sequence0=1,42,0;$

Sequence1=1,54,0;$


Срабатывает только Sequence1, да и то при условии, что я буду быстро попеременно нажимать левы/правый шифт.



Очень странная проблема. Ну тут остается только хардкрить.


1. Файл Main.cpp, функция runAsProcess(). Раскомментировать строчку:

// printf(«RegExp: '%s'\n», config.getSequence(layoutCount));


2. И файл EventQueue.cpp, метод checkSequence(). Раскомментировать строчки:

// printf(«Queue: '%s'\n», queueSequence);

и

// printf(«Count=%d\n», count);


Скомпилять, сделать make install, запустить /usr/sbin/loloswitcher без параметров, в консоли. Понажимать шифты, показать консольный вывод.

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