(Сценарий здесь был значительно улучшен Azerothian , дополнительно вот еще одна измененная версия , где я добавил несколько обходных путей и приемов, а также добавил прокрутку клика -назад в (он отключен по умолчанию, но вам просто нужно установить «enableclickscroll=1» в начале файла, чтобы получить его )с некоторыми значительными улучшениями. Сценарий по умолчанию использует bash, но совместим с тире )
.У меня есть рабочее решение в виде bash-скрипта, оно не совсем идеально, но выполняет свою работу, по крайней мере, для моих целей.
Для сценария требуются xdotool и xinput и xsel . sxhkd — рекомендуемое решение для привязки скрипта к средней -мыши.
(Примечание :скрипт совместим с тире , измените#!/bin/bash на#!/bin/dash , чтобы использовать более быстрый интерпретатор, если он установлен)
#!/bin/bash
#Autoscroll (hold only)
echo -n | xsel -n -i
eval $(xdotool getmouselocation --shell)
starty=$Y
mouseid=$(xinput --list | grep -i -m 1 'mouse' | grep -o 'id=[0-9]\+' | grep -o '[0-9]\+')
toggle=0
while [ $toggle -eq 0 ]
do
sleep 0.02
mmouse=$(xinput --query-state $mouseid | grep 'button\[2' | cut -d \= -f2)
toggle=$(xinput --query-state $mouseid | grep 'button\[2' | grep -c up)
eval $(xdotool getmouselocation --shell)
curry=$Y
#Scroll down
while [ $curry -gt $starty ] && [ $toggle -eq 0 ]
do
eval $(xdotool getmouselocation --shell)
curry=$Y
speed=$(expr $curry / 100 - $starty / 100)
xdotool click --repeat $speed --delay 1 5
toggle=$(xinput --query-state $mouseid | grep 'button\[2' | grep -c up)
sleep 0.02
done
#Scroll up
while [ $curry -lt $starty ] && [ $toggle -eq 0 ]
do
eval $(xdotool getmouselocation --shell)
curry=$Y
speed=$(expr $curry / 100 - $starty / 100 | sed 's:-::')
xdotool click --repeat $speed --delay 1 4
toggle=$(xinput --query-state $mouseid | grep 'button\[2' | grep -c up)
sleep 0.02
done
done
А вот и конфигурация sxhkd:./.config/.sxhkd/sxhkdrc
~button2
"/path/to/autoscroll"
@button2
~control + c
echo -n | xsel -n -i
~control + shift + c
echo -n | xsel -n -i
~control + x
echo -n | xsel -n -i
Приведенный выше сценарий при запуске с помощью sxhkd разрешает -системную автопрокрутку, но только при удерживании средней кнопки мыши. Щелчок средней кнопкой мыши будет работать как обычно, но с отключенной функцией вставки (, за исключением случаев, когда вы не используете ctrl+c или ctrl+x для копирования вещей ).
Если вы предпочитаете оставлять вставку средней кнопкой мыши включенной (, не рекомендуется, если вы не хотите случайно вставлять что-то ), используйте вместо этого:
~button2
"/path/to/autoscroll"
@button2
А также закомментировать или удалить первую строку скрипта автопрокрутки(echo -n | xsel -n -i строка)Есть несколько причин, по которым я использую sxhkd , а не xbindkeys .
Хорошей новостью является то, что удерживание средней кнопки мыши для прокрутки работает безупречно (до тех пор, пока вы не можете вставлять объекты с помощью средней мыши ).
Плохая новость заключается в том, что щелчок средней кнопкой мыши для переключения автоматической -прокрутки имеет довольно серьезные проблемы, поэтому я не оставил его в сценарии по умолчанию.
Чтобы включить автопрокрутку щелчком мыши, замените все экземпляры:
toggle=$(xinput --query-state $mouseid | grep 'button\[2' | grep -c up)
С:
if [ "$mmouse" = "down" ]; then
toggle=$(xinput --query-state $mouseid | grep 'button\[2' | grep -c up)
else
toggle=$(xinput --query-state $mouseid | grep 'button\[' | sort | grep -c down)
fi
Проблемы с удержанием и нажатием для прокрутки:
Проблемы только с нажатием для прокрутки:
Первую проблему можно решить, настроив ./.config/.sxhkd/sxhkdrc следующим образом
@button2
"/path/to/autoscroll"
Однако это не только лишает вас возможности удерживать прокрутку от -до -, ваша средняя кнопка мыши будет работать только для автопрокрутки, вы больше не сможете использовать среднюю кнопку мыши для открытия ссылок в новых вкладках. без строки ~button2. Если вы никогда не используете эту функцию и никогда не используете среднюю мышь для вставки элементов, это может вам подойти, но в остальном я бы не советовал этого делать.
Суть в том, что он отлично работает, если удерживать среднюю кнопку мыши для автопрокрутки, и совсем не работает, если щелкнуть, чтобы включить автопрокрутку (, поэтому я оставил его отключенным)
Это удовлетворяет мои потребности в соответствии с запросом ОП, однако я буду некоторое время ждать лучших ответов, если у кого-то окажется лучшее решение, прежде чем я отмечу этот ответ как решение.
У меня нет лучшего ответа, кроме того, что я улучшил (на мой взгляд )предоставленный скриптом cestarian, я хотел горизонтальную прокрутку, и у меня также были проблемы с моей мышью Logitech, которая не поднималась правильно.
Я также не вижу причин иметь так много циклов, когда один цикл будет намного быстрее и позволит выполнять прокрутку в нескольких направлениях в одном и том же цикле :D
Проверено на xUbuntu 18.04.2 LTS
sudo apt install xdotool xsel sxhkd
~/.config/sxkhd/sxhkdrc
~button2
"~/.config/sxkhd/autoscroll.sh"
@button2
~control + c
echo -n | xsel -n -i
~control + shift + c
echo -n | xsel -n -i
~control + x
echo -n | xsel -n -i
~/.config/sxkhd/autoscroll.sh
#!/bin/dash
# Autoscroll (hold only)
middlemousebutton=2
mousescrollup=4
mousescrolldown=5
mousescrollleft=6
mousescrollright=7
enableverticalscroll=1
enablehorizontalscroll=1
## Danger below :D
echo -n | xsel -n -i
eval $(xdotool getmouselocation --shell)
starty=$Y
startx=$X
toggle=$middlemousebutton
while [ $toggle -eq $middlemousebutton ]
do
eval $(xdotool getmouselocation --shell)
curry=$Y
currx=$X
if [ $enableverticalscroll -eq 1 ]
then
if [ $curry -gt $starty ]
then
speedy=$(expr $curry / 100 - $starty / 100)
if [ $speedy -gt 0 ]
then
xdotool click --repeat $speedy --delay 1 $mousescrolldown
fi
else
speedy=$(expr $curry / 100 - $starty / 100 | sed 's:-::')
if [ $speedy -gt 0 ]
then
xdotool click --repeat $speedy --delay 1 $mousescrollup
fi
fi
fi
if [ $enablehorizontalscroll -eq 1 ]
then
if [ $currx -gt $startx ]
then
speedx=$(expr $currx / 100 - $startx / 100)
if [ $speedx -gt 0 ]
then
xdotool click --repeat $speedx --delay 1 $mousescrollright
fi
else
speedx=$(expr $currx / 100 - $startx / 100 | sed 's:-::')
if [ $speedx -gt 0 ]
then
xdotool click --repeat $speedx --delay 1 $mousescrollleft
fi
fi
fi
toggle=$(xinput --list "Virtual core pointer" | grep -i -m 1 "Button state:" | grep -o "[$middlemousebutton]\+")
sleep 0.02
done
chmod +x ~/.config/sxkhd/autoscroll.sh
Убедитесь, что вы добавили sxhkd вSession and Startup -> Autostart Applications
и все должно работать при следующей загрузке