Как избежать застревания мыши на нескольких мониторах разных размеров

У меня есть два монитора. Один - 1920x1080 (левый экран), а другой - 1440x900 (правый экран).

Прямо сейчас, я настроил его так, чтобы верхние части обоих мониторов были выровнены. Таким образом, когда моя мышь находится в самой верхней части левого экрана и я перемещаю мышь вправо, она плавно перемещается в правый экран. Однако, если моя мышь находится на нижних 180 пикселях левого экрана, и я перемещаю мышь вправо, она не будет перемещаться на правый экран, поэтому мне нужно переместить мышь вверх, прежде чем переместить ее вправо правый экран меньше левого экрана.

Моя желаемая функциональность: если я нахожусь в нижней части левого экрана и перемещаю мышь вправо, она должна появиться в нижней части правого экрана.

4
задан 21 September 2015 в 04:02

3 ответа

Я обнаружил, что что-то работает на моей машине. Мне не удалось протестировать его с несколькими мониторами, но я думаю, что настройки будут работать для вас. Это требует, чтобы вы установили xdotool.

Если это работает, поместите его в свой .rclocal, как описано здесь , и он запустится при запуске.

#! /bin/bash
# Cursor relocation script by Cass May <cass@cassm.net>

# 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
0
ответ дан 21 September 2015 в 04:02

Причина, по которой это происходит, заключается в том, что ваш левый монитор имеет высоту 1080 пикселей, в то время как правый экран имеет высоту 900. Поскольку эти два элемента расположены сверху, ваша мышь будет двигаться плавно, если вы двигаться справа налево и наоборот.

Но это не будет работать для нижнего края, так как нижняя часть левого экрана имеет высоту на 180 пикселей больше, чем правый экран. Согласно этому вопросу , это известная ошибка в системе X Window

Показанное решение может работать для вас, если вы используете оборудование и драйверы NVIDIA, но в противном случае вы можете застрять , У меня нет этой проблемы под управлением Windows 7 с двумя мониторами с различным разрешением.

0
ответ дан 21 September 2015 в 04:02

Я сталкивался с той же проблемой и поскольку другие указали, что Ubuntu видит, что Ваши мониторы выглядят примерно так (возможно, порядок наоборот):

+----------++----------------+
|          ||                |
|          ||                |
+----------+|                |
            |                |
            +----------------+

В этом примере, когда Ваша мышь находится в правильном мониторе в нижней части и мыши, перемещен, прямо оставил Вас, поражает мертвую зону, где Вы не можете пересечь экраны. Я изменил файл удара, который cassm отправил, чтобы иметь высоту мыши быть пропорциональным при пересечении поэтому при пересечении мыши 3/4 путь от левого монитора мышь появляется 3/4 путь на правильном мониторе.

Для запущения скрипта, я работал, следуют инструкциям ниже:

1) Удостоверьтесь, что установили свои мониторы прямо с изображением в сценарии (ОДИН ВЫШЕ, ОТЛИЧАЕТСЯ) в настройках Displays Ubuntu

2) Сделайте текстовый файл названным "mousejumper.sh" или чем-либо заканчивающимся в .sh

3) Щелкните правой кнопкой по файлу и измените Свойства для создания его исполняемым файлом

4) Скопируйте и вставьте сценарий в файл

    #! /bin/bash
    # Cursor relocation script by Cass May <cass@cassm.net>

    # 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) Измените эти значения в сценарии для соответствия спецификациям монитора

LEFTX="1919"
LEFTMONHEIGHT="1080"

RIGHTX="1920"
RIGHTMONHEIGHT="2159"

Мои мониторы были 1920x1080 слева и 3840x2160 справа.

Если Вы нуждаетесь в помощи, находя, что Ваши значения мониторов используют этот небольшой сценарий удара и перемещают Вашу мышь:

#! /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) Выполните его в терминале с./mousejumper.sh

Я не хочу иметь это выполнение все время, таким образом, я не собираюсь иметь системный запуск оно на запуске. У меня есть немного утилиты, которую я записал для переключения сценариев как это на и прочь вручную.

1
ответ дан 21 September 2015 в 04:02

Другие вопросы по тегам:

Похожие вопросы: