Uygulama başına fare tekerleği kaydırma hızı nasıl değiştirilir


9

Üstte (odaklanmış) çalışan uygulamaya bağlı olarak farklı fare tekerleği kaydırma hızına sahip olmak mümkün mü?

Kolay okuma için guake için daha düşük kaydırma hızı ve web tarayıcısının daha hızlı kaydırması için daha yüksek kaydırma hızı gibi.


Terminali deprem mi etti? Herhangi bir şeyle "fare hızı" ne yapmalı?
Braiam

1
@Braiam Bence OP sadece örnek olarak seçti. Uygulama adı önemsiz, ancak önemli bir kısmı keyfi uygulama başına kaydırma hızı değişikliği
Sergiy Kolodyazhnyy

@ Uygulamaların fare tekerleği olaylarını nasıl yorumladığını gösterin son derece önemlidir. yani. Firefox, bir düğme 5'i (xorg'un faremin kaydırmasını nasıl gördüğünü) "üç satırı yavaşça aşağı doğru hareket ettir" olarak yorumlar, diğer uygulamalar diğer kriterleri takip edebilir, ancak ortak olan 3 satırdır ve bu xserver tarafından kontrol edilmez.
Braiam

Yanıtlar:


8

Giriş

Aşağıdaki komut dosyası dynamic_mouse_speed.py , kullanıcı tanımlı pencerede odak olduğunda fare işaretçisinin ve / veya kaydırma hızının ne olacağını belirtmeye olanak tanır .

Önemli : komut dosyası, imwheelkaydırma hızını artırmak için program gerektirir . Lütfen yoluyla yükleyinsudo apt-get install imwheel

kullanım

-hBayrağın gösterdiği gibi :

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

Komut dosyası, kullanıcının fare tıklamasıyla izlemek istediği pencereyi seçmesine olanak tanır. Fare işaretçisi çaprazlanır ve kullanıcı istediği pencereyi seçebilir.

python3 dynamic_mouse_speed.pyYalnız koşmak sadece pop-up iletişim kutusunu gösterir ve kendi başına hiçbir şey yapmaz.

Koşmak python3 dynamic_mouse_speed.py -s 5kaydırma hızını artırır, kaydırma hızını python3 dynamic_mouse_speed.py -s -5yavaşlatır. python3 dynamic_mouse_speed.py -p -0.9işaretçi hızını azaltırken işaretçi hızını python3 dynamic_mouse_speed.py -p 0.9artırır. -sve -pseçenekler karıştırılabilir. -vkomut satırında hata ayıklama bilgileri üretir.

Kaynak

GitHub gist olarak da mevcuttur

#!/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()

notlar

  • birden fazla komut dosyası örneği, her ayrı pencere için hızın ayarlanmasına izin verir.
  • Komut satırından çalıştırıldığında, açılır iletişim kutuları aşağıdaki iletiyi oluşturur: Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.Bunlar yok sayılabilir.
  • Consity Birliğindeki yeni başlatıcı öğelerini elle nasıl düzenleyebilir / oluşturabilirim? çift ​​tıklatarak başlatmak istiyorsanız, bu komut dosyası için bir başlatıcı veya masaüstü kısayolu oluşturmak için
  • Bu komut dosyasını kolay erişim için bir klavye kısayoluna bağlamak için bkz. Klavye kısayolları nasıl eklenir?
  • Sadece kullanılması önerilir biri o sahip olduğu bulunmuştur ilk aygıtta çalıştığından, komut çalıştıran fare Evdev Scrolling Distanceözelliğini
  • Birden çok pencereyi kontrol etmek için birden fazla örnek başlatılabilir, ancak performans uğruna önerilmez

Şaşırtıcı cevap. Mümkünse size 50 temsilci verirdim.

4
@luchonacho İsterseniz soruya her zaman ödül sunabilirsiniz, ancak soru gönderildikten sonra sadece 2 gün sonra kullanılabilir :)
Sergiy Kolodyazhnyy

2
Soru kaydırma hızını değiştirme hakkında soru soruyor. Bu komut dosyasının yaptığı gibi görünmüyor, ancak belki de buna uyarlanabilir. Aslında, fare imlecinin pencereye bağlı olarak hareket etme hızını değiştirmek muhtemelen çoğu kullanıcının öngörülemeyen bir şekilde davranacaktır. Dahası, hız değişiklikleri bir gecikmeyle gerçekleştiğinde.
kasperd

@kasperd Gerçekten, soru başlığı biraz yanıltıcıydı ve komut dosyası kaydırma hızından ziyade işaretçi hızını değiştiriyor. Ancak, bu büyük bir sorun değil ve gerçekten komut dosyasını kaydırma hızını içerecek şekilde uyarlayabilirim. Ancak imwheelbu, biraz daha karmaşık hale getirecek paketin yüklenmesini gerektirir . Cevabımı güncellediğimde size haber vereceğim. Öngörülemeyen kullanıcı bulma davranışı hakkında söylediklerinize gelince, bunun nasıl tahmin edilemez olduğunu görmüyorum. Daha fazla açıklayabilir misiniz?
Sergiy Kolodyazhnyy

@Serg Fare hareket ettiren bir kullanıcının ortasında fare imleci değişirse, hedefledikleri noktaya ulaşmaları pek olası değildir. Ve eğer değişiklik saniyeye kadar gecikmeyle gerçekleşirse, kullanıcı hareketin bir kısmının her hızda ne kadar büyük olduğunu bile bilemez. İmleç 250 milisaniyede oldukça uzağa gidebilir. Fareyi fiziksel olarak tam olarak aynı şekilde hareket ettirseniz bile davranış her seferinde aynı olmayacaktır, çünkü gecikme 0 ile 250 milisaniye arasında eşit olarak yayılacaktır.
kasperd
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.