Aktualizacja 7 kwietnia: Dodano inną wersję i znaleziono Alberta, zobacz aktualizację i Bonus poniżej !!!
Dotyczące funkcjonalności deski rozdzielczej : Zapytałeś: „ Czy mimo to można zmienić domyślne zachowanie programu uruchamiającego, aby to sprawdzić przed otwarciem nowego okna ”? Podstawowa odpowiedź brzmi: nie, jako zwykły użytkownik nie masz możliwości dodania tego zachowania do myślnika. Jeśli jednak byłby programista zakresu jedności, który byłby skłonny to zaimplementować, możesz do nich podejść lub sam go opracować, jeśli masz determinację i chcesz się uczyć. Moje umiejętności kodowania są bardzo skromne, dlatego używam skryptu powłoki i dostępnego graficznego interfejsu dla skryptów jako obejścia.
Powiązana informacja
Oryginalny post:
Napisałem skrypt, który używa dialogu zenity i wmctrl, aby osiągnąć to, o co prosiłeś. Zauważ, że jest to skrypt graficzny, co oznacza, że będzie działał tylko z oknami, w GUI i nie będzie działać, jeśli spróbujesz uruchomić coś w tty. Poza tym z tego, co rozumiem, Alfred robi dokładnie to samo. Możesz utworzyć do niego skrót na pulpicie lub skrót do programu uruchamiającego, jak opisano tutaj i tutaj .
Scenariusz:
#!/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
Dodatkowe uwagi: w poprzedniej wersji skrypt używał echa $ ?, aby sprawdzić, czy poprzednie wyrażenia zakończyły się powodzeniem. Zgodnie z sugestią Muru (z edycji) zmieniłem kod na nieco bardziej kompaktową, więc proponuję spojrzeć na poprzednią i aktualną.
Ponadto wcześniej wmctrl -a $MYPROG
nie działał z testowaniem google-chrome lub chrome-browser; z jakiegoś głupiego powodu niektóre programy mają właściwość WM_CLASS okna pisanego wielkimi literami, podczas gdy program wymieniony przez dpkg --get-selections
ma małe litery (po prostu czytaj man wmctrl
i uruchamiaj wmctrl -lx
, będziesz wiedział). Dodanie tego -ax powinno o to zadbać. Skrypt wyświetla już otwarte okno chromu tak, jak powinno
Kolejna rzecz - wmctlr jest nieco dziwny, ponieważ czasami potrzebuje opóźnienia (miał doświadczenie z innym skryptem), więc musiałem dodać sleep 1
linię. Wcześniej byłby to rodzaj włączania i wyłączania Firefoksa, ale teraz działa płynnie.
Skrypt w akcji
W poniższej animacji widać, że przy pierwszym uruchomieniu skryptu jest jedna instancja firefox, a skrypt przełącza fokus na to okno; w drugim teście otwieram nowe wystąpienie google-chrome, które nie było wcześniej otwarte. (Nota boczna: Nawiasem mówiąc, jeśli interesujesz się pulpitem, to jest to openbox z doku Cairo)
Zgodnie z sugestią w komentarzach usunięto osadzoną animację, opublikowano tylko link. Zgłoś, jeśli jest zepsuty, proszę!
http://i.stack.imgur.com/puuPZ.gif
Aktualizacja, 7 kwietnia
Ulepszyłem nieco skrypt, aby wszystkie programy wymienione w rozwijanym polu wprowadzania zenity. Teraz użytkownik nie musi zapamiętywać każdego programu, ale może po prostu przewijać listę za pomocą klawiszy strzałek lub po prostu otworzyć menu rozwijane. Ponadto ta ulepszona wersja podnosi okna nie według nazwy, ale według identyfikatora okna, co zapewnia znacznie lepszą wydajność. Zauważ, że sposób, w jaki przechodzę przez pliki .desktop jest trochę zbędny, używając dwukrotnie polecenia cut, ale ponieważ mój skrypt-fu nie jest do tej pory tak dobry, to wszystko, co mogę zrobić. Sugestie dotyczące ulepszeń są mile widziane!
#!/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
Premia:
Znalazłem Alberta , który jest wersją Alfreda dla Linuksa, ale sam tego nie próbowałem. Warto jednak to sprawdzić. Jednak, jak już zauważył Jacob, nadal jest wadliwy.
Istnieje aplikacja o nazwie Gnome-Do, która graficznie wygląda podobnie do Alfreda, jednak nie ma takiej samej funkcjonalności jak ten skrypt.
Daj mi znać, jeśli podoba Ci się ten skrypt, jeśli coś wymaga naprawy, i nie zapomnij głosować odpowiedzi, jeśli okażą się przydatne