web-dev-qa-db-fra.com

Comment puis-je créer un raccourci pour fermer toutes les fenêtres de la même application?

Lorsque je clique avec le bouton droit de la souris sur l'icône d'une application dans le lanceur Unity, je peux appuyer sur Quit pour fermer toutes les fenêtres correspondant à cette application. Est-il possible de faire la même chose avec un raccourci clavier qui agit sur la fenêtre active (et toutes les autres fenêtres correspondant à la même application)?

Je pourrais faire quelque chose de similaire avec xkill, mais dans ce cas, je n'ai pas le message qui me rappelle des fichiers non sauvegardés.

4
user525864

La réponse de user72216 n'a pas toujours fonctionné. Par exemple, si j'ai ouvert plusieurs fenêtres Okular (une visionneuse KDE PDF, le code ne fermera pas toutes les fenêtres, car différents identificateurs de fenêtre sont attribués aux fenêtres. Le code suivant extrait tous les identifiants de fenêtre et les ferme normalement:

#!/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

Comment fermer en toute sécurité toutes les fenêtres d'une application graphique avec une touche de raccourci

Le moyen le plus sûr de fermer la fenêtre d'une application normalement et de ne pas perdre de données est d'utiliser wmctrl (non installé par défaut):

wmctrl -ic <window_id>

Pour l'utiliser dans un script pour fermer toutes les fenêtres d'une application:

  1. installer à la fois xdotool et wmctrl

    Sudo apt-get install wmctrl xdotool
    
  2. Copiez le script ci-dessous dans un fichier vide, enregistrez-le sous le nom 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. Ajoutez la commande suivante à une touche de raccourci:

    python3 /path/to/stop_active.py
    

    Choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez la commande:

    python3 /path/to/stop_active.py
    

    NB ne pas utiliser ~ ou $HOME dans une touche de raccourci , mais utilisez plutôt des chemins absolus.

Maintenant, le raccourci peut être utilisé pour fermer gracieusement toutes les fenêtres de la fenêtre la plus en avant.

Explication

J'ai essayé les diverses options kill (kill -2, kill -HUP, kill -s TERM <pid> etc.), qui sont mentionnées dans plusieurs messages pour fermer une application en douceur. Testé sur une fenêtre gedit avec des modifications non enregistrées, elles ont toutes fermé la fenêtre, mais sans aucune interaction.

wmctrl ne demande quoi faire, comme dans Ctrl+Q.

Le script découvre ensuite d'abord la pid de la fenêtre la plus en avant, avec la commande:

xdotool getactivewindow getwindowpid

ensuite, la liste des fenêtres actuellement ouvertes s’appelle avec la commande:

wmctrl -lp

Dans cette liste, les fenêtres correspondantes sont sélectionnées et fermées avec la commande:

wmctrl -ic <window_id>

Remarque

Si vous fermez toutes les fenêtres nautilus, dans la ligne

if pid in w and not "Desktop" in w:

"Desktop" fait référence à la fenêtre de votre bureau qui devrait normalement rester. Si vous n'utilisez pas une version anglaise d'Ubuntu, remplacez "Desktop" par le nom localisé du Bureau dans votre langue.

10
Jacob Vlijm

Introduction

Le script ci-dessous supprime toutes les fenêtres actives de la fenêtre active dans laquelle l'utilisateur travaille. Cela est censé être lié à un raccourci.

Le script affichera une fenêtre invitant l’utilisateur à confirmer avant de supprimer toutes les fenêtres.

Le script utilise tous les outils natifs (préinstallés), tels que qdbus, zenity et bash.

Obtention du script

Vous pouvez soit copier la source du script ici, soit l'obtenir depuis mon dépôt git en suivant les instructions ci-dessous.

  1. Sudo apt-get install git
  2. cd /opt ; Sudo git clone https://github.com/SergKolo/sergrep.git
  3. Le fichier sera situé dans /opt/sergrep/kill_windows_set.sh; Assurez-vous que le fichier est exécutable avec Sudo chmod +x kill_windows_set.sh

Relier le script au raccourci

Les informations pertinentes peuvent être trouvées ici:

Comment lier des fichiers .sh à une combinaison de clavier?

La source

#!/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

Script en action

enter image description here

1