it-swarm.com.de

Wie kann ich eine Verknüpfung erstellen, um alle Fenster derselben Anwendung zu schließen?

Wenn ich im Unity-Launcher mit der rechten Maustaste auf das Symbol einer Anwendung klicke, kann ich drücken Quit um alle Fenster zu schließen, die dieser Anwendung entsprechen. Ist es möglich, dasselbe mit einer Tastenkombination zu tun, die auf dem aktiven Fenster (und allen anderen Fenstern, die derselben Anwendung entsprechen) ausgeführt wird?

Ich könnte etwas Ähnliches mit xkill machen, aber in diesem Fall habe ich nicht die Nachricht, die mich an nicht gespeicherte Dateien erinnert.

4
user525864

Die Antwort von user72216 hat nicht immer funktioniert. Wenn ich zum Beispiel mehrere Okular-Fenster (ein KDE-Viewer PDF) geöffnet habe, schließt der Code nicht alle Fenster, da den Fenstern unterschiedliche Fenster-IDs zugewiesen sind. Der folgende Code extrahiert alle Fenster-IDs und schließt sie ordnungsgemäß:

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

So schließen Sie sicher alle Fenster einer GUI-Anwendung mit einer Tastenkombination

Die sicherste Möglichkeit, das Fenster einer Anwendung ordnungsgemäß zu schließen und sicherzustellen, dass keine Daten verloren gehen, ist die Verwendung von wmctrl (nicht standardmäßig installiert):

wmctrl -ic <window_id>

So verwenden Sie es in einem Skript, um alle Fenster einer Anwendung zu schließen:

  1. installiere sowohl xdotool als auch wmctrl

    Sudo apt-get install wmctrl xdotool
    
  2. Kopieren Sie das folgende Skript in eine leere Datei und speichern Sie es als 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. Fügen Sie einer Tastenkombination den folgenden Befehl hinzu:

    python3 /path/to/stop_active.py
    

    Wählen Sie: Systemeinstellungen> "Tastatur"> "Verknüpfungen"> "Benutzerdefinierte Verknüpfungen". Klicken Sie auf das "+" und fügen Sie den Befehl hinzu:

    python3 /path/to/stop_active.py
    

    NB Verwenden Sie in einer Tastenkombination nicht ~ oder $HOME Verwenden Sie stattdessen absolute Pfade.

Mit der Verknüpfung können nun alle Fenster des vordersten Fensters ordnungsgemäß geschlossen werden.

Erläuterung

Ich habe die verschiedenen kill -Optionen (kill -2, kill -HUP, kill -s TERM <pid> usw.) ausprobiert, die in mehreren Beiträgen erwähnt wurden, um eine Anwendung ordnungsgemäß zu schließen. Getestet auf einem gedit -Fenster mit nicht gespeicherten Änderungen, schlossen alle das Fenster ohne Interaktion.

wmctrl fragt , was zu tun ist, jedoch ähnlich wie Ctrl+Q.

Das Skript findet dann zuerst das pid des vordersten Fensters mit dem Befehl:

xdotool getactivewindow getwindowpid

anschließend wird die Liste der aktuell geöffneten Fenster mit dem Befehl aufgerufen:

wmctrl -lp

Aus dieser Liste werden die entsprechenden Fenster mit dem Befehl ausgewählt und geschlossen:

wmctrl -ic <window_id>

Hinweis

Wenn Sie alle nautilus Fenster in der Zeile schließen

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

"Desktop" bezieht sich auf Ihr Desktop-Fenster, das normalerweise immer bleiben sollte. Wenn Sie keine englische Version von Ubuntu verwenden , ersetzen Sie "Desktop" durch den lokalisierten Namen des Desktops in Ihrer Sprache.

10
Jacob Vlijm

Einführung

Das unten stehende Skript beendet alle aktiven Fenster des aktuell aktiven Fensters, in dem der Benutzer arbeitet. Dies soll an eine Verknüpfung gebunden sein.

Das Skript zeigt ein Popup-Fenster an, in dem der Benutzer zur Bestätigung aufgefordert wird, bevor alle Fenster geschlossen werden.

Das Skript verwendet alle nativen (vorinstallierten) Tools wie qdbus, zenity und bash.

Erhalten Sie das Skript

Sie können entweder die Skriptquelle hier kopieren oder sie mithilfe der folgenden Anweisungen aus meinem Git-Repository beziehen

  1. Sudo apt-get install git
  2. cd /opt ; Sudo git clone https://github.com/SergKolo/sergrep.git
  3. Die Datei befindet sich in /opt/sergrep/kill_windows_set.sh; Stellen Sie sicher, dass die Datei mit Sudo chmod +x kill_windows_set.sh ausführbar ist.

Binden des Skripts an die Verknüpfung

Die relevanten Informationen finden Sie hier:

Wie binde ich .sh-Dateien an eine Tastaturkombination?

Quelle

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

Drehbuch in Aktion

enter image description here

1