web-dev-qa-db-ja.com

同じアプリケーションのすべてのウィンドウを閉じるショートカットを作成するにはどうすればよいですか?

Unityランチャーでアプリケーションのアイコンを右クリックすると、 Quit そのアプリケーションに対応するすべてのウィンドウを閉じます。アクティブなウィンドウ(および同じアプリケーションに対応する他のすべてのウィンドウ)で動作するキーボードショートカットで同じことを行うことは可能ですか?

xkillでも同様のことができますが、その場合、保存されていないファイルを思い出すメッセージがありません。

4
user525864

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]])
1
Jae

安全にGUIアプリケーションのすべてのウィンドウをショートカットキーで閉じる方法

アプリケーションのウィンドウを適切に閉じて、データが失われないようにする最も安全な方法は、 wmctrl (デフォルトではインストールされません)を使用することです:

wmctrl -ic <window_id>

スクリプトでそれを使用して、アプリケーションのすべてのウィンドウを閉じるには:

  1. xdotoolwmctrlの両方をインストールします

    Sudo apt-get install wmctrl xdotool
    
  2. 以下のスクリプトを空のファイルにコピーし、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]])
    
  3. 次のコマンドをショートカットキーに追加します。

    python3 /path/to/stop_active.py
    

    システム設定>「キーボード」>「ショートカット」>「カスタムショートカット」を選択します。 「+」をクリックして、コマンドを追加します。

    python3 /path/to/stop_active.py
    

    NBショートカットキーで~または$HOMEを使用しない、代わりに絶対パスを使用します。

これで、ショートカットを使用して、最前面のウィンドウのすべてのウィンドウを正常に閉じることができます。

説明

さまざまなkillオプション(kill -2kill -HUPkill -s TERM <pid>など)を試しました。これらは、いくつかの投稿でアプリケーションを正常に閉じるために言及されています。変更を保存していないgeditウィンドウでテストしましたが、すべてのウィンドウは、対話なしでウィンドウを喜んで閉じました。

wmctrldoesただし、何をすべきかを尋ねる 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"を使用言語のローカライズされたデスクトップ名で置き換えます。

10
Jacob Vlijm

前書き

以下のスクリプトは、ユーザーが作業している現在アクティブなウィンドウのすべてのアクティブウィンドウを強制終了します。これは、ショートカットにバインドされることを意図しています。

スクリプトは、すべてのウィンドウを強制終了する前にユーザーに確認を求めるポップアップを表示します。

このスクリプトは、qdbuszenity、およびbashなどのすべてのネイティブ(プリインストール)ツールを使用します。

スクリプトを取得する

ここでスクリプトソースをコピーするか、以下の手順を使用してgitリポジトリから取得できます。

  1. Sudo apt-get install git
  2. cd /opt ; Sudo git clone https://github.com/SergKolo/sergrep.git
  3. ファイルは/opt/sergrep/kill_windows_set.shにあります。ファイルがSudo chmod +x kill_windows_set.shで実行可能であることを確認してください

スクリプトをショートカットにバインドする

関連情報はここにあります:

。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

アクションのスクリプト

enter image description here

1