Bisakah saya memiliki jendela yang menampilkan pratinjau langsung kecil dari ruang kerja lain?

29

Apakah mungkin untuk meniru bagian langsung dari satu ruang kerja sehingga terlihat di ruang kerja saat ini sebagai jendela yang dapat dipindahkan?

Suatu hari saya memiliki VM Windows 10 yang berjalan pada host Ubuntu 16.04 saya yang membutuhkan waktu sangat lama untuk menyelesaikan pembaruan. Saya terus memeriksa perkembangannya melalui Expo ( Super+ S) di Ubuntu. Itu membuat saya berpikir bahwa masalah ini kemungkinan besar sudah dipecahkan sejak alat seperti simplescreenrecorder dapat dikonfigurasi untuk merekam hanya sebagian dari layar. Namun, saya tidak tahu terminologi yang tepat untuk digunakan untuk pencarian Google saya.

Saya ingin melihat tangkapan layar 300x150 di bawah ini dalam bentuk jendela mengambang (dengan pembaruan langsung) di sudut kanan atas tempat kerja mana pun yang saat ini.

masukkan deskripsi gambar di sini

AnthonyK
sumber
1
@erg sini proyek baru untuk Anda
Rinzwind
@Rinzwind Anda harus membenci Serg ... Kami (keduanya) telah melihat sesuatu seperti ini sebelumnya, tidak berhasil.
Jacob Vlijm
1
Saya bahkan memberi hadiah untuk kali ini: =) dapatkan @JacobVlijm
Rinzwind
Akan menjadi fitur keren :) Ini tidak akan membantu dalam kasus VM, tetapi ada solusi untuk aplikasi terminal: menggunakan Konsole. Ini memiliki dua opsi berguna: "beri tahu aktivitas" dan "beri tahu tentang keheningan". Yang pertama akan mengirimi Anda pemberitahuan ketika baris baru ditampilkan di terminal (berguna saat menggunakan tail -F file | grep patternlog untuk memperingatkan beberapa peristiwa), yang kedua akan mengirimi Anda pemberitahuan ketika ada beberapa waktu sejak baris tulisan terakhir (berguna untuk tahu kapan build telah berakhir).
kik
@Rinzwind sial, ini akan bekerja ...
Jacob Vlijm

Jawaban:

26

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.

masukkan deskripsi gambar di sini

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

  1. Dengan jendela di depan, tekan tombol pintas:

    masukkan deskripsi gambar di sini

    (jendela akan memperkecil)

  2. Pindah ke ruang kerja lain, tekan lagi tombol pintas, representasi kecil jendela akan muncul, diperbarui setiap 4 detik:

    masukkan deskripsi gambar di sini

    Jendela selalu ditampilkan di atas jendela lain. Karena itu, jendela adalah 300px (lebar), tetapi dapat diatur untuk ukuran apa pun.

  3. 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

  1. 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()
    
  2. 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

  1. Pasang python3-pil, xdotooldanwmctrl

    sudo apt-get install xdotool wmctrl python3-pil
    
  2. Buat, jika belum ada, direktori ~/bin.

  3. Salin skrip 1, ia mengontrol skrip, seperti (tepatnya) showcase_control(tanpa ekstensi) di ~/bin, dan membuatnya dapat dieksekusi .
  4. Salin skrip 2, skrip jendela mini, dengan (tepatnya) showmin(tanpa ekstensi) ~/bin, dan buat agar dapat dieksekusi .
  5. 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 importdapat 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 importperintah-, 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:

  1. Menekan pintasan sekali: jendela yang ditargetkan dibuat lengket, tetapi diminimalkan
  2. Menekannya lagi (mungkin di ruang kerja lain): versi mini kecil dari jendela muncul di sudut kiri atas, diperbarui sekali per empat detik.
  3. 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

    masukkan deskripsi gambar di sini

  • Salin baris di bawah ini ke file kosong, simpan seperti minwin.desktopdi ~/.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" ~/binjalur 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.

Yakub Vlijm
sumber
Jadi, orang tua yang baik importbisa melakukannya, sedangkan screenshot gnome tidak bisa. Sangat, sangat menarik. Saya ingin tahu apa sebenarnya perbedaan antara cara mereka bekerja
Sergiy Kolodyazhnyy
@Erg, ya, saya benar-benar terkejut, berpikir itu tidak bisa dilakukan hanya dengan peralatan dapur :)
Jacob Vlijm
1
@ThatGuy sedang mengerjakannya :)
Jacob Vlijm
1
@jymbob Terima kasih atas komentarnya! Mereka tidak diragukan lagi dalam sistem, tetapi pertanyaannya adalah apakah mereka tersedia dari luar. Jika pengembang tidak memberikan opsi cli atau API dengan cara apa pun, membobol kode akan menjadi pekerjaan dengan urutan yang sama sekali berbeda. Saya ingin memiliki opsi.
Jacob Vlijm
1
@JacobVlijm Fair point. Mungkin lebih banyak info di sini stackoverflow.com/questions/18595951/… tetapi jauh di atas tingkat kompetensi saya!
jymbob
1

Sesuatu yang tampaknya berlebihan tetapi benar-benar berfungsi untuk tujuan ini adalah Open Broadcaster . Di kotak daftar "Sumber", klik tanda tambah, pilih "Tangkapan Jendela", lalu ikuti petunjuk untuk memilih jendela yang Anda minati. Tidak ada gunanya memukul catatan; cukup gunakan pratinjau. Ini tersedia untuk hampir semua OS , dengan instruksi untuk Ubuntu di sini , yang telah saya salin di bawah ini.

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

Jika Anda suka, Anda dapat masuk ke menu "View" dan menyembunyikan semua elemen UI.

golvok
sumber