آنالوگ جدید Punto Switcher برای لینوکس: xswitcher

پایان پشتیبانی xneur در شش ماه گذشته باعث رنج من شده است. (با ظهور OpenSUSE 15.1 روی دسکتاپ من: با فعال بودن xneur، پنجره ها فوکوس خود را از دست می دهند و به مرور زمان با ورودی صفحه کلید سوسو می زنند).

"اوه، لعنتی، من دوباره شروع به تایپ کردن در طرح بندی اشتباه کردم" - در کار من این اغلب به طرز ناشایست اتفاق می افتد. و هیچ چیز مثبتی اضافه نمی کند.

آنالوگ جدید Punto Switcher برای لینوکس: xswitcher
در عین حال، من (به عنوان یک مهندس طراح) می‌توانم آنچه را که می‌خواهم کاملاً واضح فرموله کنم. اما من (اول از Punto Switcher، و سپس، به لطف ویندوز ویستا، در نهایت به لینوکس، از xneur) دقیقاً یک چیز می خواستم. پس از اینکه متوجه شدید که زباله های روی صفحه در طرح بندی اشتباهی قرار دارند (این معمولاً در پایان تایپ یک کلمه جدید اتفاق می افتد)، روی "مکث/شکستن" کلیک کنید. و آنچه را که چاپ کرده اید دریافت کنید.

در حال حاضر، محصول نسبت عملکرد/پیچیدگی بهینه (از دیدگاه من) را دارد. وقت اشتراک گذاری است.

TL.DR

بعداً انواع جزئیات فنی وجود خواهد داشت، بنابراین ابتدا - پیوند "لمس کردن" برای افراد بی تاب

در حال حاضر رفتار زیر کدگذاری شده است:

  • "مکث/شکست": کلمه آخر را به عقب باز می کند، طرح را در پنجره فعال تغییر می دهد (بین 0 و 1) و دوباره شماره گیری می کند.
  • "Ctrl چپ بدون هیچ چیز": طرح بندی را در پنجره فعال (بین 0 و 1) تغییر می دهد.
  • "Shift چپ بدون هیچ چیز": طرح شماره 0 را در پنجره فعال روشن می کند.
  • "Shift راست بدون هیچ چیز": طرح شماره 1 را در پنجره فعال روشن می کند.

از این به بعد قصد دارم رفتار را سفارشی کنم. بدون بازخورد، جالب نیست (به هر حال من با آن خوب هستم). من معتقدم که در Habré درصد کافی از مخاطبان با مشکلات مشابه وجود خواهد داشت.

NB زیرا در نسخه فعلی، keylogger به "/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 به زبان گلانگ نوشته شده است، با حداقل گنجاندن C. فرض بر این است که این رویکرد کمترین تلاش را به همراه خواهد داشت (تا کنون). در حالی که توانایی اتصال موارد گم شده را با استفاده از cgo حفظ می کنید.

متن حاوی نظراتی است در مورد اینکه از کجا و چرا گرفته شده است. زیرا کد xneur "به من الهام بخش نبود"، آن را به عنوان نقطه شروع در نظر گرفتم لولوسویچر.

استفاده از "/dev/input/" هم مزایا دارد (همه چیز قابل مشاهده است، از جمله کلید تکرار خودکار فشار داده شده) و هم معایب. معایب عبارتند از:

  • تکرار خودکار (رویدادهای با کد "2") با تکرار با x ارتباطی ندارد.
  • ورودی از طریق رابط های X11 قابل مشاهده نیست (مثلاً VNC اینگونه عمل می کند).
  • نیاز به روت

از سوی دیگر، اشتراک رویدادهای X از طریق "XSelectExtensionEvent()" امکان پذیر است. می توانید نگاه کنید کد xinput. من چیزی شبیه به این را برای رفتن پیدا نکردم، و پیاده سازی خشن بلافاصله صد خط کد C را به خود اختصاص داد. فعلا بذارش کنار

خروجی "معکوس" در حال حاضر از طریق پیچ کردن صفحه کلید مجازی ایجاد می شود. با تشکر از نویسنده keybd_event، اما انتزاع در آنجا بسیار سطح بالایی است و باید دوباره انجام شود. به عنوان مثال، من از کلید Win سمت راست برای انتخاب ردیف 3 استفاده می کنم. و فقط Win چپ به عقب منتقل می شود.

اشکالات شناخته شده

  • ما چیزی در مورد ورودی "کامپوزیت" نمی دانیم (مثال: ½). در حال حاضر نیازی به آن نیست.
  • ما داریم برد درست را اشتباه بازی می کنیم. در مورد من، این تاکید را می شکند.
  • هیچ تجزیه ورودی واضحی وجود ندارد. در عوض، چندین تابع وجود دارد: Compare()، CtrlSequence()، RepeatSequence()، SpaceSequence(). سپاس ها nsmcan برای مراقبت شما: آن را در کد و اینجا تصحیح کرد. با احتمال معینی می توانید هنگام تعویض باگ ها را پیدا کنید.
    در این مرحله من "چگونه" را نمی دانم و از هر پیشنهادی استقبال می کنم.
  • (وای خدا) استفاده رقابتی از کانال ها (keyboardEvents، miceEvents).

نتیجه

کد ساده ترین رویه است. و مثل من احمق بنابراین، من با این امید که تقریباً هر تکنسینی بتواند آنچه را که می خواهد کامل کند، خود را تملق می گویم. و به لطف این، این محصول بدون پشتیبانی از بین نمی رود، مانند بسیاری از موارد فقط برای سرگرمی.

موفق باشید!

منبع: www.habr.com

اضافه کردن نظر