В свободное время с целью начать изучать bash собрал на коленке нечто для вызова приложений...
Если приложение ещё не запущено, запускает приложение, в противном случае - переключает нас на рабочую область (workspace), где находится приложение, и делает его активным.
Вызов firefox'а:
Для себя каждому приложению назначил горячую клавишу.
Для работы скрипта необходим wmctrl:
|
sudo apt-get install wmctrl
|
summon.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
#!/bin/bash
# ~Pe Ell # Hotkey application summoner
# Todo: # - work with more than 1 window opened; # - automatic detection of application
if < $# -lt 1 >; then cat <<END Usage: $SELF <identificator> <WM_CLASS> <command><arguments>...
Switch to application window in any workspace or starts the application if it isn't running.
<identificator> Identificator of application need to be found.
<WM_CLASS> "wmctrl -xl | awk '{ print \$3 }'" or substring. <command> Path to run application if no window is found (optional). todo: arguments END exit 1 fi
idn=$1 wmc=$2 cmd=$3
if < -o $wmc >; then mode="auto" if < -o $cmd >; then cmd=$idn; fi if < $idn = "firefox" >; then wmc="Navigator.Firefox" elif < $idn = "eclipse" >; then wmc="Eclipse.Eclipse" cmd="/opt/eclipse/eclipse" elif < $idn = "thunderbird" >; then wmc="Mail.Thunderbird" elif < $idn = "deadbeef" >; then wmc="deadbeef.Deadbeef" unset idn elif < $idn = "photoshop" >; then wmc="Photoshop.exe.Wine" cmd="wine /home/dm/Soft/Photoshop/Photoshop.exe" unset idn elif < $idn = "remmina" >; then wmc="remmina.Remmina" cmd="remmina" unset idn elif < $idn = "gcalctool" >; then wmc="gcalctool.Gcalctool" unset idn elif < $idn = "nautilus" >; then wmc="nautilus.Nautilus" unset idn fi else mode="manual" fi
if < `wmctrl -xl | awk '{ print $3 }' | grep -c "$wmc"` != 0 >; then # Switching to found window in any workspace echo "act=switch" if < -o $idn >; then wmi=`wmctrl -xl | awk '{ if ( $3 == wmc ) { print $0 } }' wmc=$wmc` fi #temporary fix start i=0 for id in $wmi; do i=$<i> if < $i -lt 5 >; then continue; fi idn=$idn" "$id done idn=${idn:1} #temporary fix end wmctrl -a "$idn" else # Running application echo "act=run" $cmd fi
echo -e "mode=$mode\nidn=$idn\nwmc=$wmc\ncmd=$cmd"
exit 0</i></arguments>
|
Хотел до конца доработать полностью автоматическое определение и вызов приложения по одному идентификатору, но сил и времени так и не хватило.