如何突出显示当前屏幕(或窗口)?


11

我在工作时使用两个屏幕设置,尽管它通常带来的好处多于伤害,但我有一些问题。

其中之一是跟踪焦点出现问题-有时我在错误的屏幕上键入错误(焦点在我的光标后面,但是当您匆忙执行操作时,总是不容易注意到光标在其他屏幕上)。当我不打字而导致大量不同的动作(雷鸟中的一键快捷方式)时,这非常烦人。

有没有一种方法可以更好地突出显示活动屏幕或窗口(例如,使用容易看到的边框-即使是最大化的窗口)?

编辑:

我认为,当窗口获得焦点时,一种不错的解决方案是一种简短的动画。


哪个DE?在gnome-shell中,您可以使用extensions.gnome.org/extension/891/windows-blur-effects
Rmano

1
@Rmano标签说“团结” :)
Jacob Vlijm

1
@JacobVlijm糟糕---是的。将发表评论,可能对谷歌搜索有用……
Rmano

Answers:


13

突出显示聚焦的屏幕(或在焦点改变时暗淡闪烁,请参阅下面的进一步编辑)

在并排双显示器设置(左右)中,下面的脚本将带有焦点窗口的显示器的亮度设置为“正常”(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

如何使用

  1. 该脚本需要wmctrl

    sudo apt-get install wmctrl
  2. 将脚本复制到一个空文件中,另存为 highlight_focus.py

  3. 通过以下命令对其进行测试:

    python3 /path/to/highlight_focus.py

    连接第二台监视器后,测试脚本是否按预期工作。

  4. 如果一切正常,请将其添加到启动应用程序:Dash>启动应用程序>添加命令:

    /bin/bash -c "sleep 15 && python3 /path/to/highlight_focus.py"

笔记

  • 该脚本资源极少。要“节省燃油”,屏幕设置;在脚本启动过程中,分辨率,跨度大小等仅读取一次(不包含在循环中)。这意味着,如果您连接/断开第二台监视器,则必须重新启动脚本。

  • 如果将其添加到启动应用程序,则意味着您必须在更改监视器配置后注销/登录。

  • 如果您希望在变暗的屏幕上使用其他亮度百分比,请更改以下行中的值:

    action2 = "xrandr", "--output", scr2, "--brightness", "0.6"

该值可以介于0,0(黑屏)和1.0(100%)之间。

说明

在此处输入图片说明

在脚本启动时,它将确定:

  • 两个屏幕的跨度分辨率
  • 左屏幕的x分辨率
  • 两个屏幕的名称

然后,在一个循环中(每秒一次),它:

  • 使用以下命令检查活动窗口的位置:

    • wmctrl -lG (获取窗口及其位置的列表)
    • xprop -root _NET_ACTIVE_WINDOW (获取最前面的窗口的ID)

如果窗口的(x-)位置大于左屏幕的x分辨率,则该窗口显然在右屏幕上,除非它大于两个屏幕的跨度大小(然后它将在工作区上正确的)。因此:

if limit < pos < span:

确定窗口是否在右侧屏幕上(此处limit是左侧屏幕pos的x 分辨率,是窗口的x位置,span还是两个屏幕的组合x分辨率)。

如果最前面的窗口(在左屏幕或右屏幕上)的位置发生了变化,该脚本将使用以下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

+1。我一直都很喜欢你的答案雅各布。辛苦了
2015年

我不得不更改limit < pos < spanlimit <= pos < span使其正常运行。无论如何,这真的很好。但是我不确定是否要以这种方式工作(调暗另一个屏幕)。我将尝试对其进行修改,以便在更改活动屏幕时发出单个明亮的“脉冲”。
korda 2015年

我还添加了退出处理程序,它将屏幕亮度重置为正常值。(因此当我在测试过程中杀死脚本时,它不会保持暗淡状态)。不知道我是否应该在这里添加它-我对python的了解不多,所以我不确定我是否做对了(但它能正常工作)
korda

我已经将其修改为您的答案并添加了。
korda

1
@JacobVlijm哇!你摇滚
dhiya

1

我还找到了另一个解决方案,该解决方案与我最初想要的解决方案有点不同,但是也可以正常工作。

  1. 安装 compizconfig-settings-manager compiz-plugins
  2. 运行ccsm
  3. Effects部分中启用Animations插件
  4. Focus Animation编辑中选择所需的动画。

只有波浪效应起作用了...所以,如果您不喜欢它,您将像我一样面对悲伤。


道奇(Dodge)也为我工作,但前提是升起的窗户被隐藏或部分隐藏在另一个窗户后面。淡入淡出使人感到奇怪,不愉快的闪光。
帕迪·兰道
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.