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.
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]])
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:
installer à la fois xdotool
et wmctrl
Sudo apt-get install wmctrl xdotool
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]])
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.
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>
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.
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
.
Vous pouvez soit copier la source du script ici, soit l'obtenir depuis mon dépôt git en suivant les instructions ci-dessous.
Sudo apt-get install git
cd /opt ; Sudo git clone https://github.com/SergKolo/sergrep.git
/opt/sergrep/kill_windows_set.sh
; Assurez-vous que le fichier est exécutable avec Sudo chmod +x kill_windows_set.sh
Les informations pertinentes peuvent être trouvées ici:
Comment lier des fichiers .sh à une combinaison de clavier?
#!/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