Dupa vreo ora si ceva timp in care am cercetat cam toate scenariile posibile am ajuns si eu la niste concluzii despre cum se rezolva aceasta problema. Asta dupa solutia gasita aseara. Spre exemplu daca as folosi setarile lui danieljucan as obtine un mouse la care ar functiona doar left, middle and right click in mod corect, scrool-ul ar face back si forward iar butoanele de navigare nimic. O sa incerc sa imi condensez concluziile intr-un How-To care va trata problema intr-un mod general (sper). Daca scot vreo bula pe undeva, va rog corectati-ma

.
Acu ii dau bate cu
How-To-ul:
Indiferent de cate butoane are mouse-ul, pentru ca exista si mousi mai SF decat al meu, functionalitatea dorita se invarte in jurul a 7 actiuni care se doresc a fi recunoscute de orice mouse care poate lua locul unuia standard cu 5 butoane. De ce 7 actiuni la 5 butoane? Simplu: rotita de scrool este privita de catre X ca 3 butoane, nu ca unul singur (middle click). Actiunile recunoscute de X (cel putin pe ubuntu si pe kubuntu sunt asa) sunt urmatoarele:
butonul 1 - left click
butonul 2 - middle click
butonul 3 - right click
butonul 4 - scrool up
butonul 5 - scrool down
butonul 6 - navigation back
butonul 7 - navigation forward
Notez lista cu (*)
Motivul pentru care nu toti mousii sunt recunoscuti corect de catre X este pentru ca nu toti producatorii respecta aceasta numerotare a butoanelor in functie actiunile (evenimentele) dorite. Acesta este si motivul pentru care incercarile mele au esuat incercand sa respect alte how-to-uri si posturi de pe alte forumuri: nu folosesc un mouse standard. Solutia cea mai la indemana este remaparea butoanelor asa cum a sugerat Wonder in prima faza. Dar sa incep cu inceputul.
Suportul pentru butoanele de navigare este implementat in X, acesta doar trebuie activat in cazul in care acesta nu a fost auto-detectat. Spre exemplu Mandriva 2007 il auto-detecteaza si chiar mai mult, mapeaza corect actiunile mouse-ului. Aceasta se face dupa cum a spus si danieljucan, editand
/etc/X11/xorg.conf. Configurarea mea difera putin si o sa explic unde si de ce.
Section "InputDevice"
Identifier "Configured Mouse"
Driver "mouse"
Option "Buttons" "7"
Option "CorePointer"
Option "Device" "/dev/input/mice"
Option "Protocol" "ExplorerPS/2"
Option "ZAxisMapping" "4 5"
EndSection
Prima linie cu bold este cea care prezinta interes in prima faza. Acolo se spune cate butoane are mouse-ul. Chiar daca el are mai multe, cum am spus mai sus, prezinta interes doar cele 7 actiuni deci valoarea va fi setata pe 7. Am observat ca mai mult nu strica (desi nici nu aduce nimic in plus) dar mai putin da. Aceasta este valoarea recomandata la o configuratie de acest gen.
A doua linie cu bold defineste care sunt butoanele care ar trebui sa execute scrool up si scrool down. Caz in care acestea in hardware nu sunt recunoscute ca fiind butoanele 4 si 5 exista doua metode prin care aceasta poate fi corectata. Prima e prin editarea xorg.conf unde se inlocuiesc valorile de 4 si 5 cu acele care corespund lui scrool up si scrool down. Ajung si la partea unde acestea se pot identifica cu xev. A doua metoda (si cea recomandata) este remaparea lor cu xmodmap.
Nu recomand adaugarea de "ButtonMapping" ca optiuni in xorg.conf deoarece in anumite cazuri particulare aceasta solutie nu functioneaza, ba mai mult, X-ul nu va mai recunoaste mai mult de 7 butoane iar daca alea de navigare sunt de la 8 incolo, aleluia. Nu am reusit sa le fac sa le vada prin metoda asta deci dupa vreo 20 de minute am renuntat.
Identificarea carui buton ii este atasata o actiune este simpla. Se ruleaza din terminal aplicatia
xev. Se va deschide o fereastra peste care se pot executa evenimente de la mouse sau de la tastatura, evenimente care vor fi afisate in fereastra terminalului. Evenimentele vor arata ceva de genul:
ButtonRelease event, serial 29, synthetic NO, window 0x2600001,
root 0x156, subw 0x0, time 4183550102, (95,78), root:(691,126),
state 0x10, button 8, same_screen YES
ButtonPress event, serial 29, synthetic NO, window 0x2600001,
root 0x156, subw 0x0, time 4183550457, (95,78), root:(691,126),
state 0x10, button 9, same_screen YES
Asa se vor identifica si butoanele cu pricina. Spre exemplu in cazul meu particular butoanele 8 si 9 executau navigation back si navigation forward in loc de butoanele 6 si 7. A trebuit sa le remapez si cam aceasta a fost solutia.
Remaparea cu xmodmap in principiu este simpla. Comanda accepta ca parametru un sir de numere care definesc actiunile dupa cum urmeaza:
xmodmap -e "pointer = 1 2 3 x1 y1 z1 t1 x2 y2 z2 t2"
Am ingrosat caracterele acelea pentru ca acolo pot aparea problemele. Acelea vor fi inlocuite cu numere dupa cum urmeaza:
x1 - va fi inlocuit cu numarul butonului care a fost identificat in xev ca executand scrool up
y1 - va fi inlocuit cu numarul butonului care a fost identificat in xev ca executand scrool down
z1 - va fi inlocuit cu numarul butonului care a fost identificat in xev ca executand navigation back
t1 - va fi inlocuit cu numarul butonului care a fost identificat in xev ca executand navigation forward
Restul de x2, y2, t2, z2 sunt butoanele care au fost inlocuite din mapping si care trebuie puse la coada. Am incercat sa nu le pun iar rezultatul a fost un mouse care nu functiona corect deci cele inlocuite nu sunt optionale. Pentru ca am pomenit de cazul meu particular, comanda utilizata de mine a fost:
xmodmap -e "pointer = 1 2 3 4 5 8 9 6 7"
deoarece doar butoanele de navigare erau busite. Cum am zis si mai sus, doar primele 7 sunt importante.
Comanda xmodmap se poate executa din terminal deci in caz de eroare se poate reveni usor la configuratia initiala spre deosebire de cazul xorg.conf unde trebuie rescris fisierul si restartat X-ul pentru a obtine modificarile dorite. Dupa remapare puteti testa evenimentele cu xev iar acestea trebuie sa corespunda cu lista publicata la
(*). Daca acestea corespund atunci se poate incerca intr-un browser cum ar fi Firefox sau Opera. In cazul meu it works like a charm.
Deoarece maparea cu xmodmap nu va ramane dupa restartarea X-ului exista mai multe metode. Una este cea descrisa de danieljucan cu scriptul din
/bin. Eu am ales-o pe aia pe care o stiam. Am facut un script custom pe care l-am pus in
~/.kde/Autostart (sunt KDE user)
#!/bin/bash
xmodmap -e "pointer = 1 2 3 4 5 8 9 6 7"
# ma rog, aici am bagat si alte linii care executa la start-up alte programe care nu fac obiectul acestui How-To
Am salvat sriptul cu denumirea de mai sus (autostart.sh) desi nu e batuta in cuie si i-am dat drept de execute cu:
chmod -c 755 autostart.sh
Cam atata de spus din punctul meu de vedere. Succes.
Add: la sugestia lui Wonder pentru a elimina scripturile de la start-up (eu il aveam deja pe ala) se creaza fisierul
/etc/X11/Xmodmap in care se pune linia:
pointer = 1 2 3 x1 y1 z1 t1 x2 y2 z2 t2
dupa regulile descrise mai sus. It might not work under KDE (mie nu imi merge), dar daca Wonder zice ca functioneaza atunci il cred pe cuvant.