Как сделать ярлык, чтобы закрыть все окна одного и того же приложения?

Когда я щелкаю правой кнопкой мыши значок приложения в панели запуска Unity, я могу нажать Quit , чтобы закрыть все окна, соответствующие этому приложению. Можно ли сделать то же самое с помощью сочетания клавиш, которое работает в активном окне (и во всех других окнах, соответствующих тому же приложению)?

Я мог бы сделать нечто подобное с xkill, но в этом случае У меня нет сообщения, которое помнит меня о несохраненных файлах.

4
задан 3 April 2016 в 13:05

4 ответа

Ответ user72216 всегда не работал. Например, если я открыл несколько Okular (средство просмотра PDF KDE) окна, код не закроет все окна, поскольку различные идентификаторы окна присвоены окнам. Следующий код извлекает все идентификаторы окна и закрывает их корректно:

#!/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
ответ дан 3 April 2016 в 23:05
  • 1
    Если you' ре, уверенное, это удалило все, чем моя работа привычки решения. То, что я все еще попробовал бы, apt-get install aptitude, который похож склонен - добираются, но более умный для всего я понимаю и использую его для чистки aptitude purge netbeans. I' m не слишком уверенный в этом устраняющий его, хотя – DanNightmare 10 August 2017 в 21:09

Вы могли создать ярлык для xkill.

настройки < клавиатура < ярлыки < пользовательские ярлыки

Добавляют пользовательский ярлык, затем просто пишут "xkill" в меню команды и устанавливают Ваш собственный ярлык путем нажатия клавиш, которые Вы хотите.

Как Вы сказал, что это не дает Вам "сохраненные несохраненные файлы" сообщение все же.

-2
ответ дан 3 April 2016 в 23:05
  • 1
    что делает Вы имеете в виду " eventually"? Shouldn' t OP запускаются путем предоставления x только Вам? – Zanna 11 August 2017 в 00:09

Как безопасно закрыть все окна gui приложения с сочетанием клавиш

Самый безопасный способ закрыть окно приложения корректно и удостовериться Вы не потеряете данные, использует wmctrl (не установленный по умолчанию):

wmctrl -ic <window_id>

Использовать его в сценарии для закрытия всех окон приложения:

  1. установите обоих xdotool и wmctrl

    sudo apt-get install wmctrl xdotool
    
  2. Скопируйте сценарий ниже в пустой файл, сохраните его как 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. Добавьте следующую команду к сочетанию клавиш:

    python3 /path/to/stop_active.py
    

    Выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команду:

    python3 /path/to/stop_active.py
    

    N.B. не используйте ~ или $HOME в сочетании клавиш, но полных путях использования вместо этого.

Теперь ярлык может использоваться для корректного закрытия всех окон frontmost окна.

Объяснение

Я попробовал различное kill опции (kill -2, kill -HUP, kill -s TERM <pid> и т.д.), которые упоминаются в нескольких сообщениях для закрытия приложения корректно. Протестированный на a gedit окно с несохраненными изменениями, все они закрыли окно счастливо однако без любого взаимодействия.

wmctrl действительно спрашивает, что сделать однако, подобный Ctrl+Q.

Сценарий затем сначала узнает pid из frontmost окна, с командой:

xdotool getactivewindow getwindowpid

впоследствии, список в настоящее время открываемых окон называют с командой:

wmctrl -lp

Из этого списка соответствующие окна выбраны и соглашаются команда:

wmctrl -ic <window_id>

Примечание:

Если Вы закрываете все nautilus окна, в строке

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

"Desktop" относится к Вашему окну Desktop, которое обычно должно всегда оставаться. Если Вы не используете английскую версию Ubuntu, замены "Desktop" локализованным названием Рабочего стола на Вашем языке.

10
ответ дан 3 April 2016 в 23:05
  • 1
    так I' ve просто установил netbeans самостоятельно, через способный - добираются, и это - netbeans 8.1, не 9. это - проблема. 9 тот, который поддерживает Java 9. но я don' t находят установку для netbeans 9, хотя он, как предполагалось, был выпущенным концом июля 2017 – DanNightmare 10 August 2017 в 21:25

Введение

Рев сценария уничтожает все активные окна в настоящее время активного окна, в котором работает пользователь. Это предназначено, чтобы быть связанным с ярлыком.

Сценарий покажет всплывающее окно, предлагающее пользователю подтвердить прежде, чем уничтожить все окна.

Сценарий использует (предварительно установленные) инструменты всего собственного компонента, такой как qdbus,zenity, и bash.

Получение сценария

Можно или скопировать источник сценария здесь или получить его из моего репозитория мерзавца с помощью рева инструкций

  1. sudo apt-get install git
  2. cd /opt ; sudo git clone https://github.com/SergKolo/sergrep.git
  3. Файл будет расположен в /opt/sergrep/kill_windows_set.sh ; Удостоверьтесь, что файл является исполняемым файлом с sudo chmod +x kill_windows_set.sh

Привязка сценария к ярлыку

Релевантная информация может быть найдена здесь:

Как я обязываю .sh файлы вводить с клавиатуры комбинацию?

Источник

#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: 1047481448@qq.com 
# 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

Сценарий в действии

enter image description here

1
ответ дан 3 April 2016 в 23:05

Другие вопросы по тегам:

Похожие вопросы: