Unityランチャーでアプリケーションのアイコンを右クリックすると、 Quit そのアプリケーションに対応するすべてのウィンドウを閉じます。アクティブなウィンドウ(および同じアプリケーションに対応する他のすべてのウィンドウ)で動作するキーボードショートカットで同じことを行うことは可能ですか?
xkill
でも同様のことができますが、その場合、保存されていないファイルを思い出すメッセージがありません。
User72216による答えは常に機能しませんでした。たとえば、複数のOkular(KDE PDFビューアー)ウィンドウを開いた場合、異なるウィンドウIDがウィンドウに割り当てられるため、コードはすべてのウィンドウを閉じません。次のコードは、すべてのウィンドウIDを抽出し、それらを正常に閉じます。
#!/usr/bin/env python3
import subprocess
def get(cmd):
return subprocess.check_output(cmd).decode("utf-8").strip()
pid = get(["xdotool", "getactivewindow", "getwindowpid"])
# Identify the name of the application
username = get(["users"])
jobs = get(["ps","-u",username])
jobname = ""
for w in jobs.splitlines():
jobinfo = w.split()
if pid == jobinfo[0]:
jobname = jobinfo[-1]
break
# Get all pids that match the jobname
pidlist = []
for w in jobs.splitlines():
jobinfo = w.split()
if jobinfo[-1] == jobname:
pidlist = pidlist + [jobinfo[0]]
# Close all windows with having the pids
wlist = get(["wmctrl", "-lp"])
for pid in pidlist:
for w in wlist.splitlines():
if pid in w and not "Desktop" in w:
print(w.split()[0])
subprocess.call(["wmctrl", "-ic", w.split()[0]])
アプリケーションのウィンドウを適切に閉じて、データが失われないようにする最も安全な方法は、 wmctrl (デフォルトではインストールされません)を使用することです:
wmctrl -ic <window_id>
スクリプトでそれを使用して、アプリケーションのすべてのウィンドウを閉じるには:
xdotool
とwmctrl
の両方をインストールします
Sudo apt-get install wmctrl xdotool
以下のスクリプトを空のファイルにコピーし、stop_active.py
として保存します
#!/usr/bin/env python3
import subprocess
def get(cmd):
return subprocess.check_output(cmd).decode("utf-8").strip()
pid = get(["xdotool", "getactivewindow", "getwindowpid"])
for w in get(["wmctrl", "-lp"]).splitlines():
if pid in w and not "Desktop" in w:
subprocess.call(["wmctrl", "-ic", w.split()[0]])
次のコマンドをショートカットキーに追加します。
python3 /path/to/stop_active.py
システム設定>「キーボード」>「ショートカット」>「カスタムショートカット」を選択します。 「+」をクリックして、コマンドを追加します。
python3 /path/to/stop_active.py
NBショートカットキーで~
または$HOME
を使用しない、代わりに絶対パスを使用します。
これで、ショートカットを使用して、最前面のウィンドウのすべてのウィンドウを正常に閉じることができます。
さまざまなkill
オプション(kill -2
、kill -HUP
、kill -s TERM <pid>
など)を試しました。これらは、いくつかの投稿でアプリケーションを正常に閉じるために言及されています。変更を保存していないgedit
ウィンドウでテストしましたが、すべてのウィンドウは、対話なしでウィンドウを喜んで閉じました。
wmctrl
doesただし、何をすべきかを尋ねる Ctrl+Q。
スクリプトは、次のコマンドで最初にpid
を見つけます。
xdotool getactivewindow getwindowpid
その後、現在開いているウィンドウのリストが次のコマンドで呼び出されます。
wmctrl -lp
このリストから、対応するウィンドウが選択され、コマンドで閉じられます:
wmctrl -ic <window_id>
すべてのnautilus
ウィンドウを閉じる場合、次の行で
if pid in w and not "Desktop" in w:
"Desktop"
は、通常は常に表示されるデスクトップウィンドウを指します。 Ubuntuの英語版を使用していない場合、"Desktop"
を使用言語のローカライズされたデスクトップ名で置き換えます。
以下のスクリプトは、ユーザーが作業している現在アクティブなウィンドウのすべてのアクティブウィンドウを強制終了します。これは、ショートカットにバインドされることを意図しています。
スクリプトは、すべてのウィンドウを強制終了する前にユーザーに確認を求めるポップアップを表示します。
このスクリプトは、qdbus
、zenity
、およびbash
などのすべてのネイティブ(プリインストール)ツールを使用します。
ここでスクリプトソースをコピーするか、以下の手順を使用してgitリポジトリから取得できます。
Sudo apt-get install git
cd /opt ; Sudo git clone https://github.com/SergKolo/sergrep.git
/opt/sergrep/kill_windows_set.sh
にあります。ファイルがSudo chmod +x kill_windows_set.sh
で実行可能であることを確認してください関連情報はここにあります:
#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: [email protected]
# Date: April 2nd , 2016
# Purpose: Close all windows of the active application
# Written for: https://askubuntu.com/q/753033/295286
# Tested on: Ubuntu 14.04 LTS
###########################################################
# Copyright: Serg Kolo , 2016
#
# Permission to use, copy, modify, and distribute this software is hereby granted
# without fee, provided that the copyright notice above and this permission statement
# appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
ARGV0="$0"
ARGC=$#
get_running_apps()
{
qdbus org.ayatana.bamf /org/ayatana/bamf/matcher org.ayatana.bamf.matcher.RunningApplications
}
list_children()
{
qdbus org.ayatana.bamf "$1" org.ayatana.bamf.view.Children
}
get_pid()
{
qdbus org.ayatana.bamf "$1" org.ayatana.bamf.window.GetPid
}
main()
{
local ACTIVE
local apps_list
apps_list=( $( get_running_apps | tr '\n' ' ' ) )
for app in ${apps_list[@]} ; do
ACTIVE=$(qdbus org.ayatana.bamf $app org.ayatana.bamf.view.IsActive)
if [ "x$ACTIVE" = "xtrue" ] ; then
windows=( $( list_children $app | tr '\n' ' ' ) )
fi
done
for window in ${windows[@]} ; do
PIDS+=( $(get_pid $window) )
done
if zenity --question \
--text="Do you really want to kill ${#PIDS[@]} windows ?" ;
then
kill ${PIDS[@]}
fi
}
main