前書き
次のスクリプトでdynamic_mouse_speed.py
は、ユーザー定義ウィンドウにフォーカスがある場合のマウスポインターやスクロール速度を指定できます。
重要:このスクリプトでは、imwheel
スクロール速度を上げるためのプログラムが必要です。経由でインストールしてくださいsudo apt-get install imwheel
使用法
-h
フラグが示すように:
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
このスクリプトにより、ユーザーはマウスクリックで追跡するウィンドウを選択できます。マウスポインターが十字に変わり、ユーザーは必要なウィンドウを選択できます。
python3 dynamic_mouse_speed.py
単独で実行すると、ポップアップダイアログのみが表示され、単独では何も実行されません。
実行python3 dynamic_mouse_speed.py -s 5
するとスクロール速度が上がり、python3 dynamic_mouse_speed.py -s -5
スクロール速度は下がります。python3 dynamic_mouse_speed.py -p -0.9
ポインタの速度を下げ、ポインタの速度をpython3 dynamic_mouse_speed.py -p 0.9
上げます。-s
および-p
オプションは、混合することができます。-v
コマンドラインでデバッグ情報を生成します。
ソース
GitHub gistとしても利用可能
#!/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()
ノート
- スクリプトの複数のインスタンスにより、個別のウィンドウごとに速度を設定できます。
- コマンドラインから実行すると、ポップアップダイアログに次のメッセージが表示
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
されます。これらは無視できます。
- 相談してくださいどのように私は編集/手でユニティに新しいランチャアイテムを作成することができますか?このスクリプトのランチャーまたはデスクトップショートカットを作成するため(ダブルクリックで起動する場合)
- このスクリプトをキーボードショートカットにリンクして簡単にアクセスできるようにするには、キーボードショートカットを追加する方法を参照してください 。
- スクリプトが実行されているときは、プロパティを持つことが判明した最初のデバイスで動作するため、マウスは1つだけ使用することをお勧めし
Evdev Scrolling Distance
ます。
- 複数のインスタンスを起動して複数のウィンドウを制御できますが、パフォーマンスのために推奨されていません