Могу ли я сделать прокрутку среднего мыши на Linux ведут себя больше похоже на автосветку на Windows?

Используйте это:

alias ipy3='ipython3'
2
30.05.2019, 03:29
2 ответа

(Сценарий здесь был значительно улучшен 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 .

  • sxhkd позволяет сделать так, чтобы щелчок связанной кнопки проходил нормально, прежде чем запускать скрипт (это то, что делает ~button2 ), это позволяет средней кнопке мыши сохранять свою предыдущую функциональность вместе с выполнение этого скрипта.
  • По какой-то причине как для sxhkd, так и для xbindkeys, если бы я попытался привязать скрипт к средней мыши, это сработало бы, только если включена эмуляция колесика мыши libinput, если я ее отключу, скрипт просто не будет работать через эти программы (, даже если он отлично работает сам по себе ), короче говоря, решением этой проблемы был префикс @ sxhkd, следовательно, @button2.

Хорошей новостью является то, что удерживание средней кнопки мыши для прокрутки работает безупречно (до тех пор, пока вы не можете вставлять объекты с помощью средней мыши ).

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

Чтобы включить автопрокрутку щелчком мыши, замените все экземпляры:

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

Проблемы с удержанием и нажатием для прокрутки:

  • Он прокручивается довольно быстро на минимальной скорости, хотя, вероятно, подходит для большинства пользователей, лично я предпочел бы более медленные скорости. Наиболее вероятным решением для этого является снижение скорости прокрутки для libinput, это, к сожалению, не так просто, как должно быть (, поэтому я еще не проверял ).
  • Горизонтальная прокрутка не реализована, однако ее было бы легко реализовать (Я просто никогда ею не пользуюсь, поэтому у меня не было причин ). В настоящее время весь сценарий основан на оси Y, копирование того, что уже здесь, и включение оси X было бы простым делом, и вместо кнопок мыши 4 и 5, которые предназначены для вертикальной прокрутки, вы должны использовать кнопки мыши 6 и 7 для горизонтальная прокрутка. (Исправлено в версии Azerothian и модифицированной версии)
  • Нет значка, указывающего начальную позицию прокрутки, и нет изменения курсора, указывающего, что прокрутка активна. Я предполагаю, что это не должно быть так сложно решить, но раньше я ошибался...
  • Если курсор мыши находится в месте с возможностью прокрутки (, например на вкладках браузера или на панели задач, где вы можете прокручивать задачи/вкладки )при отпускании кнопки, прокрутка будет нежелательной.(Устранено обходным путем в модифицированной версии)

Проблемы только с нажатием для прокрутки:

  • Запуск не всегда (это ошибка текущей конфигурации sxhkd, если я использую только @button2 для сценария и опускаю ~button2, он работает отлично, однако это также означает, что вы не можете больше не используйте среднюю мышь, чтобы открывать ссылки на новой вкладке в браузере, потому что щелчок больше не будет переадресовываться через)(исправлено в модифицированной версии путем добавления переменной clickdelay для управления льготным периодом вы должны отпустить среднюю кнопку мыши, чтобы активировать прокрутку кликов)
  • Не определяет, когда средний щелчок действительно использовался для чего-то другого. (напр. если вы используете средний щелчок, чтобы открыть ссылку на новой вкладке, прокрутка, скорее всего, будет активирована как побочный эффект этого среднего щелчка, возможным решением будет наличие программы, которая определяет статус курсора и активирует только скрипт если курсор нейтральный или при наведении текст, или хотя бы не активируется при наведении на ссылки, однако я не знаю такого софта)
  • Повторное нажатие средней кнопки мыши, чтобы остановить прокрутку, не работает (вы можете нажать любую другую кнопку мыши, чтобы остановить прокрутку вместо этого, например, левый или правый щелчок, так что на самом деле это не имеет большого значения )это, вероятно, можно решить с помощью немного повозился со сценарием, но руки не дошли. (Исправлено в модифицированной версии)
  • Прокрутка не привязана к начальной позиции курсора, а скорее к самому курсору (это не проблема при удерживании кнопки ). Это означает, что, допустим, вы находитесь в браузере и используете этот скрипт автопрокрутки, если вы переместите мышь слишком высоко вверх по экрану, вместо прокрутки вверх и вниз на текущей странице вы вместо этого начнете прокручивать свои вкладки,что далеко не идеально, поскольку это означает, что вы должны быть осторожны с тем, куда вы перемещаете курсор во время прокрутки. (Смягчено в модифицированной версии)

Первую проблему можно решить, настроив ./.config/.sxhkd/sxhkdrc следующим образом

@button2
    "/path/to/autoscroll"

Однако это не только лишает вас возможности удерживать прокрутку от -до -, ваша средняя кнопка мыши будет работать только для автопрокрутки, вы больше не сможете использовать среднюю кнопку мыши для открытия ссылок в новых вкладках. без строки ~button2. Если вы никогда не используете эту функцию и никогда не используете среднюю мышь для вставки элементов, это может вам подойти, но в остальном я бы не советовал этого делать.

Суть в том, что он отлично работает, если удерживать среднюю кнопку мыши для автопрокрутки, и совсем не работает, если щелкнуть, чтобы включить автопрокрутку (, поэтому я оставил его отключенным)

Это удовлетворяет мои потребности в соответствии с запросом ОП, однако я буду некоторое время ждать лучших ответов, если у кого-то окажется лучшее решение, прежде чем я отмечу этот ответ как решение.

2
27.01.2020, 22:08

У меня нет лучшего ответа, кроме того, что я улучшил (на мой взгляд )предоставленный скриптом 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

и все должно работать при следующей загрузке

2
27.01.2020, 22:08

Теги

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