Bir pencereyi Unity'deki bir kutuya küçültebilir miyim?


17

Irix'in 4Dwm'sinde pencereleri bir kutuya küçültme yeteneği vardı (modern pencere yöneticileri tarafından kullanılan görev çubuğunun aksine). Bunu eski bir HPUX üzerinde de gördüm.

Bağlantılı görüntüdeki "konsol" karesine bakın:

resim açıklamasını buraya girin

Ubuntu'da bir eklenti veya Unity dışında bir pencere yöneticisi ile başarmak mümkün mü?


Tuhaf, ama ilginç bir soru :) Böyle bir şey düşünebilirim. Simge önemli miydi, yoksa genel bir simge olabilir mi? Nasıl davranıyor? masaüstündeki bir simge veya minimal bir "pencere" gibi.
Jacob Vlijm

@JacobVlijm Simge genel değil. Her uygulamanın, Unity'de simge
durumuna

Unity içinde de yapılabilir, ancak pencere masaüstünde ikonize edilir (ilgili uygulamanın simgesi ve pencerenin adı ile). Bir atış ister misin? (ilginç, ama zorlu bir iş olurdu, başlamadan önce sorsan iyi olur :))
Jacob Vlijm

1
Evet bu bana yardımcı olabilir. Birçok açık pencereyle çalışmak zorundayım ve bunları organize etmenin bu şekilde daha iyi olduğunu düşünüyorum. Unity hakkında hiçbir şey bilmiyorum, bu yüzden sadece testte yardımcı olabilirim.
Artium

Yanıtlar:


18

Kendi sürprizime göre, masaüstünüzde çok fazla şey olmadığı sürece oldukça güzel çalışıyor .

Bir süre onunla çalıştım ve sık sık çalışma alanı anahtarlarına garip, ama garip bir şekilde güzel bir alternatif gibi görünüyor . Sadeliği için ferahlatıcı.

Uygulamada

Çözüm aslında tanımladığınız şeydir:

  • Bir tuş bileşimine basıldığında, masaüstünüzdeki pencereden bir pencereden "kutulanır":

    resim açıklamasını buraya girin

    uygulamanın görünümü ile bir simgeye dönüştürün:

    resim açıklamasını buraya girin

  • Simgeye çift tıkladığınızda pencere görünecek ve simge kaybolacaktır.

Nasıl çalışır

Kısa öykü (açıklama):

  • Kısayol tuşuna bastığınızda, komut dosyası şu argümanla çağrılır box:

    windowbox box
    
  • Komut dosyası daha sonra:

    • en öndeki pencerenin pencere kimliğini okur
    • "normal" bir pencere olup olmadığını kontrol eder (örneğin masaüstünüzün eşlemesini kaldırmak istemezsiniz)
    • Pencereye sahip olan uygulamanın işlem adını arar.
    • İlgili uygulamanın .desktopdosyasındaki ilgili simgeyi/usr/share/applications
    • bağımsız olarak adlandırılmış bir .desktopdosya oluşturur Exec=ve betiği (çift tıklandığında) argümanla çağıran bir satır içerir show:

      windowbox show
      

.desktopDosya, pencerenin id ait (file-) adı olarak ek argümanlar argümanlar, bir dizi katacak .desktopdosyası.

Ardından:

  • .desktopDosya daha sonra bir çift tıklanabilir nesne yapmak için, çalıştırılabilir yapılır.

  • Ne zaman .desktopdosya çift tıklandığında, pencere (yeniden) eşleştirilmiş, .desktopdosya masaüstünüze kaldırılır.

Nasıl kurulur

  1. Eğer pencereleri ile uğraşmak istediğinizde gibi pratik olarak her zaman, script de ihtiyacı var wmctrlve xdotool:

    sudo apt-get install xdotool wmctrl
    
  2. Dizini oluşturun ~/bin( ~ana dizininiz anlamına gelir)
  3. Aşağıdaki komut dosyasını boş bir dosyaya kopyalayın, içine windowbox(uzantı yok) kaydedin ~/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. Komut dosyasını yürütülebilir yapın

  5. Yeni oluşturulan dizinin "açılır" olması için $PATHoturumu source ~/.profilekapat / kapat veya çalıştır (terminal penceresinden)
  6. Komut dosyası ile komut dosyasını bir terminal penceresinden test edin:

    windowbox box
    

    Pencere kaybolmalı, masaüstünüzde "kutulu" pencere görünmelidir.

  7. Her şey yolunda giderse, bir kısayol tuşuna aşağıdaki komutu ekleyin: ekranınızın sağ üst kısmındaki dişli simgesini seçin:

    Dişli simgesini

  8. Git System SettingsKeyboardShortcutsCustom Shortcuts. Simgesini tıklayın +ve komutu ekleyin:

    windowbox box
    

Bunu yapmalı.

Önemli Not

Komut dosyası , pencereyi görünmez yapmak için xdotool's kullanır windowunmap. Masaüstünüzde oluşturulan "kutu" (simge), gizli pencereye açılan tek "kapı" dır. Başka bir deyişle: masaüstü dosyalarını manuel olarak kaldırmayın. Eğer yaparsanız pencere kaybolur.

Yapılacak iş [değiştir 20-12: bitti ]

Komut dosyası hala bazı ayrıntılandırmalar kullanabilir:

  • Pencere geometrisi tanım gereği geri yüklenmez. Çok iyi düzeltilebilir, ama size ilk sonucu göstereceğimi düşündüm.
  • Çoğu durumda, kutulu pencerenin doğru simgesi vardır. Ancak işlev get_process(w_id)bazı iyileştirmeler kullanabilir. İşlem bir komut olarak bulunamazsa /usr/share/applications, dosyanın genel bir simgesi vardır.

Kutulu pencere simgelerine diğer simgelerden farklı bir boyut verme

Komut isimleri oluşturulan .desktopdosyalar hep boxed_1.desktop , boxed_2.desktopvb yaratılış anında "kullanılabilir" adıyla bağlı (dosya adları değil, görüntülenen adı).

Dosyaları (genel olarak) sağ tıklayıp> simge boyutu ile yeniden boyutlandırabilirsiniz. İyi haber, dosyayı kaldırır ve yeniden oluşturursanız, boyutun hatırlanmasıdır. Yeniden başlattıktan sonra dosyayı yeniden oluştursanız bile. Yani eğer araç hiç kutulu pencereler (örneğin) 1-5 resized, onlar olacak hep aynı boyutta olduğunda (script) tekrar oluşturmak!

resim açıklamasını buraya girin


2
Yorum bırakmadan kendime
dayanamıyorum

Güzel! Birkaç yorum: 1. Satırı dtop = "/home/jacob/Bureaublad"masaüstüme giden bir yolla değiştirdim ( dtop = "/home/" + user + "/Desktop") 2. Çift tıklayarak geri yükleme işe yaramadı. Ben source ~/.profileyeterli olmadığını şüpheli giriş testi / derhal test etmek için bu test. 3. Birlik içinde simgeleri manuel olarak yeniden boyutlandırmak mümkündür (sağ tıklama -> yeniden boyutlandırma simgesi), f_contentsimgenin boyutunu ayarlamak için bir parametre eklemek mümkün müdür ?
Artium

4
Bu cevabın ilk paragrafını okumaya başladığımda , altta turuncu bir simge olacağını biliyordum ! ;-): P
Fabby

1
Merhaba @Artium Betiği güncelledim, şimdi daha iyi simge bulma ve geometri geri yükleme de dahil olmak üzere birkaç önemli iyileştirme var, iyi eğlenceler!
Jacob Vlijm

1
@Artium biliyorum, ama komut dosyasında deneyin, resminize benzer olağan klasör simgesi. muhtemelen sadece aynı simgeye bir bağlantı.
Jacob Vlijm

7

Bunu başarmak için fvwm kullanabilirsiniz .

  1. Fvwm yükleyin:

    sudo apt-get update
    sudo apt-get install fvwm
    
  2. İkonize etme işlevini kullanan bir onları bulun - burada birkaç tane var: http://www.jmcunx.com/fvwm_theme.html Birkaç tanesi gösterdiğiniz ekran görüntüsüne benziyor.

  3. Temanın metnini kopyalayın, ardından ~/.fvwm/(önce gizli dosyaları göster) öğesine gidin, ardından bir dosya oluşturun.fvwm2rc

  4. Bu dosyayı bir metin düzenleyicisinde (gedit gibi) açın ve tema metnini içine yapıştırın.

  5. Bilgisayarı yeniden başlatın ve fvwm ve login'i seçin.

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.