別のワークスペースの小さなライブプレビューを表示するウィンドウを使用できますか?


29

現在のワークスペースで移動可能なウィンドウとして表示されるように、1つのワークスペースのライブセクションをミラーリングすることは可能ですか?

先日、Ubuntu 16.04ホストでWindows 10 VMを実行していましたが、更新に非常に長い時間がかかりました。UbuntuのExpo(Super+ S)で進捗状況を確認し続けました。simplescreenrecorderなどのツールは画面の一部のみを記録するように設定できるため、この問題はすでに解決されている可能性が高いと考えました。ただし、Google検索に使用する適切な用語がわかりません。

現在のワークスペースの右上隅に、以下の300x150のスクリーンショットをフローティングウィンドウ(ライブ更新あり)の形で表示したいと思います。

ここに画像の説明を入力してください


1
@sergここであなたのための新しいプロジェクト
-Rinzwind

@Rinzwindあなたはセルグを憎む必要があります...私たち(両方)は以前にこのようなものを見ていましたが、成功しませんでした。
ジェイコブVlijm 16年

1
今回も賞金をかけました:=)取得@JacobVlijm
Rinzwind

クールな機能になります:) VMの場合は役に立ちませんが、ターミナルアプリケーションにはKonsoleを使用するソリューションがあります。「アクティビティで通知」と「無音で通知」という2つの便利なオプションがあります。最初の行は端末に新しい行が表示されたときに通知を送信します(tail -F file | grep pattern一部のイベントについてログで使用する場合に便利です)。2番目の行は最後に書かれた行から時間が経過したときに通知を送信します(に役立ちます)ビルドがいつ終了したかを確認してください)。
kik

@Rinzwind神聖ながらくた、それは...仕事に起こっている
ジェイコブVlijm

回答:


26

編集

(新しい答え)

できました。
以下の回答は、Trusty、Xenial、Yakkety、ZestyのPPAとして、洗練された形でインジケータとして利用できるようになりました。

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

Thインジケーター(プレビューウィンドウを含む)のジュースが少なくなりました。オプションには、設定ウィンドウ、ウィンドウの境界サイズ/色、ウィンドウサイズの設定が含まれます。

ここに画像の説明を入力してください

それまでの間、AUウィンドウに注目しておくと便利です。メッセージがあるかどうかを確認してください:)


古い回答

最初の 2番目の大まかな概念)

別のワークスペース上のウィンドウの最小化された表現を持っている

私自身の(大きな)驚きには、それを効果的に行うことができます。別のワークスペース上のウィンドウの更新された表現があります。ない、ウィンドウの別の場所(:私のテレビカード画面例)に目を維持するために間違いなく良い十分に映画を見にフィット:

実際の仕組み

  1. ウィンドウが前面にある状態で、ショートカットキーを押します。

    ここに画像の説明を入力してください

    (ウィンドウは最小化されます)

  2. 別のワークスペースに移動し、ショートカットキーをもう一度押すと、ウィンドウの小さな表現が表示され、4秒ごとに更新されます。

    ここに画像の説明を入力してください

    ウィンドウは常に他のウィンドウの上に表示されます。現状では、ウィンドウは300ピクセル(幅)ですが、任意のサイズに設定できます。

  3. 終了するには、ショートカットキーを(もう一度)押します。小さなウィンドウが閉じ、元のウィンドウのビューポートに移動します。これは最小化されずに再び表示されます。

スクリプト

  1. 制御スクリプト

    #!/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. ウィンドウ表現

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

使い方

  1. インストールpython3-pilxdotoolおよびwmctrl

    sudo apt-get install xdotool wmctrl python3-pil
    
  2. まだ存在しない場合は、ディレクトリを作成します~/bin

  3. スクリプト1をコピーし、彼は制御スクリプトを(正確に)showcase_control(拡張子なし)として~/bin実行可能にします
  4. スクリプト2(ミニウィンドウスクリプト)を(正確に)showmin(拡張子なし)としてコピーし~/bin実行可能にします
  5. ログアウトしてから再度ログインし、選択したショートカットに次のコマンドを追加します。

    showcase_control
    

    [システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット]を選択します。「+」をクリックして、コマンドを追加します。

    showcase_control
    

    そしてそれは動作するはずです!

    • キーを1回押すと、現在のウィンドウが表示されます
    • ミニウィンドウが必要な他のワークスペースに移動します
    • もう一度押すと、ミニウィンドウが表示されます
    • もう一度押すと元のワークスペースに戻り、(自動的に)元のウィンドウの最小化を解除して、ミニ1を閉じます。

マイナス面?

  • 現在のセットアップでは、プロセッサーにいくつかの作業が追加されます。しかし、私の(非常に)古いシステムでは、(平均して)apprが追加されます。4から5パーセントは、私は私が気付かなかった、数える任意の方法。

    更新:ウィンドウイメージの取得importと一緒に、1ステップでイメージのサイズを変更できることが判明しました。これにより、プロセッサの負荷が大幅に削減されます。同時に、更新時間は短くなり(現在は3秒)、それでも「コスト」は低くなっています。

説明

  • 私の出発点は、OPが別のワークスペースのウィンドウを監視し、何かが終了するのを待つオプションを使用したいと述べた方法でした。
  • 一方で、文字通り別のワークスペース上のウィンドウの正確な(ミニ)のコピーを持つことは不可能だ、我々はできると、既存の窓のイメージ作りimport、我々はウィンドウIDを持っていたら、-commandを。これは両方とも最小化されたウィンドウまたはフォーカスのないウィンドウで動作しますが、1つの問題があります。ウィンドウは現在のワークスペースにある必要があります
  • 次に、一時的に(ミニウィンドウが使用されている間)、ウィンドウを「スティッキー」(すべてのワークスペースで実質的に利用可能)にしますwmctrlが、同時に最小化します。
  • すべてが自動的に行われるため、最初のビューポートに戻り、元のウィンドウを「非」スティッキーにし、最小化を解除することも自動的に行われるため、実質的に違いはありません。

要するに:

  1. ショートカットを1回押す:ターゲットウィンドウはスティッキーになりますが、最小化されます
  2. もう一度押すと(おそらく別のワークスペース上で):左上隅に小さなミニバージョンのウィンドウが表示され、4秒に1回更新されます。
  3. もう一度押すと、ミニウィンドウが閉じられ、デスクトップがウィンドウの最初のワークスペースに移動し、ウィンドウが非粘着および最小化されて復元されます。

VirtualBox専用

VBoxウィンドウが前面にあるとき、Ubuntuショートカットキーが無効になっていることがわかります(!)。そのため、制御スクリプトを別の方法で起動する必要があります。以下にいくつか簡単なものを示します。

オプション1

制御スクリプトを編集しました。今だけのVirtualBoxの場合:

  • クリックしてどこでもデスクトップ上に、そして、あなたのショートカットキーを押してください。その後、ショートカットキーを使用してウィンドウを表示し、終了します。

    説明:ウィンドウを「デスクトップ」タイプにした場合、デスクトップを最小化したくないため、制御スクリプトは終了しました。現在アクティブなウィンドウがデスクトップである場合、スクリプトはまず、ターゲットとなる可能性のある既存のVirtualBoxウィンドウを最初に検索します。

オプション2

  • 下のアイコンをコピー(右クリック->名前を付けて保存)、名前を付けて保存 minwinicon.png

    ここに画像の説明を入力してください

  • 、空のファイルに以下の行をコピーとして保存minwin.desktop~/.local/share/applications

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

    ランチャーがローカル~/binパスを「見つける」ためには、ログアウトして再度ログインする必要があります。
    アイコンをランチャーにドラッグして使用します。

2番目のソリューションには重要な欠点があります。ランチャーから使用した後、数秒間点滅し続け、ウィンドウが表示されるのを待ちます。その間、再度クリックしても効果はありません。ここで説明されているように、それ解決できますが、この答えにそれを含めると、本当に長すぎます。オプション2を使用する場合は、リンクをご覧ください。


したがって、古き良き時代importはそれを行うことができますが、gnome-screenshotはできません。とても興味深いです。私は、まさに彼らの働き方の違いは何かcurriousよ
Sergiy Kolodyazhnyy

@Sergええ、私は本当に、びっくりしました、それだけでキッチンツールで行うことができなかったと思った:)
ヤコブVlijm

1
@ThatGuyがそれに取り組んでいる:)
ジェイコブヴリム

1
@jymbobコメントありがとうございます!それらはシステムに疑いの余地はありませんが、問題は外部から入手できるかどうかです。開発者がcliオプションまたはAPIを提供しない場合、コードへの侵入は完全に異なる順序の仕事になります。私はオプションが欲しいのですが。
ジェイコブVlijm

1
@JacobVlijmフェアポイント。おそらくこちらの情報がこちらstackoverflow.com/questions/18595951 / ...しかし、私の能力レベルをはるかに超えています!
jymbob

1

やり過ぎのように見えるが、この目的のために完全に機能するものは、Open Broadcasterです。[ソース]リストボックスで、プラス記号をクリックして[ウィンドウキャプチャ]を選択し、プロンプトに従って目的のウィンドウを選択します。レコードをヒットしても意味がありません。プレビューを使用してください。ほぼすべてのOSで利用できます。Ubuntuの手順はこちらを参照してください(以下にコピーしました)。

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

気になったら、[表示]メニューに移動して、すべてのUI要素を非表示にできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.