[Megoldva] Billentyűzetkiosztás módosítása Xmodmap helyett (volt: Ébredéskor script végrehajtása / xkbcomp)

Fórumok

Sziasztok!

Xmodmap helyett szeretnék az xkbcomp segítségével billentyűzetkiosztást beállítani.

A kiosztás betöltése működik is, de alvás utáni ébredéskor visszaáll az alapértelmezett kiosztás.

Próbálkoztam /etc/pm/sleep.d alá betenni az indítását, ill. megpróbáltam a systemd alá betenni ébredésre, de látszólag nem hajtja végre egyik sem.
A rendszer Debian 8 + KDE4, manuálisan indítva jól működik.

Lehet, hogy elkerülte valami a figyelmem, de hogyan tudnék felébredéskor egy scriptet ténylegesen lefuttatni?

Minden ötletet szívesen fogadok.

------------------------------------------------------------------------------------

A következőképpen oldottam meg a problémát:

Volt egy .xkb fájlom, ami az Xmodmap-os kiosztást tartalmazta.
Így generálható le az aktuális kiosztás alapján:

xkbcomp -xkb $DISPLAY filename.xkb

Ebből a fájlból a konkrét billentyű-kiosztást hagytam meg, ez nálam xkb_symbols "pc+hu+inet(evdev)"-vel kezdődött.
Minden mást kitöröltem, beleértve a fájl elején lévő "xkb_keymap { nyitó" (és hozzá tartozó záró) tag-et is.
Az említett sort pedig lecseréltem "xkb_symbols "basic""-re, és az előző sorba beírtam, hogy "default partial".

Elneveztem "vazso"-nak és bekerült a /usr/share/X11/xkb/symbols könyvtárba.

Az ugyanitt található "hu" nevű fájlt szerkesztettem, és beleírtam a következőket:

// Saját layout
partial
xkb_symbols "vazso" {
   include "hu(102_qwertz_comma_dead)"
   include "vazso(basic)"
   name[Group1] = "Hungarian";
};

A /usr/share/X11/xkb/rules könyvtárban lévő evdev.xml-t a következőképpen módosítottam:

Megkerestem a magyar kiosztást, ennél a layout/configitem/name paraméter értéke "hu".
Megkerestem a "variantList" részt, és ide beillesztettem a következőket:

<variant>
   <configItem>
      <name>vazso</name>
      <description>Hungarian (VaZso)</description>
   </configItem>
</variant>

Ezek után fel tudtam venni mint magyar billentyűzetkiosztás, és be tudtam állítani "vazso" variánsként.
Megjelent rendesen a billentyűzetkiosztások között, és tudok váltani a magyar, módosított magyar, angol kiosztások között.

Sleep üzemmódból felélesztve működik rendesen a billentyűzetkiosztás, új billentyűzet csatlakoztatásakor pedig azon is működik rendesen.

Végeredményben sikerült az Xmodmap-os megoldással azonos eredményt elérnem, csak nem terheli annyira a gépet és könnyedén váltogathatok a kiosztások között is.
...és ami a lényeg: nem okoz gondot ébredéskor, ha alt+tab kombinációt nyomok a gépnek, vagyis gyorsan éled a rendszer.

Így már elégedett vagyok vele. :)

Hozzászólások

Nem lehet hogy a script éppen lefut csak nincs jogosultsága (xauth) az X-hez?

Azt elvileg megoldottam, szimplán rootként futtatva működik, hozzáfér a user session-jéhez egyéb varázslások nélkül is.

Próbáltam /home/user alá file-t is létrehozni, egyelőre az sem sikerült - ennek illene megtörténnie userként és rootként is.

A /etc/systemd alatt viszont valószínűleg nem jól próbáltam futtatni, annak még jobban utána kell járnom.
Azt nem értem viszont, hogy állítólag .xsessionrc-ből is el kellene indulnia, de még file-t sem sikerült létrehoznom innen sem.

Azt kizártnak tartom, hogy script alapon ezt a problémát meg lehessen oldani (emiatt a systemd sem hangzik megoldásnak).
A probléma ott kezdődik, hogy a menet közben megjelenő (pl. kihúzod-visszadugod) billentyűzetre is le kellene valakinek futtatni a scriptet, de az X szerver kivételével szerintem nincs olyan komponens, aki tudna arról, hogy "nőtt egy új billentyűzet" az X számára. A kernel (és emiatt a systemd) csak azt tudja, hogy nőtt egy új input device, de hogy mikor lesz abból az X számára új billentyűzet, azt csak ő tudja.
Jelenleg én is scriptet használok, csak nálam ki van vezetve egy window manager menübe, és amikor szükség van rá, akkor kiadom a parancsot onnan újra.

Szerintem kb. ezen a környéken lehet a megoldás:
https://wiki.archlinux.org/index.php/Keyboard_configuration_in_Xorg#Usi…

Lehet, hogy nem úszom meg egy korrekt kiosztás létrehozását /usr/share/X11/xkb alapon?

Valóban visszaáll alapértelmezettre a kiosztás (mindenhol), ha külső billentyűzetet csatlakoztatok - újra le kell futtatni.
...meg ugye alvó állapotból felélesztve is ugyanez történik.

Eddig Xmodmap-ot használtam, ott ezek a problémák nem fordultak elő, csak az kergetett őrületbe, hogy alvó állapotból felélesztve néhány percig tilos volt megnyomnom pl. az alt+tab kombinációt, mert onnantól kezdve percekig úgy gondolta, az alt folyamatosan nyomva van.
Ilyenkor billentyűzetet hiába nyomkodtam, egérkattintás helyett meg az ablakot mozgatta volna - akár cirka öt percig.

Nem lehet, hogy a DISPLAY környezeti változó nincs beállítva a szrkipt számára? Egy DISPLAY=:0.0 sor a szkripted elején sokat lendíthet a dolgokon.

A parancsok path-szal vannak megadva?

Mert ha user-ként futtatod, akkor simán jó a mount valami parancs is, mert a user környezetét örökli, de úgy általában cron vagy hasonló környezetből indítva csak teljes path-szal, /bin/mount-ként szeret futni.

A script debug-olásához tedd ezt a script az elejére:


exec 2> /tmp/valami.log
exec 1>&2
set -x

Majd a /tmp/valami.log-ban hátha találsz valami használhatót.

Köszi - az xkbcomp-ot direkt emiatt útvonallal együtt hívtam meg, de a file-létrehozásnál ez elmaradt.
Most nem futtattam újra, de valószínűleg innen tovább lehetne lépni (ha látszik, hogy root-ként futtat, akkor másként kellene indítani az xkbcomp-ot is).

...viszont ez nem oldja meg a billentyűzet-csatlakoztatásos problémát, ezért a xkb-s megoldáson lenne jó végigmenni.

Gondolj arra, ha a szkripted, amibe szépen bevezetted a teljes elérési útvonalakat, meghív egy másik szkriptet (ami pl. egy csomaggal került a rendszerbe, és nem lenne jó ötlet teletűzdelni).
A teljes elérési útvonal pedig az miatt se túl jó, mert nem hordozható: van, ahol /bin-ben van, van, ahol /usr/bin-ben, van, ahol meg /usr/local/bin-ben.

Szóval inkább maradnék a crontab-ban megadott PATH-nál.

Most olvasgattam a linuxos crontab manualt, ami azt írogatja, hogy a cron a /bin/sh-t hívja meg, mint shell. Ha nincs shebang a szkripted elején, és a /bin/sh nem egy link a bash-ra, hanem egy szerényebb lehetőségekkel megáldott shell, akkor az is lehet, hogy szintaktikai hibásnak találja a bash-ra készült szkriptedet.

Mivel nem hagyott nyugodni a dolog, kicsit próbálkoztam.
Egyelőre ezt a módosítást csináltam a /usr/share/X11/xkb/rules/evdev.xml file-ban:

 <layout>
  <configItem>
   <name>hun</name>

   <shortDescription>hu</shortDescription>
   <description>Hungarian (Sajat)</description>
   <languageList>
    <iso639Id>hun</iso639Id>
   </languageList>
  </configItem>
 </layout>

A /usr/share/X11/xkb/symbols könyvtárba pedig bekerült a már meglévő keyboard.kbd file-om hun néven.

Így most külső billentyűzet csatlakoztatása után is van ékezetem, és altatni is tudom a rendszert úgy, hogy nem áll át a kiosztásom.
Mondjuk a külső billentyűzet angol kiosztású lesz, a belső jó.

Ez így messze van a tökéletestől, sokat lehet még finomítani rajt. Pl. a magyar egy variációjaként kellene berakni, és reménykedem, hogy user könyvtárból, esetleg /etc alól is elvégezhető.

Elvileg nem kellene az egészet felüldefiniálni, csak a magyar alapkiosztáshoz képesti módosulást, de az irány jónak tűnik.

Majd foglalkozom még vele, egyelőre a kényelmi kérdést nálam megoldotta.
Lehet, a hétvégén próbálkozom még. :)

Nálam az volt (van?), hogy újra meg újra elvesztek az xmodmap és a billentyű sebesség beállításaim. Azt szeretem, ha a billentyű rövid várakozás után szélsebesen ismétel, azonnal észereveszem, ha lelassul. Az asztali gépem csinálja ezt, amit sosem kapcsolok ki, se el nem altatok. Használat közben történik mindez. Az utóbbi időben egyre sűrűsödtek az előfordulások, már baromi bosszantó volt.

A logokban azt láttam, hogy ilyenkor valami miatt újra inicializálódik az usb-s eszköz, mintha kihúztam és visszadugtam volna. Két napja átdugtam a kábelt az usb hub-ból közvetlenül a gépbe, azóta nem jött elő a jelenség.
--
ulysses.co.hu

Sikerült megoldanom az alapproblémámat, a nyitóposzt végéhez beírtam, miként csináltam.

Most kényelmesen működik minden - külső billentyűzettel és ébredés után is, Xmodmap nélkül.