Mac OS XでのAlfredの使用を模倣したいと思います。アプリを検索した後にアプリを開こうとすると、プログラムがまだ実行されていない場合にのみ新しいウィンドウが開きます。それ以外の場合は、そのアプリケーションの現在実行中のインスタンス。ランチャーのデフォルトの動作を変更して、新しいウィンドウを開く前にこれを確認する方法はありますか?
ベストアンサー
更新4月7日:別のバージョンが追加され、Albertが見つかりました。更新と以下のボーナスを参照してください!!!
ダッシュ機能について :
あなたは質問しました」新しいウィンドウを開く前にこれをチェックするためにランチャーのデフォルトの動作を変更する方法はありますか 「。基本的な答えは、いいえ、通常のユーザーとして、その動作をダッシュに追加する方法はありません。ただし、それを実装する意思のあるユニティスコープの開発者がいる場合は、解決策があり、学習する意思がある場合は、それらにアプローチするか、自分で開発することができます。私のコーディングスキルは非常に控えめなので、回避策としてシェルスクリプトとスクリプトに使用できるグラフィカルフロントエンドを使用します。
関連情報
元の投稿:
zenityダイアログとwmctrlを使用して、要求された内容を実現するスクリプトを作成しました。これはグラフィカルスクリプトであることに注意してください。つまり、GUIのウィンドウでのみ機能し、ttyで何かを起動しようとすると機能しません。その上、私が理解していることから、アルフレッドはまったく同じことをします。こことここで説明されているように、デスクトップショートカットまたはランチャーショートカットを作成できます。
スクリプト:
#!/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
サイドノート: 以前のバージョンでは、スクリプトはecho $?を使用して、以前の式が正常に終了したかどうかをテストしていました。 muruの提案(編集から)に従って、コードをややコンパクトなバージョンに変更したので、以前のバージョンと現在のバージョンを確認することをお勧めします。
また、以前はwmctrl -a $MYPROG
google-chromeまたはchromium-browserのテストでは機能しませんでした。いくつかの愚かな理由で、一部のプログラムはウィンドウのWM_CLASSプロパティが大文字になっていますが、プログラムはdpkg --get-selections
でリストされています。 小文字です(man wmctrl
を読んでください wmctrl -lx
を実行します 、あなたは知っているでしょう)。その-axを追加すると、これを処理する必要があります。スクリプトは、すでに開いているクロムウィンドウを表示します
もう1つのこと– wmctlrは、遅延が必要になることがあるという点でやや奇妙です(別のスクリプトで経験したことがあります)。そのため、sleep 1
を追加する必要がありました。 ライン。以前はFirefoxでオンとオフを切り替えることができましたが、現在は水泳で動作します。
実行中のスクリプト
以下のアニメーションでは、スクリプトの最初の実行時に、Firefoxのインスタンスが1つ開いており、スクリプトがフォーカスをそのウィンドウに切り替えていることがわかります。 2番目のテストでは、以前は開いていなかったgoogle-chromeの新しいインスタンスを開きます。
(補足:デスクトップに興味がある場合は、cairoドックを備えたopenboxです)
コメントの提案ごとに、埋め込まれたアニメーションが削除され、リンクのみが投稿されました。壊れている場合は報告してください! http://i.stack.imgur.com/puuPZ.gif
更新、4月7日
スクリプトをいくらか改善して、zenityのドロップダウンエントリボックスにリストされているすべてのプログラムを作成しました。これで、ユーザーは各プログラムを覚える必要はありませんが、矢印キーを使用してプログラムのリストをスクロールするか、ドロップダウンメニューを開くだけで済みます。また、この改善されたバージョンでは、名前ではなくウィンドウIDによってウィンドウが表示されるため、パフォーマンスが大幅に向上します。注:.desktopファイルを調べる方法は冗長で、cutコマンドを2回使用しますが、私のscript-fuは今のところそれほど良くないので、これが私にできることのすべてです。改善のための提案を歓迎します!
#!/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
ボーナス:
私は実際にAlfredのLinuxバージョンであるAlbertを見つけましたが、自分で試したことはありません。しかし、チェックする価値があります。ただし、ジェイコブがすでに述べたように、それはまだバグがあります。
Gnome-Doというアプリがあります。これは、グラフィカルにAlfredに似ていますが、このスクリプトと同じ機能はありません。
このスクリプトが気に入った場合、修正が必要な場合はお知らせください。役立つと思われる場合は、回答に賛成することを忘れないでください。