Como posso criar um atalho para fechar todas as janelas do mesmo aplicativo?

5

Quando clico com o botão direito do mouse no ícone de um aplicativo no iniciador do Unity, posso pressionar Sair para fechar todas as janelas correspondentes a esse aplicativo. É possível fazer o mesmo com um atalho de teclado que opera na janela ativa (e todas as outras janelas correspondentes ao mesmo aplicativo)?

Eu poderia fazer algo semelhante com xkill , mas nesse caso eu não tenho a mensagem que me lembra de arquivos não salvos.

    
por user525864 02.04.2016 / 16:03

4 respostas

1

A resposta do user72216 não funcionou sempre. Por exemplo, se eu abri várias janelas do Okular (um visualizador de PDF do KDE), o código não fecha todas as janelas, pois identificações de janelas diferentes são atribuídas às janelas. O código a seguir extrai todos os ids de janela e os fecha normalmente:

#!/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]])
    
por Jae 23.09.2016 / 08:39
9

Como com segurança fechar todas as janelas de um aplicativo gui com uma tecla de atalho

A maneira mais segura de fechar a janela de um aplicativo graciosamente , e garantir que você não perderá dados, está usando wmctrl (não instalado por padrão):

wmctrl -ic <window_id>

Para usá-lo em um script para fechar todas as janelas de um aplicativo:

  1. instale os dois xdotool e wmctrl

    sudo apt-get install wmctrl xdotool
    
  2. Copie o script abaixo em um arquivo vazio, salve-o como 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. Adicione o seguinte comando a uma tecla de atalho:

    python3 /path/to/stop_active.py
    

    Escolha: Configurações do sistema > "Teclado" > "Atalhos" > "Atalhos personalizados". Clique no botão "+" e adicione o comando:

    python3 /path/to/stop_active.py
    

    N.B. não use ~ ou $HOME em uma tecla de atalho, mas use caminhos absolutos.

Agora, o atalho pode ser usado para fechar todas as janelas da janela da frente.

Explicação

Eu tentei as várias opções kill ( kill -2 , kill -HUP , kill -s TERM <pid> etc), que são mencionadas em várias postagens para fechar um aplicativo normalmente. Testados em uma janela gedit com alterações não salvas, todos eles fecharam a janela felizmente, sem qualquer interação.

wmctrl faz perguntar o que fazer no entanto, similar a Ctrl + Q .

O script primeiro descobre o pid da janela da frente, com o comando:

xdotool getactivewindow getwindowpid

subseqüentemente, a lista de janelas atualmente abertas é chamada com o comando:

wmctrl -lp

Nesta lista, as janelas correspondentes são selecionadas e fechadas com o comando:

wmctrl -ic <window_id>

Nota

Se você estiver fechando todas as janelas nautilus , na linha

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

"Desktop" está se referindo à sua janela da área de trabalho, que normalmente deve permanecer sempre. Se você não estiver usando uma versão em inglês do Ubuntu, substitua "Desktop" pelo nome localizado da área de trabalho no seu idioma.

    
por Jacob Vlijm 02.04.2016 / 16:45
1

Introdução

O script abaixo mata todas as janelas ativas da janela ativa no momento em que o usuário está trabalhando. Isso deve ser vinculado a um atalho.

O script mostrará um pop-up solicitando que o usuário confirme antes de matar todas as janelas.

O script usa todas as ferramentas nativas (pré-instaladas), como qdbus , zenity e bash .

Obtendo o script

Você pode copiar a fonte do script aqui ou obtê-la do meu repositório git usando as instruções abaixo

  1. sudo apt-get install git
  2. cd /opt ; sudo git clone https://github.com/SergKolo/sergrep.git
  3. O arquivo estará localizado em /opt/sergrep/kill_windows_set.sh ; Assegure-se de que o arquivo seja executável com sudo chmod +x kill_windows_set.sh

Vinculando o script ao atalho

As informações relevantes podem ser encontradas aqui:

Como faço para ligar arquivos .sh à combinação de teclado?

Fonte

#!/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 em ação

    
por Sergiy Kolodyazhnyy 03.04.2016 / 03:27
-2

Você pode criar um atalho para o xkill.

configurações < teclado < atalhos < atalhos personalizados

Adicione um atalho personalizado, em seguida, simplesmente escreva "xkill" no menu de comando e defina seu próprio atalho pressionando as teclas desejadas.

Como você disse, isso não significa uma mensagem "salvos não salvos".

    
por nebulon 02.04.2016 / 16:45