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.
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
Con la finestra davanti, premi un tasto scorciatoia:
(la finestra minimizzerà)
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:
La finestra viene sempre visualizzata sopra le altre finestre. Così com'è, la finestra è di 300 px (larghezza), ma può essere impostata su qualsiasi dimensione.
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
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()
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
Installare python3-pil
, xdotool
ewmctrl
sudo apt-get install xdotool wmctrl python3-pil
Crea, se non esiste ancora, la directory ~/bin
.
- Copia lo script 1, controlla lo script, come (esattamente)
showcase_control
(senza estensione) in ~/bin
, e rendilo eseguibile .
- Copia lo script 2, lo script della mini finestra, come (esattamente)
showmin
(senza estensione) in ~/bin
, e rendilo eseguibile .
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 è import
possibile 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:
- Premendo una volta la scorciatoia: la finestra target diventa appiccicosa, ma ridotta a icona
- 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.
- 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
Copia le righe sottostanti in un file vuoto, salvalo come minwin.desktop
in ~/.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 ~/bin
percorso 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.