Her çalışma alanında farklı simgelerle farklı bir Birlik Başlatıcı nasıl elde edilir?


20

Screenlets, devilspie veya CCSM kullanarak her Çalışma Alanında ayrı masaüstü klasörleri olduğuna dair çeşitli cevapları okudum ... ama sorumun cevabı bu değil. Birkaç gün önce 14.04 LTS'yi yükledim ve uygulamalarımın ve bazı yenilerini çalıştırma konusunda başarılı oldum. İstediğim şey, her biri çalıştığım ortamlar için farklı simgelere sahip 4 ayrı çalışma alanına sahip olmak . Örneğin,

  • Çalışma Alanı 1 - fen ve matematik uygulamalarına adanmış
  • Çalışma Alanı 2 - müzik araçlarına adanmış
  • Çalışma alanı 3 - elektronik devreler ve simülasyonlar için
  • Çalışma Alanı 4 - web taraması ve genel bilgi işlem için

Her ekranın ayrı simgeler içerebileceği bir Android tableti düşünün.

Bunun nasıl yapılacağı açık olmalı, ancak bir cevap bulamıyorum. Ubuntu'da 4 gün yaşıyorum, lütfen ne yaptığımı bildiğimi varsayma!


Çalışma alanı başına farklı bir başlatıcı simgesi kümesi mi kastediyorsunuz ? Nefis Sevdim, ama kaçmalıyım, demek istediğin buysa yarın üzerinde çalışacağım. Lütfen bana haber ver.
Jacob Vlijm

Evet, işte Jacob. Müzikle ilgisi olmayan devre simülasyonu için özel araçlar (LTspice gibi) vardır.
Dennis J,

Şüphesiz yapılabilir. Muhtemelen yarın ya da Salı günü :).
Jacob Vlijm

Sağol Jacob. Güne yeni başladım, bir deneyeyim. Bu tam olarak istediğim gibi geliyor !!! Ben içine almak ve geri rapor edeceğim.
Dennis J,

Jacob, buna henüz başlamadım. Başlamadan önce, yedek bir resim yapmak istiyorum. Sistem Ayarları'ndaki Yedeklemelerin bölümün tamamını geri yükleyeceğinden emin değilim. Clonezilla'yı araştırıyor, bir görüntüyü oluşturmak / geri yüklemek için iyi bir araç gibi görünüyor. Bu şekilde bir şeyler ters giderse, ben de batırmadan önce geri dönebilirim. Bu hafta yolda yeni bir 1TB sürücü var. Sistemi taşımak için Clonezilla kullanmam gerekecek. Senaryolar onları izleyebiliyor gibi görünüyorum ve gideceğim andan itibaren rapor vereceğim. Takip için teşekkürler, iddiaya girerim başkaları da yaptıklarını takdir edecektir.
Dennis J,

Yanıtlar:


24

Çalışma alanı başına farklı bir Birlik Başlatıcı ayarlama:


1. görüntü tanımını buraya girin 2. görüntü tanımını buraya girin 3. görüntü tanımını buraya girin 4. görüntü tanımını buraya girin

Aşağıdaki çözüm, çalışma alanınız kaç olursa olsun, çalışma alanı başına farklı bir başlatıcı simgesinin olmasını kolayca mümkün kılar.

Kurulum iki bölümden oluşmaktadır:

  1. Geçerli çalışma alanı için başlatıcı simgeler kümesini "hatırlamak" için bir (bir) kısayol tuşu birleşimi.

  2. Arka planda çalışan bir komut dosyası, geçerli çalışma alanının ne olduğunu ve ilgili Birlik Başlatıcı'nın ayarını takip eder. Kullanıcı çalışma alanını değiştirdiğinde hareket eder.

Nasıl çalışır

İki küçük komut dosyası dahil edilir:

İlk komut basit bir şey yapar: adlandırılmış ev dizininde bir (gizli) dosyasına akım başlatıcı içeriğini yazar mevcut çalışma sonrasında (numaralı).

İkinci senaryo geçerli çalışma alanıdır şeylere dikkat tutar. Bir çalışma alanı değişikliği varsa, komut dosyası karşılık gelen (başlatıcı-) veri dosyası olup olmadığını görür (ilk komut dosyası tarafından oluşturulur). Eğer öyleyse, dosyayı okur ve Unity Launcher'ı, dosyada hatırlandığı şekilde değiştirir.

Bu kadar.

Nasıl kurulur

  1. Komut dosyasının wmctrlyüklenmesi gerekiyor :

    sudo apt-get install wmctrl
    
  2. Her iki komut dosyasının da depolanacağı bir dizin oluşturun . Her iki komut dosyasının da bir dizinde bir arada tutulması önemlidir, çünkü işlevleri paylaşırlar ve biri diğerinden içe aktarılır. Aynı sebepten dolayı, aşağıda belirtildiği şekilde isimlendirmeniz önemlidir.

  3. Aşağıdaki komut dosyalarının her birini (farklı) boş bir dosyaya kopyalayın, onları tam olarak adlandırılmış dizine (oluşturulan 2.) kaydedin :

    set_workspace.py

    #!/usr/bin/env python3
    import subprocess    
    import os
    
    workspace_data = os.environ["HOME"]+"/.launcher_data_"
    key = ["gsettings get ", "gsettings set ", "com.canonical.Unity.Launcher favorites"]
    
    def get_res():
        # get resolution
        xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
        pos = xr.index("current")
        return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
    
    def current():
        # get the current viewport
        res = get_res()
        vp_data = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
        dt = [int(n) for n in vp_data[3].split("x")]
        cols = int(dt[0]/res[0])
        curr_vpdata = [int(n) for n in vp_data[5].split(",")]
        curr_col = int(curr_vpdata[0]/res[0])+1; curr_row = int(curr_vpdata[1]/res[1])
        return str(curr_col+curr_row*cols)
    
    def remember_current():  
        currlauncher = subprocess.check_output(["/bin/bash", "-c", key[0]+key[2]]).decode("utf-8").strip()
        f = workspace_data+current()
        open(f, "w").write(currlauncher)
    
    if __name__ == "__main__":
        remember_current()

    launcher_perworkspace.py

    #!/usr/bin/env python3
    import subprocess
    import set_workspace
    import time
    
    workspace_data = set_workspace.workspace_data
    key = set_workspace.key
    
    def check_datafile(desktop):
        f = workspace_data+str(desktop)
        try:
            new_launcher = open(f).read()
            command = key[1]+key[2]+' "'+str(new_launcher)+'"'
            subprocess.Popen(["/bin/bash", "-c", command])
        except FileNotFoundError:
            pass
    
    curr_dt1 = set_workspace.current()
    check_datafile(curr_dt1)
    
    while True:
        time.sleep(1)
        curr_dt2 = set_workspace.current()
        if curr_dt2 != curr_dt1:
            check_datafile(curr_dt2)
        curr_dt1 = curr_dt2
  4. İlk komut dosyasını ( set_workspace.py) seçtiğiniz bir kısayol tuşu kombinasyonuna ekleyin: Sistem Ayarları> "Klavye"> "Kısayollar"> "Özel Kısayollar". "+" İşaretini tıklayın ve şu komutu ekleyin:

    python3 /path/to/set_workspace.py
    
  5. Tuş birleşimini çalıştırın ve .launcher_data_3ana dizininizde gibi bir dosyanın oluşturulduğunu görün. Dosyayı görünür yapmak için Ctrl+ tuşuna basmanız gerekebilir H(dosyalar, .varsayılan olarak görünmez olan).

    Çalışma alanlarınız arasında gezinin ve prosedürü tekrarlayın: başlatıcı simgelerinin bir kombinasyonunu ayarlayın ve o belirli çalışma alanı için takımı "hatırlamak" için tuş kombinasyonunuza basın.

  6. Şimdi pratikte bitti. Background script'i komut ile test et (terminal penceresinden çalışmaya devam et):

    python3 /path/to/launcher_perworkspace.py
    

    Her şey yolunda giderse ve başlatıcınız çalışma alanı başına geçerse, Başlangıç ​​uygulamalarınıza aşağıdaki komutu ekleyin: Dash> Başlangıç ​​Uygulamaları> Ekle:

    /bin/bash -c "sleep 15&&python3 /path/to/launcher_perworkspace.py"
    

notlar

  1. Belirli bir çalışma alanı için başlatıcı simge kümesini değiştirmek istiyorsanız, çalışma alanına gidin, istediğiniz gibi simgeler ekleyin / çıkarın ve tuş kombinasyonunuza basın (arka plan komut dosyasını yeniden başlatmanız gerekmez).
  2. Yorumlardan, mevcut çalışma alanı için mevcut Başlatıcı'yı hatırlamak için kısayolda bazı yanlış anlamaların olduğu hissine kapılıyorum. Geçerli çalışma alanı için geçerli başlatıcıyı "kaydetmek" için yalnızca bir klavye kısayoluna ihtiyacınız vardır . Hangi çalışma alanında olursanız olun aynı şekilde çalışacaktır. Komut dosyasının kendisi , geçerli çalışma alanının ne olduğunu belirler .

Düzenle

Yorumunuzdan, komut (lar) ı çalıştırmaktan emin olmadığınızı ve şu anki başlatıcınızı mahvedeceğinizden korktuğunuzu anlıyorum.

Senaryonun ne yaptığına çok fazla (veya çok az :)) saygı duyduğuma eminim. Ancak şu anki Unity Launcher'ı şu komutla yedekleyebilirsiniz:

printf 'gsettings set com.canonical.Unity.Launcher favorites "' > ~/launcher_output&&printf "$(gsettings get com.canonical.Unity.Launcher favorites)">>~/launcher_output&&printf '"'>>~/launcher_output

Bu, ~/launcher_outputUnity Launcher'ınızı başlangıç ​​durumuna geri yüklemek için complete komutunu içeren bir dosya oluşturur . Acil durumlarda, sadece dosyanın içeriğini kopyalayın ve terminale yapıştırın.

Fakat yine de, senaryoyu elle değiştirmediğiniz sürece, başlatıcınızı karıştırmanız pek mümkün değildir.


ÖNEMLİ EDIT (2)

Bir yorumda istendiği gibi, burada herhangi bir kısayol kombinasyonu kullanmak zorunda kalmadan çalışan bir versiyonu ; sadece betiği çalıştırın ve başlatıcılarınızı belirli çalışma alanlarına kurmaya başlayın. Komut dosyası, farklı çalışma alanlarındaki (Unity-) başlatıcı kümenizi hatırlamak için ana dizininizde (görünmez) dosyalar oluşturur.

Bunu betiğin "sürüm 1" ini denedim, ancak her zaman iki başlatıcı denetimini iki çalışma alanı denetimi arasına "gömmek", çalışma alanlarından hızla geçerken istenmeyen davranışları (hatalı verileri kaydetmeyi) önlemek için hile olduğu ortaya çıktı.

Nasıl kullanılır

  1. İlk versiyonda olduğu gibi, bu komut dosyası wmctrlşunları kullanır :

    sudo apt-get install wmctrl

  2. Komut dosyasını boş bir dosyaya kopyalayın, olarak kaydedin. launcher_toworkspace.py

  3. Komutu ile çalıştırın:

    python3 /path/to/launcher_toworkspace.py
    
  4. Beklendiği gibi çalışıyorsa, Başlangıç ​​Uygulamalarınıza aşağıdaki komutu ekleyin:

    /bin/bash -c "sleep 15&&python3 /path/to/launcher_toworkspace.py"
    

Senaryo

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

datadir = os.environ["HOME"]+"/.config/lswitcher"
if not os.path.exists(datadir):
    os.makedirs(datadir)
workspace_data = datadir+"/launcher_data_"

key = [
    "gsettings get ",
    "gsettings set ",
    "com.canonical.Unity.Launcher favorites",
    ]

def get_launcher():
    return subprocess.check_output(
        ["/bin/bash", "-c", key[0]+key[2]]
        ).decode("utf-8").strip()

def get_res():
    # get resolution
    xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    pos = xr.index("current")
    return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]

def current():
    # get the current viewport
    res = get_res()
    vp_data = subprocess.check_output(
        ["wmctrl", "-d"]
        ).decode("utf-8").split()
    dt = [int(n) for n in vp_data[3].split("x")]
    cols = int(dt[0]/res[0])
    curr_vpdata = [int(n) for n in vp_data[5].split(",")]
    curr_col = int(curr_vpdata[0]/res[0])+1
    curr_row = int(curr_vpdata[1]/res[1])
    return str(curr_col+curr_row*cols)

curr_ws1 = current()
currlauncher1 = get_launcher()

while True:
    time.sleep(1)
    currlauncher2 = get_launcher()
    curr_ws2 = current()
    datafile = workspace_data+curr_ws2
    if curr_ws2 == curr_ws1:
        if currlauncher2 != currlauncher1:
            open(datafile, "wt").write(currlauncher2)
    else:
        if not os.path.exists(datafile):
            open(datafile, "wt").write(currlauncher2)
        else:
            curr_set = open(datafile).read()
            command = key[1]+key[2]+' "'+str(curr_set)+'"'
            subprocess.Popen(["/bin/bash", "-c", command])
    curr_ws1 = curr_ws2
    currlauncher1 = get_launcher()

Not

Çalışma alanlarınızı betiğin önceki sürümüyle ayarladıysanız, bu sürüm için de çalışması gerekir.

PPA

2015-04-23 uyarınca, Dennis J'nin ve Parto'nun cesaretlendirmesinin güzel sorusu, onu yönetmek için bir GUI dahil olmak üzere webupd8'de eleppa alınan bir betiğin oluşturulmasına yol açmıştır .

ppa:vlijm/lswitcher

Yüklemek için çalıştırın:

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

görüntü tanımını buraya girin

Şimdiden beri, Güvenilir ve Ütopik için paketlenmiştir. Testten sonra başkalarını ekleyeceğim. Ayrıca bir .debyükleyici daha ekleyeceğim , ancak kullanmanızı öneririm ppa, çünkü genellikle bu tür şeyler her zaman ve her gün güncellenir.

Viewport verilerinin yer değiştiğini yana ~/etmek ~/.config/lswitcher, size önceki senaryoyu kullanılırsa tekrar Unity Launcher kurmak gerekecek.


Klavye kısayollarını kullanmadan bu mümkün mü? Nasıl görselleştirebilirim: Çalışma alanında birinci olduğunda, yalnızca bir simge kümesi gösterilir; Çalışma alanı iki'ye geçtiğimde, fırlatıcı çizgi ve çöp kutusu simgeleri dışında boştur - sonra da otomatik olarak kaydedilmesini istediğim simgeleri eklerim. Diğer çalışma alanları için tekrarlayın. Belki bunun için bir GUI bile oluşturabilirsiniz - eğer çalışırsanız +500 verir. GUI isteğe bağlıdır.
Parto

1
@Parto WOW, birinin dikkatini nasıl çekeceğini biliyorsun :) Elbette bu mümkün, ancak sorunsuz çalışması için birden fazla iş parçacığı olacaktı ("mono" parça komut dosyasında denedim). Önümüzdeki birkaç gün içinde bir cevap bekliyoruz :).
Jacob Vlijm

1
Muhteşem. Bekleyeceğim ... ama güzel bir soru, nasıl düşünmedim merak ediyorum.
Parto

1
@ Pato Cömertliğinizden etkilendiğimi söylemeliyim. Üzerinde daha fazla çalışmayı planlıyorum ve belki de ppabaşlatmak / durdurmak için GUI, tercihler vb. Bu arada masaüstünüz harika görünüyor!
Jacob Vlijm

1
İstediğin zaman. Herkesin şimdi bir itmeye ihtiyacı var. Üstelik daha önce bana yardım ettin - sadece bir teşekkür olarak düşün. Bu 'proje' hakkında, herkes bir teknoloji olmadığı için bir ppa iyi olurdu.
Parto
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.