Capitolo 18. Wheel Mouse

A grande richiesta, vediamo come configurare un wheel-mouse in Linux, in modo che funzioni col maggior numero di applicazioni. Un mio consiglio personale è di lasciar perdere Imwheel, un programma che serve proprio a questo, ma che crea a volte incompatibilità con alcuni programmi: io ho configurato tutto senza di esso, e il wheel-mouse mi funziona in X-Window, Kde, Gnome, Wmaker, Emacs, Netscape, Vim, Rxvt e compagnia. A me l'uso contemporaneo di Gpm (per il mouse in console pura) e X-Window creava dei problemi, funzionava "random". Ho risolto facendo leggere in console su /dev/gpmdata, e in X-Window direttamente da /dev/psaux. Queste è la situazione dei device in /dev/:

mrshark@pingu:~$ ls -l /dev/mouse /dev/gpmdata /dev/psaux
prw-r--r--    1 root     root            0 feb  5 14:16 /dev/gpmdata
lrwxrwxrwx    1 root     root            5 feb  5 14:26 /dev/mouse -> psaux
crw-------    1 root     root      10,   1 feb 12 07:48 /dev/psaux 
   

Io uso wheel-mouse con porta PS/2, se avete info per altri tipi di mouse, fatemi sapere! I mouse Logitech in versione OEM (bianchi con logo nero), pare non funzionino. Seguono le sezioni relative al mouse delle configurazioni per Xfree86 versioni 3 e 4 rispettivamente:

Attenzione

Il resto dei file è stato eliminato! C'è molta altra roba all'interno di questi file! Non copiateli semplicemente al posto di quelli che avete, altrimenti X non vi partirà più! Siete avvisati! ;-) )

=== file: /etx/X11/XF86Config ===

Section "Pointer"
    Protocol    "imps/2"        # mouse ps/2
#    Protocol    "intellimouse" # mouse seriale
    Device      "/dev/psaux"
    buttons     5
    ZAxisMapping 4 5
EndSection
   

=== file: /etx/X11/XF86Config-4 ===

# questa e' la sezione originale del mio file, che uso ancora a volte
# quando non ho voglia di attaccare il wheel-mouse al portatile
Section "InputDevice"
    Identifier  "Mouse1"
    Driver      "mouse"
    Option "Protocol"    "PS/2"
    Option "Device"      "/dev/psaux"
    Option "Emulate3Buttons" "on"
    Option "Emulate3Timeout" "50"
EndSection

# questa invece e' la nuova sezione che ho aggiunto per il wheel-mouse
Section "InputDevice"
    Identifier  "Mouse2"
    Driver      "mouse"
    Option "Protocol"    "IMPS/2"        # mouse ps/2
#    Option "Protocol"    "INTELLIMOUSE" # mouse seriale
    Option "Device"      "/dev/psaux"
    Option "Emulate3Buttons" "off"
    Option "ZAxisMapping" "4 5"
EndSection

# in questa sezione dovete specificare quale dei 2 mouse impostati
# precedentemente volete usare nelle vostre sessioni X-Window; la
# riga che vi interessa e' la InputDevice... 
Section "ServerLayout"
    Identifier "layout1"
    Screen     "screen1"
#    InputDevice "Mouse1" "CorePointer"
    InputDevice "Mouse2" "CorePointer"
    InputDevice "Keyboard1" "CoreKeyboard"
EndSection
   

Con queste dovreste essere a posto per X-Window, e quindi il mouse dovrebbe già funzionare anche nei vari Window manager (a me già così funziona in tutti i programmi Kde 1 e 2, Gnome e i suoi WM, e con Wmaker). Provate, riavviando X.

Ora passiamo a Gpm. Quella che segue è la configurazione di Pingu, la mia Linuxbox Debian, che ha un file apposito per le opzioni di Gpm, quindi se usate altre distribuzioni dovrete inserire nello script che lo avvia le opzioni indicate di seguito ( -m /dev/psaux -t imps2 ):

=== file: /etc/gpm.conf ===

device=/dev/psaux
responsiveness=
repeat_type=
type=imps2
append=""
# eventualmente mettili sulla riga di comando di gpm se non usi debian
# le uniche 2 opzioni che uso sono m e t, come segue da "ps aux | grep gpm":
# /usr/sbin/gpm -m /dev/psaux -t imps2
   

Seguono ora le righe da aggiungere al vostro file ~/.Xdefaults per abilitare lo scroll in Netscape, 5 :

Attenzione

Il mouse in Netscape funziona solo se avete il NumLock del tastierino numerico disattivato! Ma con questo disattivato, Rxvt fa casini... a voi la palla...

=== file: ~/.Xdefaults ===

Netscape*drawingArea.translations:  #replace    \
<Btn1Down>:           ArmLink()   \n\
<Btn2Down>:           ArmLink()   \n\
~Shift<Btn1Up>:       ActivateLink()  \n\
~Shift<Btn2Up>:       ActivateLink(new-window)  \
DisarmLink()    \n\
Shift<Btn1Up>:        ActivateLink(save-only)  \
DisarmLink()    \n\
Shift<Btn2Up>:        ActivateLink(save-only)  \
DisarmLink()    \n\
<Btn1Motion>:             DisarmLinkIfMoved()  \n\
<Btn2Motion>:             DisarmLinkIfMoved()  \n\
<Btn3Motion>:             DisarmLinkIfMoved()  \n\
<Motion>:             DescribeLink()  \n\
<Btn3Down>:           xfeDoPopup()    \n\
<Btn3Up>:             ActivatePopup() \n\
Ctrl<Btn4Down>: PageUp()\n\
Ctrl<Btn5Down>: PageDown()\n\
Shift<Btn4Down>: LineUp()\n\
Shift<Btn5Down>: LineDown()\n\
None<Btn4Down>: LineUp()LineUp()LineUp()LineUp()LineUp()LineUp()\n\
None<Btn5Down>: 
LineDown()LineDown()LineDown()LineDown()LineDown()LineDown()\n\
Alt<Btn4Down>: xfeDoCommand(forward)\n\
Alt<Btn5Down>: xfeDoCommand(back)\n

Netscape*globalNonTextTranslations: #override\n\
Shift<Btn4Down>: LineUp()\n\
Shift<Btn5Down>: LineDown()\n\
None<Btn4Down>:LineUp()LineUp()LineUp()LineUp()LineUp()LineUp()\n\
None<Btn5Down>:LineDown()LineDown()LineDown()LineDown()LineDown()LineDown()\n\
Alt<Btn4Down>: xfeDoCommand(forward)\n\
Alt<Btn5Down>: xfeDoCommand(back)\n
   

Con le righe seguenti, da aggiungere in ~/.emacs, abiliterete la rotella anche per Emacs:

=== file: ~/.emacs ===

(defun up-slightly () (interactive) (scroll-up 5))
(defun down-slightly () (interactive) (scroll-down 5))
(global-set-key [mouse-4] 'down-slightly)
(global-set-key [mouse-5] 'up-slightly)

(defun up-one () (interactive) (scroll-up 1))
(defun down-one () (interactive) (scroll-down 1))
(global-set-key [S-mouse-4] 'down-one)
(global-set-key [S-mouse-5] 'up-one)

(defun up-a-lot () (interactive) (scroll-up))
(defun down-a-lot () (interactive) (scroll-down))
(global-set-key [C-mouse-4] 'down-a-lot)
(global-set-key [C-mouse-5] 'up-a-lot)
   

Con le righe seguenti, sempre da aggiungere in ~/.emacs, abiliterete invece la rotella anche per XEmacs:

=== file: ~/.emacs ===

(define-key global-map 'button4
  '(lambda (&rest args)
    (interactive) 
    (let ((curwin (selected-window)))
      (select-window (car (mouse-pixel-position)))
      (scroll-down 5)
      (select-window curwin)
)))
(define-key global-map [(shift button4)]
  '(lambda (&rest args)
    (interactive) 
    (let ((curwin (selected-window)))
      (select-window (car (mouse-pixel-position)))
      (scroll-down 1)
      (select-window curwin)
)))
(define-key global-map [(control button4)]
  '(lambda (&rest args)
    (interactive) 
    (let ((curwin (selected-window)))
      (select-window (car (mouse-pixel-position)))
      (scroll-down)
      (select-window curwin)
)))
(define-key global-map 'button5
  '(lambda (&rest args)
    (interactive) 
    (let ((curwin (selected-window)))
      (select-window (car (mouse-pixel-position)))
      (scroll-up 5)
      (select-window curwin)
)))
(define-key global-map [(shift button5)]
  '(lambda (&rest args)
    (interactive) 
    (let ((curwin (selected-window)))
      (select-window (car (mouse-pixel-position)))
      (scroll-up 1)
      (select-window curwin)
)))
(define-key global-map [(control button5)]
  '(lambda (&rest args)
    (interactive) 
    (let ((curwin (selected-window)))
      (select-window (car (mouse-pixel-position)))
      (scroll-up)
      (select-window curwin)
)))
   

Altre informazioni nel documento indicato nella sezione "Links"