私は職場で2つの画面設定を使用していますが、通常は痛い以上の助けになりますが、いくつかの問題があります。
それらの1つは、後続のフォーカスに関する問題です-間違った画面で入力するのを間違えることがあります(フォーカスは私のカーソルの末尾にありますが、ラッシュで何かをするときにカーソルが他の画面にあることに気付くのは必ずしも簡単ではありません)。これは、タイピングの代わりに大量の異なるアクション(Thunderbirdの1キーショートカット)を引き起こすときに非常に迷惑です。
アクティブな画面またはウィンドウを強調表示する方法はありますか(たとえば、最大化されたウィンドウでも、見やすい境界線を使用するなど)。
編集:
私は、ウィンドウがフォーカスを取得したときに、ニースのソリューションが何らかの短いアニメーションになると思います。
左右に並べたデュアルモニターセットアップ(左右)では、以下のスクリプトは、フォーカスされたウィンドウのモニターの明るさを「通常」(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
2番目のモニターを接続した状態で、スクリプトが期待どおりに機能するかどうかをテストします。
すべてが正常に機能する場合は、スタートアップアプリケーションに追加します。[ダッシュ]> [スタートアップアプリケーション]> [コマンドを追加]:
/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%)の間です。
スクリプトの起動時に、以下を決定します。
次に、ループで(1秒間に1回)、次のようにします。
次のコマンドでアクティブウィンドウの位置を確認します。
wmctrl -lG
(ウィンドウとその位置のリストを取得するため)xprop -root _NET_ACTIVE_WINDOW
(最前面のウィンドウのIDを取得するため)ウィンドウの(x-)位置が左画面のx解像度よりも大きい場合、ウィンドウは明らかに右画面にあります。unless 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
私は別の解決策も見つけました。それは最初に望んでいたものとは少し異なりますが、うまくいきます。
compizconfig-settings-manager compiz-plugins
Effects
セクションでAnimations
プラグインを有効にしますFocus Animation
で、目的のアニメーションを編集して選択します。波の効果のみが機能しました...それが気に入らなければ、私の顔と同じくらい悲しい顔になります。