Нов аналог на Punto Switcher за linux: xswitcher

Краят на поддръжката на xneur ми причини известно страдание през последните шест месеца. (с навлизането на OpenSUSE 15.1 на моите настолни компютри: с активиран xneur прозорците губят фокус и мигат смешно в такт с въвеждане от клавиатурата).

„О, по дяволите, отново започнах да пиша в грешното оформление“ - това се случва неприлично често в работата ми. И не добавя нищо положително.

Нов аналог на Punto Switcher за linux: xswitcher
В същото време аз (като инженер-конструктор) мога доста ясно да формулирам какво искам. Но аз исках (първо от Punto Switcher, а след това, благодарение на Windows Vista, най-накрая преминаване към Linux, от xneur) точно едно нещо. След като разберете, че боклукът на екрана е в грешно оформление (това обикновено се случва в края на въвеждането на нова дума), натиснете „Пауза/Прекъсване“. И вземете това, което сте отпечатали.

В момента продуктът има оптималното (от моя гледна точка) съотношение функционалност/сложност. Време е да споделим.

TL.DR

По-късно ще има всякакви технически подробности, така че първо - връзка "докосване" за нетърпеливите.

В момента следното поведение е твърдо кодирано:

  • „Пауза/Прекъсване“: връща назад последната дума, превключва оформлението в активния прозорец (между 0 и 1) и набира отново.
  • „Ляв Ctrl без нищо“: превключва оформлението в активния прозорец (между 0 и 1).
  • „Ляво преместване без нищо“: включва оформление № 0 в активния прозорец.
  • „Дясно преместване без нищо“: включва оформление № 1 в активния прозорец.

Отсега нататък смятам да персонализирам поведението. Без обратна връзка не е интересно (все пак съм добре). Вярвам, че на Хабре ще има достатъчен процент от аудиторията с подобни проблеми.

NB защото в текущата версия кийлогърът е прикачен към "/dev/input/", xswitcher трябва да се стартира с root права:

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 MB в RSS).

Детайли

Сега - подробностите.

Цялото хранилище първоначално беше посветено на моя проект за домашни любимци и ме мързи да започна друг. И така, всичко е натрупано (само в папки) и е покрито от AGPL („обратен патент“).

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

Текстът съдържа коментари откъде е заимстван и защо. защото кодът на xneur „не ме вдъхнови“, взех го като отправна точка loloswitcher.

Използването на "/dev/input/" има както своите предимства (всичко се вижда, включително натиснатия клавиш за автоматично повторение), така и недостатъци. Недостатъците са:

  • Автоматичното повторение (събития с код „2“) не корелира с повторението с x.
  • Входът през X11 интерфейси не се вижда (така работи например VNC).
  • Нуждаете се от root.

От друга страна е възможно да се абонирате за X събития чрез „XSelectExtensionEvent()“. Можете да надникнете xinput код. Не намерих нищо подобно за go и грубата реализация веднага отне сто реда C код. Оставете го настрана за сега.

„Обратният“ изход в момента се осъществява чрез завинтване на виртуалната клавиатура. Благодаря на автора на keybd_event, но абстракцията там е твърде високо ниво и ще трябва да се преработи допълнително. Например, използвам десния клавиш Win, за да избера 3-тия ред. И само левият Win се предава обратно.

Известни грешки

  • Не знаем нищо за „композитен“ вход (пример: ½). Не е необходимо точно сега.
  • Ние играем правилната победа неправилно. В моя случай разваля ударението.
  • Няма ясен анализ на входа. Вместо това има няколко функции: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Благодаря nsmcan за ваша грижа: коригирах го в кода и тук. С известна вероятност можете да хванете грешки при подмяна.
    На този етап не знам „как да“ и бих приветствал всякакви предложения.
  • (О, Боже) конкурентно използване на канали (keyboardEvents, miceEvents).

Заключение

Кодът е най-простата процедура. И глупав като мен. Така че, лаская се с надеждата, че почти всеки техник ще може да завърши това, което иска. И благодарение на това, този продукт няма да загине без поддръжка, както повечето само за забавление.

На добър час!

Източник: www.habr.com

Добавяне на нов коментар