如何才能仅在特定显示器上最小化窗口?

如何才能仅在特定显示器上最小化窗口?

我有显示器和笔记本电脑屏幕,并且“显示桌面”功能有问题。

笔记本电脑屏幕显示应始终保留的小部件。主显示器正常使用。

每当我使用键盘快捷键(在我的情况下是 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])

如何使用

  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>(或不最小化)。

最后的“测试”(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

介绍

下面的脚本允许用户点击他们想要的显示,该显示上的所有窗口都将最小化。此脚本旨在绑定到键盘快捷键,但如果需要也可以手动运行。

使用方法很简单:

  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

该文件将被命名为最小化_显示_窗口.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 存在。对于那些感兴趣的人,它发布为要旨

相关内容