Как я могу минимизировать окна, только на определенном мониторе?

Я имею экран монитора и ноутбука и имею проблему с "Выставочной настольной функцией ".

Экран Laptop показывает виджет, который должен остаться для все время. Основной монитор обычно используется.

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

Действительно ли это возможно?

Вопрос, подобный https://superuser.com/questions/200945/how-can-i-make-the-show-desktop-function-only-hide-the-windows-on-a-specific-m, с заметными различиями, которые я спрашиваю о другой ОС.

5
задан 20 March 2017 в 03:18

2 ответа

Только минимизируйте окна на одном экране

Сценарий ниже может использоваться, чтобы (только) минимизировать окна на левом экране или только на правильном экране.

Скрипт запущен с также 1 или 2 как аргумент, в зависимости от которого экрана требуется минимизировать окна.

Сценарий

#!/usr/bin/env python3
import subprocess
import sys

scr = sys.argv[1]

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8")

# find the right side of the left screen
edge = [int(s.split("x")[0]) for s in get("xrandr").split() if "+0+" in s][0]
# read the window list
wlist = [w.split() for w in get(["wmctrl", "-lG"]).splitlines()]
for w in wlist:
    # retrieve the window id and -position
    w_id = w[0]; xpos = int(w[2])
    # check the position of the window, decide action depending on arg.
    test = xpos < edge if scr == "1" else xpos >= edge
    if test:
        # check if the window is "normal" and / or minimized
        w_data = get(["xprop", "-id", w_id])
        if all([not "_NET_WM_STATE_HIDDEN" in w_data,
                    "_NET_WM_WINDOW_TYPE_NORMAL" in w_data]):
            subprocess.Popen(["xdotool", "windowminimize", w_id])

Как использовать

  1. Для сценария нужны оба wmctrl и xdotool

    sudo apt-get install xdotool wmctrl
    
  2. Скопируйте сценарий в пустой файл, сохраните его как min_screen.py

  3. Выполнять его:

    python3 /path/to/min_screen.py 1
    

    минимизировать окна на левом экране, и

    python3 /path/to/min_screen.py 2 
    

    минимизировать окна только на правильном экране

  4. Если все хорошо работает, добавьте его к сочетанию клавиш

Примечания

  • Сценарий предполагает, что python3 установлен, но код не python3 конкретный, я верю.
  • Сценарий был записан на Unity, но в отличие от рабочих областей (области просмотра), обрабатывая экраны не должен иметь значения.
  • Сценарий не минимизирует окна с pid 0 (Неактивный или другой tkinterокна, например). Если это - проблема, упомяните. Может быть решен.

Объяснение

Сценарий сначала ищет правый край левого экрана путем поиска строки с +0+ в выводе xrandr, сходство с:

1680x1050+0+0

Первый раздел, 1680, ширина левого экрана. Впоследствии, все, что мы должны сделать, изучают список окна (wmctrl -lG) и посмотрите, какое из окон является "ниже" или "выше" 1680, и действие соответственно, минимизируя с командой xdotool windowminimize <window_id> (или не).

Th "тестируют" наконец (mmiz): xprop -id <window_id> должен проверить, имеем ли мы дело с "нормальным" окном (вместо, например, Ваш рабочий стол, который также перечислен как окно), и если окно уже минимизировано.

См. также комментарий в сценарии.

Привязка сценария к сочетанию клавиш

1. На Lubuntu

Для редактирования глобальных сочетаний клавиш в Lubuntu, посмотрите, что Lubuntu минимизирует все выставочное настольное сочетание клавиш?

В этом случае: сохраните сценарий из этого ответа в файл на компьютере, сделайте этот исполняемый файл файла, открытый /.config/openbox/lubuntu-rc.xml и замена

  <keybind key="W-d">
    <action name="ToggleShowDesktop"/>
  </keybind>

  <action name="Execute">
   <command>/path/to/show_desktop.py 1</command>
  </action>

где /path/to/show_desktop.py(конечно), путь к сценарию, и также 1 или 2 целенаправленный экран. Сделайте исполняемый файл сценария.

Компьютер перезапуска для перезагрузки конфигурации.

2. Единица/Gnome

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

/path/to/show_desktop.py 1

... к ярлыку по Вашему выбору

3
ответ дан 23 November 2019 в 09:21

Введение

сценарий ниже позволяет пользователю нажимать на дисплей, который они хотят, и все окна на том дисплее будут минимизированы. Этот сценарий предназначен, чтобы быть связанным с сочетанием клавиш, но может работать вручную раз так желаемый.

Использование просто:

  1. активируют сценарий, Ваш курсор мыши превратится в крест
  2. , Нажимают на любое окно программы (но не настольные) на дисплее, который Вы хотите минимизировать.
  3. сценарий определит все окна на том дисплее и минимизирует (представляют их в виде значка).

программа не требует, чтобы были установлены любые дополнительные пакеты. Сценарий был протестирован на обычной Ubuntu 16.04 LTS и Lubuntu 16.04 LTS. Благодаря @JourneymanGeek для тестирования его на Fedora 24 с KDE также!

Получение исходного кода

сценария исходный код сценария может быть получен путем ручного копирования его здесь, или путем получения его от моего репозиторий github . Для получения его через git выполняют эти шаги:

  1. sudo apt-get install git
  2. cd /opt ; sudo git clone https://github.com/SergKolo/sergrep.git
  3. sudo chmod -R +x sergrep

файл назовут minimize_display_windows.py. Удостоверьтесь, когда Вы обяжете это с сочетанием клавиш предоставлять полный путь сценарию. Например, как так:

 python /opt/sergrep/minimize_display_windows.py

Исходный код

Гарантирует файл, к которому Вы сохранили этот код, имеет исполняемые полномочия.

#!/usr/bin/env python
#
###########################################################
# Author: Serg Kolo , contact: 1047481448@qq.com 
# Date: July 3, 2016
# Purpose:  Minimize windows on a display which user clicks
# Written for: http://askubuntu.com/q/793195/295286  
# Tested on: Ubuntu 16.04 LTS,Lubuntu 16.04 Virtual Machine
###########################################################
# 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.
#
#     https://opensource.org/licenses/MIT

from gi.repository import GdkX11,Gdk
import subprocess

def run_sh(cmd):
    # reusable function to 
    # run shell commands
    # Returns stdout of the
    # process
    proc = subprocess.Popen(cmd, shell=True,stdout=subprocess.PIPE)
    out = proc.stdout.read().strip()
    return out 

# First,let the user click on any window
# on the monitor which they want to minimize.
# For that we need to extract integer XID of
# the window from xwininfo output.
# Basically,same as xwininfo -int | awk '/Window id/{print $4}'

user_selected = ""
for item in run_sh("xwininfo -int").split("\n"):
    if "Window id" in item:
       user_selected = item.split()[3]

# Here we basically get all the windows on the screen,
# and check if their XID matches the one user selected
# Once we find that window, we need to know to what display
# that window belongs. 
screen =  Gdk.Screen.get_default()
for window in screen.get_window_stack():
    if str(window.get_xid()) == user_selected:
       close_screen = int(screen.get_monitor_at_window(window))

# We know which display to close now. Loop over all
# windows again, and if they're on the same display
# the one that user chose - iconify it ( in X11 terminology
# that means minimize the window  )
for window in screen.get_window_stack():
    if screen.get_monitor_at_window(window) == close_screen :
       window.iconify()

Демонстрация

А короткая запись сценария в действии может быть найдена на моем Заметки на полях канала

YouTube

Первоначально, я записал другой сценарий, но это может только использоваться в Единице и требует, чтобы xdotool присутствовал. Для заинтересованных это отправляется как суть

2
ответ дан 23 November 2019 в 09:21

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

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