Sıcak Köşeleri Unity'de özel komutları çalıştıracak şekilde ayarlayabilir miyim?


13

Sıcak Köşeleri gerçekten seviyorum. :-)

Aşağıda gösterildiği gibi sıcak köşede özel bir komut çalıştırmak bir şekilde mümkün mü?

resim açıklamasını buraya girin


Özellikle hotcorners ile mümkün olduğunu düşünmüyorum (en azından Unity'nin bunları kullanma şekliyle değil), ancak fare ekranın belirli bir alanına yerleştirildiğinde komut dosyalarını tetiklemek mümkündür. Örneğin, askubuntu.com/a/758307/295286 , Fareyle üzerine gelme bölümü bölümüne bakın. Hotcorners'a daha fazla bakacağım, ancak bunlar işe yaramazsa, özel komut dosyası iyi mi?
Sergiy Kolodyazhnyy

Çoklu monitör mü yoksa tekli mi?
Jacob Vlijm

Merhaba orschiro, gönderildi. Lütfen her şeyin açık olup olmadığını belirtin.
Jacob Vlijm

Hey, burada cevabımda olduğundan daha fazla hotcorner var. Kaç tane tercih ederdin?
Jacob Vlijm

2
@JacobVlijm, Serg, Cevabımı gör.
wjandrea

Yanıtlar:


10

ccsm

  1. CompizConfig Ayarlar Yöneticisi'ni (CCSM) yükleyin. Terminalde çalıştır:

    sudo apt-get install compizconfig-settings-manager
  2. CCSM'yi açın.

  3. "Komutlar" a gidin
  4. Yuvalardan birine istediğiniz komutu girin. Örneğin:

    CCSM ekran görüntüsü - komut

  5. "Kenar Bağlamaları" sekmesine gidin

  6. "Hiçbiri" ni tıklayın ve yeni ayarladığınız komuta karşılık gelen istediğiniz sıcak köşeyi (veya kenarı) ayarlayın

    CCSM ekran görüntüsü - sıcak köşeler

  7. Farenizi köşeye getirin

  8. Şimdi komutunuz çalıştırıldı!

    CCSM ekran görüntüsü - komut çalışıyor

14.04 tarihinde çalıştığı onaylandı.


Önerilen tüm çözümlerden en kolayı. Bir komut dosyası aracılığıyla daha iyi gerçekleştirilmiş komut isteniyorsa, sadece compiz komutunu bu komut dosyasına işaret edin veya komut dosyası $ PATH içindeki bir bin klasöründeyse sadece komut dosyası adını verin. Sadece olası bir dezavantaj birlik / compiz'in kullanıcı kümesi komutlarını, yani entegre edilmemiş olanları rastgele 'kaybettiği' bilinmektedir. Bir kullanıcı komutunun nasıl entegre edileceği bu sorunun kapsamı dışındadır.
Doug

@wjandrea Sonuçta uygulanır. Compiz beni şaşırtmaz. İyi cevap, OP'nin istediği şey için en uygun. + 1'ed
Sergiy Kolodyazhnyy

Maalesef haklısın haha. Evet OP'nin tam olarak sorduğu şey.
Jacob Vlijm

Düzenlemeleriniz ve cevaplarınızla ilgili bana birkaç kez yardımcı oldunuz. Ole'Serg'in eskiden söylediği gibi bir "çerez" var ... gerçekten yarım düzine var :)
WinEunuuchs2Unix

6

Özel komutlar

Unity kullanıyorsanız ve ccsm yüklüyse, wjandrea'nın cevabı elbette cevabınızdır. Değilse veya diğer dağıtımlarda kullanmak için hafif bir alternatif faydalı olabilir.

Aşağıdaki komut dosyasıyla, hotcorner'larınızın her birine özgü herhangi bir komutu ayarlayabilirsiniz .

Örnek olarak, aşağıdaki kurulumu yaptım:

  • Sol Üst Eylem yok
  • Sağ Üst Run Gedit
  • Sol Alt İşlem yok
  • Sağ Alt Run Gnome terminali

Elbette komutların harici komut dosyalarını çalıştırmasını da sağlayabilirsiniz.

Ayrıca, satırdaki sıcak köşenin boyutunu ayarlayabilirsiniz :

cornersize = 10

Sadece değeri (piksel) değiştirin. Komut dosyası, komutlarınızı tetiklemek için (kare) alanları ayarlar:

resim açıklamasını buraya girin

Senaryo

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

cornersize = 20

commands = [
    None,
    "gedit",
    None,
    "gnome-terminal",
    ]

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()

def get_pos():
    return [int(s.split(":")[1]) for s in get(["xdotool", "getmouselocation"]).split()[:2]]

scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2
res = [int(n) for n in scrdata[resindex].split("+")[0].split("x")]

match1 = None

while True:
    time.sleep(1)
    xy = get_pos()
    x = xy[0]; y = xy[1]
    test = [
        [x < cornersize, y < cornersize],
        [x > res[0]-cornersize, y < cornersize],
        [x < cornersize, y > res[1]-cornersize],
        [x > res[0]-cornersize, y > res[1]-cornersize],
        ]
    match2 = [i for i, p in enumerate(test) if all(p)]
    if match2 != match1:
        if match2:
            cmd = commands[match2[0]]
            if cmd:
                subprocess.Popen(["/bin/bash", "-c", cmd])
    match1 = match2

Kurmak

  1. Betiğin ihtiyacı var xdotool

    sudo apt install xdotool
  2. Komut dosyasını boş bir dosyaya kopyalayın, i'yi farklı kaydedin hotcorners2.py
  3. Komut dosyasının başında komutlarınızı ayarlayın (tırnaklara dikkat edin)

    commands = [
        None,
        "gedit",
        None,
        "gnome-terminal",
    ]

    (daha sonra sol üst / sağ, sol alt / sağ)

  4. Komut dosyasını test edin:

    python3 /path/to/hotcorners2.py
  5. Tümü iyi çalışıyorsa Başlangıç ​​Uygulamaları'na ekleyin: Çizgi> Başlangıç ​​Uygulamaları> Ekle. Komutu ekleyin:

    /bin/bash -c "sleep 5 && python3 /path/to/hotcorners2.py"

notlar

  • Komut dosyası şu anda (ilk) ekranda çalışır. Birden fazla ekrana bakmak, hatta farklı ekranlarda farklı şeyler yapmak için kolayca düzenlenebilir, lütfen belirtin.
  • Birkaç kişi beğenirse, rahat kullanım ve kolay kurulum için bir gui ve ppa ekleyebiliriz.

DÜZENLE

Biraz daha gelişmiş bilgi işlem kullanırsak , komutları tetiklemek için kare alan yerine yarıçap kullanabiliriz (iyi eski @pythagoras sayesinde):

resim açıklamasını buraya girin

Küçük fark, ama sadece eğlence için:

Senaryo

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

# set distance (hotcorner sensitivity)
radius = 20

# top-left, top-right, bottom-left, bottom-right
commands = [
    None,
    "gedit",
    None,
    "gnome-terminal",
    ]

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()

def get_pos():
    return [int(s.split(":")[1]) for s in get(["xdotool", "getmouselocation"]).split()[:2]]

# get the resolution
scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2
res = [int(n) for n in scrdata[resindex].split("+")[0].split("x")]
# list the corners, could be more elegant no doubt
corners = [[0, 0], [res[0], 0], [0, res[1]], [res[0], res[1]]]

match1 = None

while True:
    time.sleep(1)
    pos = get_pos()
    # get the current difference from the mousepointer to each of the corner (radius)
    diff = [int(math.sqrt(sum([(c[i]-pos[i])**2 for i, n in enumerate(res)])))\
            for c in corners]
    # see if any of the corners is "approached" within the radius
    match2 = [diff.index(n) for n in diff if n < radius]
    # if so, and the corresponding command is not set to None, run it.
    if all([match2 != match1, match2]):
        cmd = commands[match2[0]]
        if cmd:
            subprocess.Popen(["/bin/bash", "-c", cmd])
    match1 = match2

kullanım

Hemen hemen aynı. Komutlarınızı ve tetiklenecek yarıçapı komut dosyasının baş bölümünde ayarlayın.


5

NOT:

wjandrea'nın cevabı , varsayılan Ubuntu veya Ubuntu Kylin kullanan (veya ekran yöneticisi olarak compiz olan) biri için en uygun cevaptır, bu yüzden benim oyumu ve saygımı alır. Aşağıda verilen cevap Birlik üzerinde de kullanılabilir, ancak muhtemelen biraz gereksiz olacaktır. Ancak, compiz olmayan masaüstü ortamlarında, aşağıda sunulan gösterge kullanılabilir. Kısaca Lubuntu 16.04 VM'de test ettim, bu yüzden orada çalıştığını biliyorum ve Kylin 14.04 ile de uyumlu hale getirdi. GNOME ve MATE masaüstü bilgisayarlar için, herhangi bir göstergeyi kullanabilmek için önce AppIndicators'ı etkinleştirmeniz gerekir.

Giriş

indicator-edgerEkranın 4 kenarı boyunca herhangi bir yerde fare konumuna göre kullanıcı tanımlı komutları tetiklemeye izin veren uyguladım . Orijinal versiyon bir gün içinde, yaklaşık 7 saat içinde yapıldı, bu yüzden oldukça minimalist ama işi yapıyor.

resim açıklamasını buraya girin

Gösterge ~/.edger-commands.json, açıkça jsonformatta dosya üzerinden kontrol edilir . Kullanıcı tarafından manuel olarak yazılabilir veya göstergenin DEFINE COMMANDSseçeneği ile ayarlanabilir . Tetiklemeyi etkinleştirme / devre dışı bırakma seçeneği hatırlanır ve kullanıcının rahatlığı için otomatik olarak dosyaya yazılır. Örnek yapılandırma dosyası şöyle olacaktır:

{
    "right": "gnome-terminal",
    "top": "firefox",
    "left": "",
    "bottom": "gnome-screenshot",
    "enabled": true
}

"left"Dosyadaki girişi not edin . Bu kenar ayarlanmamıştır, ancak jsonsözdizimi nedeniyle orada boş bir dize, yani tırnak işareti olması gerekir "".

Gösterge, kullanıcının fareyi kenarlardan herhangi birine (~ 3 piksel kenar boşluğu ile) yerleştirdiğini algıladığında, gösterge bir kabarcık bildirimi gönderir ve uygun komutu (tanımlanmışsa) çalıştırır. Kullanıcı fareyi kenardan uzaklaştırmadıkça tetiğin etkinleştirilmesi tekrarlanmaz.

resim açıklamasını buraya girin

Yukarıdaki ekran görüntüsünde görebileceğiniz gibi, göstergede ayrıca komut satırında hata ayıklama çıkışı vardır. Herhangi bir hata bulursanız, terminalden çalıştırmaktan çekinmeyin, hatanın ne olduğunu öğrenin ve projenin GitHub'ının sorunlar sayfasında uygun hata raporu gönderin .

Şu anda köşeler için destek yok (sadece kenarlar) ve tek monitör kurulumu için üretildi (açıkçası, oluşturulduktan sonraki 7 saat içinde tüm tabanları kapatamaz), ancak bu özellikler gelecekte kullanılabilir.

Kurulum ve kaynak kodu

Kaynak kodu Projeler GitHub sayfasında veya Launchpad'de bulunabilir . Kurulum terminalde aşağıdaki komutlarla gerçekleştirilir:

sudo add-apt-repository ppa:1047481448-2/sergkolo
sudo apt-get update
sudo apt-get install indicator-edger
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.