다른 작업 공간의 작은 라이브 미리보기를 보여주는 창을 가질 수 있습니까?


29

현재 작업 공간에서 이동할 수있는 창으로 표시되도록 한 작업 공간의 라이브 섹션을 미러링 할 수 있습니까?

다른 날에는 Ubuntu 16.04 호스트에서 Windows 10 VM을 실행하여 업데이트를 완료하는 데 정말 오랜 시간이 걸렸습니다. 우분투에서 엑스포 ( Super+ S)를 통해 진행 상황을 계속 확인했습니다 . simplescreenrecorder와 같은 도구가 화면의 일부만 기록하도록 구성 할 수 있기 때문에이 문제는 이미 해결되었을 가능성이 가장 높습니다. 그러나 Google 검색에 사용할 적절한 용어를 모르겠습니다.

아래의 300x150 스크린 샷을 현재 작업 공간의 오른쪽 상단에 떠있는 창 (실시간 업데이트 포함) 형태로보고 싶습니다.

여기에 이미지 설명을 입력하십시오


1
@serg 여기 당신을위한 새로운 프로젝트
Rinzwind

@Rinzwind 당신은 Serg를 미워해야합니다 ... 우리 (모두)이 같은 것을보고 전에 성공하지 못했습니다.
Jacob Vlijm

1
나는 심지어 이번에 현상금을 넣었다 : =) 그것에게 @JacobVlijm
Rinzwind

멋진 기능이 될 것입니다 :) VM 경우에는 도움이되지 않지만 Konsole 사용과 같은 터미널 응용 프로그램에 대한 솔루션이 있습니다. "활동 알림"및 "자동 알림"의 두 가지 유용한 옵션이 있습니다. 첫 번째 줄은 터미널에 새 줄이 표시되면 알림을 보내며 ( tail -F file | grep pattern일부 이벤트를 경고하기 위해 로그를 사용할 때 유용 합니다) 두 번째 줄은 마지막 줄 이후의 시간이있을 때 알림을 보냅니다. 빌드가 언제 끝났는지 알 수 있습니다).
kik

@Rinzwind 거룩한 쓰레기, 그것은 작동합니다 ...
Jacob Vlijm

답변:


26

편집하다

(신규 답변)

끝난.
아래의 답변은 이제 Trusty, Xenial, Yakkety 및 Zesty의 ppa로 지표로 세련된 형태로 제공됩니다.

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

주스의 표시기 (미리보기 창 포함)가 매우 낮습니다. 옵션에는 설정 창, 설정 창 테두리 크기 / 색상, 창 크기가 있습니다.

여기에 이미지 설명을 입력하십시오

그 동안 AU 창을 주시하는 것이 유용하다는 것을 알았습니다. 메시지가 있는지 확인하십시오 :)


오래된 답변

( 번째 거친 개념)

다른 작업 공간에서 창을 최소화하여 표현

놀랍게도 속임수와 속임수 로 효과적으로 수행 할 수 있습니다 . 다른 작업 공간에서 업데이트 된 창 표현을 갖습니다. 영화를보기에는 적합 하지 않으며 다른 곳의 창문 (예 : 내 TV 카드 창)을 계속 볼 수있을 정도로 충분합니다.

실제로 작동하는 방식

  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-pil, xdotoolwmctrl

    sudo apt-get install xdotool wmctrl python3-pil
    
  2. 디렉토리가 없으면 작성하십시오 ~/bin.

  3. 복사 스크립트 1, 그는 (정확하게)와 같은 스크립트 제어 showcase_control에서 (확장자)을 ~/bin하고, 그것을 실행하기 .
  4. 복사 스크립트 2 (정확하게)과 미니 창 스크립트 showmin에서 (확장자) ~/bin, 그리고 그것을 실행하기 .
  5. 로그 아웃했다가 다시 로그인하고 선택한 바로 가기에 다음 명령을 추가하십시오.

    showcase_control
    

    시스템 설정> "키보드"> "바로 가기"> "사용자 정의 바로 가기"를 선택하십시오. "+"를 클릭하고 다음 명령을 추가하십시오.

    showcase_control
    

    그리고 작동해야합니다!

    • 키를 한 번 눌러 현재 창을 가져옵니다.
    • 미니 윈도우를 원하는 다른 작업 공간으로 이동
    • 다시 누르면 미니 윈도우가 나타납니다
    • 다시 누르면 원래 작업 공간으로 돌아가고 (자동으로) 원래 창을 최소화하고 미니 -1을 닫습니다.

단점?

  • 설정은 현재와 같이 프로세서에 약간의 작업을 추가합니다 . 그러나 내 (매우) 오래된 시스템에서는 (평균) appr이 추가됩니다. 4-5 % 나는 어떤 식 으로든 눈치 채지 못했다고 생각 합니다 .

    업데이트 : 그것은 밝혀 import과 함께, 한 번에 이미지 크기를 조정할 수 있습니다 가져 오는 창 이미지를. 이는 프로세서로드가 상당히 줄어든 것을 의미합니다. 동시에 새로 고침 시간이 짧아지고 (현재 3 초) 여전히 "비용"이 낮습니다.

설명

  • 내 출발점은 OP가 다른 옵션을 사용하여 다른 작업 공간의 창을 주시하고 무언가를 마칠 때까지 기다리겠다고 언급 한 방식이었습니다.
  • 하지만 말 그대로 정확한 (미니) 다른 작업 공간에 창으로 복사 가진 것은 불가능 보인다, 우리는 할 수 과 기존 윈도우의 이미지를 만들어 import우리가 윈도우 ID를 일단, - 명령. 둘 다 초점이없는 최소화 된 창 또는 창에서 작동하지만 한 가지 문제가 있습니다. 창 은 현재 작업 공간에 있어야합니다 .
  • 트릭은 (미니 윈도우가 사용되는 동안) 일시적으로 창을 "고정"(모든 작업 공간에서 사실상 사용 가능)으로 wmctrl만들지 만 동시에 최소화하는 것입니다.
  • 모든 것이 자동으로 수행되기 때문에 차이는 사실상 없습니다. 초기 뷰포트로 돌아와서 원래 창을 "고정 해제"하고 고정을 해제하면 자동으로 수행됩니다.

한마디로 :

  1. 바로 가기를 한 번 누르기 : 대상 창이 고정되어 있지만 최소화됩니다.
  2. 다시 누르면 (다른 작업 공간에서) : 왼쪽 상단에 작은 미니 버전의 창이 나타나고 4 초마다 한 번씩 업데이트됩니다.
  3. 다시 누르면 미니 창이 닫히고 바탕 화면이 창의 초기 작업 공간으로 이동하며 고정 및 최소화되지 않은 상태로 복원됩니다.

VirtualBox 전용

VBox 창이 앞에 있으면 Ubuntu 바로 가기 키가 비활성화 (!)되어 제어 스크립트를 다른 방법으로 시작해야합니다. 몇 가지 간단한 것들 아래.

옵션 1

제어 스크립트를 편집했습니다. 이제 VirtualBox의 경우 에만 :

  • 바탕 화면의 아무 곳이나 클릭 한 다음 바로 가기 키를 누릅니다. 그런 다음 바로 가기 키를 사용하여 창을 표시하고 종료하십시오.

    설명 : 데스크탑을 최소화하지 않으려는 창 유형이 "desktop"인 경우 제어 스크립트가 종료되었습니다. 이제 스크립트는 먼저 현재 활성화 된 창이 데스크탑 인 경우 대상이 될 기존 VirtualBox 창을 먼저 찾습니다.

옵션 2

  • 아래 아이콘을 복사 (오른쪽 클릭-> 다른 이름으로 저장)하여 다른 이름으로 저장하십시오. minwinicon.png

    여기에 이미지 설명을 입력하십시오

  • 빈 파일에 아래 라인을 복사로 저장 minwin.desktop에서 ~/.local/share/applications:

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

    실행기가 로컬 ~/bin경로 를 "찾기"하려면 로그 아웃했다가 다시 로그인해야 합니다!
    아이콘을 실행기로 드래그하여 사용하십시오.

두 번째 해결책은 중요한 단점이 있습니다. 실행기에서 사용한 후에는 몇 초 동안 깜박 거리면서 창이 나타날 때까지 기다립니다. 그 동안 다시 클릭해도 효과가 없습니다. 즉 설명 된대로 해결할 수 여기에 ,하지만이 답변에 정말 너무 오래 그것을 만들 것이라는 점을 포함. 옵션 2를 사용하려면 링크를 확인하십시오.


importgnome-screenshot은 할 수 없지만, 오래된 것은 그렇게 할 수 있습니다. 매우 흥미 롭습니다. 나는 그들이 일하는 방식의 차이점이 정확히 무엇인지 유쾌하다
Sergiy Kolodyazhnyy

그래 @Serg, 정말 놀랐습니다, 그것은 :) 단지 주방 도구와 함께 할 수없는 생각
야곱 Vlijm

1
@ThatGuy :)
Jacob Vlijm

1
@jymbob 댓글 주셔서 감사합니다! 그들은 시스템에서 의심의 여지가 없지만 외부에서 구할 수 있는지 여부는 의문입니다 . 개발자가 cli 옵션 또는 API를 제공하지 않으면 코드에 침입하는 것은 완전히 다른 순서입니다. 그래도 옵션을 갖고 싶습니다.
Jacob Vlijm

1
@JacobVlijm 페어 포인트. 아마도 추가 정보를 원하시면 여기 stackoverflow.com/questions/18595951/... 하지만 방법은 내 능력 수준의 위!
jymbob

1

과도하게 보이지만이 목적을 위해 완전히 작동하는 것은 Open Broadcaster 입니다. "소스"목록 상자에서 더하기를 클릭하고 "창 캡처"를 선택한 다음 프롬프트에 따라 관심있는 창을 선택하십시오. 기록에 타격이 없습니다. 미리보기 만 사용하십시오. 그것은 사용할 수있어 거의 모든 OS 우분투에 대한 지침과 함께, 여기에 내가 아래에 복사했습니다.

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

기분이 좋으면 "보기"메뉴로 가서 모든 UI 요소를 숨길 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.