現在の画面(またはウィンドウ)を強調表示する方法は?


11

私は職場で2つの画面設定を使用していますが、通常は痛い以上の助けになりますが、いくつかの問題があります。

そのうちの1つは、後続のフォーカスに関する問題です-間違った画面で入力を間違えることがあります(フォーカスがカーソルの末尾にありますが、急いでいるときに他の画面にカーソルがあることに気付くのは必ずしも簡単ではありません)。入力する代わりに、さまざまなアクション(Thunderbirdの1つのキーのショートカット)を大量に発生させると、これは非常に面倒です。

アクティブな画面またはウィンドウを強調表示する方法はありますか(たとえば、最大化されたウィンドウでも、見やすい境界線を使用するなど)。

編集:

ウィンドウがフォーカスされたときの素晴らしい解決策は、ある種の短いアニメーションだと思います。


どのDE?gnome-shellでは、extensions.gnome.org / extension
891 / windows

1
@Rmanoタグはユニティを
言います

1
@JacobVlijm oops --- true。コメントを残します、グーグルの誰かに役立つかもしれません
...-Rmano

回答:


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

    2番目のモニターを接続した状態で、スクリプトが期待どおりに機能するかどうかをテストします。

  4. すべてが正常に機能する場合は、スタートアップアプリケーションに追加します。[ダッシュ]> [スタートアップアプリケーション]> [コマンドを追加]:

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

ノート

  • スクリプトのリソースは非常に少なくなっています。「燃料を節約」するには、画面のセットアップ。解像度、スパンサイズなどは、スクリプトの起動中に1回だけ読み込まれます(ループには含まれません)。つまり、2番目のモニターを接続/切断する場合は、スクリプトを再起動する必要があります。

  • スタートアップアプリケーションに追加した場合、モニター構成の変更後にログアウト/ログインする必要があります。

  • 淡色表示の画面に別の明るさの割合を希望する場合は、次の行の値を変更します。

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

値は0,0(黒い画面)から1.0(100%)の間です。

説明

ここに画像の説明を入力してください

スクリプトの起動時に、以下を決定します。

  • 両方の画面のスパニング解像度
  • 左画面のx解像度
  • 両方の画面の名前

次に、ループで(1秒間に1回)、次のようにします。

  • 次のコマンドでアクティブウィンドウの位置を確認します。

    • wmctrl -lG (ウィンドウとその位置のリストを取得するため)
    • xprop -root _NET_ACTIVE_WINDOW (最前面のウィンドウのIDを取得するため)

ウィンドウの(x-)位置が左画面のx解像度よりも大きい場合、ウィンドウは明らかに2つの画面のスパニングサイズよりも大きい場合を除き、右画面に表示されます(その後、ワークスペースに表示されます)権利)。したがって:

if limit < pos < span:

ウィンドウが右画面にあるかどうかを決定します(limit左画面のx-res posは、ウィンドウのx-位置でspanあり、両方の画面の結合されたx-resです)。

最前面のウィンドウ(左画面または右画面)の位置に変更がある場合、スクリプトは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。私はいつもあなたの答えジェイコブが大好きです。よくやった。
パート

動作するように変更limit < pos < spanするlimit <= pos < span必要がありました。とにかくこれは本当にいいです。ただし、この方法で動作させる(他の画面を暗くする)かどうかはわかりません。アクティブな画面が変更されたときに単一の明るい「パルス」を作成するように変更してみます。
コルダ

また、終了ハンドラーを追加しました。画面の明るさを通常の値にリセットします。(したがって、テスト中にスクリプトを削除しても、淡色表示のままになりません)。ここに追加する必要があるかどうかわからない-私はpythonにあまり
興味

回答を編集して追加しました。
コルダ

1
わーい!あなたがロック
ディーヤ

1

私は別の解決策も見つけました。それは最初に望んでいたものとは少し異なりますが、うまくいきます。

  1. インストール compizconfig-settings-manager compiz-plugins
  2. ccsmを実行する
  3. Effectsセクションを有効Animationsプラグイン
  4. Focus Animation編集し、目的のアニメーションを選択します。

波の効果だけが働いた...だからあなたがそれを好きではないなら、あなたは私のように悲しい顔をするでしょう。


ダッジも機能しますが、上げ窓が別の窓の後ろに隠れているか、部分的に隠れている場合に限ります。フェードは、奇妙で不快なフラッシュを与えます。
水田ランダウ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.