Я имею экран монитора и ноутбука и имею проблему с "Выставочной настольной функцией ".
Экран Laptop показывает виджет, который должен остаться для все время. Основной монитор обычно используется.
Каждый раз, когда я использую сочетание клавиш (ключ окон + d в моем случае), все окна будут скрыты, но я только хочу скрыть все окна на определенном мониторе.
Действительно ли это возможно?
Вопрос, подобный https://superuser.com/questions/200945/how-can-i-make-the-show-desktop-function-only-hide-the-windows-on-a-specific-m, с заметными различиями, которые я спрашиваю о другой ОС.
Сценарий ниже может использоваться, чтобы (только) минимизировать окна на левом экране или только на правильном экране.
Скрипт запущен с также 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])
Для сценария нужны оба wmctrl
и xdotool
sudo apt-get install xdotool wmctrl
Скопируйте сценарий в пустой файл, сохраните его как min_screen.py
Выполнять его:
python3 /path/to/min_screen.py 1
минимизировать окна на левом экране, и
python3 /path/to/min_screen.py 2
минимизировать окна только на правильном экране
Unity
, но в отличие от рабочих областей (области просмотра), обрабатывая экраны не должен иметь значения.tkinter
окна, например). Если это - проблема, упомяните. Может быть решен.Сценарий сначала ищет правый край левого экрана путем поиска строки с +0+
в выводе xrandr
, сходство с:
1680x1050+0+0
Первый раздел, 1680
, ширина левого экрана. Впоследствии, все, что мы должны сделать, изучают список окна (wmctrl -lG
) и посмотрите, какое из окон является "ниже" или "выше" 1680
, и действие соответственно, минимизируя с командой xdotool windowminimize <window_id>
(или не).
Th "тестируют" наконец (mmiz
): xprop -id <window_id>
должен проверить, имеем ли мы дело с "нормальным" окном (вместо, например, Ваш рабочий стол, который также перечислен как окно), и если окно уже минимизировано.
См. также комментарий в сценарии.
Для редактирования глобальных сочетаний клавиш в 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
целенаправленный экран. Сделайте исполняемый файл сценария.
Компьютер перезапуска для перезагрузки конфигурации.
Сделайте исполняемый файл сценария и выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команду:
/path/to/show_desktop.py 1
... к ярлыку по Вашему выбору
сценарий ниже позволяет пользователю нажимать на дисплей, который они хотят, и все окна на том дисплее будут минимизированы. Этот сценарий предназначен, чтобы быть связанным с сочетанием клавиш, но может работать вручную раз так желаемый.
Использование просто:
программа не требует, чтобы были установлены любые дополнительные пакеты. Сценарий был протестирован на обычной Ubuntu 16.04 LTS и Lubuntu 16.04 LTS. Благодаря @JourneymanGeek для тестирования его на Fedora 24 с KDE также!
сценария исходный код сценария может быть получен путем ручного копирования его здесь, или путем получения его от моего репозиторий github . Для получения его через git
выполняют эти шаги:
sudo apt-get install git
cd /opt ; sudo git clone https://github.com/SergKolo/sergrep.git
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()
А короткая запись сценария в действии может быть найдена на моем Заметки на полях канала
Первоначально, я записал другой сценарий, но это может только использоваться в Единице и требует, чтобы xdotool присутствовал. Для заинтересованных это отправляется как суть