У меня есть два монитора. Один - 1920x1080 (левый экран), а другой - 1440x900 (правый экран).
Прямо сейчас, я настроил его так, чтобы верхние части обоих мониторов были выровнены. Таким образом, когда моя мышь находится в самой верхней части левого экрана и я перемещаю мышь вправо, она плавно перемещается в правый экран. Однако, если моя мышь находится на нижних 180 пикселях левого экрана, и я перемещаю мышь вправо, она не будет перемещаться на правый экран, поэтому мне нужно переместить мышь вверх, прежде чем переместить ее вправо правый экран меньше левого экрана.
Моя желаемая функциональность: если я нахожусь в нижней части левого экрана и перемещаю мышь вправо, она должна появиться в нижней части правого экрана.
Я обнаружил, что что-то работает на моей машине. Мне не удалось протестировать его с несколькими мониторами, но я думаю, что настройки будут работать для вас. Это требует, чтобы вы установили 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
Причина, по которой это происходит, заключается в том, что ваш левый монитор имеет высоту 1080 пикселей, в то время как правый экран имеет высоту 900. Поскольку эти два элемента расположены сверху, ваша мышь будет двигаться плавно, если вы двигаться справа налево и наоборот.
Но это не будет работать для нижнего края, так как нижняя часть левого экрана имеет высоту на 180 пикселей больше, чем правый экран. Согласно этому вопросу , это известная ошибка в системе X Window
Показанное решение может работать для вас, если вы используете оборудование и драйверы NVIDIA, но в противном случае вы можете застрять , У меня нет этой проблемы под управлением Windows 7 с двумя мониторами с различным разрешением.
Я сталкивался с той же проблемой и поскольку другие указали, что 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
Я не хочу иметь это выполнение все время, таким образом, я не собираюсь иметь системный запуск оно на запуске. У меня есть немного утилиты, которую я записал для переключения сценариев как это на и прочь вручную.