वर्तमान स्क्रीन (या विंडो) को कैसे हाइलाइट करें?


11

मैं काम में दो स्क्रीन सेटअप का उपयोग कर रहा हूं और जब यह आमतौर पर इससे अधिक मदद करता है तो मुझे दर्द होता है, मेरे पास इसके साथ कुछ मुद्दे हैं।

उनमें से एक समस्या अनुगामी फोकस के साथ समस्या है - कभी-कभी मैं गलत स्क्रीन पर टाइप करने की गलती करता हूं (फोकस मेरे कर्सर को पीछे कर रहा है, लेकिन यह ध्यान रखना हमेशा आसान नहीं होता है कि जब आप भीड़ में होते हैं तो कर्सर दूसरी स्क्रीन पर होता है)। यह बहुत कष्टप्रद है जब मैं टाइप करने के बजाय विभिन्न कार्यों के टन (थंडरबर्ड में एक-कुंजी-शॉर्टकट) का कारण बनता हूं।

क्या सक्रिय स्क्रीन या विंडो को बेहतर तरीके से हाइलाइट करने का एक तरीका है (उदाहरण के लिए आसानी से दिखाई देने वाली सीमा का उपयोग करना - यहां तक ​​कि अधिकतम खिड़कियों के लिए भी)?

संपादित करें:

मुझे लगता है कि खिड़की से फोकस मिलने पर अच्छा समाधान किसी तरह का छोटा एनीमेशन होगा।


कौन सा डे? सूक्ति-शैल में आप एक्सटेंशन का
।gnome.org/

1
@ रमनो टैग साईस यूनिटी :)
जैकब व्लिजम

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. यदि सब ठीक काम करता है, तो इसे स्टार्टअप एप्लिकेशन में जोड़ें: डैश> स्टार्टअप एप्लिकेशन> कमांड जोड़ें:

    /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 (सामने खिड़की की आईडी पाने के लिए)

यदि विंडो की (x-) स्थिति अधिक है, तो बाईं स्क्रीन का x- रिज़ॉल्यूशन, विंडो स्पष्ट रूप से दाईं स्क्रीन पर है, जब तक यह अधिक नहीं होती है , तब दो स्क्रीन का फैले आकार (तब यह कार्यक्षेत्र पर होगा) सही)। इसलिए:

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। वैसे भी यह वास्तव में अच्छा है। हालांकि मुझे यकीन नहीं है कि मैं इसे इस तरह से काम करना चाहता हूं (दूसरी स्क्रीन को छोटा करना)। मैं सक्रिय स्क्रीन परिवर्तन होने पर एकल उज्ज्वल 'पल्स' बनाने के लिए इसे संशोधित करने का प्रयास करूंगा।
korda

मैंने एग्जिट हैंडलर भी जोड़ा है, यह स्क्रीन की चमक को सामान्य मूल्य पर रीसेट करता है। (इसलिए जब मैं परीक्षण के दौरान स्क्रिप्ट को मार चुका हूँ तो यह मंद नहीं रहेगा)। निश्चित नहीं है कि मुझे इसे यहां जोड़ना चाहिए - मैं अजगर में ज्यादा नहीं हूं, इसलिए मुझे यकीन नहीं है कि मैंने इसे सही किया (लेकिन यह काम करता है)
korda

मैंने इसे आपके उत्तर को संपादित करके जोड़ दिया है।
korda

1
@JacobVlijm वाह! आप रॉक
धीया

1

मैंने एक और समाधान भी पाया है, जो कि मैं पहले स्थान पर चाहता था, उससे थोड़ा अलग है, लेकिन ठीक भी काम करता है।

  1. इंस्टॉल compizconfig-settings-manager compiz-plugins
  2. Ccsm चलाएं
  3. में Effectsखंड सक्षम Animationsप्लगइन
  4. में Focus Animationसंपादित करें का चयन करें और वांछित एनीमेशन।

केवल लहर प्रभाव ने काम किया ... इसलिए यदि आप इसे पसंद नहीं करते हैं, तो आपको मेरा सामना दुखी होगा।


डॉज मेरे लिए भी काम करता है, लेकिन केवल जब खिड़की को छिपाया गया था या आंशिक रूप से दूसरे के पीछे छिपा हुआ था। फीका एक अजीब, अप्रिय फ्लैश देता है।
धान लैंडौ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.