AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 797614
Accepted
AnthonyK
AnthonyK
Asked: 2016-07-12 20:12:45 +0800 CST2016-07-12 20:12:45 +0800 CST 2016-07-12 20:12:45 +0800 CST

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

  • 772

是否可以镜像一个工作区的实时部分,使其在当前工作区中作为可以移动的窗口可见?

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

我希望看到下面的 300x150 屏幕截图以浮动窗口(带有实时更新)的形式出现在当前工作区的右上角。

在此处输入图像描述

unity
  • 2 2 个回答
  • 3961 Views

2 个回答

  • Voted
  1. Best Answer
    Jacob Vlijm
    2016-11-08T06:29:21+08:002016-11-08T06:29:21+08:00

    编辑

    (新答案)

    完毕。
    下面的答案现在以精致的形式提供,作为指标,作为 Trusty、Xenial、Yakkety 和 Zesty 的 ppa:

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

    Th 指示器(包括预览窗口)现在非常低。选项包括设置窗口、设置窗口边框大小/颜色、窗口大小。

    在此处输入图像描述

    同时,我发现关注 AU 窗口很有用;看看有没有留言:)


    旧答案

    (第一第二粗略概念)

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

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

    在实践中如何运作

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

      在此处输入图像描述

      (窗口将最小化)

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

      在此处输入图像描述

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

    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-pil,xdotool和wmctrl

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

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

      showcase_control
      

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

      showcase_control
      

      它应该工作!

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

    缺点?

    • 目前的设置为您的处理器增加了一些工作。然而,在我的(非常)旧系统上,它(平均)增加了 appr。我估计是 4-5%,我没有注意到这一点。

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

    解释

    • 我的出发点是 OP 提到他想使用该选项来关注另一个工作区上的窗口,等待任何事情完成。
    • 虽然实际上在另一个工作区上拥有一个窗口的精确(迷你)副本似乎是不可能的,但一旦我们有了窗口 ID ,我们就可以使用 - 命令制作现有窗口的图像。import虽然这都适用于最小化的窗口或没有焦点的窗口,但是有一个问题:窗口需要在当前工作区上。
    • 然后诀窍是暂时(在使用迷你窗口时)使窗口“粘”(在所有工作区中几乎都可用)wmctrl,但同时最小化。
    • 由于一切都是自动完成的,实际上没有区别,因为返回到初始视口,“un-”粘住原始窗口并取消最小化它是自动完成的。

    简而言之:

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

    专门针对 VirtualBox

    当 VBox 窗口在前面时,原来 Ubuntu 快捷键被禁用(!),因此需要以另一种方式启动控制脚本。下面简单说几句。

    选项1

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

    • Click anywhere on the desktop, Then press your shortcut key. After that, simply use the shortcut key to show the window and exit.

      Explanation: The control script was made to exit if the window was of type "desktop", since you wouldn't want to minimize the desktop. Now the script first looks for possibly existing VirtualBox windows, to target, if the currently active window is the desktop.

    Option 2

    • Copy the icon below (right- click -> save as), save it as minwinicon.png

      在此处输入图像描述

    • Copy the lines below into an empty file, save it as minwin.desktop in ~/.local/share/applications:

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

      You'd need to log out and back in for the launcher to "find" the local ~/bin path!
      Drag the icon on to the launcher to use it.

    The second solution has an important downside: after using it from the launcher, it will keep blinking for a few seconds, waiting for a window to appear. During that, clicking again won't have any effect. That can be solved, as described here, but including that in this answer would really make it too long. If you want to use option two, please look into the link.

    • 27
  2. golvok
    2019-09-03T14:01:44+08:002019-09-03T14:01:44+08:00

    看起来有点矫枉过正但完全适用于这个目的的东西是Open Broadcaster。在“Sources”列表框中,点击加号,选择“Window Capture”,然后根据提示选择您感兴趣的窗口。点击记录没有意义;只需使用预览。它几乎适用于任何操作系统,这里有 Ubuntu 的说明,我在下面复制了这些说明。

    sudo apt-get install ffmpeg
    sudo add-apt-repository ppa:obsproject/obs-studio
    sudo apt-get update
    sudo apt-get install obs-studio
    

    如果您愿意,您可以进入“查看”菜单并隐藏所有 UI 元素。

    • 1

相关问题

  • 如何将 Web 应用程序放入 Unity Launcher?

  • Ubuntu 上网本 10.10 中没有 Alt+F2?

  • Unity 中的 gnome-do 样式键盘快捷键

  • 在哪里提交 Unity 的错误/愿望清单?

  • Unity 启动器——它可以作为单独的包提供吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve