EDIT
(Jawaban baru)
DIBUAT
Jawaban di bawah ini sekarang tersedia dalam bentuk yang dipoles, sebagai indikator, sebagai ppa untuk Trusty, Xenial, Yakkety dan Zesty:
sudo apt-add-repository ppa:vlijm/windowspy
sudo apt-get update
sudo apt-get install windowspy
Indikator th (termasuk jendela pratinjau) sekarang baik jus. Opsi termasuk jendela pengaturan, pengaturan ukuran / warna batas jendela, ukuran jendela.
Sementara itu, saya merasa berguna untuk mengawasi jendela AU; lihat apakah ada pesan :)
JAWABAN TUA
( Konsep kasar kedua pertama )
Memiliki representasi jendela yang diperkecil pada ruang kerja lain
Yang mengejutkan saya (besar), itu bisa dilakukan secara efektif , baik dengan tipu daya maupun tipu daya; memiliki representasi diperbarui dari jendela di ruang kerja lain. Tidak cocok menonton film, pasti cukup bagus untuk mengawasi jendela di tempat lain (misalnya: jendela kartu tv saya):
Cara kerjanya dalam praktik
Dengan jendela di depan, tekan tombol pintas:
(jendela akan memperkecil)
Pindah ke ruang kerja lain, tekan lagi tombol pintas, representasi kecil jendela akan muncul, diperbarui setiap 4 detik:
Jendela selalu ditampilkan di atas jendela lain. Karena itu, jendela adalah 300px (lebar), tetapi dapat diatur untuk ukuran apa pun.
Untuk mengakhirinya, tekan (lagi) tombol pintas. Jendela kecil akan menutup, Anda akan pindah ke viewport dari jendela asli, yang akan muncul lagi, tidak diperkecil.
Skrip
Script kontrol
#!/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()
Representatiom jendela
#!/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()
Bagaimana cara menggunakan
Pasang python3-pil
, xdotool
danwmctrl
sudo apt-get install xdotool wmctrl python3-pil
Buat, jika belum ada, direktori ~/bin
.
- Salin skrip 1, ia mengontrol skrip, seperti (tepatnya)
showcase_control
(tanpa ekstensi) di ~/bin
, dan membuatnya dapat dieksekusi .
- Salin skrip 2, skrip jendela mini, dengan (tepatnya)
showmin
(tanpa ekstensi) ~/bin
, dan buat agar dapat dieksekusi .
Logout dan kembali, dan tambahkan perintah berikut ke pintasan pilihan Anda:
showcase_control
Pilih: Pengaturan Sistem> "Keyboard"> "Pintasan"> "Pintasan Khusus". Klik "+" dan tambahkan perintah:
showcase_control
dan itu seharusnya bekerja!
- Tekan tombol satu kali untuk mengambil jendela saat ini
- pindah ke ruang kerja lain di mana Anda ingin mini-window
- Tekan lagi untuk menampilkan jendela kecil
- Tekan lagi untuk kembali ke ruang kerja asli, (otomatis) un-meminimalkan jendela asli dan tutup mini -one.
Kerugian?
Pengaturan, seperti saat ini, menambahkan beberapa pekerjaan untuk prosesor Anda. Pada sistem lama saya (sangat), ia menambahkan (rata-rata) appr. 4-5% saya rasa, yang saya tidak perhatikan sama sekali.
Pembaruan: Ternyata import
dapat mengubah ukuran gambar dalam satu langkah, bersama dengan mengambil gambar jendela. Ini berarti pengurangan substansial dalam beban prosesor. Pada saat yang sama waktu refresh lebih pendek (3 detik sekarang), masih dengan "biaya" yang lebih rendah.
Penjelasan
- Titik awal saya adalah cara OP menyebutkan bahwa dia ingin menggunakan opsi untuk mengawasi jendela di ruang kerja lain, menunggu penyelesaian sesuatu.
- Walaupun secara harfiah memiliki salinan (mini) dari sebuah jendela di ruang kerja lain tampaknya tidak mungkin, kita dapat membuat gambar dari jendela yang ada dengan
import
perintah-, setelah kita memiliki id jendela. Meskipun ini bekerja pada jendela yang diperkecil atau jendela tanpa fokus, namun ada satu masalah: jendela harus berada di ruang kerja saat ini .
- Triknya adalah untuk sementara (sementara jendela mini digunakan) membuat jendela "lengket" (tersedia secara virtual di semua ruang kerja) dengan
wmctrl
, tetapi diminimalkan pada saat yang sama.
- Karena semua dilakukan secara otomatis, perbedaan efektif adalah tidak, karena juga kembali ke viewport awal, "un-" lengket jendela asli dan un- meminimalkan itu, dilakukan secara otomatis.
Pendeknya:
- Menekan pintasan sekali: jendela yang ditargetkan dibuat lengket, tetapi diminimalkan
- Menekannya lagi (mungkin di ruang kerja lain): versi mini kecil dari jendela muncul di sudut kiri atas, diperbarui sekali per empat detik.
- Menekannya lagi: jendela mini ditutup, desktop bergerak ke ruang kerja awal jendela, jendela dipulihkan tidak lengket dan tidak diminimalkan.
Khusus untuk VirtualBox
Ketika jendela VBox di depan, ternyata tombol pintas Ubuntu dinonaktifkan (!), Sehingga skrip kontrol perlu diluncurkan dengan cara lain. Di bawah ini beberapa yang singkat.
Pilihan 1
Saya mengedit skrip kontrol. Sekarang hanya dalam kasus VirtualBox:
Klik di mana saja di desktop, Lalu tekan tombol pintas Anda. Setelah itu, cukup gunakan tombol pintas untuk menampilkan jendela dan keluar.
Penjelasan: Skrip kontrol dibuat untuk keluar jika jendela bertipe "desktop", karena Anda tidak ingin meminimalkan desktop. Sekarang skrip pertama mencari kemungkinan jendela VirtualBox yang ada, untuk menargetkan, jika jendela yang sedang aktif adalah desktop.
pilihan 2
Salin ikon di bawah ini (klik kanan -> simpan sebagai), simpan sebagai minwinicon.png
Salin baris di bawah ini ke file kosong, simpan seperti minwin.desktop
di ~/.local/share/applications
:
[Desktop Entry]
Type=Application
Name=Window Spy
Exec=showcase_control
Icon=/path/to/minwinicon.png
StartupNotify=false
Anda harus keluar dan kembali agar peluncur "menemukan" ~/bin
jalur lokal !
Seret ikon ke peluncur untuk menggunakannya.
Solusi kedua memiliki kelemahan penting: setelah menggunakannya dari peluncur, itu akan terus berkedip selama beberapa detik, menunggu jendela muncul. Selama itu, mengklik lagi tidak akan berpengaruh apa pun. Itu bisa diselesaikan, seperti yang dijelaskan di sini , tetapi termasuk bahwa dalam jawaban ini akan membuatnya terlalu lama. Jika Anda ingin menggunakan opsi dua, silakan lihat tautannya.