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

5

У меня есть монитор и экран для ноутбука, и у меня проблема с функцией "Показать рабочий стол".

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

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

Возможно ли это?

Вопрос похож на Ссылка , с заметной разницей, что я спрашиваю о разных ОС.

    
задан Mateusz Konieczny 30.06.2016 в 17:33
источник

2 ответа

3

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

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

Сценарий запускается с аргументом 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 , но в отличие от рабочих пространств (видовых экранов) обработка экранов не должна иметь значения.
  • Скрипт not минимизирует окна с помощью pid 0 (например, Idle или другие tkinter ). Если это проблема, просьба указать. Может быть решена.

Объяснение

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

1680x1050+0+0

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

Th "test" finally ( 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. Unity / Gnome

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

/path/to/show_desktop.py 1

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

    
ответ дан Jacob Vlijm 30.06.2016 в 20:06
источник
2

Введение

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

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

  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

Файл будет называться minim_display_windows.py . Убедитесь, что вы привязали это к сочетанию клавиш, чтобы обеспечить полный путь к скрипту. Например, например:

 python /opt/sergrep/minimize_display_windows.py

Исходный код

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

#!/usr/bin/env python
#
###########################################################
# Author: Serg Kolo , contact: [email protected] 
# 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()

Demo

Краткую запись сценария в действии можно найти на моем канале YouTube

Побочное примечания

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

    
ответ дан Sergiy Kolodyazhnyy 03.07.2016 в 11:13