Güncelleme 7 Nisan: Farklı bir sürüm eklendi ve Albert bulundu, güncelleme ve Bonus feryat bakınız !!!
Kısa çizgi işlevselliği ile ilgili olarak : " Yeni bir pencere açmadan önce başlatıcısının bunu kontrol etmek için varsayılan davranışını değiştirmek için yine de var mı? " Temel cevap, hayır, normal bir kullanıcı olarak bu davranışı kısa çizgiye eklemenin hiçbir yolu yoktur. Bununla birlikte, bunu uygulamaya istekli bir birlik kapsamı geliştiricisi varsa, çözüme ulaşmaya ve öğrenmeye istekliyseniz onlara yaklaşabilir veya kendiniz geliştirebilirsiniz. Kodlama becerilerim çok mütevazı, bu nedenle kabuk komut dosyası ve komut dosyaları için kullanılabilir grafik ön uç kullanıyorum.
İlgili bilgi
Orijinal yayın:
Ne istediğini elde etmek için zenity diyalog ve wmctrl kullanan bir senaryo yazdım. Bunun grafiksel bir komut dosyası olduğuna dikkat edin, yani GUI'de yalnızca pencerelerle çalışır ve tty'de bir şey başlatmaya çalışırsanız çalışmaz. Ayrıca, anladığım kadarıyla Alfred de aynı şeyi yapıyor. Burada ve burada açıklandığı gibi bir masaüstü kısayolu veya başlatıcı kısayolu oluşturabilirsiniz .
Senaryo:
#!/bin/bash
# Author: Serg Kolo
# Description: A launcher script that checks whether
# or not a window of a particular program already exists
# If a window of such program is open, bring it to focus
# Otherwise - launch a new window
# Written for /ubuntu//q/440142/295286
# Date: April 6 , 2015
#
MYPROG=$( zenity --entry --title='MY LAUNCHER' --text='Type the name of application to run' )
sleep 0.5
wmctrl -lx | awk '{print $3}' | grep -i "$MYPROG"
if [ $? -eq 0 ]; then
sleep 1
wmctrl -xa $MYPROG
#as an alternative try the line bellow
#wmctrl -a $MYPROG
exit 1
else
$MYPROG &
exit 0
fi
Yan notlar: önceki sürümde, komut dosyası önceki ifadelerin başarıyla çıkıp çıkmadığını test etmek için echo $? Muru'nun önerisine göre (düzenlemeden), kodu biraz daha kompakt bir sürüme değiştirdim, bu yüzden önceki sürüme ve geçerli olana bir göz atmanızı öneririm.
Ayrıca, daha önce wmctrl -a $MYPROG
google-chrome veya chrome-browser testleriyle çalışmadı; bazı aptal nedenlerle, bazı programlar WM_CLASS özelliğinin büyük harfle yazılmasını sağlarken, listelenen program dpkg --get-selections
küçük harflidir (sadece okuyun man wmctrl
ve çalıştırın wmctrl -lx
, bileceksiniz). -Ax eklenmesi bununla ilgilenmelidir. Betik zaten açık olan krom penceresini olması gerektiği gibi getiriyor
Başka bir şey - wmctlr bazen (başka bir komut dosyasında onunla deneyimi vardı) bir gecikme ihtiyacı biraz garip, bu yüzden sleep 1
satır eklemek zorunda kaldı . Daha önce firefox ile biraz açık ve kapalı olurdu, ama şimdi yüzerek çalışıyor.
Uygulamadaki komut dosyası
Aşağıdaki animasyonda, komut dosyasının ilk çalıştırılmasında bir tane firefox açık örneği olduğunu ve komut dosyasının odağı bu pencereye değiştirdiğini görebilirsiniz; ikinci testte, daha önce açık olmayan yeni google-chrome örneğini açtım. (Yan not: Bu arada masaüstünden cüret ediyorsanız, bu, cairo dock'lu openbox'tır)
Yorumlardaki öneri başına, gömülü animasyon kaldırıldı, yalnızca yayınlanan bağlantı. Bozuksa bildirin lütfen!
http://i.stack.imgur.com/puuPZ.gif
Güncelleme, 7 Nisan
Betiği, zenity'nin açılan giriş kutusunda listelenen tüm programları yapmak için biraz geliştirdim. Artık kullanıcının her programı ezberlemesi gerekmez, ancak ok tuşlarını kullanarak bir listede gezinebilir veya sadece açılır menüyü açabilirsiniz. Ayrıca, bu geliştirilmiş sürüm pencereleri adlarına göre değil, daha iyi performans sağlayan pencere kimliğine göre yükseltir. Not, .desktop dosyalarından geçme şeklim, cut komutunu iki kez kullanarak biraz gereksiz, ancak benim script-fu o kadar iyi olmadığından, yapabileceğim tek şey bu. İyileştirme önerileri bekliyoruz!
#!/bin/bash
# Author: Serg Kolo
# Description: Second version of a launcher script that checks whether
# or not a window of a particular program already exists
# If a window of such program is open, bring it to focus
# Otherwise - launch a new window
# Written for /ubuntu//q/440142/295286
# Date: April 7 , 2015
#
set -x
MYPROG=$(zenity --entry --text 'Select program from list' --entry-text $(ls /usr/share/applications/*.desktop | cut -d'/' -f5 | cut -d'.' -f1 | xargs echo))
sleep 0.5
# Do we have a window of such program ?
wmctrl -lx| awk '{print $3}' | grep -i $MYPROG
if [ $? -eq 0 ]; then
sleep 0.5 # if yes, find that window id, and raise it
WINID=$(wmctrl -lx | grep -i $MYPROG | awk 'NR==1{print $1}')
wmctrl -ia $WINID &
# exit 0
else
echo $MYPROG | grep -i libreoffice
if [ $? -eq 0 ]
then
MYPROG=$(echo $MYPROG | sed 's/-/ --/g')
fi
$MYPROG &
# exit 0
fi
Bonus:
Aslında Alfred'in Linux versiyonu olan Albert'i buldum , ama kendim denemedim. Yine de kontrol değer. Ancak, Jacob'un daha önce de belirttiği gibi, hala buggy.
Grafiksel olarak Alfred'e benzeyen Gnome-Do adlı bir uygulama var, ancak bu komut dosyasıyla aynı işlevselliğe sahip değil.
Bu komut dosyasını beğendiyseniz, düzeltilmesi gereken bir şey varsa bana bildirin ve yararlı bulursanız cevabı yükseltmeyi unutmayın.