Я хотел бы запустить скрипт каждый раз, когда я перемещаю свою мышь.
Это - первый шаг в создании обходного решения так, чтобы я мог использовать 100% своих краев монитора для движения между ними.
Действительно ли это возможно?
Нет, это не возможно, не настраивая драйверы Ваших X сред. Должны быть методы изменения конфигурации, чтобы сделать то, что Вы хотите.
Обнаружение движения мыши, может быть сделан с несколькими инструментами. Два примера:
Используя xdotool
в сценарии:
[Вам было бы нужно xdotool
быть установленным]:
sudo apt-get install xdotool
Сравните (в цикле) два положения мыши с временным интервалом:
Команда для получения mouseposition от xdotool
:
$ xdotool getmouselocation
x:1449 y:137 screen:0 window:79691788
Если мы анализируем этот вывод в (Python) сценарий, мы можем позволить ему выполнить команду, если мышь перемещается (если position1 не равняется position2):
#!/usr/bin/env python3
import subprocess
import time
def get_mousepos():
curr = subprocess.check_output(["xdotool", "getmouselocation"]).decode("utf-8")
return [int(it.split(":")[1]) for it in curr.split()[:2]]
current1 = get_mousepos()
while True:
time.sleep(0.5)
current2 = get_mousepos()
if not current1 == current2:
# run a command:
print("action")
current1 = current2
Используя (Python) tkinter
Тот же самый процесс может также быть, покончили python
собственный tkinter
:
[Вам было бы нужно tkinter3
быть установленным]:
sudo apt-get install python3-tk
Сценарий, с помощью tkinter
:
#!/usr/bin/env python3
from tkinter import*
import time
root = Tk()
def current_position():
return [root.winfo_pointerx(), root.winfo_pointery()]
pos1 = current_position()
while True:
time.sleep(0.5)
pos2 = current_position()
if not pos1 == pos2:
# run a command:
print("action!")
pos1 = pos2
root.mainloop()
Пример какой может быть сделан для управления тем, какую команду выполнить, когда мышь нарушает границу определенное положение (строка) ниже.
#!/usr/bin/env python3
import subprocess
def get_mousepos():
curr = subprocess.check_output(["xdotool", "getmouselocation"]).decode("utf-8")
return [int(it.split(":")[1]) for it in curr.split()[:2]]
current1 = get_mousepos()
while True:
current2 = get_mousepos()
# make the jump depend on the position and direction:
jump = 100 if current2[1] < 525 else -100
if current2[0] < 1000 and current1[0] >= 1000:
print("gone left") # you can run any other command here, like:
subprocess.Popen(["xdotool", "mousemove", str(current2[0]), str(current2[1]+jump)])
elif current2[0] > 1000 and current1[0] <= 1000:
print("gone right") # you can run any other command here
subprocess.Popen(["xdotool", "mousemove", str(current2[0]), str(current2[1]-jump)])
current1 = current2
В этом примере мышь делает переход при перемещении его слева направо или наоборот:
В этом случае мышь переходит фиксированный переход. Однако добавляя некоторую математику и перемещение строка перехода к правой стороне Вашего экрана (+ отдельное "расположение" относительно верхнего левого из второго экрана), можно сделать переход пропорционально, для создания установки что Вы где, стремясь в Вашем первом вопросе: сделайте (в двойной экранной установке), оба экрана кажутся того же вертикального разрешения при перемещении мыши от одного экрана до другого.
"Мертвый угол", куда Вы не можете переместить мышь от одного экрана до другого, не существовал бы затем. (У меня есть рабочая ситуация на моих двух экранах),
Это все еще имело бы странный эффект с окнами, если они, распространены по двум экранам однако, но это может быть сделано.