Como evitar que o mouse fique preso a vários monitores de tamanhos diferentes

4

Eu tenho dois monitores. Um é 1920x1080 (a tela da esquerda) e o outro é 1440x900 (a tela da direita).

Neste momento, configuro de tal forma que os topos de ambos os monitores estejam alinhados. Dessa forma, quando eu tenho meu mouse no topo da tela esquerda e movo o mouse para a direita, ele se move perfeitamente para a tela da direita. No entanto, se meu mouse estiver na parte inferior de 180 pixels da tela esquerda e eu mover o mouse para a direita, ele não se moverá para a tela da direita, então tenho que mover meu mouse para cima antes de movê-lo para a direita porque a tela da direita é menor que a tela da esquerda.

Minha funcionalidade desejada: se eu estiver na parte inferior da tela esquerda e mover o mouse para a direita, ele deverá aparecer na parte inferior da tela da direita.

    
por Sam King 10.06.2012 / 02:47

3 respostas

1

Eu descobri algo que parece funcionar na minha máquina. Eu não consegui testá-lo com vários monitores, mas acho que as configurações funcionarão para você. Requer que você tenha instalado o xdotool.

Se funcionar, coloque-o no seu .rclocal, conforme descrito aqui , e ele será executado na inicialização.

#! /bin/bash
# Cursor relocation script by Cass May <[email protected]>

# definitions of "hot zone", which triggers cursor relocation
XZONE="1919"
YZONE="900"

#target for cursor relocation
XTARGET="1920"
YTARGET="899"

while true; do
    # 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}')"

    # perform tests. If you wish to reconfigure this behaviour, and do
    # not know where to start, look up bash numerical comparison operators.
    if [[ "$XPOS" -eq "$XZONE" ]] && [[ "$YPOS" -ge "$YZONE" ]]
    then
        xdotool mousemove "$XTARGET" "$YTARGET"
    fi
    sleep 0.1
done
    
por cassm 23.02.2015 / 16:02
1

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.

    
por cubash 21.09.2015 / 00:55
0

A razão pela qual isso está acontecendo se deve ao fato de seu monitor esquerdo ter uma altura de 1080 pixels, enquanto a tela direita tem uma altura de 900. Como os dois estão alinhados no topo, o mouse se moverá suavemente se você mova-se da direita para a esquerda e vice-versa.

Mas isso não funcionará para a borda inferior, já que a parte inferior da tela esquerda tem 180 pixels a mais de altura que a tela da direita. De acordo com esta questão , é um bug conhecido no sistema X window

A solução mostrada pode funcionar para você se você estiver usando hardware e drivers NVIDIA, mas caso contrário, você pode estar preso. Eu não tenho esse problema executando o Windows 7 com diferentes monitores de resolução dupla.

    
por Jason 10.06.2012 / 04:55