Як вбити всі відкриті вікна?


9

Я хочу закрити всі вікна, що з’являються на моєму робочому столі. Я думав зробити це через це pkill, але мені вдалося вбити їх один за одним, а це не те, що я хочу. Кінцева мета - поставити це в сценарій, щоб запустити кіоск, він виявить, чи працює програмне забезпечення кіоску (я зрозумів, що це частина), а якщо ні, то він знищить усі відкриті вікна та перезапустить мій програмне забезпечення для кіоску.


як щодо перезапуску gdm або kdm
Raza

Відповіді:


3

Найпростіший підхід використовує xdotool:

xdotool search "" windowkill %@

xdotool search ""перераховує кожне вікно. windowkill %@вбиває кожного з них; %@стосується всіх результатів попереднього пошуку.

Ви можете скористатися --maxdepth 1опцією, щоб searchобмежити вибрані вікна вікнами верхнього рівня.


1
На жаль, він не працює при використанні VNC (xdotool викликає помилку сегментації).
Дієго Квейроз

Це, мабуть, варто ще одне питання - у VNC все має бути однаковим чи ні.
Майкл Гомер

Я згоден, але це не так. Є звіт про помилку щодо цього питання: github.com/jordansissel/xdotool/isissue/126
Дієго

2

це працює принаймні для kde та xfce (gnome не тестується, але він може також працювати):

1) встановити wmctrl

2) потім створіть сценарій під назвою 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) зробити його виконуваним:chmod +x ./close_windows.sh

3) створити запис у меню "Пуск", який вказує на сценарій close_windows.

4) виконати сценарій close_windows з цього запису.

джерело: https://forum.manjaro.org/index.php?topic=4412.0 :


Ідеальне рішення. І він також працює з VNC. Важливо додати, що вам може знадобитися змінити "Desktop $", щоб відповідати локалізації установки (наприклад, на португальській це "Área de trabalho $").
Дієго Кейроз

2

Майкл Гомер та Гвідо ван Стін показали способи вбити всі вікна. Це не знищить фонові процеси, якщо такі є. Він не вбивав би збої програм, вікно яких зайшло, але вони все ще виконуються без користувальницького інтерфейсу. Тож ви можете скоріше вбити процеси.

Ви можете запустити kill -9 -1як некорінний користувач, щоб знищити всі процеси, які виконуються як цей користувач. Вам потрібно буде запустити додаток для кіоску як виділений користувач (це все одно стандартна конфігурація для кіосків для безпеки) та забезпечити перезапуск інтерфейсу кіоску, коли всі процеси в сеансі мертві (що також є стандартною конфігурацією для кіосків, за стійкість).


0

Відповідь Гуйдо прекрасно працює на мене. Я написав невеликий перехресний компілюваний прогрес Pascal Linux / Windows, складений разом із Lazarus / FPC для власного використання, який запускає його команду wmctrl або еквівалентну команду 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.

Я також помітив, що Дієго має рацію щодо назви робочого столу, і мій виконуваний Linux працюватиме лише у французькому середовищі xfce із робочим столом під назвою "Бюро". Мені не вдалося знайти ім'я робочого столу в змінних оточення (і це не вартувало проблем).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.