จะไฮไลต์หน้าจอปัจจุบัน (หรือหน้าต่าง) ได้อย่างไร?


11

ฉันใช้การตั้งค่าสองหน้าจอในที่ทำงานและในขณะที่มันมักจะช่วยได้มากกว่าที่ฉันเจ็บฉันมีปัญหาบางอย่างกับมัน

หนึ่งในนั้นมีปัญหากับการโฟกัสที่ต่อท้าย - บางครั้งฉันทำผิดพลาดในการพิมพ์บนหน้าจอที่ไม่ถูกต้อง (การโฟกัสคือการลากเคอร์เซอร์ของฉัน แต่มันไม่ง่ายเลยที่จะสังเกตเห็นว่าเคอร์เซอร์อยู่บนหน้าจออื่น ๆ สิ่งนี้น่ารำคาญมากเมื่อแทนที่จะพิมพ์ฉันทำให้เกิดการกระทำที่แตกต่างกันหลายอย่าง (ทางลัดคีย์เดียวในธันเดอร์เบิร์ด)

มีวิธีการเน้นหน้าจอหรือหน้าต่างที่ใช้งาน (ตัวอย่างเช่นการใช้เส้นขอบที่มองเห็นได้ง่ายกว่า - แม้สำหรับหน้าต่างที่ขยายใหญ่สุด)?

แก้ไข:

ฉันคิดว่าทางออกที่ดีน่าจะเป็นภาพเคลื่อนไหวสั้น ๆ เมื่อหน้าต่างได้รับโฟกัส


DE ไหน ใน gnome-shell คุณสามารถใช้Extensions.gnome.org/extension/891/windows-blur-effects
Rmano

1
@Rmano แท็ก sais Unity :)
Jacob Vlijm

1
@JacobVlijm อ๊ะ --- จริง จะแสดงความคิดเห็นที่อาจจะมีประโยชน์สำหรับคน googling ...
Rmano

คำตอบ:


13

เน้นหน้าจอที่เน้น (หรือหรี่แสงจากการเปลี่ยนโฟกัสดูที่ EDIT เพิ่มเติมด้านล่าง)

ในการตั้งค่าจอภาพคู่ข้างเคียง (ซ้าย - ขวา) สคริปต์ด้านล่างจะตั้งค่าความสว่างของจอภาพด้วยหน้าต่างเพ่งความสนใจไปที่ "ปกติ" (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:

กำหนดว่าหน้าต่างอยู่บนหน้าจอด้านขวา (โดยที่limitx-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 ฉันรักคำตอบของคุณเสมอกับยาโคบ ทำได้ดีมาก
Parto

ฉันต้องเปลี่ยนlimit < pos < spanเพื่อlimit <= pos < spanให้มันทำงานได้ อย่างไรก็ตามนี่เป็นสิ่งที่ดีจริงๆ อย่างไรก็ตามฉันไม่แน่ใจว่าฉันต้องการให้มันทำงานด้วยวิธีนี้ (ลดแสงหน้าจออื่น ๆ ) ฉันจะพยายามแก้ไขเพื่อให้ 'พัลส์' ที่สว่างเพียงครั้งเดียวเมื่อมีการเปลี่ยนแปลงหน้าจอที่ใช้งานอยู่
korda

ฉันได้เพิ่มตัวจัดการทางออกมันรีเซ็ตความสว่างของหน้าจอเป็นค่าปกติ (ดังนั้นมันจะไม่หายไปเมื่อฉันฆ่าสคริปต์ระหว่างการทดสอบ) ถ้าไม่แน่ใจว่าฉันควรเพิ่มได้ที่นี่ - ฉันไม่ได้มากในหลามดังนั้นผมไม่แน่ใจว่าถ้าฉันไม่มันขวา ( แต่การทำงาน)
Korda

ฉันได้แก้ไขคำตอบของคุณแล้วเพิ่มเข้าไป
korda

1
@JacobVlijm ว้าว! คุณร็อค
dhiya

1

ฉันได้พบวิธีแก้ไขปัญหาอื่นซึ่งแตกต่างจากสิ่งที่ฉันต้องการในตอนแรกเล็กน้อย แต่ก็ใช้ได้ดีเช่นกัน

  1. ติดตั้ง compizconfig-settings-manager compiz-plugins
  2. เรียกใช้ ccsm
  3. ในEffectsส่วนเปิดใช้งานAnimationsปลั๊กอิน
  4. ในการFocus Animationแก้ไขและเลือกภาพเคลื่อนไหวที่ต้องการ

เอฟเฟกต์คลื่นใช้งานได้เท่านั้น ... ดังนั้นหากคุณไม่ชอบคุณจะต้องเผชิญกับความเศร้าเหมือนฉัน


Dodge ยังใช้ได้กับฉันด้วยเช่นกันเฉพาะเมื่อหน้าต่างยกถูกซ่อนอยู่หรือซ่อนบางส่วนไว้ด้านหลัง จางหายไปทำให้แฟลชแปลก ๆ
Paddy Landau
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.