Tôi có thể có một cửa sổ hiển thị bản xem trước trực tiếp nhỏ của không gian làm việc khác không?


29

Có thể phản chiếu một phần trực tiếp của một không gian làm việc để nó có thể nhìn thấy trong không gian làm việc hiện tại dưới dạng một cửa sổ có thể được di chuyển xung quanh?

Hôm trước tôi có máy ảo Windows 10 chạy trên máy chủ Ubuntu 16.04, mất rất nhiều thời gian để hoàn tất cập nhật. Tôi tiếp tục kiểm tra tiến trình của nó thông qua hội chợ triển lãm ( Super+ S) trên Ubuntu. Điều đó khiến tôi nghĩ rằng vấn đề này rất có thể đã được giải quyết vì các công cụ như simplescreenrecorder có thể được cấu hình để ghi lại chỉ một phần của màn hình. Tuy nhiên, tôi không biết thuật ngữ thích hợp để sử dụng cho tìm kiếm Google của mình.

Tôi muốn xem ảnh chụp màn hình 300x150 bên dưới dưới dạng cửa sổ nổi (có cập nhật trực tiếp) ở góc trên bên phải của bất kỳ không gian làm việc nào là hiện tại.

nhập mô tả hình ảnh ở đây


1
@serg ở đây một dự án mới cho bạn
Rinzwind

@Rinzwind bạn phải ghét Serg ... Chúng tôi (cả hai) đã từng nhìn vào thứ gì đó như thế này trước đây, đã không thành công.
Jacob Vlijm

1
Tôi thậm chí còn đặt tiền thưởng vào lần này: =) nhận được nó @JacobVlijm
Rinzwind

Sẽ là một tính năng thú vị :) Nó sẽ không giúp ích gì trong trường hợp VM, nhưng có một giải pháp cho các ứng dụng đầu cuối: sử dụng Konsole. Nó có hai tùy chọn hữu ích: "thông báo về hoạt động" và "thông báo về sự im lặng". Dòng đầu tiên sẽ gửi cho bạn một thông báo khi một dòng mới được hiển thị trong thiết bị đầu cuối (hữu ích khi sử dụng tail -F file | grep patterntrên nhật ký để được cảnh báo về một số sự kiện), dòng thứ hai sẽ gửi thông báo cho bạn khi có một thời gian kể từ dòng viết cuối cùng (hữu ích cho biết khi nào việc xây dựng kết thúc).
kik

@Rinzwind tào lao thần thánh, nó sẽ hoạt động ...
Jacob Vlijm 6/11/2016

Câu trả lời:


26

CHỈNH SỬA

(Câu trả lời mới)

LÀM XONG.
Câu trả lời dưới đây hiện có sẵn ở dạng đánh bóng, dưới dạng chỉ báo, dưới dạng ppa cho Trusty, Xenial, Yakkety và Zesty:

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

Chỉ báo (bao gồm cả cửa sổ xem trước) hiện đang ở mức thấp. Các tùy chọn bao gồm cửa sổ cài đặt, cài đặt kích thước / màu viền cửa sổ, kích thước cửa sổ.

nhập mô tả hình ảnh ở đây

Trong khi đó, tôi thấy thật hữu ích khi để mắt đến cửa sổ AU; xem có tin nhắn nào không :)


TRẢ LỜI

( khái niệm thô thứ hai đầu tiên )

Có một đại diện tối thiểu của một cửa sổ trên không gian làm việc khác

Đối với sự ngạc nhiên (lớn) của riêng tôi, nó có thể được thực hiện một cách hiệu quả , có thể là với mánh khóe và lừa dối; có một đại diện cập nhật của một cửa sổ trên không gian làm việc khác. Không phù hợp để xem phim, chắc chắn đủ tốt để theo dõi cửa sổ ở nơi khác (ví dụ: cửa sổ thẻ tv của tôi):

Làm thế nào nó hoạt động trong thực tế

  1. Với cửa sổ phía trước, bấm phím tắt:

    nhập mô tả hình ảnh ở đây

    (cửa sổ sẽ thu nhỏ)

  2. Di chuyển đến không gian làm việc khác, nhấn phím tắt một lần nữa, một đại diện nhỏ của cửa sổ sẽ xuất hiện, cập nhật cứ sau 4 giây:

    nhập mô tả hình ảnh ở đây

    Cửa sổ luôn hiển thị trên đầu các cửa sổ khác. Như vậy, cửa sổ có kích thước 300px (chiều rộng), nhưng có thể được đặt thành bất kỳ kích thước nào.

  3. Để kết thúc nó, nhấn (một lần nữa) phím tắt. Cửa sổ nhỏ sẽ đóng lại, bạn sẽ di chuyển đến khung nhìn của cửa sổ ban đầu, nó sẽ xuất hiện lại, không bị tối ưu hóa.

Các kịch bản

  1. Kịch bản điều khiển

    #!/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. Cửa sổ đại diện

    #!/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()
    

Cách sử dụng

  1. Cài đặt python3-pil, xdotoolwmctrl

    sudo apt-get install xdotool wmctrl python3-pil
    
  2. Tạo, nếu nó chưa tồn tại, thư mục ~/bin.

  3. Sao chép tập lệnh 1, anh ta kiểm soát tập lệnh, như (chính xác) showcase_control(không có phần mở rộng) trong ~/binlàm cho tập lệnh thực thi .
  4. Sao chép tập lệnh 2, tập lệnh cửa sổ nhỏ, dưới dạng (chính xác) showmin(không có phần mở rộng) ~/binlàm cho tập lệnh thực thi .
  5. Đăng xuất và đăng nhập lại và thêm lệnh sau vào lối tắt bạn chọn:

    showcase_control
    

    Chọn: Cài đặt hệ thống> "Bàn phím"> "Phím tắt"> "Phím tắt tùy chỉnh". Nhấp vào "+" và thêm lệnh:

    showcase_control
    

    và nó nên hoạt động!

    • Nhấn phím một lần để lấy cửa sổ hiện tại
    • di chuyển đến không gian làm việc khác nơi bạn thích cửa sổ nhỏ
    • Nhấn một lần nữa để hiển thị miniwindow
    • Nhấn một lần nữa để di chuyển trở lại không gian làm việc ban đầu, (tự động) bỏ thu nhỏ cửa sổ ban đầu và đóng mini -one.

Nhược điểm?

  • Việc thiết lập, như hiện tại, thêm một số công việc cho bộ xử lý của bạn. Tuy nhiên, trên hệ thống cũ (rất) của tôi, nó bổ sung (trung bình) appr. 4-5% tôi nghĩ, điều mà tôi đã không nhận thấy bằng bất kỳ cách nào.

    Cập nhật: Hóa ra importcó thể thay đổi kích thước hình ảnh trong một bước, cùng với tìm nạp hình ảnh cửa sổ. Điều này có nghĩa là giảm đáng kể tải bộ xử lý. Đồng thời thời gian làm mới ngắn hơn (3 giây bây giờ), vẫn với "chi phí" thấp hơn.

Giải trình

  • Điểm xuất phát của tôi là cách OP đề cập rằng anh ấy muốn sử dụng tùy chọn để theo dõi một cửa sổ trên một không gian làm việc khác, chờ đợi một cái gì đó kết thúc.
  • Trong khi theo nghĩa đen có một chính xác (mini) sao chép của một cửa sổ trên không gian làm việc khác dường như không thể, chúng ta có thể làm cho một hình ảnh của một cửa sổ hiện tại với import-Command, một khi chúng ta có id cửa sổ. Mặc dù cả hai đều hoạt động trên các cửa sổ hoặc cửa sổ thu nhỏ mà không tập trung, tuy nhiên có một vấn đề: cửa sổ cần phải ở trên không gian làm việc hiện tại .
  • Thủ thuật sau đó là tạm thời (trong khi cửa sổ nhỏ được sử dụng) làm cho cửa sổ "dính" (hầu như có sẵn trên tất cả các không gian làm việc) với wmctrl, nhưng được thu nhỏ cùng một lúc.
  • Vì tất cả được thực hiện tự động, nên sự khác biệt có hiệu quả là không có, vì cũng quay lại chế độ xem ban đầu, "un-" dán cửa sổ ban đầu và bỏ tối thiểu nó, được thực hiện tự động.

Nói ngắn gọn:

  1. Nhấn phím tắt một lần: cửa sổ được nhắm mục tiêu được thực hiện dính, nhưng được thu nhỏ
  2. Nhấn lại lần nữa (có lẽ là trên một không gian làm việc khác): một phiên bản nhỏ của cửa sổ xuất hiện ở góc trên bên trái, được cập nhật một lần trong bốn giây.
  3. Nhấn lại lần nữa: cửa sổ mini được đóng lại, màn hình nền di chuyển đến không gian làm việc ban đầu của cửa sổ, cửa sổ được khôi phục không dính và không thu nhỏ.

Cụ thể cho VirtualBox

Khi cửa sổ VBox ở phía trước, hóa ra các phím tắt Ubuntu bị vô hiệu hóa (!), Vì vậy tập lệnh điều khiển cần được khởi chạy theo cách khác. Dưới đây một vài cái ngắn gọn.

lựa chọn 1

Tôi đã chỉnh sửa tập lệnh điều khiển. Bây giờ chỉ trong trường hợp VirtualBox:

  • Nhấp vào bất cứ nơi nào trên máy tính để bàn, sau đó nhấn phím tắt của bạn. Sau đó, chỉ cần sử dụng phím tắt để hiển thị cửa sổ và thoát.

    Giải thích: Tập lệnh điều khiển được tạo để thoát nếu cửa sổ thuộc loại "máy tính để bàn", vì bạn sẽ không muốn thu nhỏ màn hình. Bây giờ tập lệnh trước tiên tìm các cửa sổ VirtualBox có thể có, để nhắm mục tiêu, nếu cửa sổ hiện đang hoạt động là máy tính để bàn.

Lựa chọn 2

  • Sao chép biểu tượng bên dưới (nhấp chuột phải -> lưu dưới dạng), lưu dưới dạng minwinicon.png

    nhập mô tả hình ảnh ở đây

  • Sao chép các dòng dưới đây vào một tệp trống, lưu nó như minwin.desktoptrong ~/.local/share/applications:

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

    Bạn cần đăng xuất và đăng nhập lại để trình khởi chạy "tìm" ~/binđường dẫn cục bộ !
    Kéo biểu tượng vào trình khởi chạy để sử dụng nó.

Giải pháp thứ hai có một nhược điểm quan trọng: sau khi sử dụng nó từ trình khởi chạy, nó sẽ tiếp tục nhấp nháy trong vài giây, chờ đợi một cửa sổ xuất hiện. Trong thời gian đó, nhấp lại sẽ không có hiệu lực. Điều đó có thể được giải quyết, như được mô tả ở đây , nhưng bao gồm điều đó trong câu trả lời này sẽ thực sự làm cho nó quá dài. Nếu bạn muốn sử dụng tùy chọn hai, vui lòng xem liên kết.


Vì vậy, cũ tốt importcó thể làm điều đó, trong khi ảnh chụp màn hình gnome không thể. Rất, rất thú vị. Tôi
tò mò

@Serg yeah, tôi thực sự ngạc nhiên, nghĩ rằng nó không thể được thực hiện chỉ với dụng cụ nhà bếp :)
Jacob Vlijm

1
@ThatGuy làm việc trên nó :)
Jacob Vlijm

1
@jymbob Cảm ơn bạn đã bình luận! Họ không nghi ngờ gì trong hệ thống, nhưng câu hỏi là nếu chúng có sẵn từ bên ngoài. Nếu các nhà phát triển không cung cấp tùy chọn cli hoặc API theo bất kỳ cách nào, việc xâm nhập vào mã sẽ là một công việc hoàn toàn khác. Tôi muốn có tùy chọn mặc dù.
Jacob Vlijm

1
@JacobVlijm Điểm công bằng. Có thể biết thêm thông tin ở đây stackoverflow.com/questions/18595951/ trên nhưng vượt quá khả năng của tôi!
jymbob

1

Một cái gì đó có vẻ như quá mức cần thiết nhưng hoàn toàn hoạt động cho mục đích này là Open Broadcaster . Trong hộp danh sách "Nguồn", nhấp vào dấu cộng, chọn "Chụp cửa sổ", sau đó làm theo lời nhắc để chọn cửa sổ bạn quan tâm. Không cần nhấn vào bản ghi; chỉ cần sử dụng bản xem trước. Nó có sẵn cho hầu hết mọi hệ điều hành , với hướng dẫn cho Ubuntu tại đây , mà tôi đã sao chép bên dưới.

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

Nếu bạn cảm thấy thích nó, thì bạn có thể vào menu "Xem" và ẩn tất cả các thành phần UI.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.