क्या मैं एकता पर एक बॉक्स में एक खिड़की को कम कर सकता हूं?


17

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

लिंक की गई छवि में "कंसोल" वर्ग देखें:

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

क्या उबंटू पर पूरा करना संभव है, या तो एक प्लगइन के साथ या शायद एकता के अलावा कुछ विंडो मैनेजर?


अजीब, लेकिन दिलचस्प सवाल :) मैं ऐसा कुछ सोच सकता था। क्या आइकन मायने रखेगा, या यह एक सामान्य हो सकता है? यह कैसा व्यवहार करता है? डेस्कटॉप पर एक आइकन या एक न्यूनतम "विंडो" की तरह।
जैकब वल्जिम

@JacobVlijm आइकन सामान्य नहीं है। प्रत्येक अनुप्रयोग में एकता के रूप में कम से कम खिड़कियों के प्रतीक के रूप में इसका खुद का आइकन है)
आर्टियम

एकता के भीतर भी किया जा सकता है, लेकिन विंडो को डेस्कटॉप पर आइकन किया जाएगा (संबंधित एप्लिकेशन का आइकन और विंडो का नाम)। आप एक शॉट फैंसी होगा? (एक दिलचस्प, लेकिन चुनौतीपूर्ण काम होगा, बेहतर शुरू होने से पहले पूछें :))
जैकब व्लिजम

1
हां यह मेरे लिए मददगार हो सकता है। मुझे बहुत सारी खुली खिड़कियों के साथ काम करना है और उन्हें व्यवस्थित करने का यह तरीका मेरी राय में बेहतर है। मुझे एकता के बारे में कुछ नहीं पता है, इसलिए मैं केवल परीक्षण में मदद कर सकता हूं।
अर्टियम

जवाबों:


18

मेरे अपने आश्चर्य के लिए, यह काफी अच्छी तरह से काम करता है, जब तक कि आपके डेस्कटॉप पर बहुत अधिक अन्य चीजें नहीं हैं

मैंने इसके साथ कुछ समय के लिए काम किया, और यह एक अजीब लगता है, लेकिन अक्सर कार्यक्षेत्र स्विच के लिए अजीब रूप से पर्याप्त अच्छा विकल्प है। इसकी सादगी के लिए ताज़ा।

प्रयोग में

समाधान वास्तव में बहुत ज्यादा है जो आप वर्णन करते हैं:

  • एक कुंजी संयोजन दबाने से आपके डेस्कटॉप पर खिड़की से "बॉक्स" होगा, एक खिड़की से:

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

    एक आइकन में, आवेदन की उपस्थिति के साथ:

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

  • आइकन पर डबल क्लिक करें, और विंडो फिर से दिखाई देगी और आइकन गायब हो जाएगा।

यह काम किस प्रकार करता है

लघु कहानी (स्पष्टीकरण):

  • शॉर्टकट कुंजी दबाते समय, स्क्रिप्ट को तर्क के साथ कहा जाता है box:

    windowbox box
    
  • स्क्रिप्ट तब:

    • सबसे सामने वाली विंडो की विंडो आईडी पढ़ता है
    • जांचें कि क्या यह "सामान्य" विंडो है (आप उदाहरण के लिए अपने डेस्कटॉप को अनमैप करना नहीं चाहेंगे)
    • विंडो के मालिक के आवेदन की प्रक्रिया का नाम दिखता है।
    • इसी एप्लिकेशन की .desktopफ़ाइल में संबंधित आइकन को देखता है/usr/share/applications
    • एक विशिष्ट नाम वाली .desktopफ़ाइल बनाता है , एक Exec=लाइन के साथ जो स्क्रिप्ट (जब डबल-क्लिक की जाती है) को तर्क के साथ कहता है show:

      windowbox show
      

.desktopफ़ाइल ऐसी खिड़की आईडी, (फ़ाइल) के नाम के रूप में अतिरिक्त तर्क तर्क, के एक नंबर जोड़ देगा .desktopफ़ाइल।

इसके बाद:

  • .desktopफ़ाइल तो निष्पादन किया जाता है, यह एक डबल क्लिक करने योग्य वस्तु बनाने के लिए।

  • जब .desktopफ़ाइल को डबल क्लिक किया जाता है, तो विंडो (पुनः) मैप की जाती है, .desktopफ़ाइल को आपके डेस्कटॉप से ​​हटा दिया जाता है।

स्थापित कैसे करें

  1. व्यावहारिक रूप से हमेशा की तरह, जब आप खिड़कियों के साथ खेलना चाहते हैं, तो स्क्रिप्ट को दोनों की जरूरत है wmctrlऔर xdotool:

    sudo apt-get install xdotool wmctrl
    
  2. निर्देशिका बनाएँ ~/bin( ~अपने घर निर्देशिका के लिए खड़ा है)
  3. नीचे दी गई स्क्रिप्ट को एक खाली फ़ाइल में कॉपी करें, इसे windowbox(कोई एक्सटेंशन नहीं) के रूप में सहेजें ~/bin

    #!/usr/bin/env python3
    import subprocess
    import sys
    import os
    
    # --- On Unity, there is a (y-wise) deviation in window placement
    # set to zero for other window managers
    deviation = 28
    # ---
    
    args = sys.argv[1:]
    
    get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()
    
    def find_dtop():
        # get the localized path to the Desktop folder
        home = os.environ["HOME"]
        dr_file = home+"/.config/user-dirs.dirs"
        return [home+"/"+ l.split("/")[-1].strip() \
                for l in open(dr_file).readlines() \
                if l.startswith("XDG_DESKTOP_DIR=")][0].replace('"', "")
    
    def check_windowtype(w_id):
        # check the type of window; only unmap "NORMAL" windows
        return "_NET_WM_WINDOW_TYPE_NORMAL" in get(["xprop", "-id", w_id])
    
    def get_process(w_id):
        # get the name of the process, owning the window and window x/y position
        w_list = get(["wmctrl", "-lpG"]).splitlines()
        pid = [l for l in w_list if w_id in l][0].split()
        proc = get(["ps", "-p", pid[2], "-o", "comm="])
        xy = (" ").join(pid[3:5])
        return (proc, xy)
    
    def read_f(f, string, proc):
        # search for a possible match in a targeted .desktop file
        try:
            with open(f) as read:
                for l in read:
                    if all([l.startswith(string), proc in l]):
                        in_f = True
                        break
                    else:
                        in_f = False
        except:
            in_f = False
        return in_f
    
    def get_icon(proc, w_name):
        # search appropriate icon in /usr/share/applications
        exceptions = [item for item in [
            ["soffice", "libreoffice-main"],
            ["gnome-terminal", "utilities-terminal"],
            ["nautilus", "folder"],
            ] if item[0] in proc]
        if exceptions:
            if exceptions == [["soffice", "libreoffice-main"]]:
                loffice = [
                    ["Calc", "libreoffice-calc"],
                    ["Writer", "libreoffice-writer"],
                    ["Base", "libreoffice-base"],
                    ["Draw", "libreoffice-draw"],
                    ["Impress", "libreoffice-impress"],
                    ]
                match = [m[1] for m in loffice if m[0] in w_name]
                if match:
                    return match[0]
                else:
                    return exceptions[0][1]
            else:      
                return exceptions[0][1]
        else:
            default = "/usr/share/applications"
            dtfiles = [default+"/"+f for f in os.listdir(default)]
            for f in dtfiles:
                if read_f(f, "Exec=", proc) == True:   
                    for l in open(f).readlines():
                        if l.startswith("Icon="):
                            icon = l.replace("Icon=", "").strip()
                            print(f)
                            break
                    break
            return icon
    
    def create_name():
        # create unique (file-) name for boxed window
        n = 1
        while True:
            name = dtop+"/"+"boxed_"+str(n)+".desktop"
            if os.path.exists(name):
                n += 1
            else:
                break
        return name
    
    def convert_wid(w_id):
        # convert window- id, xdotool format, into wmctrl format
        w_id = hex(int(w_id))
        return w_id[:2]+(10-len(w_id))*"0"+w_id[2:]
    
    def create_icon(w_id, w_name, icon, pos):
        # create the launcher, representing the boxed window
        boxedwindow = create_name()
        f_content =[
                "[Desktop Entry]",
                "Name=[WINDOW] "+w_name,
                "Exec=windowbox show "+w_id+" '"+boxedwindow+"' "+pos,
                "Icon="+icon,
                "Type=Application",
                ]
        if icon == "generic":
            f_content.pop(3)
        with open(boxedwindow, "wt") as boxed:
            for l in f_content:
                boxed.write(l+"\n")
        command = "chmod +x "+"'"+boxedwindow+"'"
        subprocess.call(["/bin/bash", "-c", command])
    
    if args[0] == "box":
        dtop = find_dtop()
        w_id = convert_wid(get(["xdotool", "getactivewindow"]))
        w_name = get(["xdotool", "getwindowname", w_id])
        if check_windowtype(w_id) == True:
            procdata = get_process(w_id)
            procname = procdata[0]
            icon = get_icon(procname, w_name); icon = icon if icon != None else "generic"
            create_icon(w_id, w_name, icon, procdata[1])
            subprocess.call(["xdotool", "windowunmap", w_id])
    
    elif args[0] == "show":
        w_id = args[1]
        subprocess.call(["xdotool", "windowmap", w_id])    
        subprocess.call(["xdotool", "windowmove", "--sync", w_id, args[3], str(int(args[4])-deviation)])
        os.remove(args[2])
  4. स्क्रिप्ट को निष्पादन योग्य बनाएं

  5. नवसृजित निर्देशिका को "पॉप अप" बनाने के लिए $PATH, या तो लॉग इन / /, या रन करें source ~/.profile(टर्मिनल विंडो से)
  6. कमांड द्वारा टर्मिनल विंडो से टेस्ट रन करें:

    windowbox box
    

    खिड़की गायब होनी चाहिए, "बॉक्सिंग" विंडो आपके डेस्कटॉप पर दिखाई देनी चाहिए।

  7. यदि सभी ठीक काम करते हैं, तो शॉर्टकट कमांड में निम्न कमांड जोड़ें: अपनी स्क्रीन के ऊपरी दाईं ओर गियर आइकन चुनें:

    गियर निशान

  8. पर जाएं System SettingsKeyboardShortcutsCustom Shortcuts। क्लिक करें +और कमांड जोड़ें:

    windowbox box
    

इससे हो जाना चाहिए।

महत्वपूर्ण लेख

स्क्रिप्ट का उपयोग करता है xdotool's windowunmapखिड़की अदृश्य बनाने के लिए। आपके डेस्कटॉप पर बनाया गया "बॉक्स" (आइकन) छिपी हुई खिड़की का एकमात्र "गेट" है। दूसरे शब्दों में: डेस्कटॉप फ़ाइल को मैन्युअल रूप से न निकालें। यदि आप करते हैं तो खिड़की अच्छे से खो जाएगी।

काम करने के लिए [संपादित करें 20-12: किया ]

स्क्रिप्ट अभी भी कुछ शोधन का उपयोग कर सकती है:

  • विंडो ज्यामिति परिभाषा द्वारा बहाल नहीं है। बहुत अच्छी तरह से तय किया जा सकता है, लेकिन मुझे लगा कि मैं आपको पहला परिणाम दिखाऊंगा।
  • ज्यादातर मामलों में, बॉक्सिंग विंडो का सही आइकन होता है। get_process(w_id)हालाँकि यह कार्य कुछ सुधार का उपयोग कर सकता है। यदि प्रक्रिया को कमांड के रूप में नहीं मिला है /usr/share/applications, तो फ़ाइल में एक सामान्य आइकन है।

बॉक्स-विंडो के आइकॉन को अन्य आइकॉन की तुलना में एक अलग आकार देते हैं

स्क्रिप्ट हमेशा बनाई गई .desktopफ़ाइलों को नाम देती है , आदि, सृजन के क्षण में "उपलब्ध" नाम के आधार पर (फ़ाइल नाम, प्रदर्शित नाम नहीं)। boxed_1.desktopboxed_2.desktop

आप फ़ाइलों (सामान्य रूप से) का आकार बदल सकते हैं, दाईं ओर> आइकन आकार पर क्लिक करें। अच्छी खबर यह है कि यदि आप फ़ाइल को हटाते हैं और इसे फिर से बनाते हैं, तो आकार याद किया जाता है। भले ही आप पुनरारंभ करने के बाद फिर से फ़ाइल बनाएँ। इसका मतलब है कि यदि आपने कभी बॉक्सिंग विंडो (जैसे) 1-5 का आकार परिवर्तन किया है, तो वे हमेशा एक ही आकार के होंगे जब आप (स्क्रिप्ट) उन्हें फिर से बनाएंगे!

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


2
मैं खुद को एक टिप्पणी छोड़ने के बिना विरोध नहीं कर सकता, आप से बहुत अच्छा जवाब :)
रावण

अच्छा! कुछ टिप्पणियां: 1. मैंने dtop = "/home/jacob/Bureaublad"अपने डेस्कटॉप के लिए एक पथ के साथ लाइन को बदल दिया ( dtop = "/home/" + user + "/Desktop") 2. डबल क्लिक करके पुनर्स्थापित करने से काम नहीं हुआ। मुझे संदेह है कि source ~/.profileयह परीक्षण करने के लिए पर्याप्त रूप से लॉग-इन / आउट नहीं होगा। 3. एकता में माउस को मैन्युअल रूप से आकार देना संभव है (राइट क्लिक -> आकार बदलें आइकन), क्या f_contentआइकन के आकार को सेट करने के लिए कुछ पैरामीटर जोड़ना संभव है ?
आर्टियम

4
जब मैंने इस उत्तर के पहले पैराग्राफ को पढ़ना शुरू किया, तो मुझे पता था कि नीचे एक नारंगी आइकन होगा! ;-): P
Fabby

1
हाय @Artium मैंने स्क्रिप्ट को अपडेट किया, अब इसमें कुछ महत्वपूर्ण सुधार हुए हैं, जिनमें बेहतर आइकन- खोज और ज्यामिति- बहाल करना, मज़े करना!
जैकब वल्जिम

1
@Artium मुझे पता है, लेकिन स्क्रिप्ट में एक का प्रयास करें, यह आपकी छवि के समान सामान्य फ़ोल्डर आइकन है। शायद सिर्फ उसी आइकन का लिंक।
जैकब वल्जिम

7

इसे पूरा करने के लिए आप fvwm का उपयोग कर सकते हैं ।

  1. Fvwm स्थापित करें:

    sudo apt-get update
    sudo apt-get install fvwm
    
  2. उन्हें एक आइकन खोजें जो आइकॉनिफ फ़ंक्शन का उपयोग करता है - यहां कई हैं: http://www.jmcunx.com/fvwm_theme.html आपके द्वारा दिखाए गए स्क्रीन-शॉट जैसे कई दिखते हैं।

  3. विषय के पाठ की प्रतिलिपि बनाएँ, फिर ~/.fvwm/पहले पर जाएँ (पहले छुपी हुई फ़ाइलें दिखाएँ) फिर एक फ़ाइल बनाएँ.fvwm2rc

  4. उस फाइल को टेक्स्ट एडिटर में खोलें (जैसे gedit) और उसमें थीम टेक्स्ट पेस्ट करें।

  5. कंप्यूटर को रिबूट करें, और fvwm को चुनें और लॉगिन करें।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.