Repository 32bit  Forum
Repository 64bit  Wiki

Xorg - hal - synaptics touchpad

Da Slacky.eu.
Versione delle 14:35, 16 giu 2009, autore: Targzeta (Discussione | contributi)

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

Indice

Introduzione

Questo wiki spiega come settare i touchpad synaptics attraverso hal e il nuovo xorg >= 1.5.x. I nuovi server xorg supportano l'hotplugging attraverso le informazioni prelevate grazie al demone hal (hald). Si può vedere il sottosistema hal come un database di informazioni sui vari device presenti nel PC, il server xorg quindi lo contatta attraverso il message bus di sistema (dbus-daemon --system) e preleva ciò di cui ha bisogno per "auto-configurarsi". In questo modo i futuri server xorg (ma anche lo stesso 1.5.x) potranno quasi certamente fare a meno del famoso file di configurazione /etc/X11/xorg.conf.
In questo wiki spiegheremo come aggiungere al database di hal le informazioni relative ai touchpad synaptics in modo tale che il server xorg le possa prelevare per configurare il driver stesso (il driver synaptics).

Cosa ci serve

Tutto il software necessario si trova di default sulla slackware a partire già dalla versione current di oggi, 16 Giugno 2009. In pratica ci si deve solo assicurare di avere installato i pacchetti (le versioni sono riferite alla distribuzione current di slackware):

  • hal-0.5.11
  • dbus-1.2.14
  • xorg-server-1.6.1
  • xf86-input-evdev-2.2.2
  • xf86-input-synaptics-1.1.2

I due demoni hald e dbus-daemon --system sono eseguiti all'avvio della slackware dai relativi file:

/etc/rc.d/rc.hald
/etc/rc.d/rc.messagebus
NOTA: evdev deve essere compilato anche nel kernel! Ma nei kernel della Slackware è già presente.

Come aggiungere le informazioni al database di hal per il driver synaptics di xorg

Per aggiungere le informazioni sulla configurazione che vogliamo ottenere per il touchpad bisogna creare un file per hal, ad esempio il file:

/etc/hal/fdi/policy/11-x11-synaptics.fdi

con all'interno quanto segue:

<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="0.2">
  <device>
    <match key="info.capabilities" contains="input.touchpad">
        ...
        ...
        ...
    </match>
  </device>
</deviceinfo>

Tutto ciò che è nei ... sarà la nostra configurazione, e vedremo in seguito cosa e come possiamo settarla.
Intanto cerchiamo di capire cosa abbiamo fatto creando questo file. Innanzitutto il path /etc/hal/fdi/policy ci assicura che il file verrà letto dal demone hald al suo prossimo riavvio. Il contenuto del file segue la DTD (Document Type Definition) dei file XML per hal, noi stiamo dicendo che vogliamo effettuare delle operazioni (sono quelle nei ...) se tra le info.capabilities individuate nel PC c'è un entry che contiene il valore input.touchpad.

Controllare le informazioni sul device presenti nel database di hal

Come abbiamo visto, quello che noi faremo è semplicemente aggiungere informazioni al database di hal per il driver synaptics. Inoltre abbiamo anche visto che le informazioni verranno aggiunte al device in cui compare la stringa input.touchpad come info.capabilities.
Il sistema hal prevede una serie di software con il quale è possibile interrogare il database da riga di comando, e ora noi ne sfrutteremo due per controllare le informazioni già presenti nel database. Eseguendo:

$> hal-find-by-capability --capability input.touchpad
/org/freedesktop/Hal/devices/platform_i8042_i8042_AUX_port_logicaldev_input

si ottiene l'udi (Unique Device Id) del device che contiene input.touchpad come info.capabilities.
Ora eseguendo hal-device passando come parametro l'udi ottenuto:

$> hal-device '/org/freedesktop/Hal/devices/platform_i8042_i8042_AUX_port_logicaldev_input' 
udi = '/org/freedesktop/Hal/devices/platform_i8042_i8042_AUX_port_logicaldev_input'
  input.originating_device = '/org/freedesktop/Hal/devices/platform_i8042_i8042_AUX_port'  (string)
  info.subsystem = 'input'  (string)
  linux.sysfs_path = '/sys/class/input/input4/event4'  (string)
  info.category = 'input'  (string)
  info.product = 'SynPS/2 Synaptics TouchPad'  (string)
  info.parent = '/org/freedesktop/Hal/devices/platform_i8042_i8042_AUX_port'  (string)
  info.capabilities = { 'input', 'input.touchpad' } (string list)
  info.udi = '/org/freedesktop/Hal/devices/platform_i8042_i8042_AUX_port_logicaldev_input'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  input.device = '/dev/input/event4'  (string)
  linux.subsystem = 'input'  (string)
  input.product = 'SynPS/2 Synaptics TouchPad'  (string)
  linux.device_file = '/dev/input/event4'  (string)

otteniamo le informazioni contenute nel database di hal relative al nostro touchpad (si noti che tra le info.capabilities c'è anche input.touchpad).

I primi passi per la configurazione

Ora limitiamoci ad inserire nel database di hal le informazioni minimali in modo da avere il nostro touchpad attivo, quindi inseriamo nel file /etc/hal/fdi/policy/11-x11-synaptics.fdi quanto segue:

<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="0.2">
  <device>
    <match key="info.capabilities" contains="input.touchpad">
        <merge key="input.x11_driver" type="string">synaptics</merge>
        <merge key="input.x11_options.SHMConfig" type="string">true</merge>
    </match>
  </device>
</deviceinfo>

dicendo quindi ad hal che se trova una chiave info.capabilities che contiene la stringa input.touchpad deve aggiungere nel database le coppie chiave = valore:

input.x11_driver = synaptics
input.x11_options.SHMConfig = true

La prima chiave (input.x11_driver) viene cercata dal server xorg al momento dell'avvio per sapere quali driver deve caricare per gestire l'input, quindi noi gli diciamo di caricare anche il driver synaptics. La seconda chiave (input.x11_options.SHMConfig) viene invece cercata dal driver synaptics e gli serve per sapere come configurarsi. Tutte le chiavi di configurazione del driver synaptics iniziano con input.x11_options. e al momento sono tutte di tipo string. Quindi per ora abbiamo detto al driver che vogliamo sfruttare la memoria condivisa (SHM - Shared Memory), vedremo dopo il perchè.

Quindi, una volta riavviato il demone hald con:

#> /etc/rc.d/rc.hald restart

rieseguendo:

$> hal-device '/org/freedesktop/Hal/devices/platform_i8042_i8042_AUX_port_logicaldev_input' 
udi = '/org/freedesktop/Hal/devices/platform_i8042_i8042_AUX_port_logicaldev_input'
  ...
  input.x11_driver = 'synaptics'  (string)
  ...
  input.x11_options.SHMConfig = 'true'  (string)
  ...

vediamo che nel database di hal, relativamente al touchpad, sono presenti anche le nostre impostazioni.

Allora quando noi avvieremo il server xorg, lui troverà la chiave input.x11_driver e capirà che dovrà caricare il driver synaptics, il quale a sua volta troverà la chiave input.x11_options.SHMConfig e saprà che dovrà configurarsi in modo tale da poter essere configurato tramite la memoria condivisa.

Usare synclient per configurare il driver synaptics a runtime

Con la semplice impostazione precedente

<merge key="input.x11_options.SHMConfig" type="string">true</merge>

abbiamo detto al driver synaptics che deve poter essere configurabile a runtime attraverso la memoria condivisa, e questo ci permette di eseguire, a server xorg attivo, il comando synclient.

NOTA: l'opzione 'SHMConfig = true' è considerata un rischio per la sicurezza, visto che tutti coloro che hanno accesso al PC possono 
configurare il driver synaptics semplicemente tramite SHM.

Lanciando:

$> synclient -l
Parameter settings:
    LeftEdge                = 1752
    RightEdge               = 5192
    TopEdge                 = 1620
    BottomEdge              = 4236
    ....

si può vedere come è configurato il driver synaptics al momento attuale. Tutte le proprietà sono spiegate nel manuale del driver, accessibile con:

man 4 synaptics

Ad esempio per abilitare lo scrolling verticale si esegua:

$> synclient VertEdgeScroll=1

e controllando con:

$> synclient -l| grep VertEdgeScroll
    VertEdgeScroll          = 1

si nota che è abilitato.

Alcune proprità interessanti del driver synaptics

Oltre allo scrolling verticale il driver synaptics mette a disposizione un sacco di proprietà tra cui:

* I TapButton
* I CornerButton

I TapButton servono per dire al driver quali pulsanti deve considerare come premuti quando si 'clicca' nel centro del touchpad, ad esempio con:

$> synclient TapButton1=1 TapButton2=2 TapButton3=3

diciamo al driver, rispettivamente, che:

  • quando clicchiamo nel centro del touchpad con un dito, si deve comportare come se fosse stato premuto il 1° pulsante (generalmente il tasto sinistro).
  • quando clicchiamo nel centro del touchpad con due dita, si deve comportare come se fosse stato premuto il 2° pulsante.
  • quando clicchiamo nel centro del touchpad con tre dita, si deve comportare come se fosse stato premuto il 3° pulsante.

I CornerButton servono per dire al driver quali pulsanti deve considerare come premuti quando si 'clicca' negli angoli del touchpad, ad esempio con:

$> synclient RTCornerButton=2 RBCornerButton=3

diciamo al driver, rispettivamente, che:

  • quando clicchiamo nell'angolo in alto a destra (RT - right top) del touchpad deve comportarsi come se fosse stato premuto il 2° pulsante.
  • quando clicchiamo nell'angolo in basso a destra (RB - right bottom) del touchpad deve comportarsi come se fosse stato premuto il 3° pulsante.

Un file per hal di esempio

Una volta trovata la giusta configurazione per il nostro touchpad a runtime grazie a synclient, possiamo renderla attiva ad ogni avvio del server xorg modificando il file /etc/hal/fdi/policy/11-x11-synaptics.fdi.
Ad esempio il mio file contiene:

<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="0.2">
  <device>
    <match key="info.capabilities" contains="input.touchpad">
        <merge key="input.x11_driver" type="string">synaptics</merge>
        <merge key="input.x11_options.SHMConfig" type="string">true</merge>
        <merge key="input.x11_options.VertEdgeScroll" type="string">true</merge>
        <merge key="input.x11_options.MaxTapTime" type="string">180</merge>
        <merge key="input.x11_options.FingerLow" type="string">25</merge>
        <merge key="input.x11_options.FingerHigh" type="string">30</merge>
        <merge key="input.x11_options.TapButton1" type="string">1</merge>
        <merge key="input.x11_options.TapButton2" type="string">3</merge>
        <merge key="input.x11_options.TapButton3" type="string">2</merge>
        <merge key="input.x11_options.RTCornerButton" type="string">3</merge>
        <merge key="input.x11_options.RBCornerButton" type="string">2</merge>
    </match>
  </device>
</deviceinfo>

Si noti come tutte le chiavi per il driver synaptics iniziano con 'input.x11_options.' mentre il nome delle proprietà ('SHMConfig', 'VertEdgeScroll' 'MaxTapTime', etc..) sono prese direttamente dal manuale del driver (synaptics(4)) e sono le stesse che abbiamo passato al comando synclient.

Conclusione

Grazie alla lettura di questo piccolo wiki dovremmo essere in grado di capire:

  • come avverrà la futura configurazione dei server xorg (grazie ad hal e dbus)
  • e quindi come poter intervenire per modificarla

Se notate qualche incorrettezza scrivetemi pure, generalmente accetto ben volentieri critiche o proposte di matrimonio :)
Spina

Strumenti personali
Namespace

Varianti