Kann ich ein Fenster in eine Box in Unity minimieren?


17

In Irix 4Dwm gab es die Möglichkeit, Fenster in eine Box zu minimieren (im Gegensatz zur Taskleiste, die von modernen Fenstermanagern verwendet wird). Ich habe das auch auf einem alten HPUX gesehen.

Siehe das "Konsolen" -Quadrat im verknüpften Bild:

Bildbeschreibung hier eingeben

Ist es unter Ubuntu möglich, entweder mit einem Plugin oder einem anderen Fenstermanager als Unity zu arbeiten?


Seltsame, aber interessante Frage :) Mir fällt so etwas ein. Würde die Ikone eine Rolle spielen oder könnte es eine allgemeine sein? Wie verhält es sich? wie ein Symbol auf dem Desktop oder ein minimales "Fenster".
Jacob Vlijm

@JacobVlijm Das Symbol ist nicht generisch. Jede Anwendung verfügt über ein eigenes Symbol (als Symbole für minimierte Fenster in Unity)
Artium

Dies könnte auch in Unity erfolgen, aber das Fenster wird auf dem Desktop als Symbol angezeigt (mit dem Symbol der entsprechenden Anwendung und dem Namen des Fensters). Lust auf einen Schuss? (
Wäre

1
Ja, das kann mir hilfreich sein. Ich muss mit vielen offenen Fenstern arbeiten und diese Art der Organisation ist meiner Meinung nach besser. Ich weiß nichts über Unity, deshalb kann ich nur beim Testen helfen.
Artium

Antworten:


18

Zu meiner eigenen Überraschung funktioniert es ganz gut, solange Sie nicht zu viele andere Dinge auf Ihrem Desktop haben .

Ich habe eine Weile damit gearbeitet, und es scheint eine seltsame, aber seltsamerweise nette Alternative zu häufigen Arbeitsplatzwechseln zu sein. Erfrischend für seine Einfachheit.

In der Praxis

Die Lösung ist eigentlich so ziemlich das, was Sie beschreiben:

  • Durch Drücken einer Tastenkombination wird das Fenster auf Ihrem Desktop von einem Fenster aus "umrahmt":

    Bildbeschreibung hier eingeben

    in ein Symbol mit dem Erscheinungsbild der Anwendung:

    Bildbeschreibung hier eingeben

  • Doppelklicken Sie auf das Symbol. Das Fenster wird erneut angezeigt und das Symbol verschwindet.

Wie es funktioniert

Die Kurzgeschichte (Erklärung):

  • Beim Drücken der Tastenkombination wird das Skript mit dem folgenden Argument aufgerufen box:

    windowbox box
    
  • Das Skript dann:

    • liest die Fenster-ID des vordersten Fensters
    • prüft, ob es sich um ein "normales" Fenster handelt (Sie möchten beispielsweise die Zuordnung Ihres Desktops nicht aufheben)
    • Sucht den Prozessnamen der Anwendung, die das Fenster besitzt.
    • Schlägt das entsprechende Symbol in der entsprechenden Anwendungsdatei .desktopin nach/usr/share/applications
    • Erstellt eine .desktopDatei mit einem eindeutigen Namen und einer Exec=Zeile, die das Skript (bei Doppelklick) mit dem folgenden Argument aufruft show:

      windowbox show
      

Die .desktopDatei fügt eine Reihe zusätzlicher Argumente hinzu, z. B. die Fenster-ID, den (Datei-) Namen der.desktop Datei.

Anschließend:

  • Die .desktopDatei wird dann ausführbar gemacht, um sie zu einem doppelklickbaren Objekt zu machen.

  • Wenn Sie auf die .desktopDatei doppelklicken, wird das Fenster (neu) zugeordnet und die .desktopDatei von Ihrem Desktop entfernt.

Wie stellt man das ein

  1. Wie praktisch immer, wenn Sie mit Windows herumspielen möchten, benötigt das Skript beides wmctrlund xdotool:

    sudo apt-get install xdotool wmctrl
    
  2. Erstellen Sie das Verzeichnis ~/bin( ~steht für Ihr Home-Verzeichnis)
  3. Kopieren Sie das folgende Skript in eine leere Datei und speichern Sie es unter windowbox(ohne Erweiterung) 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. Machen Sie das Skript ausführbar

  5. Um das neu erstellte Verzeichnis zum "Pop-up" zu machen $PATH, müssen Sie sich entweder abmelden / anmelden oder ausführen source ~/.profile(über ein Terminalfenster).
  6. Führen Sie das Skript von einem Terminalfenster aus mit dem folgenden Befehl aus:

    windowbox box
    

    Das Fenster sollte verschwinden, das "umrahmte" Fenster sollte auf Ihrem Desktop erscheinen.

  7. Wenn alles funktioniert, fügen Sie den folgenden Befehl zu einer Tastenkombination hinzu: Wählen Sie das Zahnradsymbol oben rechts auf Ihrem Bildschirm:

    Zahnrad-Symbol

  8. Gehen Sie zu System SettingsKeyboardShortcutsCustom Shortcuts. Klicken Sie auf +und fügen Sie den Befehl hinzu:

    windowbox box
    

Das sollte es tun.

Wichtige Notiz

Das Skript verwendet xdotool's windowunmap, um das Fenster unsichtbar zu machen. Die erstellte "Box" (Symbol) auf Ihrem Desktop ist das einzige "Tor" zum ausgeblendeten Fenster. Mit anderen Worten: Entfernen Sie die Desktop-Datei (en) nicht manuell. Das Fenster geht für immer verloren, wenn Sie dies tun.

Zu erledigende Arbeit [Bearbeiten 20-12: erledigt ]

Das Skript könnte noch etwas verfeinert werden:

  • Die Fenstergeometrie wird nicht per Definition wiederhergestellt. Kann sehr gut behoben werden, aber ich dachte, ich würde dir das erste Ergebnis zeigen.
  • In den meisten Fällen hat das umrahmte Fenster das richtige Symbol. Die Funktion get_process(w_id)könnte jedoch verbessert werden. Wenn der Prozess nicht als Befehl in gefunden wird /usr/share/applications, hat die Datei ein generisches Symbol.

Geben Sie den Fenstersymbolen eine andere Größe als den anderen Symbolen

Die Skriptnamen die erstellten .desktopDateien immer boxed_1.desktop , boxed_2.desktopusw., je nach „verfügbar“ Namen zur Zeit der Schöpfung (Dateinamen, der angezeigte Name).

Sie können die Größe der Dateien (im Allgemeinen) ändern, indem Sie mit der rechten Maustaste auf> Symbolgröße klicken. Die gute Nachricht ist, dass die Größe erhalten bleibt, wenn Sie die Datei entfernen und neu erstellen. Auch wenn Sie die Datei nach einem Neustart erneut erstellen. Das heißt, wenn Sie jemals die geschachtelte Fenster der Größe verändert (zB) 1-5, sie werden immer die gleiche Größe haben , wenn Sie (das Skript) erstellen sie wieder!

Bildbeschreibung hier eingeben


2
Ich kann nicht widerstehen, ohne einen Kommentar zu hinterlassen, sehr nette Antwort von Ihnen :)
Ravan

Nett! Einige Kommentare: 1. Ich habe die Zeile dtop = "/home/jacob/Bureaublad"durch einen Pfad zu meinem Desktop ersetzt ( dtop = "/home/" + user + "/Desktop"). 2. Das Wiederherstellen per Doppelklick hat nicht funktioniert. Ich vermute, dass dies source ~/.profilenicht ausreicht, um sich sofort an- und abzumelden und dies zu testen. 3. In Unity ist es möglich, die Größe von Symbolen manuell zu ändern (Rechtsklick -> Symbolgröße ändern). Ist es möglich, Parameter hinzuzufügen f_content, um die Größe des Symbols festzulegen?
Artium

4
Als ich anfing, den ersten Absatz dieser Antwort zu lesen, wusste ich nur , dass unten ein orangefarbenes Symbol zu sehen sein würde! ;-): P
Fabby

1
Hallo @Artium, ich habe das Skript aktualisiert. Es enthält jetzt einige wichtige Verbesserungen, einschließlich einer besseren Symbolfindung und Geometriewiederherstellung. Viel Spaß!
Jacob Vlijm

1
@Artium Ich weiß, aber versuchen Sie es mit dem im Skript, es ist das übliche Ordnersymbol, ähnlich wie bei Ihrem Bild. wahrscheinlich nur ein Link zum selben Icon.
Jacob Vlijm

7

Sie können dazu fvwm verwenden .

  1. Installieren Sie fvwm:

    sudo apt-get update
    sudo apt-get install fvwm
    
  2. Suchen Sie nach ihnen, die die iconify-Funktion verwenden - hier gibt es mehrere: http://www.jmcunx.com/fvwm_theme.html Einige sehen aus wie der von Ihnen gezeigte Screenshot.

  3. Kopieren Sie den Text des Themas, navigieren Sie zu ~/.fvwm/(zeigen Sie zuerst versteckte Dateien an) und erstellen Sie dann eine Datei.fvwm2rc

  4. Öffnen Sie diese Datei in einem Texteditor (wie gedit) und fügen Sie den Designtext ein.

  5. Starten Sie den Computer neu und wählen Sie fvwm und login.

Bildbeschreibung hier eingeben

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.