Cuttlefish ir touchpad

D
  • 19 Lap '15

Sveiki gudragalviai, matau sprendžiat bet kokią problemą sėkmingai. Štai jums dar viena

Radau programą - Cuttlefish - ir scriptą jai, kuriuo junginėju skirtingą ekrano pašvietimą teplepui. Kai įkišu maitinimo laidą, programa automatiškai padaro 100 % apšvietimą, ištraukiu - sumažina tiek, kiek nurodžiau scripte. Jei kam įdomu, galėsiu parašyti, kaip tai veikia.

Dabar pati problema: kaip padaryti, kad Lenovo M30 touchpadas taip pat veiktų, kai ištraukiamas belaidės pelės adapteris iš USB lizdo, ir nustotų veikti, kai įkištas (na, šiaip tai geriau, kai pelė įjungiama/išjungiama jungtuku ant pačios pelės). Čia keistas dalykas - pats kompiuteris niekaip neįsimena, kada reikia išjungti padą, jis veikia visada. Išjungiu (F6), o po suspendo ar po išjungimo vėl jis veikia. Norėtųsi automatiškai nustatyt, kad neveiktų, ir tik esant reikalui (be pelės) veiktų.

Kaip turėtų atrodyti scriptas ir kur jis turėtų būti padėtas?

T
Techtronic
Mindaugas N.
  • 19 Lap '15

Kaip tai padaryti yra pilnas internetas, parasysiu viena is budu kuri pats naudociau tokiu atveju.

Modernios GNU/Linux distros naudoja systemd/udev, naudokis tuom. Tarkim jeigu nori atlikti koki veiksma kai mouse pajungi, gali sukurti faila/rule (jeigu jo dar nera) /etc/udev/rules.d/mouse.rules ir jame:

SUBSYSTEM=="input", KERNEL=="mouse[0-9]*", ACTION=="add", RUN+="komanda"

O jeigu atjungi mouse:

SUBSYSTEM=="input", KERNEL=="mouse[0-9]*", ACTION=="remove", RUN+="komanda"

udevadm komanda pades surasti tikslius events.

D
  • 20 Lap '15

Hmmm... Techtronic atsakymas kelia daug klausimų. Kaip skamba "komanda"? Nerandu niekaip, kiek išbandžiau, nė viena nejungia per terminalą touchpado.

T
Techtronic
Mindaugas N.
  • 20 Lap '15

@Dimavicius gali naudoti xinput arba synclient, nepamirsk kad reikes nustatyti DISPLAY kintamaji arba XAUTHORITY.

Kaip pvz:

SUBSYSTEM=="input", ... , ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/.../.Xauthority", RUN+="/.../synclient TouchpadOff=1"
T
Techtronic
Mindaugas N.
  • 20 Lap '15

Na kad turetum ka skaityti manualose tau dar geresnis budas (beveik parasiau viska uz tave):

Kadangi jau zinome kaip kurti udev rules, galima sukurti ir systemd unit

Rule tokiu atveju bus tokia:

SUBSYSTEM=="input", KERNEL=="mouse[0-9]*", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}="touchpad_disable.service"
SUBSYSTEM=="input", KERNEL=="mouse[0-9]*", ACTION=="remove", TAG+="systemd", ENV{SYSTEMD_WANTS}="touchpad_enable.service"

Unit atrodo taip:

[Unit]
Description=Disable touchpad

[Service]
Type=oneshot
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/.../.Xauthority
ExecStart=/usr/bin/xinput ...

Systemd units jau palaiko User/Group, bei DISPLAY kintamaji nustato automatiskai, bet tai priklauso nuo esamos systemd versijos...Skaityk dokumentacija, rasi budu kaip patobulinti visa sita veiksma.

EDIT: nezinau kokia situacija su Ubuntu + systemd, bet labai tikiuosi naudoja ta ka ir visos kitos distros.

D
  • 20 Lap '15

Esu dėkingas Techtronic už norą padėti, tačiau

Aš atsiprašau, turbūt turėjau rašyti į naujokų skiltį, nes tikrai nesu žinovas šitų dalykėlių, net su paprasčiausia matematika pykstuosi, because humanitaras chrienovas

Todėl, jei Techtronic tau būtų nesunku, ar negalėtum kaip nors nušviesti visų šitų programavimo subtilybių eigą step-by-step kaisaka...?

Instrukcija skaityt... kur?

T
Techtronic
Mindaugas N.
  • 20 Lap '15

Tai gana sudetinga nezinant kiek pas tamsta yra ziniu GNU/Linux. As tikrai nerasysiu step-by-step, bet jeigu nori ne tik isspresti savo problema bet ir kazka ismokti, tai stai nuo ko gali pradeti.

Jeigu dar nezinai, tai GNU/Linux kaip ir viskas yra failai:
https://www.youtube.com/watch?v=3P8n1uC0tyI
https://www.youtube.com/watch?v=3P8n1uC0tyI

Udev yra Linux device manager (atsako uz failus esancius /dev direktorijoje), jis inicializuoja kiekviena nauja irengini ir atlieka tam tikrus veiksmus. Tarkim pervadina network interface arba leidzia suzinoti tavo naudojamam DE (Desktop environment) kad esi pajunges nauja laikmena.

Systemd taip pat labai svarbus GNU/Linux elementas, jis atsako uz servisus, periodines uzduotis (cron), logus ar net autentifikacija.

Daug kam jis nepatiko ir sulauke kritikos, nes aka systemd "nesilaiko" Unix philosophy,
bet as manau kad mums senai reikejo tokio init. Jeigu jau bent kiek teko dometis, tai zinai jog Udev dabar yra systemd dalis, o ir kaip jau rasiau visos modernios GNU/Linux distros jau naudoja systemd . Seniau teko naudotis visokius HAL, devfsd ar forkus udev, rasyti daug random shell skriptu kurie veike tik ant vienos distros, o po atnaujinimo ar reboot kartais ir niekur neveike... Tai buvo problema, kuria ne karta buvo pakele tokie garsus vardai kaip Nvidia, nes jiems buvo sudetinga parasyti driveri ar servisa kuris veiks visur.

https://en.wikipedia.org/wiki/User_space
http://www.freedesktop.org/wiki/Software/systemd/

Jeigu nori atlikti koki veiksma tada kai pvz pajungi mouse, monitoriu ar webcam'a mes galime panaudoti udev "rules" kurias skaito udev is direktorijos /etc/udev/rules.d/* ir jos atrodo taip:

SUBSYSTEM=="net", ACTION=="add", ENV{ID_USB_DRIVER}=="cdc_ether", ENV{ID_MODEL}="N900__PC-Suite_Mode", ENV{ID_VENDOR}=="Nokia", NAME="n900" RUN+="/home/minde/bin/usb_network"

Apie formata siu ruliu suzinoti gali cia http://www.freedesktop.org/software/sys ... /udev.html

Kad aptikti savo irangini gali naudoti komanda:

udevadm monitor

Tokiu budu rasi ka panaudoti kuriant udev rules. Ties judant toliau, turi keleta pasirinkimu ka toliau daryti.

* Panaudoti RUN ir tokiu budu paleisti programa ar skripta kuris atliks reikalingus veiksmus.
* Naudoti systemd servisus tam kad aktyvuoti norima servisa kuris gali buti ir kitas device

Pirmu atveju gali paprasciausiai sukurti skripta bum.sh ir nurodes kur jis randasi udev rulei sutaupyti laiko nes jis tau ir atliks norimus veiksmus

#!/bin/bash
touch /tmp/ok

Antras budas sudetingesnis, o ir privers ismokti rasyti systemd unit failus, bet ateiti tokios zinios gali labai praversti.
Systemd units rasi /usr/lib/systemd/**, arba per user ~/.config/systemd/user/**.

Turbut pats paprasciausias atrodo taip:

[Unit]
Description=Servisas kuris padaro pasauli grazesni

[Service]
ExecStart=/usr/bin/skype --self-destruction

[Install]
WantedBy=multi-user.target

kuri uzvadinus skype.service galesi paleisti su komanda:

systemctl start skype

O nurodzius udev rulei tokiu bududu:

SUBSYSTEM=="net", ACTION=="add", ENV{ID_USB_DRIVER}=="cdc_ether", ENV{ID_MODEL}="N900__PC-Suite_Mode", TAG+="systemd", ENV{SYSTEMD_WANTS}="skype.service"

paleisi savo nauja servisa kuris paleis komanda "skype --self-destruction" kai Linux aptiks nauja irangini. Placiau apie servisu rasyma rasi cia http://www.freedesktop.org/software/sys ... .unit.html

Na dabar turi pakankamai informacijos kaip pasieti norima tiksla, tik ar noro yra dometis toliau ?