Tempo addietro andavo affermando che non c'era speranza di usare con XFree86 i tasti ``extra'' che si sono su certe tastiere, come ad esempio il tasto ``calcolatrice'' o il tasto ``play'' o il tasto ``internet'', etc. Mentre con le console testuali e` piu` che altro una questione di usare ``setkeycodes'' e loadkeys, con X non sembrava ci fosse speranza (a parte per i soliti Windows sinistro e destro). In realta` sembra proprio che ora abbia torto (per fortuna!). Dicevo che non c'era speranza in quanto col buon comando ``xev'' (che mostra tutti gli eventi che arrivano ad una certa finestra) non vedevo alcun evento (nessun keycode, per la precisione) per i tasti in questione. L'altro giorno, un po' per caso e un po' ispirato dal fatto che Ettore e Daniele avevan fatto qualcosa di simile a suo tempo, provo con il computer del fratellone che ha una di queste tastiere ``estese'', kernel 2.4.x e XFree86 4.1.0, e scopro che invece qui gli eventi (i keycode) arrivano. Kernel 2.4, modifica a XFree86 o cosa? Boooh. Vai a sapere... Cmq, ecco una brevissima guida a come funziona la tastiera in X e come si possono usare i tasti extra (e scusate se mi dilungo in dettagli, ma per come era scritta nella Keyboard-And-Console-HOWTO non l'avevo mai capita finora...) ---------------------------------------------------------------------- 1) Le tastiere generano degli ``scancode'' (sequenze di uno o due byte). XFree86 li legge (tramite il kernel) e ad essi associa dei ``keycode'' (un codice numerico). 2) A ogni keycode si possono associare uno o piu` ``keysym'': essi sono dei nomi simbolici che indicano univocamente un tasto all'interno dell'X Window System, ovvero delle varie implementazioni esistenti. Questa mappatura keycode -> keysym serve per il semplice motivo che se cosi` non fosse sarebbe impossibile usare applicazioni remotamente (visto che i keycode cambiano da modello di tastiera a modello di tastiera e non e` pensabile che ogni applicazione debba sapere tutto su tutti i possibili modelli di tastiere :-). L'elenco completo dei keysym si puo` vedere nel file /usr/include/X11/keysymdef.h e ne esistono innumerevoli: molti di essi indicano dei caratteri alfanumerici, altri indicano funzioni particolari (esempio: backspace, delete, compose, meta, super, hyper, multi, etc.). Questo perche` in passato le varie workstation e i vari X terminal disponevano di un'ampia gamma di tastiere con i tasti piu` inconsueti che si potessero concepire (oggi un po' meno). 3) Tipicamente con X un keycode ha associato a se` al piu` 4 keysym: - il primo viene usato se il tasto indicato dal keycode viene premuto da solo - il secondo viene usato quando il tasto indicato dal keycode viene premuto con shift - il terzo viene usato quando il tasto indicato dal keycode viene premuto insieme al tasto mod1 (che solitamente e` l'ALT sinistro) - il quarto viene usato quando il tasto indicato dal keycode viene premuto insieme a shift e a mod1 Le applicazioni stanno in ascolto per vedere che keysym e` stato premuto, e agiscono di conseguenza. 4) Di serie con l'X Window System arriva un programmino che si chiama ``xmodmap'' che permette di variare al volo le associazioni tra keycode e keysym (e anche altre cose). Permette anche di visualizzare le mappature correnti con ``xmodmap -pk'' oppure ``xmodmap -pke'' Esempio pratico: le tastiere di oggi hanno i tasti ``Windows sinistro'' e ``Windows destro'', che con Linux di solito non servono a un tubo... essi solitamente hanno keycode 115 e 116 (sulle tastiere italiane). Con xmodmap e` possibile utilizzarli in maniera piu` proficua, come ad esempio assegnando loro la graffa aperta e chiusa (utile a chi programma), e le quadre con shift Ovvero: xmodmap -e 'keycode 115 = braceleft bracketleft' xmodmap -e 'keycode 116 = braceright bracketright' Fatto questo, premendo il tasto windows sinistro da solo verra` prodotta la graffa aperta, e premendo il tasto windows destro da solo verra` prodotta la graffa chiusa. Idem con shift, ma ci son le parentesi quadre. 5) Ritornando ai fantomatici tasti "in piu`", con i vecchi XFree86 non venivano manco beccati i keycode, quindi nulla da fare con X. Con i nuovi XFree86 (>= 4.1 ?) invece i keycode ci sono. Ad essi non e` pero` associato alcun keysym, per cui le applicazioni normali non se ne possono far granche`. Ma da quanto sopra risulta chiaro che possiamo associare dei keysym a questi keycode usando xmodmap. 6) Non mi pare ci sia uno standard di qualche genere per i keycode generati dai tasti ``extra'' delle tastiere estese, per cui bisogna innanzitutto avviare `xev', portare il puntatore del mouse all'interno della sua finestra, premere i tasti estesi e annotarsi il loro keycode. 7) A questo punto bisogna associar loro dei keysym. Sfortunatamente non mi pare che siano ancora previsti dei keysym per essi (del tipo ``volume+'' o ``volume-'' o ``calcolatrice''), ma non e` da escludere che in una futura release dell'X Window System ci siano. Fortunatamente ci sono molti keysym che normalmente non vengono usati se non con tastiere molto particolari: io ho usato quelli da F13 a F35. Esempio: se il tasto ``calcolatrice'' genera il keycode 156, gli si puo` associare F15 con xmodmap -e 'keycode 156 = F15' Una volta fatto questo, se si preme il tasto ``calcolatrice'', le applicazioni X vedranno che e` stato premuto il tasto F15. 8) Fatta questa operazione per tutti i tasti estesi, associando via via keysym diversi, rimane solo da trovare un modo per associare dei comandi ai keysym. Questa e` una possibilita` offerta da diversi window manager. Ad esempio sawfish permette di eseguire delle azioni (anche lanciare comandi) sul ricevimento di un certo keysym. E` solo questione di configurarlo tramite l'apposita GUI. Idem credo per il window manager di KDE, e probabilmente anche per WindowMaker. Per cui non resta che dire al nostro window manager preferito (tramite la sua GUI di configurazione) che se si accorge che uno ha premuto F15 (che per noi e` il tasto ``calcolatrice'') deve avviare il programma xcalc. Semplice, no? :-) Pero` funziona. Cercando in giro per la rete si trova anche questo documento che riassume la cosa (l'ho trovato solo dopo aver scritto la gran parte di questa mail): http://www.linuxdude.co.uk/docs/Special-Keys/ Per modificarsi un po' piu` comodamente le tastiere esiste anche il buon Xkeycaps, che e` una GUI per creare piu` intuitivamente dei file per xmodmap (ma nel seppur lungo elenco di layout disponibili non mi par di vederne alcuno che includa anche i tasti extra di cui sopra) http://www.jwz.org/xkeycaps/ Alcune note: 1) Le modifiche effettuate con xmodmap non sono persistenti, ma sussistono solo fintantoche` il server X sta in funzione. Ne consegue che se vogliamo delle modifiche persistenti, bisogna invocare xmodmap ad ogni nuovo avvio dell'X server e rifare il tutto. 2) Finora ho lanciato molte volte xmodmap, ma se le modifiche da fare son tante (ed e` il nostro caso) basta creare un file di testo che contenga una istruzione per riga, ad esempio ... keycode 115 = braceleft keycode 116 = braceright keycode 156 = F15 ... e poi invocarlo con ``xmodmap nomefile''. Riagganciandoci alla nota precedente, si puo` notare che in alcune (tutte?) distribuzioni cio` viene gia` fatto automaticamente dagli script che avviano l'X server, i quali sostanzialmente eseguono ``xmodmap /etc/X11/Xmodmap'' e/o ``xmodmap ~/.xmodmap'' Per cui possiamo mettere le nostre modifiche/aggiunte in quei file e ritrovarcele in seguito. 3) Side effect interessante: esistono alcuni programmi per cambiare da tastera italiana a tastiera inglese e viceversa, ma con xmodmap e` possibile farne una versione ``povera'' che funziona sempre e ovunque: - configurare XFree86 in modo da usare la tastiera inglese - eseguire ``xmodmap -pke > ~/tastiera_inglese.xmodmap'' - configurare XFree86 in modo da usare la tastiera italiana - eseguire ``xmodmap -pke > ~/tastiera_italiana.xmodmap'' Per passare al volo alla tastiera inglese basta quindi un bel ``xmodmap ~/tastiera_inglese.xmodmap'' e per ritornare a quella italiana basta un ``xmodmap ~/tastiera_italiana.xmodmap'' -- | \ \ | ___|_ |_ | ianezz AT sodalia.it | _ \ | \ | _| / / Visita il LinuxTrent a _|_/ _\_| _|____|___|___| http://www.linuxtrent.it -- Per iscriversi (o disiscriversi), basta spedire un messaggio con SOGGETTO "subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxxxxxx