Cách thay đổi tốc độ cuộn của bánh xe chuột trên mỗi ứng dụng


9

Có thể có tốc độ cuộn bánh xe chuột khác nhau dựa trên ứng dụng chạy trên đầu (tập trung).

Giống như tốc độ cuộn chậm hơn cho guake để dễ đọc và cao hơn để trình duyệt web cuộn nhanh hơn.


Quake thiết bị đầu cuối? Điều gì phải làm "tốc độ chuột" với bất cứ điều gì?
Braiam

1
@Braiam Tôi nghĩ OP chỉ chọn những thứ này làm ví dụ. Tên ứng dụng không liên quan, nhưng phần quan trọng là sự thay đổi tốc độ cuộn trên mỗi ứng dụng tùy ý
Sergiy Kolodyazhnyy

@Serg cách các ứng dụng diễn giải các sự kiện bánh xe chuột là vô cùng phù hợp. I E. Firefox diễn giải một nút 5 (cách xorg thấy chuột của tôi cuộn xuống) là "di chuyển ba dòng xuống một cách trơn tru", tương tự, các ứng dụng khác có thể tuân theo các tiêu chí khác nhưng phổ biến là 3 dòng và điều này không được điều khiển bởi xserver.
Braiam

Câu trả lời:


8

Giới thiệu

Kịch bản sau đây dynamic_mouse_speed.py cho phép chỉ định con trỏ chuột và / hoặc tốc độ cuộn sẽ là gì khi cửa sổ do người dùng xác định có tiêu điểm.

Quan trọng : tập lệnh yêu cầu imwheelchương trình tăng tốc độ cuộn. Vui lòng cài đặt nó quasudo apt-get install imwheel

Sử dụng

Như được hiển thị bằng -hcờ:

usage: dynamic_mouse_speed.py [-h] [-q] [-p POINTER] [-s SCROLL] [-v]

Sets mouse pointer and scroll speed per window

optional arguments:
  -h, --help            show this help message and exit
  -q, --quiet           Blocks GUI dialogs.
  -p POINTER, --pointer POINTER
                        mouse pointer speed,floating point number from -1 to 1
  -s SCROLL, --scroll SCROLL
                        mouse scroll speed,integer value , -10 to 10
                        recommended
  -v, --verbose         prints debugging information on command line

Kịch bản cho phép người dùng chọn cửa sổ họ muốn theo dõi bằng cách nhấp chuột. Con trỏ chuột sẽ biến thành chéo và người dùng có thể chọn một cửa sổ họ muốn.

Chạy python3 dynamic_mouse_speed.pymột mình chỉ hiển thị hộp thoại bật lên và không làm gì cả.

Chạy python3 dynamic_mouse_speed.py -s 5làm tăng tốc độ cuộn, trong khi python3 dynamic_mouse_speed.py -s -5làm chậm tốc độ cuộn xuống. python3 dynamic_mouse_speed.py -p -0.9giảm tốc độ con trỏ, trong khi python3 dynamic_mouse_speed.py -p 0.9tăng tốc độ con trỏ. -s-pcác tùy chọn có thể được trộn lẫn. -vtạo ra thông tin gỡ lỗi trên dòng lệnh.

Nguồn

Cũng có sẵn như ý chính GitHub

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Author: Sergiy Kolodyazhnyy
Date:  August 2nd, 2016
Written for: https://askubuntu.com/q/806212/295286
Tested on Ubuntu 16.04 LTS

usage: dynamic_mouse_speed.py [-h] [-q] [-p POINTER] [-s SCROLL] [-v]

Sets mouse pointer and scroll speed per window

optional arguments:
  -h, --help            show this help message and exit
  -q, --quiet           Blocks GUI dialogs.
  -p POINTER, --pointer POINTER
                        mouse pointer speed,floating point number from -1 to 1
  -s SCROLL, --scroll SCROLL
                        mouse scroll speed,integer value , -10 to 10
                        recommended
  -v, --verbose         prints debugging information on command line


"""
from __future__ import print_function
import gi
gi.require_version('Gdk', '3.0')
gi.require_version('Gtk', '3.0')
from gi.repository import Gdk, Gtk,Gio
import time
import subprocess
import sys
import os
import argparse


def run_cmd(cmdlist):
    """ Reusable function for running shell commands"""
    try:
        stdout = subprocess.check_output(cmdlist)
    except subprocess.CalledProcessError:
        print(">>> subprocess:",cmdlist)
        sys.exit(1)
    else:
        if stdout:
            return stdout



def get_user_window():
    """Select two windows via mouse. 
       Returns integer value of window's id"""
    window_id = None
    while not window_id:
        for line in run_cmd(['xwininfo', '-int']).decode().split('\n'):
            if 'Window id:' in line:
                window_id = line.split()[3]
    return int(window_id)

def gsettings_get(schema,path,key):
    """Get value of gsettings schema"""
    if path is None:
        gsettings = Gio.Settings.new(schema)
    else:
        gsettings = Gio.Settings.new_with_path(schema,path)
    return gsettings.get_value(key)

def gsettings_set(schema,path,key,value):
    """Set value of gsettings schema"""
    if path is None:
        gsettings = Gio.Settings.new(schema)
    else:
        gsettings = Gio.Settings.new_with_path(schema,path)
    return gsettings.set_double(key,value)

def parse_args():
    """ Parse command line arguments"""
    arg_parser = argparse.ArgumentParser(
                 description="""Sets mouse pointer and scroll """ + 
                             """speed per window """)
    arg_parser.add_argument(
                '-q','--quiet', action='store_true',
                help='Blocks GUI dialogs.',
                required=False)

    arg_parser.add_argument(
                '-p','--pointer',action='store',
                type=float, help=' mouse pointer speed,' + 
                'floating point number from -1 to 1', required=False)

    arg_parser.add_argument(
                '-s','--scroll',action='store',
                type=int, help=' mouse scroll speed,' + 
                'integer value , -10 to 10 recommended', required=False)

    arg_parser.add_argument(
                '-v','--verbose', action='store_true',
                help=' prints debugging information on command line',
                required=False)
    return arg_parser.parse_args()

def get_mouse_id():
    """ returns id of the mouse as understood by
        xinput command. This works only with one
        mouse attatched to the system"""
    devs = run_cmd( ['xinput','list','--id-only']   ).decode().strip()
    for dev_id in devs.split('\n'):
        props = run_cmd( [ 'xinput','list-props', dev_id  ]   ).decode()
        if "Evdev Scrolling Distance" in props:
            return dev_id


def write_rcfile(scroll_speed):
    """ Writes out user-defined scroll speed
        to ~/.imwheelrc file. Necessary for
        speed increase"""

    number = str(scroll_speed)
    user_home = os.path.expanduser('~')
    with open( os.path.join(user_home,".imwheelrc") ,'w'  ) as rcfile:
        rcfile.write( '".*"\n' )
        rcfile.write("None, Up, Button4, " + number + "\n"   )   
        rcfile.write("None, Down, Button5, " + number + "\n")
        rcfile.write("Control_L, Up,   Control_L|Button4 \n" +
                     "Control_L, Down, Control_L|Button5 \n" +
                     "Shift_L,   Up,   Shift_L|Button4 \n" +
                     "Shift_L,   Down, Shift_L|Button5 \n" )



def set_configs(mouse_speed,scroll_speed,mouse_id):
    """ sets user-defined values
        when the desired window is in focus"""
    if mouse_speed:
        gsettings_set('org.gnome.desktop.peripherals.mouse',None, 'speed', mouse_speed)

    if scroll_speed:
       if scroll_speed > 0:
           subprocess.call(['killall','imwheel'])
           # Is it better to write config here
           # or in main ?
           write_rcfile(scroll_speed)
           subprocess.call(['imwheel'])
       else:
           prop="Evdev Scrolling Distance"
           scroll_speed = str(abs(scroll_speed))
           run_cmd(['xinput','set-prop',mouse_id,prop,scroll_speed,'1','1']) 



def set_defaults(mouse_speed,scroll_speed,mouse_id):
    """ restore values , when user-defined window
        looses focus"""
    if mouse_speed:
        gsettings_set('org.gnome.desktop.peripherals.mouse', None, 
                      'speed', mouse_speed)

    if scroll_speed:
        if scroll_speed > 0:
           subprocess.call(['killall','imwheel'])
        if scroll_speed < 0:
           prop="Evdev Scrolling Distance"
           run_cmd(['xinput','set-prop',mouse_id,prop,'1','1','1'])


def main():
    """Entry point for when program is executed directly"""
    args = parse_args()

    # Get a default configs
    # gsettings returns GVariant, but
    # setting same schema and key requires 
    # floating point number
    screen = Gdk.Screen.get_default()
    default_pointer_speed = gsettings_get('org.gnome.desktop.peripherals.mouse', 
                                          None, 
                                          'speed')
    default_pointer_speed = float(str(default_pointer_speed))


    # Ask user for values , or check if those are provided via command line
    if not args.quiet:
       text='--text="Select window to track"'
       mouse_speed = run_cmd(['zenity','--info',text])

    user_window = get_user_window() 

    scroll_speed = args.scroll    
    pointer_speed = args.pointer
    mouse_id = get_mouse_id()

    if pointer_speed: 
        if pointer_speed > 1 or pointer_speed < -1:

           run_cmd(['zenity','--error',
                    '--text="Value out of range:' + 
                    str(pointer_speed) + '"'])
           sys.exit(1)

    # ensure that we will raise the user selected window
    # and activate all the preferences 
    flag = True
    for window in screen.get_window_stack():
        if user_window == window.get_xid():
            window.focus(time.time())
            window.get_update_area()
    try:
        while True:
            time.sleep(0.25) # Necessary for script to catch active window
            if  screen.get_active_window().get_xid() == user_window:
                if flag:
                    set_configs(pointer_speed,scroll_speed,mouse_id) 
                    flag=False

            else:
               if not flag:
                  set_defaults(default_pointer_speed, scroll_speed,mouse_id)
                  flag = True

            if args.verbose: 
                print('ACTIVE WINDOW:',str(screen.get_active_window().get_xid()))
                print('MOUSE_SPEED:', str(gsettings_get(
                                          'org.gnome.desktop.peripherals.mouse',
                                           None, 'speed')))
                print('Mouse ID:',str(mouse_id))
                print("----------------------")
    except:
        print(">>> Exiting main, resetting values")
        set_defaults(default_pointer_speed,scroll_speed,mouse_id)

if __name__ == "__main__":
    main()

Ghi chú

  • nhiều phiên bản của tập lệnh cho phép cài đặt tốc độ cho mỗi cửa sổ riêng biệt.
  • Khi chạy từ dòng lệnh, hộp thoại bật lên tạo ra thông báo sau: Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.Chúng có thể bị bỏ qua.
  • Tham khảo Làm cách nào tôi có thể chỉnh sửa / tạo các mục trình khởi chạy mới trong Unity bằng tay? để tạo một trình khởi chạy hoặc lối tắt trên màn hình cho tập lệnh này, nếu bạn muốn khởi chạy nó bằng cách bấm đúp
  • Để liên kết tập lệnh này với phím tắt để dễ truy cập, hãy tham khảo Cách thêm phím tắt?
  • Bạn chỉ nên sử dụng một con chuột khi tập lệnh đang chạy, vì nó hoạt động trên thiết bị đầu tiên được tìm thấy có thuộc Evdev Scrolling Distancetính
  • Nhiều phiên bản có thể được bắt đầu để kiểm soát nhiều cửa sổ, nhưng nó không được khuyến khích vì hiệu suất

Câu trả lời tuyệt vời. Tôi sẽ thưởng cho bạn 50 đại diện nếu điều đó là có thể.

4
@luchonacho Bạn luôn có thể cung cấp tiền thưởng cho câu hỏi nếu bạn muốn như vậy, nhưng nó chỉ có sẵn sau 2 ngày kể từ khi câu hỏi được đăng :)
Sergiy Kolodyazhnyy

2
Câu hỏi hỏi về việc thay đổi tốc độ cuộn. Nó không giống như những gì kịch bản này làm, nhưng có lẽ nó có thể được điều chỉnh để làm như vậy. Trên thực tế, việc thay đổi tốc độ mà con trỏ chuột di chuyển tùy thuộc vào cửa sổ có thể sẽ hoạt động theo cách mà hầu hết người dùng thấy không thể đoán trước. Thậm chí nhiều hơn khi thay đổi tốc độ xảy ra với một độ trễ.
kasperd

@kasperd Thật vậy, tiêu đề câu hỏi hơi sai lệch và tập lệnh thay đổi tốc độ con trỏ, thay vì tốc độ cuộn. Tuy nhiên, nó không phải là một vấn đề lớn và thực sự tôi có thể điều chỉnh kịch bản để bao gồm tốc độ cuộn. Tuy nhiên, điều đó đòi hỏi phải cài đặt imwheelgói, điều này sẽ làm cho nó phức tạp hơn một chút. Tôi sẽ cho bạn biết khi tôi cập nhật câu trả lời của mình. Đối với những gì bạn nói về hành vi tìm kiếm người dùng không thể đoán trước, tôi không thấy điều này khó lường như thế nào. Bạn có thể giải thích thêm?
Sergiy Kolodyazhnyy

@Serg Nếu con trỏ chuột thay đổi ở giữa người dùng di chuyển nó, họ sẽ không thể đạt được điểm họ thực sự nhắm đến. Và nếu thay đổi xảy ra với độ trễ tối đa ¼ giây, người dùng thậm chí không thể biết được một phần của chuyển động xảy ra như thế nào với mỗi tốc độ. Con trỏ có thể di chuyển khá xa trong 250 mili giây. Và hành vi sẽ không giống nhau mỗi lần, ngay cả khi bạn di chuyển chuột chính xác theo cùng một cách, bởi vì độ trễ sẽ được trải đều trong khoảng từ 0 đến 250 mili giây.
kasperd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.