Làm thế nào để làm nổi bật màn hình hiện tại (hoặc cửa sổ)?


11

Tôi đang sử dụng hai thiết lập màn hình tại nơi làm việc và trong khi nó thường giúp ích nhiều hơn nó, tôi có một số vấn đề với nó.

Một trong số đó là vấn đề với việc lấy nét theo dõi - đôi khi tôi mắc lỗi gõ sai màn hình (tiêu điểm đang theo dõi con trỏ của tôi, nhưng không phải lúc nào cũng dễ dàng nhận thấy con trỏ ở trên màn hình khác khi bạn làm việc vội vàng). Điều này rất khó chịu khi thay vì gõ tôi gây ra vô số hành động khác nhau (một phím tắt trong sấm sét).

Có cách nào để làm nổi bật tốt hơn màn hình hoặc cửa sổ đang hoạt động (ví dụ: sử dụng đường viền dễ nhìn thấy - ngay cả đối với các cửa sổ tối đa)?

BIÊN TẬP:

Tôi nghĩ rằng giải pháp tốt đẹp sẽ là một loại hoạt hình ngắn khi cửa sổ nhận được tiêu điểm.


DE nào? Trong gnome-shell, bạn có thể sử dụng phần mở
rộng.gnome.org/extension/891/windows

1
@Rmano thẻ sais Unity :)
Jacob Vlijm

1
@JacobVlijm oops --- đúng. Sẽ để lại những nhận xét, có lẽ có thể có ích cho một ai đó googling ...
Rmano

Câu trả lời:


13

Làm nổi bật màn hình tập trung (hoặc mờ khi thay đổi tiêu cự, xem EDIT bên dưới)

Trong thiết lập màn hình kép song song (trái phải), tập lệnh bên dưới sẽ đặt độ sáng của màn hình với cửa sổ tập trung thành "bình thường" (100%), trong khi một đoạn khác bị mờ đến 60%.

Nếu tiêu cự thay đổi, độ sáng sẽ theo tiêu điểm:

tập trung vào (một cửa sổ) trên màn hình bên phải nhập mô tả hình ảnh ở đây

tập trung vào (một cửa sổ) trên màn hình bên trái nhập mô tả hình ảnh ở đây

Kịch bản

#!/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

Cách sử dụng

  1. Kịch bản cần wmctrl:

    sudo apt-get install wmctrl
  2. Sao chép tập lệnh vào một tập tin trống, lưu nó dưới dạng highlight_focus.py

  3. Kiểm tra- chạy nó bằng lệnh:

    python3 /path/to/highlight_focus.py

    Với màn hình thứ hai được kết nối , kiểm tra xem tập lệnh có hoạt động như mong đợi không.

  4. Nếu tất cả đều hoạt động tốt, hãy thêm nó vào các ứng dụng khởi động: Dash> Ứng dụng khởi động> Thêm lệnh:

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

Ghi chú

  • Kịch bản cực kỳ thấp về tài nguyên. Để "tiết kiệm nhiên liệu", thiết lập màn hình; độ phân giải, kích thước nhịp, vv chỉ được đọc một lần, trong khi khởi động tập lệnh (không bao gồm trong vòng lặp). Điều đó có nghĩa là bạn phải khởi động lại tập lệnh nếu bạn kết nối / ngắt kết nối màn hình thứ hai.

  • Nếu bạn đã thêm nó vào các ứng dụng khởi động, điều đó có nghĩa là bạn phải đăng xuất / đăng nhập sau khi thay đổi cấu hình màn hình.

  • Nếu bạn thích phần trăm độ sáng khác cho màn hình mờ, hãy thay đổi giá trị trong dòng:

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

Giá trị có thể nằm giữa 0,0(màn hình đen) và 1.0(100%).

Giải trình

nhập mô tả hình ảnh ở đây

Khi khởi động tập lệnh, nó xác định:

  • độ phân giải kéo dài của cả hai màn hình
  • độ phân giải x của màn hình bên trái
  • tên của cả hai màn hình

Sau đó, trong một vòng lặp (một lần mỗi giây), nó:

  • kiểm tra vị trí của cửa sổ hoạt động bằng các lệnh:

    • wmctrl -lG (để có được danh sách các cửa sổ và vị trí của chúng)
    • xprop -root _NET_ACTIVE_WINDOW (để lấy id của cửa sổ ngoài cùng)

Nếu vị trí (x-) của cửa sổ lớn hơn độ phân giải x của màn hình bên trái, thì cửa sổ rõ ràng nằm ở màn hình bên phải, trừ khi nó lớn hơn kích thước kéo dài của hai màn hình (thì nó sẽ ở trên không gian làm việc trên bên phải). vì thế:

if limit < pos < span:

xác định xem cửa sổ nằm ở màn hình bên phải (trong đó limitx-res của màn hình bên trái, poslà vị trí x của cửa sổ và spanlà x-res kết hợp của cả hai màn hình).

Nếu có sự thay đổi vị trí của cửa sổ ngoài cùng (trên màn hình bên trái hoặc màn hình bên phải), tập lệnh sẽ đặt độ sáng của cả hai màn hình bằng xrandrlệnh:

xrandr --output <screen_name> --brightness <value>

BIÊN TẬP

Làm mờ màn hình tập trung thay vì màn hình "không tập trung" bị mờ vĩnh viễn

Như được yêu cầu trong một bình luận và trong trò chuyện, bên dưới một phiên bản của tập lệnh cung cấp một đèn flash mờ ngắn trên màn hình mới tập trung thay vào đó:

#!/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. Tôi luôn yêu câu trả lời của bạn Jacob. Công việc tốt đẹp.
Parto

Tôi đã phải thay đổi limit < pos < spanđể limit <= pos < spanlàm cho nó hoạt động. Dù sao điều này là thực sự tốt đẹp. Tuy nhiên tôi không chắc là tôi có muốn nó hoạt động theo cách này không (làm mờ màn hình khác). Tôi sẽ cố gắng sửa đổi nó để tạo ra một 'xung' sáng khi màn hình hoạt động thay đổi.
korda

Tôi cũng đã thêm trình xử lý thoát, nó đặt lại độ sáng màn hình về giá trị bình thường. (vì vậy nó sẽ không bị mờ khi tôi giết tập lệnh trong khi thử nghiệm). Không chắc chắn tôi có nên thêm nó ở đây không - Tôi không có nhiều vào python, vì vậy tôi không chắc liệu tôi đã làm đúng hay chưa (nhưng nó hoạt động)
korda

Tôi đã chỉnh sửa câu trả lời của bạn và thêm nó.
korda

1
@JacobVlijm Wow! bạn đá
dhiya

1

Tôi cũng đã tìm thấy một giải pháp khác, khác một chút so với những gì tôi muốn ở nơi đầu tiên, nhưng cũng hoạt động tốt.

  1. Tải về compizconfig-settings-manager compiz-plugins
  2. Chạy ccsm
  3. Trong Effectsphần kích hoạt Animationsplugin
  4. Trong Focus Animationchỉnh sửa và chọn hình ảnh động mong muốn.

Chỉ có hiệu ứng sóng hoạt động ... Vì vậy, nếu bạn không thích nó, bạn sẽ có khuôn mặt buồn như tôi.


Dodge cũng hoạt động với tôi, nhưng chỉ khi cửa sổ nâng cao bị ẩn hoặc ẩn một phần phía sau cái khác. Fade cho một đèn flash kỳ lạ, khó chịu.
Paddy Landau
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.