Comment tuer toutes les fenêtres ouvertes?

9

Je souhaite fermer toutes les fenêtres apparaissant sur mon bureau. J'ai pensé à le faire pkill, mais je n'ai réussi qu'à les tuer un à la fois, ce qui n'est pas ce que je veux. L'objectif final est de mettre cela dans un script pour exécuter un kiosque, il détectera si le logiciel du kiosque est en cours d'exécution (j'ai compris cette partie) et si ce n'est pas le cas, il tuera toutes les fenêtres ouvertes et redémarrera mon logiciel de kiosque.

Joe
la source
que diriez-vous de redémarrer gdm ou kdm
Raza

Réponses:

3

L'approche la plus simple utilise xdotool:

xdotool search "" windowkill %@

xdotool search ""répertorie toutes les fenêtres. windowkill %@tue chacun d'eux; %@fait référence à tous les résultats de la recherche précédente.

Vous pouvez préférer utiliser l' --maxdepth 1option pour searchlimiter les fenêtres sélectionnées aux fenêtres de niveau supérieur.

Michael Homer
la source
Malheureusement, cela ne fonctionne pas lors de l'utilisation de VNC (xdotool soulève une erreur de segmentation).
Diego Queiroz
Cela vaut probablement une autre question - les choses devraient être les mêmes sous VNC ou non.
Michael Homer
Je suis d'accord, mais ce n'est pas le cas. Il y a un rapport de bug sur ce problème: github.com/jordansissel/xdotool/issues/126
Diego Queiroz
2

cela fonctionne au moins pour kde et xfce (gnome non testé, mais cela pourrait aussi fonctionner):

1) installez wmctrl

2) puis créez un script appelé close_windows.sh:

# close all open windows gracefully without closing the Desktop environment
WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
for i in $WIN_IDs; do wmctrl -ic "$i"; done
# Keep checking and waiting until all windows are closed (you probably don't need this section)
while test $WIN_IDs; do 
    sleep 0.1; 
    WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
done 

3) rendez-le exécutable:chmod +x ./close_windows.sh

3) créez une entrée dans le menu de démarrage qui pointe vers le script close_windows.

4) exécutez le script close_windows à partir de cette entrée.

source: https://forum.manjaro.org/index.php?topic=4412.0 :

Guido van Steen
la source
Solution parfaite. Et cela fonctionne également avec VNC. Il est important d'ajouter que vous devrez peut-être modifier "Desktop $" pour correspondre à la localisation de votre installation (par exemple, en portugais, il s'agit de "Área de trabalho $").
Diego Queiroz
2

Michael Homer et Guido van Steen ont montré des moyens de tuer toutes les fenêtres. Cela ne tuerait pas les processus d'arrière-plan, s'il y en a. Cela ne tuerait pas les programmes en panne dont la fenêtre a disparu mais qui s'exécutent toujours sans interface utilisateur. Vous préférerez peut-être plutôt tuer les processus.

Vous pouvez exécuter en kill -9 -1tant qu'utilisateur non root pour tuer tous les processus qui s'exécutent en tant que cet utilisateur. Vous devez exécuter l'application kiosque en tant qu'utilisateur dédié (c'est une configuration standard pour les kiosques de toute façon, pour des raisons de sécurité) et vous assurer que l'interface du kiosque redémarre lorsque tous les processus de la session sont morts (qui est également une configuration standard pour les kiosques, pour la robustesse).

Gilles 'SO- arrête d'être méchant'
la source
0

La réponse de Guido fonctionne parfaitement pour moi. J'ai écrit un petit prog Pascal Pascal compilable Linux / Windows compilé avec Lazarus / FPC pour mon propre usage, qui lance sa commande wmctrl, ou la commande équivalente windows Powershell:

program CloseAll;
{Ferme toutes les fenêtres}
{$mode objfpc}{$H+}
uses
    Classes, SysUtils, Process, Crt;

var
  p: TProcess;
 // i: integer=0;
  {$R *.res}
begin
      p := TProcess.Create(nil);
    try
        p.ShowWindow := swoHIDE; // Cache la console
        {$ifdef windows}
        p.Executable := 'cmd.exe';
        p.Parameters.Add('powershell -command "(New-Object -comObject Shell.Application).Windows() | foreach-object {$_.quit()}; Get-Process | Where-Object {$_.MainWindowTitle -ne \"\"} | stop-process"');
        {$else}
        p.Executable := '/bin/bash';
        p.Parameters.Add('-c');
        //close all open windows gracefully without closing the Desktop environment
        p.Parameters.Add ('WIN_IDs=$(wmctrl -l | grep -vwE "Bureau$|xfce4-panel$" | cut -f1 -d' + #39 + ' ' + #39 + ')' +#10 + 'for i in $WIN_IDs; do wmctrl -ic "$i"; done');
        //p.Options := p.Options + [poWaitOnExit, poUsePipes];
        {$endif}
        p.Execute;
    finally
        p.Free
    end
end.

J'ai également remarqué que Diego avait raison sur le nom du bureau, et mon exécutable Linux ne fonctionnerait que sur un environnement xfce français avec le bureau nommé "Bureau". Je n'ai pas pu trouver le nom du bureau dans les variables d'environnement (et cela ne valait pas la peine).

Francois_C
la source