24 febrero 2010

MPX: Multipuntero para la próxima Ubuntu

La próxima versión de Ubuntu, el Lince Lúcido, o 10.04, traerá xorg 7.5 con MPX activado por defecto. No se puede sacar mucho provecho de él aun, pero ya lo tenemos para probarlo. Como está todavía verde, los punteros y teclados extra no se activan solos y hay que configurarlos. Pero no hay problema; vamos a ver como se hace en la alfa 2, cuando está a punto de salir la alfa 3. Lo he probado primero en el portátil, para poder usar la tableta y un ratón externo simultáneamente. Y sí, ahí estaban los dos punteros cogiendo ventanas por separado.

Es bastante fácil una vez has encontrado cómo. Primero que nada, abrimos una terminal, que vamos a usar bastante porque no hay herramientas gráficas aun para ello. Sacamos un listado de los dispositivos de entrada que tenemos:
xinput list


Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ "Logitech USB Mouse" id=9 [slave pointer (2)]
⎜ ↳ "Macintosh mouse button emulation" id=11 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ "Power Button" id=6 [slave keyboard (3)]
↳ "Power Button" id=7 [slave keyboard (3)]
↳ "Sleep Button" id=8 [slave keyboard (3)]
↳ "AT Translated Set 2 keyboard" id=10 [slave keyboard (3)]

Tenemos un puntero y un teclado maestros virtuales. Enchufamos otro ratón. Como los reales están asociados a éstos, vamos a crear otro virtual:

xinput create-master New

⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ "Logitech USB Mouse" id=9 [slave pointer (2)]
⎜ ↳ "Macintosh mouse button emulation" id=11 [slave pointer (2)]
⎜ ↳ "Logitech USB-PS/2 Optical Mouse" id=12 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ "Power Button" id=6 [slave keyboard (3)]
↳ "Power Button" id=7 [slave keyboard (3)]
↳ "Sleep Button" id=8 [slave keyboard (3)]
↳ "AT Translated Set 2 keyboard" id=10 [slave keyboard (3)]
⎡ New pointer id=13 [master pointer (14)]
⎜ ↳ New XTEST pointer id=15 [slave pointer (13)]
⎣ New keyboard id=14 [master keyboard (13)]
↳ New XTEST keyboard id=16 [slave keyboard (14)]

Los nuevos maestros virtuales no tienen ningún dispositivo real asociado. Los dos ratones que hay enchufados están asociados al puntero con id=2. Pues vamos a asociar el que hemos enchufado (id=12) al nuevo maestro (id=13):
xinput reattach 12 13
Si desconectamos el ratón, el nuevo maestro seguirá ahí y algunas ventanas no nos responderán como esperaríamos (el foco se queda en otra ventana), así que deberíamos eliminarlo:
xinput remove-master 13
Y todo vuelve a la normalidad.
Creo que voy a necesitar un teclado USB para experimentar con esto...

4 comentarios:

Anónimo dijo...

Bonito ! Funciona con Fedora 13.
Abraço

Anónimo dijo...

Ola,
gostaria de compartir un script que permite jugar con essas funcionalidades.
La linea mas importante que permite botar una mouse, automatizando la operacion manual que explicaste en el post es esta :

MOUSE=$(diff /tmp/1-no-mouse.txt /tmp/2-uma-mouse.txt |grep -E -o id=[0-9]+ | tr -d [a-z,=])
Extrae los numeros del master o del nuevo puntero.

Para utilisar un nuevo puntero, executar el script y seguir sus preguntas, o executar con la opcion --help


#! /bin/bash

CONFIGFILE=~/.multiponteiros

if [ ! -f $CONFIGFILE ] ; then
touch $CONFIGFILE
fi

if [ $@ > 0 ] ; then
if [ $1 = "-r" ] || [ $1 = "--remove" ] ; then
if [ -s $CONFIGFILE ] ; then #size > 0
xinput remove-master $(tail -n 1 $CONFIGFILE)
#suprimir ultima linha
sed --in-place '$d' $CONFIGFILE
echo Ponteiro desabilitado.
else
echo Voce nao tem mouse para remover.
fi
else
if [ $1 = "-h" ] || [ $1 = "--help" ] ; then
echo Programa para botar uma nova mouse com um novo ponteiro.
echo usage : install-mouses.sh [-r --remove]
echo Chamar o programa uma vez para botar uma nova mouse,
echo usar a opção -r para remover a ultima mouse inserida.
fi
fi
exit
fi

install_dependencies() {
for DISTRIB in apt-get yum
do
[[ "$(type -p ${DISTRIB} 2>/dev/null)" ]] && echo ${DISTRIB}
done
}

find_dependencies(){
if [ ! -f /usr/bin/xinput ] ; then
echo Voce tem que instalar o programa xinput
exit
fi
}

find_dependencies

echo Vamos criar um novo ponteiro.
echo Favor botar na configuração initial \(remover a mouse que você quer inserir\)
echo e pressionne enter.
read x
xinput list > /tmp/1-no-mouse.txt
echo Pode inserir a mouse
read x
xinput list > /tmp/2-uma-mouse.txt

# Aquela linha saque o numero da nova mouse
MOUSE=$(diff /tmp/1-no-mouse.txt /tmp/2-uma-mouse.txt |grep -E -o id=[0-9]+ | tr -d [a-z,=])

xinput create-master mymaster
xinput list > /tmp/3-master1.txt
# localisar a id do novo master
MASTER1=$(diff /tmp/2-uma-mouse.txt /tmp/3-master1.txt | \
grep "mymaster.*pointer.*master.*pointer"| \
grep -E -o id=[0-9]+ | tr -d [a-z,=])

xinput reattach $MOUSE $MASTER1

# salvar a configuração num arquivo
echo $MASTER1 >> $CONFIGFILE

echo Operação finalizada. Pode aproveitar.
echo Chame o script de novo para botar uma nova mouse.
echo Chame o script com a opção -r ou --remover para remover a ultima mouse inserida.

Anónimo dijo...

Y este codigo usa una interface minimal con zenity, en bash.
Se puede cliquear para botar un nuevo puntero, removerlo, ler la ayuda e para testar una aplicacion con varios punteros (porque todavia no existen muchas), el script descarga un programa del sitio
git://gitorious.org/vinput/vinput.git
tenta de compilarlo y lo usa : permite dibujar con varios punteros :)

#! /bin/bash

PASTA=~/.multipointeros/
CONFIGFILE=${PASTA}multipt
GIT=/usr/bin/git
LOG=${PASTA}log

if [ ! -d $PASTA ] ; then
mkdir $PASTA
fi

if [ ! -f $CONFIGFILE ] ; then
#echo file created
touch $CONFIGFILE
fi

remover(){
if [ -s $CONFIGFILE ] ; then #size > 0
xinput remove-master $(tail -n 1 $CONFIGFILE)
#suprimir ultima linha
sed --in-place '$d' $CONFIGFILE
#echo Ponteiro desabilitado.
zenity --info --text "Ponteiro desabilitado"
else
zenity --info --text "Voce nao tem mouse para remover"
fi
main
}

help(){
zenity --info \
--text="Com esse programa, você pode abilitar novas mouses com os seus ponteiros proprios.\n\
Funciona em Fedora >= 13, em Ubuntu >= 10.0.1 e em outros sistemas que tem a versão de Xorg >= 1.6 (pode ver com Xorg -version).
Precisa-se do programa xinput que se encontra nos depositos das distribucões.
autores : Guillermina e Vincent"
main
}

install(){
#zenity --info --text="Favor remover o mouse que você quer instalar"
zenity --info --text="O programa precisa de inicialisar-se. Favor esperar antes de inserir o mouse que você quer instalar."

if [ ! "$?" = 1 ] ; then
xinput list > /tmp/1-no-mouse.txt
zenity --info --text="Pode inserir a mouse"
if [ ! "$?" = 1 ] ; then
xinput list > /tmp/2-uma-mouse.txt

# Aquela linha saque o numero da nova mouse
MOUSE=$(diff /tmp/1-no-mouse.txt /tmp/2-uma-mouse.txt |grep -E -o id=[0-9]+ | tr -d [a-z,=])

xinput create-master mymaster
xinput list > /tmp/3-master1.txt
# localisar a id do novo master
MASTER1=$(diff /tmp/2-uma-mouse.txt /tmp/3-master1.txt | \
grep "mymaster.*pointer.*master.*pointer"| \
grep -E -o id=[0-9]+ | tr -d [a-z,=])

xinput reattach $MOUSE $MASTER1

# salvar a configuração num arquivo
echo $MASTER1 >> $CONFIGFILE
zenity --info --text="Operação finalizada. Pode aproveitar."
fi
fi
main
}

Anónimo dijo...

# y por fin :
# normalmente roda en Ubuntu y Fedora, por lo menos

# useful
find_dependencies(){
#echo "" > ${PASTA}dep
if [ ! -f /usr/bin/xinput ] ; then
echo Voce tem que instalar o programa xinput
#echo "Voce tem que instalar o programa xinput." >> ${PASTA}dep
zenity --error --text "Você tem que instalar o programa xinput.\n \
No Fedora, ele encontra-se no paquote xorg-x11-apps."

fi
# if [ ! /usr/lib/libX11.so.6 ] ; then
# echo "instalar libX11" >> ${PASTA]dep
# fi

}

desenho(){
cd $PASTA
if [ ! -d ${PASTA}vinput/ ] ; then
echo Baixamos as fontes do programa do repositorio git ...
if [ ! -f $GIT ] ; then
echo Favor baixar o programa git e tentar de novo.
main
fi
git clone git://gitorious.org/vinput/vinput.git | tee >(zenity --progress \
--pulsate --title="Multiponteiros" --text="Baixando de git ..." \
--auto-close --width="400")
if [ "$?" = -1 ] ; then
zenity --error \
--text="Operação cancelada."
exit
fi

cd vinput/demo

# fedora ou ubuntu ? precisa-se de uma biblioteca adicional para F13
if [ -f /usr/bin/yum ] ; then
FEDORA="-lX11"
fi
# compilar ... com barra de progressão
gcc -o demo-paint demo-paint.c `pkg-config --cflags --libs xi` $FEDORA
# $? = return code of previous command
if [ $? -eq 0 ] ; then
echo beleza ! Compilou bem.
else
echo argh ... não compilou :/
zenity --warning --text="O programa não compilou.\n Favor verificar vossa conexão ao internet.\n Você pode examinar o arquivo de log em ~/.multiponteiros/log. \n \
Cuidado com os pre-requisitos : precisa-se das librarias \n
libXi, libXi-devel, libXcursor, libXcursor-devel e libXt.\
Em Ubuntu, chamam-se libxi-dev e libxcursor-dev."
fi

fi
echo O programa já esta instalado
# run
cd vinput/demo
notify-send --expire-time=5000 "Você pode cliquear para desenhar !"
./demo-paint >> /dev/null

main



}

# echo Vamos criar um novo ponteiro.
# echo Favor botar na configuração initial \(remover a mouse que você quer inserir\)
# echo e pressionne enter.
# read x
main(){
#while $1 ; do
ans=$(zenity --list --width="400" --height="250" \
--text "O que você quer fazer ?"\
--title "install mouses - IHC"\
--radiolist --column " " --column "acão" \
TRUE "Botar mouse" FALSE "Remover mouse" FALSE "Rodar o programa de desenho" \
FALSE Ajuda\
)

case $ans in
"Botar mouse" )
echo botar
install
;;
"Remover mouse" )
echo remover
remover
;;
"Rodar o programa de desenho" )
echo rodar
desenho
;;
"Ajuda" )
echo ajuda
help
;;
esac

#done

}

#################
# Programa
#################

find_dependencies

main