我可以在窗口中显示另一个工作区的小型实时预览吗?

是否可以镜像一个工作空间的实时部分,以便它在当前工作空间中可见为可以移动的窗口?

前几天我在我的Ubuntu 16.04主机上运行了一个Windows 10 VM,需要很长时间才能完成更新。 我一直在通过Ubuntu的Expo( Super + S )检查它的进展情况。 这让我觉得这个问题很可能已经解决,因为像simplescreenrecorder这样的工具可以配置为只记录屏幕的一部分。 但是,我不知道用于我的Google搜索的正确术语。

我想看看下面的300×150截图是以浮动窗口的forms(带有实时更新)在任何工作区的右上角碰巧是最新的。

在此处输入图像描述

编辑

(新答案)

DONE。
以下答案现在以抛光forms提供,作为指标,作为Trusty,Xenial,Yakkety和Zesty的ppa:

 sudo apt-add-repository ppa:vlijm/windowspy sudo apt-get update sudo apt-get install windowspy 

现在,指示器(包括预览窗口)的果汁很低。 选项包括设置窗口,设置窗口边框大小/颜色,窗口大小。

在此处输入图像描述

与此同时,我发现关注AU窗口很有用; 看看有没有消息:)


老答复

第一个粗略的概念)

在另一个工作区上最小化窗口的表示

对我自己(大)的惊喜,它可以有效地完成,无论是欺骗和欺骗; 在另一个工作区上有一个窗口的更新表示。 适合观看电影,绝对足以让人留意其他地方的窗户(例如:我的电视卡窗口):

它在实践中如何运作

  1. 将窗口放在前面,按快捷键:

    在此处输入图像描述

    (窗口会最小化)

  2. 移动到另一个工作区,再次按快捷键,将出现一个窗口的小表示,每4秒更新一次:

    在此处输入图像描述

    窗口始终显示在其他窗口的顶部。 实际上,窗口是300px(宽度),但可以设置为任何大小。

  3. 要结束它,请按(再次)快捷键。 小窗口将关闭,您将移动到原始窗口的视口,该窗口将再次出现,未经过最小化。

脚本

  1. 控制脚本

     #!/usr/bin/env python3 import subprocess import os import sys import time # paths imagepath = os.path.join(os.environ["HOME"], ".showcase") wfile = os.path.join(imagepath, "currentwindow") vpfile = os.path.join(imagepath, "last_vp") # setup path if not os.path.exists(imagepath): os.mkdir(imagepath) def get(command): try: return subprocess.check_output(command).decode("utf-8").strip() except subprocess.CalledProcessError: pass def get_vp(): open(vpfile, "wt").write(get(["wmctrl", "-d"]).split()[5]) def run(command): subprocess.Popen(command) def convert_tohex(widxd): return widxd[:2]+((10-len(widxd))*"0")+widxd[2:] def check_windowtype(wid): check = get(["xprop", "-id", wid]) return not any([s in check for s in [ "_NET_WM_WINDOW_TYPE_DOCK", "_NET_WM_WINDOW_TYPE_DESKTOP"]]) def edit_winprops(wid, convert=True): run(["xdotool", "windowminimize", wid]) if convert: widxd = convert_tohex(hex(int(wid))) else: widxd = wid run(["wmctrl", "-i", "-r", widxd, "-b", "add,sticky"]) get_vp() open(os.path.join(imagepath, "currentwindow"), "wt").write(widxd) def initiate_min(): # if not, minmize window, write the file wid = get(["xdotool", "getactivewindow"]) if check_windowtype(wid): edit_winprops(wid) else: pidinfo = [l.split() for l in wlist.splitlines()] match = [l for l in pidinfo if all([ get(["ps", "-p", l[2], "-o", "comm="]) == "VirtualBox", not "Manager" in l])] if match: edit_winprops(match[0][0], convert=False) # windowlist wlist = get(["wmctrl", "-lp"]) if "Window preview" in wlist: # kill the miniwindow pid = get(["pgrep", "-f", "showmin"]) run(["kill", pid]) window = open(wfile).read().strip() viewport = open(vpfile).read().strip() run(["wmctrl", "-o", viewport]) time.sleep(0.3) run(["wmctrl", "-i", "-r", window, "-b", "remove,sticky"]) run(["wmctrl", "-ia", window]) os.remove(wfile) else: # check if windowfile exists wfileexists = os.path.exists(wfile) if wfileexists: # if file exists, try to run miniwindow window = open(wfile).read().strip() if window in wlist: # if the window exists, run! run(["showmin", window]) else: # if not, minmize window, write the file initiate_min() else: # if not, minmize window, write the file initiate_min() 
  2. 窗口代表

     #!/usr/bin/env python3 import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, GObject from PIL import Image import os import subprocess import time from threading import Thread import sys wid = sys.argv[1] xsize = 300 imagepath = os.path.join(os.environ["HOME"], ".showcase") if not os.path.exists(imagepath): os.mkdir(imagepath) img_in = os.path.join(imagepath, "image.png") resized = os.path.join(imagepath, "resized.png") def get_img(): subprocess.Popen([ "import", "-window", wid, "-resize", str(xsize), resized ]) get_img() class Splash(Gtk.Window): def __init__(self): Gtk.Window.__init__(self, title="Window preview") maingrid = Gtk.Grid() self.add(maingrid) self.image = Gtk.Image() # set the path to the image below self.resized = resized self.image.set_from_file(self.resized) maingrid.attach(self.image, 0, 0, 1, 1) maingrid.set_border_width(3) self.update = Thread(target=self.update_preview) self.update.setDaemon(True) self.update.start() def update_preview(self): while True: get_img() time.sleep(3) GObject.idle_add( self.image.set_from_file, self.resized, priority=GObject.PRIORITY_DEFAULT ) def miniwindow(): window = Splash() window.set_decorated(False) window.set_resizable(False) window.set_keep_above(True) window.set_wmclass("ShowCase", "showcase") window.connect("destroy", Gtk.main_quit) GObject.threads_init() window.show_all() window.move(70, 50) Gtk.main() miniwindow() 

如何使用

  1. 安装python3-pilxdotoolwmctrl

     sudo apt-get install xdotool wmctrl python3-pil 
  2. 如果它还不存在,则创建目录~/bin

  3. 将脚本1,他控制脚本复制为~/bin )中的(确切) showcase_control (无扩展名),并使其可执行
  4. 将脚本2(迷你窗口脚本) showmin~/bin (完全) showmin (无扩展名),并使其可执行
  5. 注销并重新登录,并将以下命令添加到您选择的快捷方式中:

     showcase_control 

    选择:系统设置>“键盘”>“快捷方式”>“自定义快捷方式”。 单击“+”并添加命令:

     showcase_control 

    它应该工作!

    • 按一下键即可抓取当前窗口
    • 移动到您想要迷你窗口的其他工作区
    • 再按一次显示迷你窗口
    • 再按一次可返回原始工作区,(自动)取消原始窗口的最小化并关闭迷你一个。

缺点?

  • 目前的设置为您的处理器增加了一些function 。 然而,在我(非常)旧的系统上,它增加了(平均而言)appr。 我认为4-5%,我没有注意到任何方式。

    更新:事实certificate, import可以一步调整图像大小,同时获取窗口图像。 这意味着处理器负载的大幅减少。 同时刷新时间较短(现在为3秒),仍处于较低的“成本”。

说明

  • 我的出发点是OP提到的方式,他希望使用该选项来关注另一个工作区的窗口,等待任何事情完成。
  • 虽然在另一个工作区上确实有一个窗口的精确(迷你)副本似乎是不可能的,但是一旦我们有了窗口id,我们就可以使用import -command创建一个现有窗口的图像。 虽然这两者都可以在没有焦点的最小化窗口或窗口上工作,但是有一个问题:窗口需要在当前工作空间中
  • 然后暂时(当使用迷你窗口时)使用wmctrl使窗口“粘滞”(在所有工作空间上几乎可用),但同时最小化。
  • 由于所有操作都是自动完成的,因此差异无效 ,因为也会返回到初始视口,“取消”粘合原始窗口并取消最小化,这是自动完成的。

简而言之:

  1. 按快捷键一次:目标窗口变粘,但最小化
  2. 再次按下它(可能是在另一个工作区):左上角出现一个小型的小窗口版本,每四秒钟更新一次。
  3. 再次按下:迷你窗口关闭,桌面移动到窗口的初始工作区,窗口恢复不粘且未最小化。

专门针对VirtualBox

当VBox窗口在前面时,结果是Ubuntu快捷键被禁用(!),因此需要以另一种方式启动控制脚本。 下面是几个简短的。

选项1

我编辑了控制脚本。 现在在VirtualBox的情况下:

  • 单击桌面上的任意位置然后按快捷键。 之后,只需使用快捷键显示窗口并退出。

    说明:如果窗口的类型为“desktop”,则控制脚本将退出,因为您不希望最小化桌面。 现在,如果当前活动窗口是桌面,则脚本首先查找可能存在的VirtualBox窗口,以进行目标。

选项2

  • 复制下面的图标(右键单击 – >另存为),将其另存为minwinicon.png

    在此处输入图像描述

  • 将下面的行复制到一个空文件中,将其保存为~/.local/share/applications minwin.desktop

     [Desktop Entry] Type=Application Name=Window Spy Exec=showcase_control Icon=/path/to/minwinicon.png StartupNotify=false 

    您需要注销并重新启动才能启动发现器以“找到”本地~/bin路径!
    将图标拖到启动器上以使用它。

第二种解决方案有一个重要的缺点:从发射器使用后,它将持续闪烁几秒钟,等待窗口出现。 在此期间,再次单击将不会有任何效果。 这可以解决,如此处所述,但包括在这个答案中的确会使它太长。 如果您想使用选项二,请查看链接。