ฉันสามารถมีหน้าต่างที่แสดงภาพตัวอย่างขนาดเล็กของพื้นที่ทำงานอื่นได้หรือไม่?


29

เป็นไปได้หรือไม่ที่จะทำมิเรอร์ส่วนสดของหนึ่งเวิร์กสเปซเพื่อให้สามารถมองเห็นได้ในเวิร์กสเปซปัจจุบันเป็นหน้าต่างที่สามารถเคลื่อนย้ายไปมาได้?

วันก่อนฉันมี Windows 10 VM ทำงานบนโฮสต์ Ubuntu 16.04 ซึ่งใช้เวลานานมากในการอัปเดตให้เสร็จสมบูรณ์ ฉันตรวจสอบความคืบหน้าผ่านทาง Expo ( Super+ S) บน Ubuntu ต่อไป ฉันคิดว่าปัญหานี้ได้รับการแก้ไขแล้วเนื่องจากเครื่องมืออย่างเช่น simplescreenrecorder สามารถกำหนดค่าให้บันทึกเพียงส่วนหนึ่งของหน้าจอ อย่างไรก็ตามฉันไม่ทราบคำศัพท์ที่เหมาะสมที่จะใช้สำหรับการค้นหาโดย Google

ฉันต้องการดูภาพหน้าจอ 300x150 ด้านล่างในรูปแบบของหน้าต่างลอย (พร้อมการอัปเดตสด) ที่มุมขวาบนของพื้นที่ทำงานใดก็ตามที่เกิดขึ้นในปัจจุบัน

ป้อนคำอธิบายรูปภาพที่นี่


1
@serg นี่เป็นโครงการใหม่สำหรับคุณ
Rinzwind

@ Rinzwind คุณต้องเกลียด Serg ... พวกเรา (ทั้งคู่) มองอะไรแบบนี้มาก่อนไม่ประสบความสำเร็จ
Jacob Vlijm

1
ฉันยังใส่เงินรางวัลในครั้งนี้: =) ไปถึงมันได้ที่ @JacobVlijm
Rinzwind

จะเป็นคุณสมบัติเจ๋ง :) มันจะไม่ช่วยในกรณี VM แต่มีวิธีแก้ปัญหาสำหรับการใช้งานเทอร์มินัล: การใช้ Konsole มันมีสองตัวเลือกที่มีประโยชน์: "แจ้งเตือนเมื่อมีกิจกรรม" และ "แจ้งเตือนเมื่อปิดเสียง" คนแรกจะส่งการแจ้งเตือนให้คุณเมื่อบรรทัดใหม่ถูกแสดงในเทอร์มินัล (มีประโยชน์เมื่อใช้tail -F file | grep patternในบันทึกเพื่อเตือนเหตุการณ์บางอย่าง) อันที่สองจะส่งการแจ้งเตือนให้คุณเมื่อมีเวลาพอสมควรตั้งแต่บรรทัดที่เขียนล่าสุด รู้ว่าเมื่อสร้างได้สิ้นสุดลงแล้ว)
kik

@Rinzwind อึศักดิ์สิทธิ์ก็จะไปทำงาน ...
จาค็อบ Vlijm

คำตอบ:


26

แก้ไข

(คำตอบใหม่)

DONE
คำตอบด้านล่างมีให้ในรูปแบบขัดเงาเป็นตัวบ่งชี้ในฐานะ ppa สำหรับ Trusty, Xenial, Yakkety และ Zesty:

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

ตัวบ่งชี้ที่ Th (รวมถึงหน้าต่างแสดงตัวอย่าง) ตอนนี้น้ำผลไม้ต่ำมาก ตัวเลือกรวมถึงหน้าต่างการตั้งค่าการตั้งค่าขนาด / สีขอบหน้าต่างขนาดหน้าต่าง

ป้อนคำอธิบายรูปภาพที่นี่

ในระหว่างนี้ฉันพบว่ามีประโยชน์ที่จะคอยจับตาดูหน้าต่าง 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-pil, xdotoolและwmctrl

    sudo apt-get install xdotool wmctrl python3-pil
    
  2. ~/binสร้างถ้ามันยังไม่ปรากฏอยู่ไดเรกทอรี

  3. คัดลอกสคริปต์ 1 เขาควบคุมสคริปต์ในฐานะ (ตรง) showcase_control(ไม่มีส่วนขยาย) ใน~/binและทำให้สามารถเรียกใช้งานได้
  4. คัดลอกสคริปต์ 2, สคริปต์ mini- หน้าต่างเป็น (ตรง) showmin(ไม่มีส่วนขยาย) ใน~/binและทำให้สามารถเรียกใช้งานได้
  5. ออกจากระบบและกลับเข้ามาและเพิ่มคำสั่งต่อไปนี้ไปยังทางลัดที่คุณเลือก:

    showcase_control
    

    เลือก: การตั้งค่าระบบ> "แป้นพิมพ์"> "ทางลัด"> "ทางลัดที่กำหนดเอง" คลิกที่ "+" และเพิ่มคำสั่ง:

    showcase_control
    

    และมันก็ใช้ได้ดี!

    • กดปุ่มหนึ่งครั้งเพื่อคว้าหน้าต่างปัจจุบัน
    • ย้ายไปยังพื้นที่ทำงานอื่นที่คุณต้องการหน้าต่างมินิ
    • กดอีกครั้งเพื่อแสดงหน้าต่างเล็ก ๆ
    • กดอีกครั้งเพื่อย้ายกลับไปยังพื้นที่ทำงานดั้งเดิม (โดยอัตโนมัติ) ยกเลิกการย่อขนาดหน้าต่างต้นฉบับและปิด mini -one

ข้อเสีย?

  • การตั้งค่าตามที่เป็นอยู่ในปัจจุบันจะเพิ่มงานบางอย่างสำหรับโปรเซสเซอร์ของคุณ ในระบบเก่า (มาก) ของฉันมันจะเพิ่ม (โดยเฉลี่ย) appr 4-5% ฉันคิดว่าที่ฉันไม่ได้สังเกตเห็นในใด ๆวิธี

    ปรับปรุง:ปรากฎว่าimportสามารถปรับขนาดภาพในขั้นตอนเดียวพร้อมกับดึงภาพหน้าต่าง นี่หมายถึงการลดโหลดโปรเซสเซอร์อย่างมาก ในเวลาเดียวกันเวลารีเฟรชจะสั้นลง (3 วินาทีในขณะนี้) ยังคงอยู่ที่ "ต้นทุน" ที่ต่ำ

คำอธิบาย

  • จุดเริ่มต้นของฉันคือวิธีที่ OP กล่าวถึงเขาต้องการใช้ตัวเลือกเพื่อจับตาดูหน้าต่างในพื้นที่ทำงานอื่นโดยรอบางสิ่งที่จะทำให้เสร็จ
  • ในขณะที่ตัวอักษรที่มีความแน่นอน (ขนาดเล็ก) คัดลอกของหน้าต่างบนพื้นที่ทำงานอื่นไปไม่ได้ดูเหมือนว่าเราสามารถทำให้ภาพของหน้าต่างที่มีอยู่กับimportคำสั่งเมื่อเรามีรหัสหน้าต่าง ขณะนี้ทั้งสองทำงานบน Windows ลดลงหรือหน้าต่างโดยไม่ต้องโฟกัสมี แต่ปัญหาหนึ่งที่: ความต้องการของหน้าต่างจะเป็นบนพื้นที่ทำงานปัจจุบัน
  • เคล็ดลับคือการชั่วคราว (ในขณะที่ใช้มินิ - หน้าต่าง) ทำให้หน้าต่าง "เหนียว" (สามารถใช้ได้จริงในพื้นที่ทำงานทั้งหมด) ด้วยwmctrlแต่จะย่อเล็กสุดในเวลาเดียวกัน
  • เนื่องจากทั้งหมดจะทำโดยอัตโนมัติความแตกต่างอย่างมีประสิทธิภาพคือไม่มีตั้งแต่กลับไปที่วิวพอร์ตเริ่มต้น "ยกเลิกการ" เหนียวหน้าต่างต้นฉบับและการย่อเล็กสุดจะถูกทำโดยอัตโนมัติ

ในระยะสั้น:

  1. การกดปุ่มลัดหนึ่งครั้ง: หน้าต่างที่กำหนดเป็นเป้าหมายจะเหนียว แต่ถูกย่อให้เล็กสุด
  2. กดอีกครั้ง (น่าจะเป็นพื้นที่ทำงานอื่น): หน้าต่างขนาดเล็กรุ่นเล็กปรากฏขึ้นที่มุมซ้ายบนซึ่งอัปเดตหนึ่งครั้งต่อสี่วินาที
  3. กดอีกครั้ง: ปิดหน้าต่างย่อส่วนเดสก์ท็อปจะย้ายไปยังพื้นที่ทำงานเริ่มต้นของหน้าต่างหน้าต่างจะถูกเรียกคืนไม่เหนียวเหนอะและย่อเล็กสุด

โดยเฉพาะสำหรับ VirtualBox

เมื่อหน้าต่าง VBox อยู่ด้านหน้ามันจะเปิดใช้งานคีย์ลัดของ Ubuntu เพื่อปิดใช้งาน (!) ดังนั้นสคริปต์ควบคุมจะต้องเปิดใช้งานในอีกทางหนึ่ง ด้านล่างสั้น ๆ ไม่กี่คน

ตัวเลือกที่ 1

ฉันแก้ไขสคริปต์ควบคุม ตอนนี้เฉพาะในกรณีของ VirtualBox:

  • คลิกที่ใดก็ได้บนเดสก์ท็อปจากนั้นกดปุ่มทางลัด หลังจากนั้นเพียงใช้ปุ่มทางลัดเพื่อแสดงหน้าต่างและออก

    คำอธิบาย: สคริปต์ควบคุมถูกสร้างขึ้นเพื่อออกหากหน้าต่างเป็นประเภท "เดสก์ท็อป" เนื่องจากคุณไม่ต้องการย่อขนาดเดสก์ท็อปให้เหลือน้อยที่สุด ตอนนี้สคริปต์จะค้นหาหน้าต่าง 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เส้นทางในท้องถิ่น!
    ลากไอคอนไปยังตัวเรียกใช้เพื่อใช้งาน

โซลูชันที่สองมีข้อเสียที่สำคัญ: หลังจากใช้งานจากตัวเรียกใช้งานมันจะกะพริบต่อไปสองสามวินาทีเพื่อรอให้หน้าต่างปรากฏขึ้น ในระหว่างนั้นการคลิกอีกครั้งจะไม่มีผลใด ๆ ที่สามารถแก้ไขได้ตามที่อธิบายไว้ที่นี่แต่รวมถึงในคำตอบนี้จะทำให้มันยาวเกินไป หากคุณต้องการใช้ตัวเลือกที่สองโปรดดูที่ลิงค์


ดังนั้นผู้อาวุโสที่ดีimportสามารถทำได้ในขณะที่ gnome-screenshot ไม่สามารถทำได้ น่าสนใจมาก ๆ ฉันอยากรู้ว่าอะไรคือความแตกต่างระหว่างวิธีการทำงานของพวกเขา
Sergiy Kolodyazhnyy

@Serg ใช่ฉันรู้สึกประหลาดใจจริงๆคิดว่ามันไม่สามารถทำได้ด้วยเครื่องมือห้องครัวเพียง :)
จาค็อบ Vlijm

1
@ThatGuy ทำงานกับมัน :)
จาค็อบ Vlijm

1
@jymbob ขอบคุณสำหรับความคิดเห็น! พวกเขาไม่ต้องสงสัยเลยในระบบ แต่คำถามก็คือถ้ามีให้จากภายนอก หากนักพัฒนาไม่ได้ให้ตัวเลือก cli หรือ API ในทางใดทางหนึ่งการเจาะเข้าไปในรหัสจะเป็นงานของคำสั่งที่แตกต่างอย่างสิ้นเชิง ฉันชอบที่จะมีตัวเลือกว่า
Jacob Vlijm

1
@JacobVlijm จุดยุติธรรม อาจมีข้อมูลเพิ่มเติมได้ที่นี่stackoverflow.com/questions/18595951/…แต่เหนือระดับความสามารถของฉัน!
jymbob

1

สิ่งที่ดูเหมือนว่า overkill แต่ทั้งหมดทำงานเพื่อวัตถุประสงค์นี้คือเปิดวิทยุและโทรทัศน์ ในกล่องรายการ "แหล่งที่มา" คลิกเครื่องหมายบวกเลือก "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 ทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.