LINUX.ORG.RU

Вышел LoLo Switcher v.0.25

 , , ,


0

2

LoLo Switcher - низкоуровневый локальный переключатель клавиатуры для оконной системы X11. Работает в любых окружениях рабочего стола: KDE3, KDE4, GNOME, LXDE и прочих.

LoLo Switcher запускается как процесс на низком системном уровне и получает данные от клавиатуры напрямую из файла устройства. Обнаружив нужную последовательность кодов, LLS вызывает функции X11, отвечающие за переключение раскладки. Переключатель очень компактен и быстр, поддерживает любые модели клавиатур и джойстиков, реагирует на любые события устройства ввода, включая отпускание клавиш. Способен прозрачно работать параллельно с другими переключателями клавиатуры.

Гибкость срабатывания переключения языка обусловлена использованием регулярных выражений. Одно выражение фильтрует поток событий, второе вычленяет в потоке набор событий, при котором должно произойти переключение. Доступно как циклическое переключение языка, так и прямое. Автор использует LLS для переключения языков с помощью левого и правого SHIFT-а.

Сегодня стал доступен новый стабильный релиз LoLo Switcher v.0.25. Переключатель созрел для использования как на на 32-битных Linux-платформах, так и на платформах x86_64.

Для ознакомления с возможностями программы, на YouTube размещена видеодемонстрация работы.

Также доступно руководство по настройке.

>>> Официальная страница LoLo Switcher



Проверено: Aceler ()
Последнее исправление: Deleted (всего исправлений: 4)

Ололо свитчер... Мда... Название конечно не дотягивает до дохной говядины, но в десятке с ней...

shaplov ★★★
()

Низкоуровневый? Добавьте туда дополнительный функционал, если не трудно. Часто полноэкранные игры монопольно захватывают устройство ввода. Не работает Alt-Tab, Alt-F4. Я настроил actkbd, который также имеет прямой доступ к устройствам ввода, и герои три для Linux стали спрашивать «точно выйти?» по Alt-F4, все игры стали переключаться по Alt-Tab, а не только игры в Wine.

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

> Добавьте туда дополнительный функционал, если не трудно. Часто полноэкранные игры монопольно захватывают устройство ввода. Не работает Alt-Tab, Alt-F4. Я настроил actkbd, который также имеет прямой доступ к устройствам ввода, и герои три для Linux стали спрашивать «точно выйти?» по Alt-F4, все игры стали переключаться по Alt-Tab, а не только игры в Wine.

Хм, но это не задача переключателя раскладки клавиатуры. Делать комбаин - по моему это провальный путь. Пусть переключатель раскладки переключает раскладку.

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

> А... когда он вышел-то? В ченджлогах обычно даты пишут.

На официальной странице:

Последняя актуальная версия: 0.25 (09.10.2011)

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

> По видео понял что это не переключатель раскладки, это выбиратель её.

Это и переклчатель и выбиратель, смотря как настроить.

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

Хм... Просто мой способ сильно страшный. Надо запускать две команды, присвоения прав в /dev, и сама программа. Подробности на LOR Wiki в Games в конце. Узнать бы как сделать хороший конфиг и чтобы стартовало автоматически - написал бы совет

ZenitharChampion ★★★★★
()

Я надеюсь, он ещё и умеет срабатывать по отпусканию клавиш, а не по нажатию, а то некоторые несознательные личности понастроили себе всяких странных сочетаний клавиш :)

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

> Я надеюсь, он ещё и умеет срабатывать по отпусканию клавиш

Да, умеет. Впринципе, из-за этой функции я его и писал.

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

Нужно ввести пункт при постинге в новостях - указание лицензии программного продукта.

Gordy
()

>Гибкость срабатывания переключения языка обусловлена использованием регулярных выражений

Ждём нового пунтосвитчера поверх сабжа? :))

Binary ★★★★★
()

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

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

> Я еще в прошлый раз все сказал о странных архитектурных идеях автора.

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

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

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

В xneur работает «по отпусканию клавиш ». А автор сего чуда писал свой велосипед, потому что не осилил xneur/gxneur.

daemonpnz ★★★★★
()

Changelog в студию, кстати.

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

Я надеюсь, он ещё и умеет срабатывать по отпусканию клавиш, а не по нажатию, а то некоторые несознательные личности понастроили себе всяких странных сочетаний клавиш :)

Дык есть же вроде патч на самый любимый баг иксов, который дает возможность переключать по Ctr+Shift без потери шорткатов.

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

по как настроено в xkb, на самом деле не совсем та задача, что решает loloswitcher, но не попиарить kbdd я не мог.

qnikst ★★★★★
()

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

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

>А автор сего чуда писал свой велосипед, потому что не осилил xneur/gxneur.

Мне вот xneur не нравится, такой-то он тупой и унылый

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

>Делать комбаин - по моему это провальный путь.

но и запускать десяток низкоуровневых перехватчиков клавиатуры тоже не есть хорошо. Потом приходится городить костыли вроде пульсаудио.

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

kbdd, в общем-то для пооконности, сохранения предыдущей раскладки (тоже пооконно) (актуально для тех у кого больше 2 раскладок) и dbus интерфейса для визуализации раскладки и команд переключения.

Кстати, я тут подумал, в принципе реально сделать и по отпусканию в общем-то с хоть с xkb, достаточно в xbindkeys прописать смену раскладок по необходимой комбинации клавишь. Пример програмки на 15 строк где-то на лоре есть.

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

переключалка срабатывает по отжатию клавиш или по нажатию?

да нагните уже ваших дистростроителей, чтобы на иксы волшебный патч наложили!

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

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

Да, ибо LoLo Switcher работает только с X-функциями. На окружение ему пофиг.

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

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

в иксах они по номерам 0,1,2,3 в той очерёдности как записаны в xorg или переданы через setxkbmap

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

> Дык есть же вроде патч на самый любимый баг иксов, который дает возможность переключать по Ctr+Shift без потери шорткатов.

Больше способов, хороших и разных. Если этот патч до сих пор не в апстриме, это что-то значит, нессе па?

Aceler ★★★★★
()

а вот и сам патч:

diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index 2cdb6fc..3ed6263 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -325,24 +325,83 @@ _XkbFilterLatchState(	XkbSrvInfoPtr	xkbi,
     return 1;
 }
 
+static int xkbSwitchGroupOnRelease(void)
+{
+    /* TODO: user configuring */
+    return TRUE;
+}
+
+static void xkbUpdateLockedGroup(XkbSrvInfoPtr xkbi, XkbAction* pAction)
+{
+    XkbGroupAction ga = pAction->group;
+    if (ga.flags&XkbSA_GroupAbsolute)
+	xkbi->state.locked_group= XkbSAGroup(&ga);
+    else xkbi->state.locked_group+= XkbSAGroup(&ga);
+}
+
+static XkbFilterPtr _XkbNextFreeFilter(XkbSrvInfoPtr xkbi);
+
 static int
-_XkbFilterLockState(	XkbSrvInfoPtr	xkbi,
+_XkbFilterLockGroup(	XkbSrvInfoPtr	xkbi,
 			XkbFilterPtr	filter,
 			unsigned	keycode,
 			XkbAction *	pAction)
 {
-    if (pAction&&(pAction->type==XkbSA_LockGroup)) {
-	if (pAction->group.flags&XkbSA_GroupAbsolute)
-	     xkbi->state.locked_group= XkbSAGroup(&pAction->group);
-	else xkbi->state.locked_group+= XkbSAGroup(&pAction->group);
-	return 1;
+    int sendEvent = 1;
+
+    if (!xkbSwitchGroupOnRelease()) {
+	xkbUpdateLockedGroup(xkbi, pAction);
+	return sendEvent;
+    }
+    
+    /* Delay switch till button release */
+    if (filter->keycode==0) {		/* initial press */
+	filter->keycode = keycode;
+	filter->active = 1;
+	filter->filterOthers = 0; /* for what? */
+	filter->filter = _XkbFilterLockGroup;
+
+	/* filter->priv = 0; */
+	filter->upAction = *pAction;
+
+	/* Ok, now we need to simulate the action which would go if this action didn't block it.
+	   XkbSA_SetMods is the one: it is to set modifier' flag up. */
+	{
+	    XkbStateRec	fake_state = xkbi->state;
+	    XkbAction act;
+
+	    fake_state.mods = 0;
+	    act = XkbGetKeyAction(xkbi, &fake_state, keycode);
+
+	    /* KLUDGE: XkbSA_SetMods only? */
+	    if (act.type == XkbSA_SetMods) { 
+		XkbFilterPtr filter = _XkbNextFreeFilter(xkbi);
+		sendEvent = _XkbFilterSetState(xkbi,filter,keycode,&act);
+	    }
+	}
     }
+    else {
+  	/* do nothing if some button else is pressed */
+	if (!pAction)
+	    xkbUpdateLockedGroup(xkbi, &filter->upAction);
+	filter->active = 0;
+    }
+
+    return sendEvent;
+}
+
+static int
+_XkbFilterLockMods(	XkbSrvInfoPtr	xkbi,
+			XkbFilterPtr	filter,
+			unsigned	keycode,
+			XkbAction *	pAction)
+{
     if (filter->keycode==0) {		/* initial press */
 	filter->keycode = keycode;
 	filter->active = 1;
 	filter->filterOthers = 0;
 	filter->priv = 0;
-	filter->filter = _XkbFilterLockState;
+	filter->filter = _XkbFilterLockMods;
 	filter->upAction = *pAction;
 	xkbi->state.locked_mods^= pAction->mods.mask;
 	xkbi->setMods = pAction->mods.mask;
@@ -1104,9 +1163,12 @@ xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(dev);
 		    sendEvent=_XkbFilterLatchState(xkbi,filter,key,&act);
 		    break;
 		case XkbSA_LockMods:
+		    filter = _XkbNextFreeFilter(xkbi);
+		    sendEvent=_XkbFilterLockMods(xkbi,filter,key,&act);
+		    break;
 		case XkbSA_LockGroup:
 		    filter = _XkbNextFreeFilter(xkbi);
-		    sendEvent=_XkbFilterLockState(xkbi,filter,key,&act);
+		    sendEvent=_XkbFilterLockGroup(xkbi,filter,key,&act);
 		    break;
 		case XkbSA_ISOLock:
 		    filter = _XkbNextFreeFilter(xkbi);
DoctorSinus ★★★★★
()
Ответ на: комментарий от daemonpnz

> А автор сего чуда писал свой велосипед, потому что не осилил xneur/gxneur.

Этот xneur в половине программ тупо не работает. Когда я его пару месяцев назад ставил, он не переключал раскладку в Kate, в Kopete, в Xterm. Что это за переключатель такой? В одних программах переключает, в других нет.

Запрос в Google «xneur не работает» показательный.

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

Если этот патч до сих пор не в апстриме, это что-то значит, нессе па?

Он как минимум в бубунте наложен уже давно (ну больше года точно). А не в апстриме, потому что он изменяет протокол (но при этом проблем при практическом использовании не дает - это проверено).

Pavval ★★★★★
()

А можно на нём реализовать такое поведение: При нажатии ctrl или alt раскладка переключается на английскую qverty, а при отжатии - обратно на ту, что была?

tot-to
()
Ответ на: комментарий от lizard

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

Сначала включаешь средствам DE раскладки которые нужны.

Потом даешь команду:

/usr/sbin/loloswitcher -t2

Тебе будет показан список раскладок. Первая имеет индекс 0, остальные по возрастанию. Ну и указываешь

NumberOfLayout=4

И потом задаёшь значения для Sequence0 ... Sequence3 если нужно прямое переключение (SwitchMethod=1).

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