Posso avere una finestra che mostra una piccola anteprima dal vivo di un altro spazio di lavoro?


29

È possibile eseguire il mirroring di una sezione live di un'area di lavoro in modo che sia visibile nell'area di lavoro corrente come una finestra che può essere spostata?

L'altro giorno avevo una VM Windows 10 in esecuzione sul mio host Ubuntu 16.04 che ha impiegato molto tempo per completare l'aggiornamento. Ho continuato a controllare i suoi progressi tramite Expo ( Super+ S) su Ubuntu. Questo mi ha fatto pensare che questo problema è molto probabilmente già stato risolto poiché strumenti come il registratore schermo semplice possono essere configurati per registrare solo una parte dello schermo. Tuttavia, non conosco la terminologia corretta da utilizzare per la mia ricerca su Google.

Mi piacerebbe vedere lo screenshot di 300x150 qui sotto sotto forma di una finestra mobile (con aggiornamenti live) nell'angolo in alto a destra di qualsiasi area di lavoro sia corrente.

inserisci qui la descrizione dell'immagine


1
@serg qui un nuovo progetto per te
Rinzwind

@Rinzwind devi odiare Serg ... Noi (entrambi) abbiamo già visto qualcosa del genere prima, non ci siamo riusciti.
Jacob Vlijm,

1
Ho anche messo una taglia su questa volta: =) raggiungilo @JacobVlijm
Rinzwind

Sarebbe una caratteristica interessante :) Non sarà d'aiuto nel caso della VM, ma esiste una soluzione per le applicazioni terminali: usare Konsole. Ha due opzioni utili: "notifica sull'attività" e "notifica sul silenzio". Il primo ti invierà una notifica quando viene mostrata una nuova riga nel terminale (utile quando si utilizzano i tail -F file | grep patternregistri per essere avvisati di alcuni eventi), il secondo ti invierà una notifica quando è trascorso un po 'di tempo dall'ultima riga scritta (utile per sapere quando una build è terminata).
kik,

@Rinzwind, merda, funzionerà ...
Jacob Vlijm,

Risposte:


26

MODIFICARE

(Nuova risposta)

FATTO.
La risposta di seguito è ora disponibile in una forma raffinata, come indicatore, come ppa per Trusty, Xenial, Yakkety e Zesty:

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

L'indicatore Th (inclusa la finestra di anteprima) è ora a corto di succo. Le opzioni includono una finestra delle impostazioni, l'impostazione della dimensione / colore del bordo della finestra, la dimensione della finestra.

inserisci qui la descrizione dell'immagine

Nel frattempo, ho trovato utile tenere d'occhio la finestra AU; vedere se ci sono messaggi :)


VECCHIA RISPOSTA

( primo secondo concetto approssimativo)

Avere una rappresentazione minimizzata di una finestra su un altro spazio di lavoro

Con mia (grande) sorpresa, può essere efficacemente fatto, con l'inganno e l'inganno; avere una rappresentazione aggiornata di una finestra su un altro spazio di lavoro. Non adatto a guardare un film, sicuramente abbastanza buono da tenere d'occhio una finestra altrove (esempio: la finestra della mia scheda TV):

Come funziona in pratica

  1. Con la finestra davanti, premi un tasto scorciatoia:

    inserisci qui la descrizione dell'immagine

    (la finestra minimizzerà)

  2. Passa a un'altra area di lavoro, premi di nuovo il tasto di scelta rapida, verrà visualizzata una piccola rappresentazione della finestra, aggiornata ogni 4 secondi:

    inserisci qui la descrizione dell'immagine

    La finestra viene sempre visualizzata sopra le altre finestre. Così com'è, la finestra è di 300 px (larghezza), ma può essere impostata su qualsiasi dimensione.

  3. Per terminarlo, premere (di nuovo) il tasto di scelta rapida. La piccola finestra si chiuderà, ti sposterai nella finestra della finestra originale, che apparirà di nuovo, non minimizzata.

Gli script

  1. Lo script di controllo

    #!/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. La finestra di rappresentazione

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

Come usare

  1. Installare python3-pil, xdotoolewmctrl

    sudo apt-get install xdotool wmctrl python3-pil
    
  2. Crea, se non esiste ancora, la directory ~/bin.

  3. Copia lo script 1, controlla lo script, come (esattamente) showcase_control(senza estensione) in ~/bin, e rendilo eseguibile .
  4. Copia lo script 2, lo script della mini finestra, come (esattamente) showmin(senza estensione) in ~/bin, e rendilo eseguibile .
  5. Disconnettersi e riconnettersi e aggiungere il seguente comando a un collegamento a scelta:

    showcase_control
    

    Scegli: Impostazioni di sistema> "Tastiera"> "Scorciatoie"> "Scorciatoie personalizzate". Fai clic su "+" e aggiungi il comando:

    showcase_control
    

    e dovrebbe funzionare!

    • Premi una volta il tasto per afferrare la finestra corrente
    • passa all'altra area di lavoro in cui desideri la mini finestra
    • Premere di nuovo per mostrare la mini finestra
    • Premere di nuovo per tornare allo spazio di lavoro originale, (automaticamente) annullare la minimizzazione della finestra originale e chiudere il mini -one.

Lati negativi?

  • L'installazione, così come è attualmente, aggiunge un po 'di lavoro per il tuo processore. Sul mio (molto) vecchio sistema, tuttavia, aggiunge (in media) appr. Calcolo il 4-5%, che non ho notato in alcun modo.

    Aggiornamento: si scopre che è importpossibile ridimensionare l'immagine in un solo passaggio, insieme a recuperare l'immagine della finestra. Ciò significa una sostanziale riduzione del carico del processore. Allo stesso tempo, il tempo di aggiornamento è più breve (ora 3 secondi), sempre a "costi" inferiori.

Spiegazione

  • Il mio punto di partenza è stato il modo in cui OP ha detto che voleva usare l'opzione per tenere d'occhio una finestra su un altro spazio di lavoro, aspettando che qualcosa finisse.
  • Mentre letteralmente avere un esatto (mini) copia di una finestra su un altro spazio di lavoro sembra impossibile, siamo in grado di fare un'immagine di una finestra esistente con la import-command, una volta che abbiamo la finestra id. Mentre questo funziona sia su finestre ridotte a icona che senza focus, c'è comunque un problema: la finestra deve trovarsi nell'area di lavoro corrente .
  • Il trucco è quindi temporaneamente (mentre si utilizza la mini-finestra) rendere la finestra "appiccicosa" (essere virtualmente disponibile su tutte le aree di lavoro) con wmctrl, ma minimizzata allo stesso tempo.
  • Dal momento che tutto viene fatto automaticamente, la differenza è effettivamente nulla, poiché anche il ritorno alla finestra iniziale, "un-" appiccicoso la finestra originale e non minimizzante, viene fatto automaticamente.

In breve:

  1. Premendo una volta la scorciatoia: la finestra target diventa appiccicosa, ma ridotta a icona
  2. Premendolo di nuovo (presumibilmente su un altro spazio di lavoro): una piccola mini-versione della finestra appare nell'angolo in alto a sinistra, aggiornata una volta ogni quattro secondi.
  3. Premendolo di nuovo: la mini finestra viene chiusa, il desktop si sposta nell'area di lavoro iniziale della finestra, la finestra viene ripristinata in modo non appiccicoso e non minimizzato.

Specificamente per VirtualBox

Quando la finestra VBox è in primo piano, risulta che i tasti di scelta rapida di Ubuntu sono disabilitati (!), Quindi lo script di controllo deve essere avviato in un altro modo. Di seguito alcuni brevi.

opzione 1

Ho modificato lo script di controllo. Ora solo nel caso di VirtualBox:

  • Fai clic in un punto qualsiasi del desktop, quindi premi il tasto di scelta rapida. Successivamente, utilizza semplicemente il tasto di scelta rapida per mostrare la finestra ed uscire.

    Spiegazione: Lo script di controllo è stato creato per uscire se la finestra era di tipo "desktop", poiché non si vorrebbe minimizzare il desktop. Ora lo script cerca prima le finestre di VirtualBox eventualmente esistenti, da targetizzare, se la finestra attualmente attiva è il desktop.

opzione 2

  • Copia l'icona qui sotto (tasto destro -> salva con nome), salvala come minwinicon.png

    inserisci qui la descrizione dell'immagine

  • Copia le righe sottostanti in un file vuoto, salvalo come minwin.desktopin ~/.local/share/applications:

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

    Dovresti disconnetterti e riconnetterti affinché il programma di avvio "trovi" il ~/binpercorso locale !
    Trascina l'icona sul lanciatore per usarlo.

La seconda soluzione ha un aspetto negativo importante: dopo averlo usato dal programma di avvio, continuerà a lampeggiare per alcuni secondi, in attesa che appaia una finestra. Durante questo, fare di nuovo clic non avrà alcun effetto. Ciò può essere risolto, come descritto qui , ma includendolo in questa risposta sarebbe davvero troppo lungo. Se si desidera utilizzare l'opzione due, consultare il collegamento.


Quindi, il buon vecchio importpuò farlo, mentre lo screenshot di gnome non può. Molto, molto interessante. Sono curioso di sapere qual è esattamente la differenza tra il modo in cui lavorano
Sergiy Kolodyazhnyy

@Serg sì, sono rimasto davvero sorpreso, ho pensato che non potesse essere fatto solo con gli utensili da cucina :)
Jacob Vlijm

1
@ThatGuy ci sta lavorando :)
Jacob Vlijm

1
@jymbob Grazie per il commento! Non hanno dubbi nel sistema, ma la domanda è se sono disponibili dall'esterno. Se gli sviluppatori non forniscono in alcun modo un'opzione cli o un'API, la violazione del codice sarebbe un lavoro di un ordine completamente diverso. Mi piacerebbe avere l'opzione però.
Jacob Vlijm,

1
@JacobVlijm Fair point. Forse maggiori informazioni qui stackoverflow.com/questions/18595951/… ma molto al di sopra del mio livello di competenza!
jymbob,

1

Qualcosa che sembra eccessivo ma che funziona totalmente per questo scopo è Open Broadcaster . Nella casella di riepilogo "Sorgenti", fai clic sul segno più, seleziona "Acquisizione finestra", quindi segui le istruzioni per selezionare la finestra che ti interessa. Nessun punto nel colpire il record; basta usare l'anteprima. È disponibile praticamente per qualsiasi sistema operativo , con le istruzioni per Ubuntu qui , che ho copiato di seguito.

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

Se ne hai voglia, puoi andare nel menu "Visualizza" e nascondere tutti gli elementi dell'interfaccia utente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.