我有显示器和笔记本电脑屏幕,并且“显示桌面”功能有问题。
笔记本电脑屏幕显示应始终保留的小部件。主显示器正常使用。
每当我使用键盘快捷键(在我的情况下是 Windows 键 + d)时,所有窗口都会被隐藏,但我只想隐藏特定显示器上的所有窗口。
这可能吗?
类似问题https://superuser.com/questions/200945/how-can-i-make-the-show-desktop-function-only-hide-the-windows-on-a-specific-m,我询问的是不同的操作系统,存在明显差异。
答案1
仅最小化一个屏幕上的窗口
下面的脚本可用于(仅)最小化左侧屏幕上的窗口或者仅在右侧屏幕上。
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
仅在右侧屏幕上最小化窗口
- 如果一切正常,将其添加到快捷键
笔记
- 该脚本假定已安装 python3,但我认为代码不是特定于 python3 的。
- 脚本是在 上编写的
Unity
,但与工作区(视口)不同,处理屏幕应该没什么区别。 - 脚本将不是最小化 pid 为 0 的窗口(
tkinter
例如空闲或其他窗口)。如果这是个问题,请提及。可以解决。
解释
+0+
该脚本首先查找左屏幕的右边缘,通过在 的输出中查找 的字符串xrandr
,如下所示:
1680x1050+0+0
第一部分1680
是左屏幕的宽度。随后,我们要做的就是查看窗口列表 ( wmctrl -lG
),看看哪个窗口位于 的“下方”或“上方” 1680
,然后采取相应的措施,使用命令最小化xdotool windowminimize <window_id>
(或不最小化)。
最后的“测试”(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
使脚本可执行并选择:系统设置 > “键盘” > “快捷键” > “自定义快捷键”。点击“+”并添加命令:
/path/to/show_desktop.py 1
...到您选择的快捷方式
答案2
介绍
下面的脚本允许用户点击他们想要的显示,该显示上的所有窗口都将最小化。此脚本旨在绑定到键盘快捷键,但如果需要也可以手动运行。
使用方法很简单:
- 激活脚本后,鼠标光标将变成十字
- 单击您想要最小化的显示屏上的任何程序窗口(但不是桌面)。
- 该脚本将确定显示屏上的所有窗口,并最小化(图标化)它们。
该程序不需要安装任何附加软件包。该脚本已在常规 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
该文件将被命名为最小化_显示_窗口.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()
演示
您可以在以下网址找到脚本运行的简短录制:YouTube 频道
附注
最初,我编写了另一个脚本,但它只能在 Unity 中使用,并且需要 xdotool 存在。对于那些感兴趣的人,它发布为要旨