/dev/random

Come impostare i tasti hardware sullo Zaurus (con Angstrom)

Zaurus SL-C1000

Come personalizzare a fondo lo Zaurus modificando pochi semplici file di configurazione.

Oggi ho aggiornato Angstrom sul mio Zaurus SL-C1000, e con il resto del software è arrivato anche il nuovo kernel 2.6.23. Un po' di panico dopo l'aggiornamento (per motivi di altboot, ma ne parlerò in un altro post), sono riuscito a flashare il nuovo kernel. Tra le sorprese gradite c'è il supporto all'overlay (ma anche di questo parlerò in un altro post). Tra le sorprese meno gradite, i tasti hardware hanno smesso di funzionare (a metà). Ho quindi indagato un po' e ne approfitto per fare il punto della situazione su come configurarli.

zaurusd

Il punto focale è capire cosa faccia zaurusd. In realtà con le ultime versioni di angstrom questo software è sparito, ed è stato sostituito da un pool di software che ne replicano le funzioni, in particolare setleds, switchevd, alsactl e tskeys.

setleds (nella config di default di Angstrom) si limita a forzare il numlock attivo. Non so perché, dovrei investigare meglio. Probabilmente per attivare la fila di tasti superiore (quella dei numeri appunto).

switchevd imposta lo script da chiamare quando succede qualcosa al display: viene chiuso, messo in portrait o in landscape. Lo script richiamato si limita a richiamare altri script che attivano lo screensaver o comunicano al window manager di ruotare lo schermo.

tskeys è il centro del problema odierno. Questo software permette di “trasformare” un pezzo di display LCD, quello destro nascosto dalle iconcine, in una serie di tasti funzione, ed in particolare da F20 a F30. Anche gli spazi tra le icone diventano tasti funzione, quindi il primo in alto (a destra se usate il portrait) è F20, la casetta è F21, quindi F22. La busta è F23, lo spazio F24, l'omino F25, lo spazio F26, il calendario stilizzato F27, lo spazio F28, il libro aperto F29 e l'ultimo spazio F30.

Il problema è che con gli ultimi aggiornamenti la libreria tscal (touch-screen calibration) è stata aggiornata dalla versione 0.0 alla 1.0, e tskeys è ancora linkato alla 0.0. Ho quindi dovuto creare un symlink in /usr/lib. Fortunatamente la API non è cembiata, e tskeys è tornato a funzionare normalmente:

cd /usr/lib
ln -s libts-1.0.so.0 libts-0.0.so.0

Fatto questo è stato sufficiente rilanciare zaurusd con /etc/init.d/zaurusd restart per vedere tornare tutto a funzionare.

keylaunch

keylaunch è una specie di daemon, ma viene lanciato dall'utente al login, e permette di associare combinazioni di tasti a programmi o script. Viene lanciato al login perché deve collegarsi all'X-server dell'utente. Il formato non è molto documentato, ma ho trovato un post di Bundabrg sui forum di OESF che lo descrive, ricavando le informazioni direttamente dal sorgente di keylaunch, e mi permetto di riportarlo qui e tradurlo in italiano.

Ogni riga è così formata (le parentesi graffe indicano le variabili, le parentesi quadre che il parametro è opzionale) :

key={flag}[{option} ]{keyname}[ {combinekeyname}][:-]:[~]{command}

Mentre i significati dei vari componenti sono:

key=

Questo rimane uguale in ogni riga, e serve a far capire che stiamo definendo un tasto

{flag}

Questa è una lista di modificatori del tasto. Normalmente è .... (quattro punti), che significa “nessun modificatore”, cioè il tasto premuto da solo. Le combinazioni sono:

.... = nessun modificatore
*... = CTRL
.*.. = SHIFT (maiuscole)
..*. = Alt
...* = Fn (il tasto col bordo blu)

Si possono anche combinare, quindi, per esempio, “*.*.” significa CTRL+ALT.

[{option} ]

Questa è un'opzione opzionale :) che definisce quando viene scatenato l'evento (cioè quando il programma viene lanciato). Attenzione allo spazio che la segue! Può essere una delle seguenti:

Pressed   = Quando il tasto viene premuto
Released  = Quando il tasto viene rilasciato
Held      = Quando il tasto viene mantenuto premuto per un po' di tempo
Combine   = Quando il tasto viene premuto in combinazione con un altro

Il Combine è un caso particolare. Se viene specificato, bisogna includere anche la definizione di quale altro tasto deve essere premuto per attivare l'azione. Per esempio: volendo far caricare il programma “pippo” quando si preme contemporaneamente Calendar e Address (i tasti in basso a sinistra) si scriverà

key=....Combine F9 F10:pippo

Attenzione agli spazi! Vedremo dopo perché F9 e F10.

{keyname}

Questo parametro specifica a quale tasto ci stiamo riferendo. I nomi dei tasti vengono definiti in /etc/keymap-2.6.map ed ecco svelato da dove saltano fuori F9 e F10 che abbiamo usato prima: sono definiti qui dentro. Si possono usare tutti i tasti standard (alfanumerici) più quelli speciali: F9 per il Calendar, F10 per l'Address, F13 per Mail, F12 per l'Home, F11 per il Menu. Il tasto Cancel corrisponde all'Esc sulle normali tastiere, l'OK al Return (Invio), quindi conviene fare attenzione a come si usano in keylaunch, mentre le frecce intorno all'OK sono Left, Right, Up e Down. Qui si possono usare anche i suddetti F20...F30

[ {combinekeyname}]

Questo parametro ha senso solo quando si usa Combine tra le options, e l'abbiamo già spiegato. Si usano gli stessi nomi che abbiamo già visto per keyname.

[:-]

Specificando questo parametro (il parametro è “due-punti meno”, le parentesi quadre sono solo per far capire che è opzionale) keylaunch cercherà se c'è già un'applicazione con lo stesso nome in esecuzione e, se viene trovata, cercherà di portarne la finestra in primo piano, invece di lanciarla di nuovo.

[~]

Specificando la tilde prima del nome del comando disabilitiamo la notifica di avvio. Tipicamente questa notifica fa apparire una clessidra sulla barra del window manager.

{command}

Questo è il comando vero e proprio che viene lanciato alla pressione della combinazione di tasti che abbiamo impostato.

Un esempio

Riporto qui sotto il mio attuale /etc/keylaunchrc (che in realtà è un symlink a /etc/keylaunchrc.matchbox), per mostrare il prodotto finito. Le linee che iniziano con # (cancelletto) sono commenti che vengono ignorati da keylaunch:

key=....F9:-:gpe-calendar
key=....F10:-:gpe-contacts
key=....F13:-:sylpheed
key=....F12:-:~matchbox-remote -next
key=...*F12:-:~matchbox-remote -desktop
key=....F11:-:~matchbox-remote -menu
#key=...*1:-:~zoom out
#key=...*2:-:~zoom in
key=...*3:-:~display-brightness.sh down
key=...*4:-:~display-brightness.sh up

key=....F20:-:~display-brightness.sh up
key=....F21:-:~matchbox-remote -next
key=....F22:-:~display-brightness.sh down
key=....F23:-:sylpheed
#key=....F24:-:
key=....F25:-:gpe-contacts
#key=....F26:-:
key=....F27:-:gpe-calendar
#key=....F28:-:
key=....F29:-:FBReader
key=....F30:-:~matchbox-remote -panel-toggle

# VT changing
key=...*Left:-:~chvt 1
key=...*Right:-:~chvt 3

A parte le sezioni più ovvie (la prima parte), nella seconda parte (LCD Softkeys) vengono sfruttati proprio i tasti emulati da zaurusd/tskeys per richiamare più o meno le stesse applicazioni, ma soprattutto per regolare la luminosità del display. Questo mi permette di togliere dalla tray l'icona della luminosità, che è un succhia-RAM di prima categoria (tolte le librerie condivise occupa comunque 1 MiB di memoria). Ho riprogrammato il tasto Home (sia fisico, F12, che softkey, F21) per passare alla prossima applicazione aperta (un po' come l'Alt-Tab sul desktop), così posso togliere dalla tray anche la window-list (che non consuma molto, ma con 64 MiB di RAM è sempre meglio risparmiare). L'F30 deriva direttamente dal forum di cui sopra, e permette di nascondere la tray bar di matchbox, in modo da avere più spazio a disposizione sullo schermo (che è 640×480. Quei 20 pixel in più possono essere utili in alcune occasioni).

L'ultima parte è utile per passare dalla console testuale (chvt 1) a quella grafica (chvt 3).

keymap-2.6.map

Riporto qui anche il mio keymap-2.6.map, perché è diverso da quello originale, e permette di avere le accentate per noi italiani:

# Default kernel keymap. This uses 7 modifier combinations.
keymaps 0-2,4-5,8,12
# Change the above line into
#       keymaps 0-2,4-6,8,12
# in case you want the entries
#       altgr   control keycode  83 = Boot
#       altgr   control keycode 111 = Boot
# below.
#
keycode   1 =
keycode   2 = one              exclam
        control alt     keycode  2 = Console_1
keycode   3 = two              quotedbl
        control alt     keycode  3 = Console_2
keycode   4 = three            numbersign
        control alt     keycode  4 = Console_3
keycode   5 = four             dollar
        control alt     keycode  5 = Console_4
keycode   6 = five             percent
        control alt     keycode  6 = Console_5
keycode   7 = six              ampersand
        control alt     keycode  7 = Console_6
keycode   8 = seven            apostrophe
        altgr keycode 8 = dead_acute
keycode   9 = eight            parenleft
        altgr keycode 9 = dead_grave
keycode  10 = nine             parenright
keycode  11 = zero             asciitilde
keycode  12 = minus            at
        altgr keycode 12 = at
keycode  13 =
keycode  14 = BackSpace
        altgr keycode 14 = Delete
keycode  15 = Tab
        altgr keycode 15 = Caps_Lock
keycode  16 = q
keycode  17 = w
        altgr keycode 17 = asciicircum
keycode  18 = e
        altgr keycode 18 = equal
keycode  19 = r
        altgr keycode 19 = plus
keycode  20 = t
        altgr keycode 20 = bracketleft
keycode  21 = y
        altgr keycode 21 = bracketright
keycode  22 = u
        altgr keycode 22 = braceleft
keycode  23 = i
        altgr keycode 23 = braceright
keycode  24 = o
keycode  25 = p
keycode  26 =
keycode  27 =
keycode  28 = Return
keycode  29 = Control
keycode  30 = a
keycode  31 = s
keycode  32 = d
keycode  33 = f
        altgr keycode 33 = backslash
keycode  34 = g
        altgr keycode 34 = semicolon
keycode  35 = h
        altgr keycode 35 = colon
keycode  36 = j
        altgr keycode 36 = asterisk
keycode  37 = k
    altgr keycode 37 = backslash
keycode  38 = l
        altgr keycode 38 = bar
keycode  39 =
keycode  40 =
keycode  41 =
keycode  42 = Shift
keycode  43 =
keycode  44 = z
keycode  45 = x
keycode  46 = c
keycode  47 = v
keycode  48 = b
        altgr keycode 48 = underscore
keycode  49 = n
keycode  50 = m
keycode  51 = comma             slash
        altgr keycode 51 = less
keycode  52 = period           question
        altgr     keycode  52 = greater
keycode  53 =
keycode  54 = Shift
keycode  55 =
keycode  56 = Alt
keycode  57 = space            space
        control keycode  57 = nul
keycode 59 = F9
keycode 60 = F10
keycode 61 = AltGr
keycode 62 = Escape
keycode 63 = Return
keycode 64 = Escape
keycode 65 = Down
keycode 66 = Up
keycode 67 = Control
keycode 68 = F13
keycode 79 = F15
keycode 80 = F16
keycode 82 = F17
keycode 87 = Return
keycode 88 = F11
keycode 97 = Control
keycode 99 = F12
keycode 103 = Up
        altgr     keycode 103 = PageUp
keycode 105 = Left
        altgr     keycode 105 = Decr_Console
keycode 106 = Right
        altgr     keycode 106 = Incr_Console
keycode 108 = Down
        altgr     keycode 108 = PageDown

# LCD Softkeys as represented by zaurusd
keycode 82 = F5
keycode 79 = F15                # Home
keycode 80 = F6
keycode 81 = F16                # Email
keycode 75 = F7
keycode 76 = F17                # Addresses
keycode 77 = F8
keycode 71 = F18                # Calendar
keycode 72 = F9
keycode 73 = F19                # Book
keycode 78 = F10

In realtà l'ultima parte è sbagliata, ma devo ancora indagare a fondo.

Con questa versione, basta premere Fn+8 per avere l'accento acuto “morto” e Fn+9 per avere l'accento grave “morto”. Dopo aver premuto questa combinazione, basta premere una vocale ed avere la versione accentata della stessa.