GNU/Linux >> Znalost Linux >  >> Ubuntu

Spustit aplikaci, pouze pokud ještě není otevřená?

Chtěl bych napodobit použití Alfreda na Mac OS X, kde pokud se pokusíte otevřít aplikaci po jejím vyhledání, otevře se nové okno pouze v případě, že program již není spuštěn, jinak se zaměří na aktuálně spuštěná instance této aplikace. Je vůbec možné změnit výchozí chování spouštěče tak, aby to zkontroloval před otevřením nového okna?

Nejlepší odpověď

Aktualizace 7. dubna:Přidána jiná verze a nalezena Albert, viz aktualizace a bonus níže!!!

Funkce pomlčky :
Ptali jste se ” Existuje přesto změnit výchozí chování spouštěče, aby se toto zkontrolovalo před otevřením nového okna “. Základní odpověď je, ne, jako běžný uživatel nemáte žádný způsob, jak přidat toto chování do dash. Pokud by se však našel vývojář unity scope, který by byl ochoten to implementovat, můžete se na něj obrátit nebo jej vyvinout sami, pokud máte odhodlání a ochotu se učit. Moje kódovací dovednosti jsou velmi skromné, proto jako řešení používám skriptování v shellu a dostupné grafické rozhraní pro skripty.

Související informace

Původní příspěvek:

Napsal jsem skript, který používá zeity dialog a wmctrl k dosažení toho, co jste požadovali. Všimněte si, že se jedná o grafický skript, což znamená, že bude fungovat pouze s okny v GUI a nebude fungovat, pokud se pokusíte spustit něco v tty. Kromě toho, jak jsem pochopil, Alfred dělá přesně to samé. Můžete k němu vytvořit zástupce na ploše nebo spouštěcího zástupce, jak je popsáno zde a zde.

Skript:

#!/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 https://askubuntu.com/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

Poznámky: v předchozí verzi skript používal echo $?, aby otestoval, zda předchozí výrazy úspěšně skončily. Podle Muruova návrhu (z úpravy) jsem změnil kód na poněkud kompaktnější verzi, takže vám doporučuji podívat se na předchozí a současnou verzi.

Také dříve wmctrl -a $MYPROG nefungovalo při testování prohlížeče google-chrome nebo chromium-browser; z nějakého hloupého důvodu mají některé programy vlastnost WM_CLASS okna s velkými písmeny, zatímco program uvedený v dpkg --get-selections je malá písmena (stačí si přečíst man wmctrl a spusťte wmctrl -lx , budete vědět). Přidání toho -ax by se o to mělo postarat. Skript zobrazí již otevřené okno chromium, jak by mělo

Další věc – wmctlr je poněkud zvláštní v tom, že občas potřebuje zpoždění (měl jsem s tím zkušenost v jiném skriptu), takže jsem musel přidat sleep 1 čára. Dříve to šlo tak nějak zapínat a vypínat s firefoxem, ale teď funguje bez problémů.

Související:Bluetooth na Ubuntu 16.04?

Skript v akci

V animaci níže můžete vidět, že při prvním spuštění skriptu je otevřena jedna instance firefoxu a skript přepne fokus na toto okno; při druhém testu otevřu novou instanci google-chrome, která předtím nebyla otevřena.
(Poznámka na okraj:Pokud vás mimochodem zajímá plocha, je to openbox s cairo dockem)

Na základě návrhu v komentářích byla odstraněna vložená animace, pouze zveřejněný odkaz. Pokud je rozbitá, hlaste prosím! http://i.stack.imgur.com/puuPZ.gif

Aktualizace, 7. dubna

Skript jsem poněkud vylepšil, aby byly všechny programy uvedeny v rozevíracím poli zeity. Nyní si uživatel nemusí pamatovat každý program, ale může pouze procházet jejich seznamem pomocí kláves se šipkami nebo otevřít rozbalovací nabídku. Tato vylepšená verze také nezobrazuje okna podle názvu, ale podle ID okna, což poskytuje mnohem lepší výkon. Všimněte si, že způsob, jakým procházím soubory .desktop, je poněkud nadbytečný, používám dvakrát příkaz cut, ale protože můj script-fu zatím není tak dobrý, je to jediné, co mohu udělat. Návrhy na zlepšení jsou vítány!

#!/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 https://askubuntu.com/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:

Vlastně jsem našel Albert , což je linuxová verze Alfreda, ale sám jsem to nezkoušel. Stojí za to se podívat. Nicméně, jak již Jacob poznamenal, je stále buggy.

Existuje aplikace s názvem Gnome-Do, která graficky vypadá podobně jako Alfred, ale nemá stejné funkce jako tento skript.

Dejte mi vědět, jestli se vám tento skript líbí, jestli je potřeba něco opravit, a pokud to považujete za užitečné, nezapomeňte hlasovat pro odpověď


Ubuntu
  1. Připojení řádku k souboru pouze v případě, že ještě neexistuje

  2. Odstraňte pouze soubory v adresáři v adresářích linux NOT

  3. přidat řádek do souboru POUZE pokud v souboru již není

  1. Jak otevřít Appimage v Linuxu

  2. Proč Files (nautilus) otevírá nové okno, i když je již jedno otevřené?

  3. Emulátor -avd nespustí virtuální zařízení?

  1. Keepassx 0.4.3 On 11.10 (jednota) Není vidět v přepínači úloh (alt-tab)?

  2. Xubuntu Libre Office Calc nemůže otevřít síťový soubor?

  3. Jak udělat, aby Alt-w zavřela aktuální kartu, ne aktuální okno, v prostředí Gnome?