किसी एप्लिकेशन की सभी विंडो कैसे दिखाएं (बढ़ाएँ)?


21

मेरे पास कई विंडो का उपयोग करके एक एप्लिकेशन है। मैं जल्दी से उस एप्लिकेशन की सभी विंडो को अग्रभूमि में कैसे ला सकता हूं?

जब मैं एप्लिकेशन को स्क्रॉल-व्हील के साथ स्क्रॉल करता हूं तो यह केवल एक विंडो दिखाता है। अगली विंडो पर जाने पर, अंतिम विंडो को फिर से पृष्ठभूमि पर लाया जाता है।

जब मैं एप्लिकेशन आइकन पर क्लिक करता हूं, तो मुझे सभी विंडो का पूर्ण-स्क्रीन अवलोकन मिलता है। मुझे प्रत्येक विंडो को मैन्युअल रूप से चुनना होगा और अपने माउस को कई बार आधी स्क्रीन पर ले जाना चाहिए।

मेरा अब तक का सबसे अच्छा समाधान सभी विंडोज़ ( Ctrl+ Super+ D) को छोटा करना है और फिर स्क्रॉल-व्हील का उपयोग करके मेरे एप्लिकेशन की विंडो दिखाना है।

क्या कोई बेहतर समाधान है?


@ जोशुआ एक आवेदन की सभी खिड़कियों को सामने लाना बहुत मुश्किल नहीं है, लेकिन आप आवेदन को कैसे परिभाषित करना चाहेंगे? एक कुंजी संयोजन + एक आवेदन की खिड़की पर क्लिक करना होगा?
जेकब वलीजम

@ जोशुआ या मेबी अधिक सुरुचिपूर्ण, एक प्रमुख कॉम्बो + अनुप्रयोग नाम का पहला चरित्र?
जैकब व्लिजम

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

यह भी @Joschua यह संभव होगा कि सामने के विंडो समूहों को लाने के लिए एक महत्वपूर्ण संयोजन हो ; एक बार दबाएं -> सभी फ़ायरफ़ॉक्स विंडोज़ फिर से दिखाते हैं, फिर से -> सभी टर्मिनल खिड़कियां दिखाते हैं आदि को वास्तव में सुचारू बनाया जा सकता है। दिलचस्प। इस पर काम करते हुए। हालांकि थोड़ा काम लगेगा।
जेकब वलिजम

@JacobVlijm सही दिशा की तरह लगता है .. :) मुझे जो सबसे महत्वपूर्ण लगता है, वह यह है कि आइकन पर क्लिक करने के साथ-साथ एक महत्वपूर्ण संयोजन उस एप्लिकेशन की सभी विंडो लाता है (उदाहरण के लिए, peq के रूप में कई टर्मिनल) सामने, अधिमानतः फैलाने के लिए बाहर, ताकि वे नॉन-ओवरलैपिंग हों .. (हो सकता है, ऐसा कुछ एकता का हिस्सा बन जाए?)
जोशुआ

जवाबों:


21

EDIT -new जवाब-

नीचे दिया गया उत्तर अभी भी पूरी तरह से मान्य है, और इसलिए सुझाए गए विकल्प। चल रही अंतर्दृष्टि ने हालांकि मुझे नीचे दिए गए संकेतक का उपयोग करने के लिए इस विकल्प को जोड़ा, जो शायद सबसे सुरुचिपूर्ण समाधान है।

जैसे, इसे शायद विकल्प 5 (एक .desktop फ़ाइल का उपयोग करके) को बदलना चाहिए।

बस सूची से एप्लिकेशन चुनें, और संबंधित एप्लिकेशन की सभी विंडो (वर्तमान व्यूपोर्ट पर मौजूद) उठाएगी:

यहाँ छवि विवरण दर्ज करें

कैसे इस्तेमाल करे

ppa से:

sudo add-apt-repository ppa:vlijm/upfront
sudo apt-get update
sudo apt-get install upfront

... या मैन्युअल:

#!/usr/bin/env python3
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3, GObject
import time
from threading import Thread
import os
import subprocess
import getpass

currpath = os.path.dirname(os.path.realpath(__file__))

class Indicator():
    def __init__(self):
        self.app = 'raise_apps'
        iconpath = os.path.join(currpath, "raise.png")
        self.indicator = AppIndicator3.Indicator.new(
            self.app, iconpath,
            AppIndicator3.IndicatorCategory.OTHER)
        self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)       
        self.indicator.set_menu(self.create_menu())
        # the thread:
        self.update = Thread(target=self.check_recent)
        # daemonize the thread to make the indicator stopable
        self.update.setDaemon(True)
        self.update.start()

    def create_menu(self):
        # creates the (initial) menu
        self.menu = Gtk.Menu()
        # separator
        initial = Gtk.MenuItem("Fetching list...")
        menu_sep = Gtk.SeparatorMenuItem()
        self.menu.append(initial)
        self.menu.append(menu_sep)
        # item_quit.show() 
        self.menu.show_all()
        return self.menu

    def raise_wins(self, *args):
        index = self.menu.get_children().index(self.menu.get_active())
        selection = self.menu_items2[index][1]
        for w in selection:
            execute(["wmctrl", "-ia", w])

    def set_new(self):
        # update the list, appearing in the menu
        for i in self.menu.get_children():
            self.menu.remove(i)
        for app in self.menu_items2:

            sub = Gtk.MenuItem(app[0])
            self.menu.append(sub)
            sub.connect('activate', self.raise_wins)
        # separator
        menu_sep = Gtk.SeparatorMenuItem()
        self.menu.append(menu_sep)
        # quit
        item_quit = Gtk.MenuItem('Quit')
        item_quit.connect('activate', self.stop)
        self.menu.append(item_quit)
        self.menu.show_all()

    def get_apps(self):
        # calculate screen resolution
        res_output = get("xrandr").split(); idf = res_output.index("current")
        res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
        # creating window list on current viewport / id's / application names
        w_data = [l.split() for l in get(["wmctrl", "-lpG"]).splitlines()]
        # windows on current viewport
        relevant = [w for w in w_data if 0 < int(w[3]) < res[0] and 0 < int(w[4]) < res[1]]
        # pids
        pids = [l.split() for l in get(["ps", "-u", getpass.getuser()]).splitlines()]
        matches = [[p[-1], [w[0] for w in relevant if w[2] == p[0]]] for p in pids]
        return [m for m in matches if m[1]]

    def check_recent(self):
        self.menu_items1 = []
        while True:
            time.sleep(4)
            self.menu_items2 = self.get_apps()
            for app in self.menu_items2:
                app[0] = "gnome-terminal" if "gnome-terminal" in app[0] else app[0]
            if self.menu_items2 != self.menu_items1:
                GObject.idle_add(
                    self.set_new, 
                    priority=GObject.PRIORITY_DEFAULT
                    )
            self.menu_items1 = self.menu_items2

    def stop(self, source):
        Gtk.main_quit()

def get(command):
    return subprocess.check_output(command).decode("utf-8")

def execute(command):
    subprocess.Popen(command)

Indicator()
GObject.threads_init()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
  • सूचक को चाहिए wmctrl

    sudo apt-get wmctrl
    
  • एक खाली फ़ाइल में संकेतक को कॉपी करें, इसे इस रूप में सहेजें raise_apps.py

  • नीचे दी गई छवि को कॉपी करें, इसे सूचक के रूप में बिल्कुल एक और उसी निर्देशिकाraise.png में नाम दें

    यहाँ छवि विवरण दर्ज करें

  • तो बस इसे कमांड द्वारा चलाएं:

    python3 /path/to/raise_apps.py

  • यदि आप स्टार्टअप एप्लिकेशन को जोड़ना चाहते हैं:

    /bin/bash -c "sleep 10 && python3 /path/to/raise_apps.py" 
    

पुराने उत्तर:

सवाल के बारे में

सही टूल के साथ, किसी एप्लिकेशन की सभी विंडो को "बस" करना बहुत जटिल नहीं है। यह सुनिश्चित करने के लिए थोड़ा और अधिक जटिल है कि केवल वर्तमान व्यूपोर्ट की खिड़कियां खड़ी की गई हैं। हालांकि वास्तविक चुनौती उपयोगकर्ता को कार्रवाई उपलब्ध कराने का एक सुविधाजनक तरीका खोजना है।

यह कैसे किया जा सकता है, यह दर्शाने के लिए पांच विकल्पों के नीचे । सभी विकल्पों का उपयोग करने के लिए तैयार हैं। अंतिम विकल्प हालांकि प्रयोगात्मक की तरह है; यह ठीक काम करता है लेकिन विकल्प के विवरण में बताया गया है कि कुछ मामूली कॉस्मेटिक downsides है। मैंने इसे एक अवधारणा के रूप में जोड़ा ।

गैर-अतिव्यापी तरीके से खिड़कियों को स्वचालित रूप से फैलाना, जैसा कि एक टिप्पणी में सुझाया गया है, मुझे एक व्यावहारिक विचार नहीं लगता है; यदि आप (एप्लिकेशन-वार) समूहीकृत विंडो सेटअप में काम करते हैं, तो स्क्रिप्ट संभवतः अवांछित रूप से खिड़कियों को पुनर्व्यवस्थित करेगी।

कैसे इस्तेमाल करे

आपके लिए आवश्यक सभी विकल्पों के लिए:

  • स्थापित करें wmctrlयदि यह अभी तक आपके सिस्टम पर नहीं है:

    sudo apt-get install wmctrl
    
  • बनाएँ, अगर यह अभी तक मौजूद नहीं है, तो निर्देशिका:

    ~/bin
    

    (स्पष्टीकरण: निर्देशिका ~/bin$ PATH में है, इसलिए आप उनके नाम से निष्पादक चला सकते हैं)

  • विकल्प के अनुरूप स्क्रिप्ट को कॉपी करें, इसे एक खाली फ़ाइल में पेस्ट करें, इसे raise_app(कोई विस्तार नहीं) के रूप में सहेजें ~/binऔर इसे निष्पादन योग्य बनाएं

अलग-अलग विकल्पों में, संभावित अतिरिक्त चरणों को समझाया जाएगा।

विकल्प 1: एक या अधिक वर्ण दर्ज करके एप्लिकेशन चुनें

  • एक कुंजी संयोजन दबाएं, एक zenityविंडो दिखाई देगी
  • प्रवेश बॉक्स में एप्लिकेशन के नाम के एक या अधिक वर्ण दर्ज करें
  • एंटर दबाए

इससे मेल खाते के सभी विंडो ( वर्तमान व्यूपोर्ट पर) सामने आ जाएंगे ।

gnome-terminalवर्तमान व्यूपोर्ट पर सभी विंडो बढ़ाएँ:

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

कैसे इस्तेमाल करे:

  • "उपयोग कैसे करें" में वर्णित अनुसार सेट अप करें
  • कमांड द्वारा इसे टेस्ट करें:

    raise_app
    
  • यदि सभी ठीक काम करते हैं, तो इसे अपनी पसंद के शॉर्टकट कुंजी संयोजन में जोड़ें: चुनें: सिस्टम सेटिंग्स> "कीबोर्ड"> "शॉर्टकट"> "कस्टम शॉर्टकट"। "+" पर क्लिक करें और कमांड जोड़ें

लिपी:

#!/usr/bin/env python3
import subprocess
import getpass

def get(command):
    return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")

def execute(command):
    subprocess.Popen(["/bin/bash", "-c", command])
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# creating window list on current viewport / id's / application names
w_data = [l.split()[0:7] for l in get("wmctrl -lpG").splitlines()]
windows = [[get("ps -u "+getpass.getuser()+" | grep "+w[2]).split()[-1], w[0]]
           for w in w_data if 0 < int(w[3]) < res[0] and 0 < int(w[4]) < res[1]]
# ask user for first characters
try:
    arg = get('zenity --entry --text "first characters" --title "application"').strip()
except subprocess.CalledProcessError:
    pass
# raise matching windows
try:
    [execute("wmctrl -ia "+item[1]) for item in windows if item[0].startswith(arg)]
except (subprocess.CalledProcessError, NameError):
    pass



विकल्प 2: अनुप्रयोगों के माध्यम से चक्र करें और एक महत्वपूर्ण संयोजन के साथ अपनी खिड़कियां बढ़ाएं:

मान लीजिए कि मेरे पास कुंजी संयोजन Alt+ के तहत नीचे दी गई स्क्रिप्ट है 1। मेरे पास कई खिड़कियां खुली हैं:

  • फ़ायरफ़ॉक्स
  • GNOME टर्मिनल
  • नॉटिलस

वर्तमान राज्य:

यहाँ छवि विवरण दर्ज करें

मैं एक बार Alt+ दबाता हूं 1, सभी nautilusविंडो उठाई जाती हैं:

<छवि>

मैं फिर से Alt+ दबाता हूं 1, सभी firefoxखिड़कियां खड़ी हो जाती हैं:

<छवि>

मैं फिर से Alt+ दबाता हूं 1, सभी gnome-terminalखिड़कियां फिर से उठाई जाती हैं, चक्र शुरू होता है:

<छवि>

कैसे इस्तेमाल करे

  • "उपयोग कैसे करें" में वर्णित अनुसार सेट अप करें
  • इसे अपनी पसंद के शॉर्टकट कुंजी संयोजन में जोड़ें: चुनें: सिस्टम सेटिंग्स> "कीबोर्ड"> "शॉर्टकट"> "कस्टम शॉर्टकट"। "+" पर क्लिक करें और कमांड जोड़ें

    raise_app
    

फिर अपने कुंजी संयोजन के साथ समूहीकृत अनुप्रयोग विंडो के साथ अपने अनुप्रयोगों के माध्यम से चक्र।

लिपी:

#!/usr/bin/env python3
import subprocess
import getpass

include_single = True # set to False if you only want to cycle through apps with multiple windows

def get(command):
    return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")

def execute(command):
    subprocess.Popen(["/bin/bash", "-c", command])

def get_frontmost():
    cmd = "xprop -root"
    frontmost = [l for l in get(cmd).splitlines() if\
                 "ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1]
    return frontmost[:2]+"0"+frontmost[2:]
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# creating window list on current viewport / id's / application names
w_data = [l.split()[0:7] for l in get("wmctrl -lpG").splitlines()]
windows = [[get("ps -u "+getpass.getuser()+" | grep "+w[2]).split()[-1], w[0]]
           for w in w_data if 0 < int(w[3]) < res[0] and 0 < int(w[4]) < res[1]]
# create application list to cycle through
if include_single == False:
    pre = [it[0] for it in windows]
    apps = sorted(list(set([it for it in pre if pre.count(it) > 1])))
else:
    apps = sorted(list(set([it[0] for it in windows])))
if len(apps) == 0:
    pass
else:
    # get the frontmost window as a last itm in the cycle
    front = get_frontmost()
    front_pid = [l.split()[2] for l in get("wmctrl -lp").splitlines() if front in l][0]
    last_infront = get("ps -u "+getpass.getuser()+" | grep "+front_pid).split()[-1]
    # determine next apllication to raise
    if not last_infront in apps or last_infront == apps[-1]:
        arg = apps[0]
        print(arg)
    else:
        arg = apps[apps.index(last_infront)+1]
    # raise matching windows
    try:
        [execute("wmctrl -ia "+item[1]) for item in windows if item[0] == arg]
    except (subprocess.CalledProcessError, NameError):
        pass



विकल्प 3: प्रेस कुंजी संयोजन + लांचर आइकन पर क्लिक करें -या- वर्तमान व्यूपोर्ट पर सभी खिड़कियों को बढ़ाने के लिए आवेदन खिड़की

यह संभवतः वह विकल्प है जो प्रश्न / टिप्पणी में वर्णित के निकटतम है।

मान लीजिए कि मेरे पास एक गड़बड़ डेस्कटॉप है जिसमें तीन nautilusखिड़कियां हैं जो अन्य खिड़कियों के नीचे दफन हैं।

<छवि>

सभी नॉटिलस खिड़कियां बढ़ाने के लिए (उदाहरण शॉर्टकट: Alt+ 1):

  • प्रेस Alt+ 1, रिलीज ()
  • 3 सेकंड के भीतर, या तो:

    लॉन्चर में एप्लिकेशन के आइकन पर क्लिक करें

    <छवि>

    या:

    एप्लिकेशन की किसी एक विंडो पर क्लिक करें

    <छवि>

    परिणाम:

    <छवि>


कैसे इस्तेमाल करे:

  • "उपयोग कैसे करें" में वर्णित अनुसार सेट अप करें
  • कमांड द्वारा इसे टेस्ट करें:

    raise_app
    
  • यदि सभी ठीक काम करते हैं, तो इसे अपनी पसंद के शॉर्टकट कुंजी संयोजन में जोड़ें: चुनें: सिस्टम सेटिंग्स> "कीबोर्ड"> "शॉर्टकट"> "कस्टम शॉर्टकट"। "+" पर क्लिक करें और कमांड जोड़ें

फिर:

  • अपने कुंजी संयोजन को दबाएं और 3 सेकंड के भीतर:

    • लॉन्चर में एप्लिकेशन के आइकन पर क्लिक करें
    • एप्लिकेशन की किसी एक विंडो पर क्लिक करें

लिपी

#!/usr/bin/env python3
import subprocess
import getpass
import time

def get(command):
    return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")

def execute(command):
    subprocess.Popen(["/bin/bash", "-c", command])

def get_frontmost():
    cmd = "xprop -root"
    frontmost = [l for l in get(cmd).splitlines() if\
                 "ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1]
    return frontmost[:2]+"0"+frontmost[2:]

# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# get window data for various purposes
w_data = get("wmctrl -lpG").splitlines()
non_windows = sum([[l.split()[0] for l in w_data if it in l]\
               for it in ("unity-launcher", "unity-panel", "unity-dash", "Hud")], [])
# get id of current window
curr_window = get_frontmost()
# user gets 3 seconds to pick an application window (or launcher icon)
t = 0
while t < 4:
    w_id1 = get_frontmost()
    time.sleep(1)
    w_id2 = get_frontmost()
    if w_id1 == w_id2 or w_id2 in non_windows+[curr_window]:
        t = t+1
    else:
        new_frontmost = w_id2
        break
# raise
try:
    pid = [l.split()[2] for l in w_data if new_frontmost in l]
    wl_data = [l.split() for l in w_data]
    raise_windows = [l[0] for l in wl_data if pid[0] == l[2] and\
                     0 < int(l[3]) < res[0] and 0 < int(l[4]) < res[1]]
    [execute("wmctrl -ia "+item) for item in raise_windows]
except NameError:
    pass


विकल्प 4: एक कुंजी संयोजन एक विकल्प सूची को कॉल करता है, जो वर्तमान व्यूपोर्ट पर प्रति एप्लिकेशन विंडोज़ की संख्या दिखा रहा है

यह एक और अधिक सुविधाजनक निकला तो मैंने मान लिया:

वर्तमान संयोजन पर सभी अनुप्रयोगों और उनकी खिड़कियों की संख्या को सूचीबद्ध करते हुए (फिर से उदाहरण-) कुंजी संयोजन Alt+ 1एक zenityविंडो को दबाता है:

यहाँ छवि विवरण दर्ज करें

बस या तीर दबाने से आपको सही विकल्प मिलेगा। प्रेस Enterऔर चुने हुए आवेदन की सभी खिड़कियां उठाई जाती हैं।

कैसे इस्तेमाल करे:

  • "उपयोग कैसे करें" में वर्णित अनुसार सेट अप करें
  • कमांड द्वारा इसे टेस्ट करें:

    raise_app
    
  • यदि सभी ठीक काम करते हैं, तो इसे अपनी पसंद के शॉर्टकट कुंजी संयोजन में जोड़ें: चुनें: सिस्टम सेटिंग्स> "कीबोर्ड"> "शॉर्टकट"> "कस्टम शॉर्टकट"। "+" पर क्लिक करें और कमांड जोड़ें

लिपी

#!/usr/bin/env python3
import subprocess
import getpass

def get(command):
    return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")

def execute(command):
    subprocess.Popen(["/bin/bash", "-c", command])
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# creating window list on current viewport / id's / application names
w_data = [l.split()[0:7] for l in get("wmctrl -lpG").splitlines()]
windows = [[get("ps -u "+getpass.getuser()+" | grep "+w[2]).split()[-1], w[0]]
           for w in w_data if 0 < int(w[3]) < res[0] and 0 < int(w[4]) < res[1]]
# preparing zenity optionlist
apps = [item[0] for item in windows]
# prevent multiple zenity windows
if apps.count("zenity") > 1:
    pass
elif apps.count("zenity") > 0:
    execute('zenity --info --text "Another Zenity window is open already"')
# preventing empty windowlist
elif len(apps) > 0:
    applist = [[app, str(apps.count(app))] for app in set(apps)]
    applist.sort(key=lambda x: x[1])
    # calling zenity window
    try:
        arg = get('zenity  --list  --text "Choose an application" '+\
               '--title "Current windows" '+\
               '--column "application" '+\
               '--column "windows" '+\
               '--height 250 '+\
               '--width 250 '+\
               (" ").join(sum(applist, [])))
    except subprocess.CalledProcessError:
        pass
    # raise matching windows
    try:
        [execute("wmctrl -ia "+item[1]) \
         for item in windows if arg.startswith(item[0])]
    except (subprocess.CalledProcessError, NameError):
        pass
else:
    execute('zenity --info --text "No windows to list"')



विकल्प 5: लॉन्चर आइकन से चल रहे अनुप्रयोगों की खिड़कियां बढ़ाएं

यह विकल्प लॉन्चर आइकन में मौजूद है, जिसमें वर्तमान में चल रहे अनुप्रयोगों में क्विकलिस्ट है। एक चुनें, और अनुप्रयोगों की सभी विंडो उठाई जाएंगी।

यहाँ छवि विवरण दर्ज करें

लॉन्चर को स्वचालित रूप से अपडेट किया जाता है जब रनिंग एप्लिकेशन (वर्तमान व्यूपोर्ट पर) की सूची बदल जाती है। क्विकलिस्ट अन्य व्यूपोर्ट पर एक अलग सूची दिखाती है, जहां अन्य एप्लिकेशन की विंडो खोली जाती हैं (अनुकूलन के लिए 1-2 सेकंड का समय लगेगा)।

जैसा कि उल्लेख किया गया है, हालांकि पूरी तरह कार्यात्मक है, यह विकल्प एक अवधारणा के रूप में है । यह है के रूप में यह कुछ मामूली कॉस्मेटिक downsides है। सबसे महत्वपूर्ण:

  • कर्सर "पहिया" एक कार्रवाई के बाद कुछ सेकंड के लिए घूमता रहता है। यद्यपि यह कार्यक्षमता को प्रभावित नहीं करता है, यह एक कॉस्मेटिक नकारात्मक पक्ष है।
  • लांचर आइकन में एप्लिकेशनलिस्ट के लिए 1-2 सेकंड लगते हैं, जो चल रहे एप्लिकेशन परिवर्तनों की सूची के बाद अपडेट किए जाते हैं।

इसके अलावा सेटअप थोड़ा और अधिक जटिल है (हालांकि नीचे विस्तार से समझाया गया है):

कैसे इस्तेमाल करे

नीचे आप पाएंगे:

दो स्क्रिप्ट / एक आइकन / एक .desktopफ़ाइल

  1. सेटअप को "कैसे उपयोग करें" के रूप में तैयार करें, पहले (मुख्य-) स्क्रिप्ट को इस रूप raise_appमें सहेजें~/bin
  2. नीचे दिए गए आइकन को सहेजें (राइट-क्लिक करें, इस रूप में सहेजें) raise.png

    <आइकन>

  3. .desktopफाइल को एक खाली फाइल में कॉपी करें, लाइन को एडिट करें

        Icon=/path/to/raise.png
    

    आइकन के लिए वास्तविक पथ (उद्धरण के बीच रिक्त स्थान के साथ पथ)
    इसे इस रूप raise.desktopमें सहेजें~/.local/share/applications

  4. .desktopइसे जोड़ने के लिए फ़ाइल को लॉन्चर में खींचें

  5. दूसरी स्क्रिप्ट को कॉपी करें, इसे एक खाली फाइल में पेस्ट करें, इसे इस रूप update_appsमें सहेजें ~/bin, इसे निष्पादन योग्य बनाएं।
  6. अपने स्टार्टअप एप्लिकेशन में निम्नलिखित कमांड जोड़ें (डैश> स्टार्टअप एप्लिकेशन> जोड़ें):

    update_apps
    
  7. इसे काम करने के लिए लॉग आउट और बैक करें।

पहली स्क्रिप्ट

#!/usr/bin/env python3
import subprocess
import getpass
import sys

arg = sys.argv[1]

def get(command):
    return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")

def execute(command):
    subprocess.Popen(["/bin/bash", "-c", command])
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# creating window list on current viewport / id's / application names
w_data = [l.split()[0:7] for l in get("wmctrl -lpG").splitlines()]
windows = [[get("ps -u "+getpass.getuser()+" | grep "+w[2]).split()[-1], w[0]]
           for w in w_data if 0 < int(w[3]) < res[0] and 0 < int(w[4]) < res[1]]
try:
    [execute("wmctrl -ia "+item[1]) for item in windows if item[0].startswith(arg)]
except (subprocess.CalledProcessError, NameError):
    pass

दूसरी लिपि

#!/usr/bin/env python3
import subprocess
import getpass
import time
import os

dtfile = os.environ["HOME"]+"/.local/share/applications/raise.desktop"

def get(command):
    return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")

def execute(command):
    subprocess.Popen(["/bin/bash", "-c", command])
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# creating window list on current viewport / id's / application names
def applist():
    try:
        w_data = [l.split()[0:7] for l in get("wmctrl -lpG").splitlines()]
        windows = [[get("ps -u "+getpass.getuser()+" | grep "+w[2]).split()[-1], w[0]]
                   for w in w_data if 0 < int(w[3]) < res[0] and 0 < int(w[4]) < res[1]]
    except subprocess.CalledProcessError:
        return []
    else:
        return set([app[0] for app in windows])

def update_dtfile(applications, text):
    actionline = "Actions="+(";").join(applications)+";\n"
    with open(dtfile) as src:
        lines = src.readlines()
    lines = lines[:[i for i in range(len(lines)) \
                 if lines[i].startswith("Actions=")][0]]+[actionline]
    for item in text:
        for it in item:
            lines.append(it)
    with open(dtfile, "wt") as out:
        for line in lines:
            out.write(line)

while True:
    apps1 = applist()
    time.sleep(1)
    apps2 = applist()
    if apps1 != apps2: 
        text = [["[Desktop Action "+it+"]\n", "Name="+it+"\n",
            "Exec=raise_app "+it+"\n", "OnlyShowIn=Unity;\n\n",
            ]for it in apps2]
        update_dtfile(apps2, text)

.Desktop फ़ाइल

[Desktop Entry]
Name=Raise application windows
Comment=Raise groups of windows
Icon=/path/to/raise.png
Terminal=false
Type=Application
Version=1.0

Actions=



संक्षिप्त विवरण

ऊपर दिए गए सभी समाधान कमांड wmctrlका उपयोग करते हुए, एक विंडो सूची बनाने के लिए उपयोग करते हैं wmctrl -lpG। यह कमांड लाइन बनाती है, जैसे कि:

0x044000b3  0 3429   65   24   1615 1026 jacob-System-Product-Name unity - How to show all windows of an application? - Ask Ubuntu - Mozilla Firefox

इन पंक्तियों में शामिल हैं:

  • पहला कॉलम: विंडो की आईडी (जिसे हम इसे बढ़ाने के लिए उपयोग कर सकते हैं)
  • तीसरा स्तंभ: खिड़की का मालिक है।
  • 4th / 5th कॉलम: विंडो की ज्यामिति xy (जिसका उपयोग हम यह देखने के लिए करते हैं कि विंडो वर्तमान व्यूपोर्ट, icw पर है xrandr)

ps -u <username>एप्लिकेशन के "उपयोगकर्ता-पढ़ने योग्य" पहचान (नाम) प्राप्त करने के लिए आउटपुट में pid को देखा गया है ।
इस प्रकार हम अनुप्रयोगों के लिए विंडो आवंटित कर सकते हैं। बाद में हम forकमांड के साथ लूप में दिए गए एप्लिकेशन की विंडो बढ़ा सकते हैं wmctrl -ia

विकल्प 3
में स्क्रिप्ट 3- सेकंड "प्रतीक्षा" लूप शुरू करती है, xprop -rootकमांड का उपयोग करके बार-बार यह देखने के लिए कि क्या सबसे सामने वाली खिड़की है; यह तब होगा जब उपयोगकर्ता किसी एप्लिकेशन की विंडो बढ़ाने के लिए लॉन्चर आइकन पर क्लिक करता है, या सीधे विंडो पर क्लिक करता है। यदि हां, तो लूप टूट जाता है और "नया" सबसे आगे का एप्लिकेशन दिखता है, और बाद में उस एप्लिकेशन की अन्य सभी विंडो उठाता है।


मैं सहमत हूँ, और आपके सारे प्रयास के लिए फिर से धन्यवाद! :) || एक अजीब बात है जो मैंने पहले नोटिस नहीं की थी। कभी-कभी Option 2स्क्रिप्ट का उपयोग करने के बाद , जब एक एप्लिकेशन विंडो केंद्रित होती है (जो कि अधिकतम नहीं है) और मैं "नीचे" दिखाई देने वाली किसी अन्य विंडो पर क्लिक करता हूं, नीचे दिए गए एप्लिकेशन को फोकस नहीं मिलता है।
जोसुआ

@ जोशुआ इस प्रश्न के ओपी: askubuntu.com/questions/575830/… ने मुझे एक बग में भाग लिया जो नवीनतम "फीचर" अपडेट में पेश किया गया था। सही / गलत मिलाया गया, जिससे स्क्रिप्ट क्रैश हो जाती है जब कोई अनुप्रयोग एक से अधिक विंडो में नहीं होता है। यदि आप विकल्प 2 का उपयोग करते हैं, तो कृपया नवीनतम संस्करण में अपडेट करें।
याकूब वलीजम

विकल्प 1 ubuntu xenial पर मेरे लिए काम नहीं कर रहा है। कुछ @ कुछ: ~ / bin $ ./raise_app Gtk-Message: GtkDialog बिना ट्रांसफर पैरेंट के मैप किया गया। यह हतोत्साहित किया जाता है। मैं टर्मिनल विंडो खोलने की कोशिश कर रहा था। कुछ नहीं हुआ।
xtrinch

@Nirri आपने किस एप्लिकेशन नाम का उपयोग किया? यदि जेनटी विंडो बिना Gtk पैरेंट के चलती है तो संदेश काफी सामान्य है। "निराश" कोई त्रुटि नहीं है।
जैकब व्लिजम

टर्मिनल का पहला चार्ट। यह काम करता है - इस तरह का - यह किसी भी ऐप की एक विंडो को ऊपर उठाता है - लेकिन उनमें से केवल एक, जैसा कि सभी को अपेक्षित नहीं है @ user72216
xtrinch

1

नहीं है Super+ Wशॉर्टकट जो सभी वर्तमान में खुले खिड़कियों के एक्सपो में दिखाई देगा, कि हालांकि अन्य अनुप्रयोगों शामिल होंगे। यह डिफ़ॉल्ट रूप से आता है, और इसमें किसी भी बदलाव की आवश्यकता नहीं होती है, इसलिए शायद यह सबसे सरल विकल्प उपलब्ध है।

अन्य बातों के अलावा, आप स्क्रीन के दाएं और बाएं हिस्सों को Ctrl+ Super+ Left/ Rightबटन के साथ स्थिति दे सकते हैं, और उनके बीच Alt + ~ (tilde, नंबर एक कुंजी के बगल में) के साथ स्विच कर सकते हैं।


हालांकि यह किसी एप्लिकेशन की सभी विंडो को शीर्ष पर नहीं लाता है। आप उन्हें देख सकते हैं, लेकिन बिना बहुत कुछ क्लिक किए आप उनका उपयोग नहीं कर सकते।
जोशुआ

1

यदि आप एप्लिकेशन के माध्यम से साइकिल चलाने के लिए Alt + Tab दबाते हैं, और आप एक से अधिक विंडो के साथ मिलते हैं, तो बस पूरी तरह से कुंजी दबाए रखें और लगभग 1 पूर्ण सेकंड के बाद आइकन को उस एप्लिकेशन के सभी विंडो के दृश्य के साथ बदल दिया जाएगा।

हो सकता है कि आप जो खोज रहे हैं वह हो या न हो, लेकिन यह मेरे लिए काम करता है और एक टन सरल है, इसलिए मुझे लगा कि मैं विकल्प साझा करूँगा!


1
तुम भी नीचे तीर कुंजी प्रेस कर सकते हैं अनुप्रयोग विंडोज़ सीधे दिखाने के लिए है।
क्रिश

1

मैंने @ याकूबविल्म की raise_apps.py स्क्रिप्ट ली और इसे और अधिक मजबूत बनाने सहित कुछ संवर्द्धन किए।

विशेष रूप से, मैंने पाया था कि एक या दो दिन बाद, @ याकूबविल्म की स्क्रिप्ट काम करना बंद कर देगी, और मुझे स्क्रिप्ट को फिर से चालू करना होगा, ताकि इसे दोबारा काम में लाया जा सके। रेट्रोस्पेक्ट में, मेरा सबसे अच्छा अनुमान है कि एक्सरैंडर के लिए कई कॉल अंततः मुद्दों का कारण बनते हैं।

वैसे भी, मैंने उनके कोड को अनुकूलित किया, मतदान की आवृत्ति को 5 सेकंड से बढ़ाकर प्रत्येक 1 सेकंड में बढ़ा दिया, क्योंकि यह बहुत अधिक सीपीयू वैसे भी उपयोग नहीं करता है, और इसे और अधिक मजबूत बनाया। मैं आम तौर पर मुद्दों के बिना दिन / सप्ताह के लिए चल सकता है।

एक चेतावनी यह है कि मैं स्क्रीन रिज़ॉल्यूशन आयामों को प्राप्त करने के लिए स्टार्टअप के दौरान केवल एक बार ज़ेंडर को कॉल करता हूं। इसलिए यदि आप अपने स्क्रीन रिज़ॉल्यूशन (जैसे 1920x1080 से कुछ अन्य रिज़ॉल्यूशन) में बदलाव करते हैं, तो आप संभवतः मैन्युअल रूप से उठाना शुरू कर देंगे, ताकि यह नए रिज़ॉल्यूशन को उठा ले। व्यक्तिगत रूप से, मैं अपने स्क्रीन रिज़ॉल्यूशन को कभी नहीं बदलता, इसलिए यह मेरे लिए एक गैर-मुद्दा है। इसके अतिरिक्त, मेरे पास यह विश्वास करने का मजबूत कारण है कि ज़्र्रन्डर के पास बहुत सारी कॉलें थीं, जो स्क्रिप्ट के याकूबविल्म के संस्करण को एक या दो दिन बाद काम करना बंद कर रही थीं, इसलिए मैं दृढ़ता से सलाह दूंगा कि वे नॉर्मल कॉल न करें।

BTW, आपको / usr / स्थानीय / आइकन / निर्देशिका में up.png छवि रखने की आवश्यकता है। या यदि आप एक अलग निर्देशिका में उठाना चाहते हैं। स्क्रिप्ट में उचित परिवर्तन करें, ताकि स्क्रिप्ट छवि फ़ाइल को ढूंढ सके।

उम्मीद है, उबंटू इस तरह की 'सभी विंडोज़ों की कार्यक्षमता' को अपने सिस्टम में जल्द से जल्द एकीकृत करेगा क्योंकि यह बहुत उपयोगी है:

#!/usr/bin/python2
#
# Note to self:
# You need to add raise.png to /usr/local/icons/ directory.
#
# This script was taken from: /ubuntu/446521/how-to-show-raise-all-windows-of-an-application, 
# (@JacobVlijm's answer), and then improved to fix some
# issues, that were causing it to stop working after a day or two.
#
#
from __future__ import print_function

from sys import stderr, exit
import signal
import gi

gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3, GObject, GLib

import logging
import logging.handlers

import time
import os
import subprocess
import getpass

logger = logging.getLogger('MyLogger')
logger.setLevel(logging.DEBUG)

log_handler = logging.handlers.SysLogHandler(address='/dev/log')

logger.addHandler(log_handler)


currpath = os.path.dirname(os.path.realpath(__file__))

class Indicator():
    def __init__(self):
        self.app = 'raise-apps'
        iconpath = '/usr/local/icons/raise.png'
        self.indicator = AppIndicator3.Indicator.new(
            self.app, iconpath,
            AppIndicator3.IndicatorCategory.OTHER)
        self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)

        self.prev_menu_item_names = []
        self.menu_items = []

        res_output = get("xrandr").split()
        if (len(res_output) == 0):
            logger.error("raise-apps.py: invocation of xrandr failed! Unable to continue..")
            exit(-1)

        idf = res_output.index("current")
        res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
        (self.screen_width, self.screen_height) = res
        logger.info("raise-apps.py: screen resolution is %s x %s" % (self.screen_width, self.screen_height))

        self.indicator.set_menu(self.create_menu())

        GLib.timeout_add_seconds(1.0, self.check_recent)

    def create_menu(self):
        # creates the (initial) menu
        self.menu = Gtk.Menu()
        # separator
        initial = Gtk.MenuItem("Fetching list...")
        menu_sep = Gtk.SeparatorMenuItem()
        self.menu.append(initial)
        self.menu.append(menu_sep)

        self.menu.show_all()
        return self.menu

    def raise_wins(self, *args):
        index = self.menu.get_children().index(self.menu.get_active())
        selection = self.menu_items[index][1]
        for w in selection:
            execute(["wmctrl", "-ia", w])

    def set_new(self):
        # update the list, appearing in the menu
        for i in self.menu.get_children():
            self.menu.remove(i)
        for app in self.menu_items:

            sub = Gtk.MenuItem(app[0])
            self.menu.append(sub)
            sub.connect('activate', self.raise_wins)
        # separator
        menu_sep = Gtk.SeparatorMenuItem()
        self.menu.append(menu_sep)

        # quit
        item_quit = Gtk.MenuItem('Quit')
        item_quit.connect('activate', self.stop)
        self.menu.append(item_quit)
        self.menu.show_all()

    def get_apps(self):
        # creating window list on current viewport / id's / application names
        w_data = [l.split() for l in get(["wmctrl", "-lpG"]).splitlines()]
        # windows on current viewport
        relevant = [w for w in w_data if 0 < int(w[3]) < self.screen_width and 0 < int(w[4]) < self.screen_height]
        # pids
        pids = [l.split() for l in get(["ps", "-u", getpass.getuser()]).splitlines()]
        matches = [[p[-1], [w[0] for w in relevant if w[2] == p[0]]] for p in pids]
        return [m for m in matches if m[1]]

    def check_recent(self):
        # print("in check_recent()", file=stderr)
        self.menu_items = self.get_apps()
        for app in self.menu_items:
            app[0] = "gnome-terminal" if "gnome-terminal" in app[0] else app[0]
        # check if menu items have changed:
        has_changed = len(self.menu_items) != len(self.prev_menu_item_names)
        if (not has_changed):
            for i in range(len(self.menu_items)):
                if self.prev_menu_item_names[i] != self.menu_items[i][0]:
                    has_changed = True
                    break

        if has_changed:
            GObject.idle_add(
                self.set_new,
                priority=GObject.PRIORITY_DEFAULT)

            self.prev_menu_item_names = []
            for item in self.menu_items:
                self.prev_menu_item_names.append(item[0])

        GLib.timeout_add_seconds(1.0, self.check_recent)


    def stop(self, source):
        Gtk.main_quit()


    def recreate_menu(self, *args):
        logger.info("in recreate_menu()")
        self.prev_menu_item_names = []
        self.menu_items = []

        self.menu_items = self.get_apps()
        for app in self.menu_items:
            app[0] = "gnome-terminal" if "gnome-terminal" in app[0] else app[0]

        GObject.idle_add(
            self.set_new,
            priority=GObject.PRIORITY_DEFAULT)

        self.prev_menu_item_names = []
        for item in self.menu_items:
            self.prev_menu_item_names.append(item[0])


def get(command):
    # enable to get a feel for what this app is doing..
    # print("get", command, file=stderr)
    try:
        return subprocess.check_output(command).decode("utf-8")

    except subprocess.CalledProcessError as e:
        logger.error("raise-apps.py error: cmd=%s, error=%s" % (command, e))
        return ""

    except OSError as e:
        logger.error("raise-apps.py error: cmd=%s, error=%s" % (command, e))
        return ""

def execute(command):
    # enable to get a feel for what this app is doing..
    # print("exec", command, file=stderr)
    try:
        subprocess.call(command)

    except subprocess.CalledProcessError as e:
        logger.error("raise-apps.py error: cmd=%s, error=%s" % (command, e))
        return ""
    except OSError as e:
        logger.error("raise-apps.py error: cmd=%s, error=%s" % (command, e))
    return ""


logger.info("(raise-apps.py is starting up..)")
Indicator()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.