Başka bir çalışma alanının küçük canlı önizlemesini gösteren bir pencere alabilir miyim?


29

Geçerli çalışma alanında hareket ettirilebilecek bir pencere olarak görünmesi için bir çalışma alanının canlı bir bölümünü yansıtmak mümkün mü?

Geçen gün Ubuntu 16.04 sunucumda çalışan Windows 10 VM vardı ve bu güncelleme işlemini tamamlamak için çok uzun zaman aldı. Ubuntu'daki gelişimini Expo ( Super+ S) ile kontrol etmeye devam ettim . Bu, basit ekran kaydedici gibi araçlar ekranın sadece bir bölümünü kaydedecek şekilde yapılandırılabildiğinden, bu sorunun büyük olasılıkla çözüldüğünü düşünmemi sağladı. Ancak, Google aramam için kullanılacak uygun terminolojiyi bilmiyorum.

Aşağıdaki 300x150 ekran görüntüsünü, hangisinin çalışma alanının güncel olacağını görmek için sağ üst köşesinde bir yüzen pencere (canlı güncellemelerle) şeklinde görmek istiyorum.

görüntü tanımını buraya girin


1
Burada sizin için yeni bir proje
@serg

@Rinzwind Serg'den nefret etmelisin ... Biz daha önce böyle bir şeye bakıyorduk, başaramadık.
Jacob Vlijm

1
Hatta bu sefer ona bir ödül bile verdim: =) Başla @JacobVlijm
Rinzwind 5:16

Harika bir özellik olurdu :) VM durumunda yardımcı olmaz, ancak terminal uygulamaları için bir çözüm var: Konsole kullanarak. İki kullanışlı seçeneği vardır: "aktiviteye bildir" ve "sessizliğe bildir". İlki, terminalde yeni bir satır gösterildiğinde size bir bildirim gönderecektir tail -F file | grep pattern(bazı etkinliklerde uyarılmak için günlüklerde kullanılırken yararlıdır ), ikincisi, son yazılan satırdan bu yana bir süre geçtiğinde size bildirim gönderecektir ( yapının ne zaman bittiğini bilmek).
kik

@ Rinzwind kutsal bok, işe yarayacak ...
Jacob Vlijm

Yanıtlar:


26

DÜZENLE

(Yeni cevap)

YAPILAN.
Aşağıdaki cevap, cilalı bir biçimde, gösterge olarak, Güven, Xenial, Yakkety ve Zesty için bir ppa olarak mevcuttur:

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

Th göstergesi (önizleme penceresi dahil) artık meyve suyunda oldukça düşük. Seçenekler arasında bir pencere penceresi, pencere kenarı boyutunu / rengini ayarlama ayarları penceresi bulunur.

görüntü tanımını buraya girin

Bu arada, AU penceresine göz kulak olmanın yararlı olduğunu gördüm; bakalım mesaj var mı :)


ESKİ CEVAP

( ilk ikinci kaba konsept)

Başka bir çalışma alanında bir pencerenin simge durumuna küçültülmüş şekilde gösterilmesini sağlayın

Sürpriz ve aldatmaca olsun, kendi (büyük) sürprizime göre, etkili bir şekilde yapılabilir; Başka bir çalışma alanında bir pencerenin güncellenmiş bir temsiline sahip olmak Bir filmi izlemek için uygun değil , kesinlikle başka bir pencereye göz kulak olacak kadar iyi (örneğin: TV kartı pencerem):

Uygulamada nasıl çalışır?

  1. Pencerenin önünde, bir kısayol tuşuna basın:

    görüntü tanımını buraya girin

    (pencere küçültülür)

  2. Başka bir çalışma alanına gidin, kısayol tuşuna tekrar basın, her 4 saniyede bir güncellenen, pencerenin küçük bir gösterimi görünecektir:

    görüntü tanımını buraya girin

    Pencere her zaman diğer pencerelerin üstünde gösterir. Olduğu gibi, pencere 300px (genişlik), ancak herhangi bir boyuta ayarlanabilir.

  3. Sonlandırmak için kısayol tuşuna (tekrar) basın. Küçük pencere kapanacak, orijinal pencerenin görünüm alanına, tekrar görüntülenecek ve küçültülmeyecektir.

Scriptler

  1. Kontrol komut dosyası

    #!/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. Pencere temsilcisi temsil

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

Nasıl kullanılır

  1. Yükleme python3-pil, xdotoolvewmctrl

    sudo apt-get install xdotool wmctrl python3-pil
    
  2. Henüz mevcut değilse, dizini oluşturun ~/bin.

  3. Komut 1'i kopyalayın, komut dosyasını kontrol edin (tam olarak) showcase_control(uzantı yok) ~/binve çalıştırılabilir hale getirin .
  4. Komut dosyası 2'yi, mini pencere komut dosyasını (tam olarak) showmin(uzantı yok) içine kopyalayın ~/binve yürütülebilir hale getirin .
  5. Oturumu kapatın ve tekrar açın ve aşağıdaki komutu seçtiğiniz bir kısayola ekleyin:

    showcase_control
    

    Seçin: Sistem Ayarları> "Klavye"> "Kısayollar"> "Özel Kısayollar". "+" İşaretini tıklayın ve şu komutu ekleyin:

    showcase_control
    

    ve çalışması gerekir!

    • Mevcut pencereyi kapmak için tuşa bir kez basın.
    • Mini pencereyi istediğiniz diğer çalışma alanına taşıyın
    • Mini pencereyi göstermek için tekrar basın
    • Orijinal çalışma alanına geri dönmek için tekrar basın, (otomatik olarak) orijinal pencereyi küçültün ve mini -on'u kapatın.

Downsides?

  • Kur, şu anda olduğu gibi, işlemciniz için bazı işler ekler . Bununla birlikte (çok) eski sistemimde, (ortalama) appr. % 4-5, sanırım hiçbir şekilde farketmedim .

    Güncelleme: Görünüşe göre import, bir adımda görüntüyü, pencere görüntüsünü getirerek yeniden boyutlandırabilirsiniz . Bu, işlemci yükünde önemli bir azalma anlamına gelir. Aynı zamanda, yenileme süresi daha kısadır (şimdi 3 saniye), hala daha düşük "maliyetler" altındadır.

açıklama

  • Başlangıç ​​noktam, OP'nin başka bir çalışma alanındaki bir pencerede göz tutma seçeneğini ya da bir şeyin bitmesini bekleyen seçeneği kullanmak istediğinden bahsetti.
  • İken anlamıyla tam (mini) başka çalışma alanında bir pencerenin kopya sahip imkansız görünüyor, biz olabilir , mevcut bir pencerenin bir görüntü yapmak importpencereyi kimliğe sahip bir kez, -Komut. Her ikisi de odaklanmayan küçültülmüş pencerelerde veya pencerelerde çalışırken, bununla ilgili bir sorun var: pencerenin geçerli çalışma alanında olması gerekiyor .
  • İşin püf noktası geçici olarak (mini-pencere kullanılırken) pencereyi "yapışkan" yapmak ( wmctrlaynı anda tüm çalışma alanlarında hemen hemen kullanılabilir) yapmak , ancak aynı anda en aza indirmektir.
  • Her şey otomatik olarak yapıldığından, fark etkin değildir, çünkü başlangıç ​​görünüm penceresine geri dönülür, orijinal pencereyi "un" kaldırır ve küçültür, otomatik olarak yapılır.

Kısacası:

  1. Kısayola bir kez basıldığında: hedeflenen pencere yapışkan yapılır, ancak simge durumuna küçültülür
  2. Tekrar basıldığında (muhtemelen başka bir çalışma alanında): pencerenin küçük bir sürümü sol üst köşede dört saniyede bir güncellenir.
  3. Tekrar basıldığında: mini pencere kapatılır, masaüstü pencerenin ilk çalışma alanına gider, pencere sabitlenmez ve simge durumuna küçültülür.

Özellikle VirtualBox için

VBox penceresi öndeyken, Ubuntu kısayol tuşlarının devre dışı bırakıldığı (!) Olduğu için kontrol komut dosyasının başka bir şekilde başlatılması gerekir. Birkaç kısa olanın altında.

seçenek 1

Kontrol komut dosyasını düzenledim. Şimdi sadece VirtualBox durumunda:

  • Masaüstünde herhangi bir yeri tıklayın , sonra kısayol tuşuna basın. Ondan sonra, sadece pencereyi göstermek ve çıkmak için kısayol tuşunu kullanın.

    Açıklama: Masaüstünü simge durumuna küçültmek istemeyeceğiniz için, pencere "desktop" türündeyse, kontrol komut dosyası çıkmak için yapıldı. Şimdi, komut dosyası, şu anda etkin olan pencerenin masaüstüyse hedeflenmesini hedefleyen VirtualBox pencerelerini arar.

seçenek 2

  • Aşağıdaki simgeyi kopyalayın (sağ tıklayın -> farklı kaydet), farklı kaydet minwinicon.png

    görüntü tanımını buraya girin

  • Aşağıdaki satırları boş bir dosyaya kopyalayın, minwin.desktopiçindeki gibi kaydedin ~/.local/share/applications:

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

    Başlatıcının yerel ~/binyolu "bulması" için oturumu kapatıp tekrar açmanız gerekir !
    Kullanmak için simgeyi başlatıcıya sürükleyin.

İkinci çözümün önemli bir dezavantajı vardır: başlatıcıdan kullandıktan sonra, birkaç saniye boyunca yanıp sönmeye devam eder ve bir pencerenin görünmesini bekler. Bu sırada, tekrar tıklamanın hiçbir etkisi olmaz. Yani olabilir açıklandığı gibi, çözülecek burada , ama bu cevap gerçekten çok uzun bunu yapacağını dahil. İkinci seçeneği kullanmak istiyorsanız, lütfen bağlantıya bakınız.


Yani, importgnome-screenshot yapamaz iken , iyi yaşlı bunu yapabilir. Çok, çok ilginç. Çalışma biçimleri arasındaki farkın tam olarak ne olduğuna dair ciddiyim
Sergiy Kolodyazhnyy

@Serg evet, gerçekten şaşırdım, sadece mutfak aletleriyle yapılamayacağını düşündüm :)
Jacob Vlijm

1
Üzerinde çalışan @ThatGuy :)
Jacob Vlijm

1
@jymbob Yorumunuz için teşekkürler! Sistemde şüphe yoktur, fakat soru dışardan uygun olup olmadıklarıdır . Geliştiriciler herhangi bir şekilde bir cli seçeneği veya API sağlamazsa, koda girme tamamen farklı bir düzende bir iş olacaktır. Yine de seçeneğe sahip olmak isterdim.
Jacob Vlijm

1
@JocobVlijm Fuar noktası. Muhtemelen daha fazla bilgi burada stackoverflow.com/questions/18595951/… ancak uzmanlık seviyemin çok üstünde!
jymbob

1

Overkill gibi görünen ancak tamamen bu amaç için işe yarayan bir şey Açık Yayıncı . "Kaynaklar" liste kutusunda, artı işaretine tıklayın, "Pencere Yakala" yı seçin, ardından ilgilendiğiniz pencereyi seçmek için talimatları izleyin. sadece önizlemeyi kullan. Bu sunulmadan hemen hemen her işletim sistemi Ubuntu için talimatlar, burada aşağıda kopyasını bulabileceğiniz.

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

İsterseniz, “Görünüm” menüsüne girebilir ve tüm UI öğelerini gizleyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.