Eu estava correndo para o mesmo problema e como outros apontaram o Ubuntu vê seus monitores parecendo algo assim (talvez a ordem seja o contrário):
+----------++----------------+
| || |
| || |
+----------+| |
| |
+----------------+
Neste exemplo, quando o mouse está no monitor direito na parte inferior e o mouse é movido diretamente para a esquerda, você atinge uma zona morta onde não é possível cruzar telas. Eu modifiquei o arquivo bash que o cassm postou para ter a altura do mouse proporcional ao cruzar, então se você cruzar o mouse a 3/4 do monitor esquerdo, o mouse aparecerá 3/4 do caminho para cima no monitor direito.
Para executar o script, corri as instruções abaixo:
1) Certifique-se de configurar seus monitores diretamente com a imagem no script (UM ACIMA É DIFERENTE) nas configurações de exibição do Ubuntu
2) Crie um arquivo de texto chamado "mousejumper.sh" ou qualquer coisa que termine com .sh
3) Clique com o botão direito no arquivo e altere as Propriedades para torná-lo executável
4) Copie e cole o script no arquivo
#! /bin/bash
# Cursor relocation script by Cass May <[email protected]>
# LEFTX and RIGHTX are the screen boundaries, which triggers cursor relocation
# LEFTMONHEIGHT and LEFTMONHEIGHT are the heights in pixels of the left and right monitor
# minus 1, because computers start counting at 0... so 1920 pixels heigh becomes 1919
LEFTX="1919"
LEFTMONHEIGHT="1080"
RIGHTX="1920"
RIGHTMONHEIGHT="2159"
# Size in pixels to jump over the screens with when you hit the boundary (ex: if 5, jumps from x = 1919 to x=1924)
BUFFER="5"
# In Ubuntu Displays settings window the two monitors must be setup to look like this:
# +----------------+
# | |
# +----------+| |
# | || |
# | || |
# +----------++----------------+
#
# If the monitor setup is in a different order (ex: larger screen on left side)
# or there are more than two monitors, then the script will need to be modified
# Tip: Set "Sticky Edges" to On in the Displays settings window because
# the script checks coordinates every 0.### seconds, and sticky edges
# keeps your mouse there longer
while true; do # keep loop going to run all the time, do a slight pause for performance
# grab cursor position, and extract x and y position
CURSORPOSITION="$(xdotool getmouselocation)"
XPOS="$(grep -o '[0-9]\+' <<< "$CURSORPOSITION" | awk 'NR==1{print $1}')"
YPOS="$(grep -o '[0-9]\+' <<< "$CURSORPOSITION" | awk 'NR==2{print $1}')"
#echo "Mouse position is: ($XPOS, $YPOS)"
# if XPOS is 1920 then on right 4k monitor
if [ $XPOS = $RIGHTX ]
then
#echo "Starting jump function"
# find % height then convert
# Input is 0-2159, Output is 1080-2159
NEWYPOS=$(echo "(($LEFTMONHEIGHT+$YPOS/$RIGHTMONHEIGHT*$LEFTMONHEIGHT))" | bc -l)
#echo "YPOS with floats is: $NEWYPOS"
NEWYPOS=$(echo "$NEWYPOS" | bc -l | xargs printf "%1.0f")
NEWXPOS=$(($RIGHTX-$BUFFER))
# Move Mouse to other screen with a few pixel buffer on the screen edge
#echo "Mouse jumped from right to left from: ($XPOS, $YPOS) to ($NEWXPOS, $NEWYPOS)"
xdotool mousemove "$NEWXPOS" "$NEWYPOS"
# if XPOS is 1919 then on left 1080 monitor
elif [ $XPOS = $LEFTX ]
then
#echo "Starting jump function"
# find % height then convert
# Input is 0-2159, Output is 1080-2159
NEWYPOS=$(echo "((($YPOS-$LEFTMONHEIGHT)/$LEFTMONHEIGHT*$RIGHTMONHEIGHT))" | bc -l)
#echo "YPOS with floats is: $NEWYPOS"
NEWYPOS=$(echo "$NEWYPOS" | bc -l | xargs printf "%1.0f")
NEWXPOS=$(($LEFTX+$BUFFER))
# Move Mouse to other screen with a few pixel buffer on the screen edge
#echo "Mouse jumped from left to right from: ($XPOS, $YPOS) to ($NEWXPOS, $NEWYPOS)"
xdotool mousemove "$NEWXPOS" "$NEWYPOS"
fi
sleep 0.05
done
5) Altere esses valores no script para corresponder às especificações do seu monitor
LEFTX="1919"
LEFTMONHEIGHT="1080"
RIGHTX="1920"
RIGHTMONHEIGHT="2159"
Meus monitores foram 1920x1080 à esquerda e 3840x2160 à direita.
Se você precisar de ajuda para encontrar seus valores de monitores, use este pequeno script e mova seu mouse:
#! /bin/bash
while true; do # keep loop going to run all the time, do a slight pause for performance
# grab cursor position, and extract x and y position
CURSORPOSITION="$(xdotool getmouselocation)"
XPOS="$(grep -o '[0-9]\+' <<< "$CURSORPOSITION" | awk 'NR==1{print $1}')"
YPOS="$(grep -o '[0-9]\+' <<< "$CURSORPOSITION" | awk 'NR==2{print $1}')"
echo "Mouse position is: ($XPOS, $YPOS)"
sleep 0.1
done
6) Execute-o no terminal com ./mousejumper.sh
Eu não quero que isso aconteça o tempo todo, então não irei fazer o sistema iniciar na inicialização. Eu tenho um pequeno utilitário que escrevi para ativar e desativar manualmente os scripts como esse.