Я использую два экрана настройки на работе, и хотя обычно это помогает больше, чем вредно, у меня есть некоторые проблемы с этим.
Одной из них является проблема с перемещением фокуса - иногда я ошибаюсь, печатая на неправильном экране (фокус - это трейлинг моего курсора, но не всегда легко заметить, что курсор находится на другом экране, когда вы спешите). Это очень раздражает, когда вместо того, чтобы печатать, я вызываю множество различных действий (сочетания клавиш в Thunderbird).
Есть ли способ лучше выделить активный экран или окно (например, используя хорошо видимую рамку - даже для развернутых окон)?
РЕДАКТИРОВАТЬ:
Я думаю, что хорошим решением было бы какое-то короткой анимации, когда окно получает фокус.
В бок о бок установке парного монитора (лево-право) сценарий ниже установит яркость монитора со сфокусированным окном к "нормальному" (100%), в то время как другой недоступен к 60%.
Если фокус изменится, то яркость будет следовать за фокусом:
внимание на (окно) на правильном экране
внимание на (окно) на левом экране
#!/usr/bin/env python3
"""
In a side-by-side dual monitor setup (left-right), the script below will set
the brightness of the monitor with the focussed window to "normal" (100%),
while other one is dimmed to 60%. If the focus changes, the brightness will
follow the focus
"""
import subprocess
import time
def get_wposition():
# get the position of the currently frontmost window
try:
w_data = subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines()
frontmost = subprocess.check_output(["xprop", "-root", "_NET_ACTIVE_WINDOW"]).decode("utf-8").split()[-1].strip()
z = 10-len(frontmost); frontmost = frontmost[:2]+z*"0"+frontmost[2:]
return [int(l.split()[2]) for l in w_data if frontmost in l][0]
except subprocess.CalledProcessError:
pass
def get_onscreen():
# get the size of the desktop, the names of both screens and the x-resolution of the left screen
resdata = subprocess.check_output(["xrandr"]).decode("utf-8")
if resdata.count(" connected") == 2:
resdata = resdata.splitlines()
r = resdata[0].split(); span = int(r[r.index("current")+1])
screens = [l for l in resdata if " connected" in l]
lr = [[(l.split()[0], int([s.split("x")[0] for s in l.split() if "+0+0" in s][0])) for l in screens if "+0+0" in l][0],
[l.split()[0] for l in screens if not "+0+0" in l][0]]
return [span, lr]
else:
print("no second screen seems to be connected")
def scr_position(span, limit, pos):
# determine if the frontmost window is on the left- or right screen
if limit < pos < span:
return [right_scr, left_scr]
else:
return [left_scr, right_scr]
def highlight(scr1, scr2):
# highlight the "active" window, dim the other one
action1 = "xrandr", "--output", scr1, "--brightness", "1.0"
action2 = "xrandr", "--output", scr2, "--brightness", "0.6"
for action in [action1, action2]:
subprocess.Popen(action)
# determine the screen setup
screendata = get_onscreen()
left_scr = screendata[1][0][0]; right_scr = screendata[1][1]
limit = screendata[1][0][1]; span = screendata[0]
# set initial highlight
oncurrent1 = scr_position(span, limit, get_wposition())
highlight(oncurrent1[0], oncurrent1[1])
while True:
time.sleep(0.5)
pos = get_wposition()
# bypass possible incidental failures of the wmctrl command
if pos != None:
oncurrent2 = scr_position(span, limit, pos)
# only set highlight if there is a change in active window
if oncurrent2 != oncurrent1:
highlight(oncurrent1[1], oncurrent1[0])
oncurrent1 = oncurrent2
Потребности сценария wmctrl
:
sudo apt-get install wmctrl
Скопируйте сценарий в пустой файл, сохраните его как highlight_focus.py
Тестовый прогон это командой:
python3 /path/to/highlight_focus.py
Со вторым подключенным монитором протестируйте, если сценарий работает как ожидалось.
Если все хорошо работает, добавьте его для запущения приложений: Тире> Приложения Запуска> Добавляет команду:
/bin/bash -c "sleep 15 && python3 /path/to/highlight_focus.py"
Сценарий является чрезвычайно низким на ресурсах. "Сэкономить топливо", экранную установку; разрешения, размер промежутка и т.д. только для чтения однажды, во время запуска сценария (не включенный в цикл). Это подразумевает, что необходимо перезапустить сценарий, если Вы соединяете/разъединяете второй монитор.
Если Вы добавили его для запущения приложений, это означает, что необходимо зарегистрироваться/в после изменений в конфигурации монитора.
Если Вы предпочли бы другой процент яркости для недоступного экрана, изменить значение в строке:
action2 = "xrandr", "--output", scr2, "--brightness", "0.6"
Значение может быть между 0,0
(черный экран) и 1.0
(100%).
На запуске сценария это определяет:
Затем в цикле (однажды в секунду), это:
проверяет положение активного окна с командами:
wmctrl -lG
(для получения списка окон и их положений)xprop -root _NET_ACTIVE_WINDOW
(для получения идентификатора frontmost окна)Если (x-) положение окна больше затем x-разрешение левого экрана, окно, по-видимому, находится на правильном экране, если это не больше затем размер охвата двух экранов (затем, это было бы на рабочей области справа). поэтому:
if limit < pos < span:
определяет, находится ли окно на правильном экране (где limit
x-res левого экрана, pos
x-position окна и span
объединенный x-res обоих экранов).
Если существует изменение в положении frontmost окна (на левом экране или правильном экране), сценарий устанавливает яркость обоих экранов с xrandr
команда:
xrandr --output <screen_name> --brightness <value>
Согласно просьбе в комментарии и в чате, ниже версии сценария, который дает короткую тусклую флэш-память на недавно сфокусированном экране вместо этого:
#!/usr/bin/env python3
"""
In a side-by-side dual monitor setup (left-right), the script below will give
a short dim- flash on the newly focussed screen if the focussed screen changes
"""
import subprocess
import time
def get_wposition():
# get the position of the currently frontmost window
try:
w_data = subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines()
frontmost = subprocess.check_output(["xprop", "-root", "_NET_ACTIVE_WINDOW"]).decode("utf-8").split()[-1].strip()
z = 10-len(frontmost); frontmost = frontmost[:2]+z*"0"+frontmost[2:]
return [int(l.split()[2]) for l in w_data if frontmost in l][0]
except subprocess.CalledProcessError:
pass
def get_onscreen():
# get the size of the desktop, the names of both screens and the x-resolution of the left screen
resdata = subprocess.check_output(["xrandr"]).decode("utf-8")
if resdata.count(" connected") == 2:
resdata = resdata.splitlines()
r = resdata[0].split(); span = int(r[r.index("current")+1])
screens = [l for l in resdata if " connected" in l]
lr = [[(l.split()[0], int([s.split("x")[0] for s in l.split() if "+0+0" in s][0])) for l in screens if "+0+0" in l][0],
[l.split()[0] for l in screens if not "+0+0" in l][0]]
return [span, lr]
else:
print("no second screen seems to be connected")
def scr_position(span, limit, pos):
# determine if the frontmost window is on the left- or right screen
if limit < pos < span:
return [right_scr, left_scr]
else:
return [left_scr, right_scr]
def highlight(scr1):
# highlight the "active" window, dim the other one
subprocess.Popen([ "xrandr", "--output", scr1, "--brightness", "0.3"])
time.sleep(0.1)
subprocess.Popen([ "xrandr", "--output", scr1, "--brightness", "1.0"])
# determine the screen setup
screendata = get_onscreen()
left_scr = screendata[1][0][0]; right_scr = screendata[1][1]
limit = screendata[1][0][1]; span = screendata[0]
# set initial highlight
oncurrent1 = []
while True:
time.sleep(0.5)
pos = get_wposition()
# bypass possible incidental failures of the wmctrl command
if pos != None:
oncurrent2 = scr_position(span, limit, pos)
# only set highlight if there is a change in active window
if oncurrent2 != oncurrent1:
highlight(oncurrent2[0])
oncurrent1 = oncurrent2
Я также нашел другое решение, которое является битом, отличающимся от того, что я хотел во-первых, но хорошо работаю также.
compizconfig-settings-manager compiz-plugins
Effects
Выполнения включает Animations
плагин Focus Animation
редактирование и выбирает желаемую анимацию. Только волновой эффект работал... Таким образом, если Вам не нравится он, то у Вас будет поверхность столь же печальной как мой.
--all
не поддерживается на более старых версиях dkms. Т.Е. Ubuntu 14.04 дает Error! The action does not support multiple kernel version parameters on the command line.
– Tino
18 July 2017 в 03:59