Posso ridurre a icona una finestra in una casella su Unity?

17

Su 4Dwm di Irix, c'era la possibilità di ridurre a icona le finestre in una finestra (contrariamente alla barra delle applicazioni utilizzata dai moderni gestori di finestre). Ho visto questo anche su un vecchio HPUX.

Vedi il quadrato "console" nell'immagine collegata:

È possibile eseguire su Ubuntu, con un plugin o forse un gestore di finestre diverso da Unity?

    
posta Artium 18.12.2015 - 16:13

2 risposte

18

Con mia grande sorpresa, funziona abbastanza bene, Fintanto che non hai troppe cose sul desktop .

Ci ho lavorato per un po ', e mi sembra strano, ma stranamente abbastanza bello alternativo agli switch di workspace frequenti. Rinfrescante per la sua semplicità.

In pratica

La soluzione è praticamente ciò che descrivi:

  • Premendo una combinazione di tasti "box" la finestra sul desktop, da una finestra:

    in un'icona, con l'aspetto dell'applicazione:

  • Fai doppio clic sull'icona, la finestra riappare e l'icona scompare.

Come funziona

Il racconto (spiegazione):

  • Quando si preme il tasto di scelta rapida, lo script viene chiamato con l'argomento box :

    windowbox box
    
  • Lo script quindi:

    • legge l'id della finestra nella finestra in primo piano
    • verifica se si tratta di una finestra "normale" (non vorresti rimuovere il tuo desktop per esempio)
    • Cerca il nome del processo dell'applicazione, proprietaria della finestra.
    • Cerca l'icona corrispondente nel file .desktop dell'applicazione corrispondente in /usr/share/applications
    • crea un file .desktop con un nome univoco, con una riga Exec= che chiama lo script (quando si fa doppio clic) con l'argomento show :

      windowbox show
      

Il file .desktop aggiungerà un numero di argomenti aggiuntivi, come l'id della finestra, il nome (file-) del file .desktop .

In seguito:

  • Il file .desktop viene quindi reso eseguibile, per renderlo un oggetto cliccabile a doppio clic.

  • Quando si fa doppio clic sul file .desktop , la finestra viene (ri) mappata, il file .desktop viene rimosso dal desktop.

Come impostare

  1. Come praticamente sempre, quando vuoi giocare con Windows, lo script ha bisogno sia di wmctrl sia di xdotool :

    sudo apt-get install xdotool wmctrl
    
  2. Crea la directory ~/bin ( ~ rappresenta la tua home directory)
  3. Copia lo script di seguito in un file vuoto, salvalo come windowbox (senza estensione) in ~/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. Rendi lo script eseguibile

  5. Per rendere la cartella appena creata "pop up" in $PATH , esegui il logout / in, oppure esegui source ~/.profile (da una finestra del terminale)
  6. Test - esegui lo script da una finestra di terminale con il comando:

    windowbox box
    

    La finestra dovrebbe scomparire, la finestra "in scatola" dovrebbe apparire sul desktop.

  7. Se tutto funziona correttamente, aggiungi il seguente comando a un tasto di scelta rapida: scegli l'icona a forma di ingranaggio in alto a destra dello schermo:

  8. Vai a Impostazioni di sistema Tastiera Scorciatoie Scorciatoie personalizzate . Fai clic su + e aggiungi il comando:

    windowbox box
    

Questo dovrebbe farlo.

Nota importante

Lo script usa xdotool 's windowunmap per rendere invisibile la finestra. La "scatola" creata (icona) sul desktop è l'unico "cancello" della finestra nascosta. In altre parole: non rimuovere manualmente i file desktop. La finestra andrà persa per sempre se lo fai.

Lavoro da fare [modifica 20-12: fatto ]

Lo script potrebbe ancora usare un po 'di perfezionamento:

  • La geometria della finestra non viene ripristinata per definizione. Può essere risolto molto bene, ma ho pensato di mostrarti il ​​primo risultato.
  • Nella maggior parte dei casi, la finestra in scatola ha la sua icona corretta. La funzione get_process(w_id) potrebbe tuttavia apportare alcuni miglioramenti. Se il processo non viene trovato come comando in /usr/share/applications , il file ha un'icona generica.

Assegnazione delle icone della finestra in scatola di dimensioni diverse rispetto alle altre icone

Lo script assegna ai file .desktop creati sempre boxed_1.desktop , boxed_2.desktop ecc., a seconda del nome "disponibile" al momento della creazione (nome file, non il nome visualizzato).

Puoi ridimensionare i file (in generale), con il tasto destro del mouse & gt; dimensione dell'icona. La buona notizia è che se si rimuove il file e lo si ricrea, la dimensione viene ricordata. Anche se si crea nuovamente il file dopo un riavvio. Ciò significa che se mai ridimensionate le finestre in scatola (es.) 1-5, avranno sempre le stesse dimensioni quando (lo script) le creerai di nuovo!

    
risposta data Jacob Vlijm 19.12.2015 - 12:45
7

Puoi usare fvwm per realizzare questo.

  1. Installa fvwm:

    sudo apt-get update
    sudo apt-get install fvwm
    
  2. Trova quelli che usano la funzione iconify - ce ne sono diversi qui: link Diversi assomigliano allo schermo -shot mostra.

  3. Copia il testo del tema, quindi vai a ~/.fvwm/ (mostra prima i file nascosti) poi crea un file .fvwm2rc

  4. Apri quel file in un editor di testo (come gedit) e incolla il testo del tema in esso.

  5. Riavvia il computer e seleziona fvwm e accedi.

    
risposta data Mateo 21.12.2015 - 00:36

Leggi altre domande sui tag