Unityのボックスにウィンドウを最小化できますか?


17

Irixの4Dwmでは、ウィンドウをボックスに最小化する機能がありました(現代のウィンドウマネージャーが使用するタスクバーとは異なります)。これは古いHPUXでも見ました。

リンクされた画像の「コンソール」スクエアを参照してください。

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

プラグインを使用するか、Unity以外のウィンドウマネージャーを使用してUbuntuで実行することは可能ですか?


奇妙ですが、興味深い質問:)私はこのような何かを考えることができました。アイコンは重要でしょうか、それとも一般的なものでしょうか?どのように動作しますか?デスクトップ上のアイコンまたは最小限の「ウィンドウ」のようなものです。
ジェイコブVlijm

@JacobVlijmアイコンは一般的ではありません。各アプリケーションは)ユニティで最小化されたウィンドウのアイコンとして独自のアイコンを持っている
アルティアム

Unity内でも実行できますが、ウィンドウはデスクトップ上でアイコン化されます(対応するアプリケーションのアイコンとウィンドウの名前が表示されます)。あなたはショットを空想しますか?(興味深いが、やりがいのある仕事になります、開始する前に質問してください:))
ジェイコブVlijm

1
はい、これは私に役立ちます。私は多くの開いているウィンドウで作業する必要があり、それらを整理するこの方法は私の意見では優れています。私はUnityについて何も知らないので、テストのみを手伝うことができます。
Artium

回答:


18

驚いたことに、デスクトップ上に他のものがあまり多くない限り、非常にうまく機能します

私はしばらくそれを使って作業しましたが、奇妙なことですが、奇妙なことに、頻繁にワークスペースを切り替えるのに十分代替手段です。そのシンプルさのためにリフレッシュ。

実際には

解決策は、実際にあなたが説明するものとほぼ同じです。

  • キーの組み合わせを押すと、デスクトップ上のウィンドウがウィンドウから「ボックス化」されます。

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

    アプリケーションの外観を持つアイコンに:

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

  • アイコンをダブルクリックすると、ウィンドウが再表示され、アイコンが消えます。

使い方

短い話(説明):

  • ショートカットキーを押すと、スクリプトは引数で呼び出されますbox

    windowbox box
    
  • スクリプトは次のとおりです。

    • 最前面のウィンドウのウィンドウIDを読み取ります
    • 「通常の」ウィンドウかどうかを確認します(たとえば、デスクトップのマッピングを解除したくないでしょう)
    • ウィンドウを所有しているアプリケーションのプロセス名を検索します。
    • 対応するアプリケーションの.desktopファイルで対応するアイコンを検索します/usr/share/applications
    • 引数を指定してスクリプトを(ダブルクリックした場合に)呼び出す行を.desktop使用して、一意の名前のファイルを作成Exec=しますshow

      windowbox show
      

.desktopファイルには、ウィンドウIDなどの追加の引数引数の数、の([ファイル] - )の名前を追加します.desktopファイルを。

その後:

  • .desktopこのファイルは、それダブルクリック可能なオブジェクトにするために、実行されています。

  • 場合は.desktop、ファイルをダブルクリックすると、ウィンドウがある(再)マッピングされ、.desktopファイルがデスクトップから削除されます。

設定方法

  1. あなたは窓の周りプレイしたい時に実質的にいつものように、スクリプトは両方を必要wmctrlxdotool

    sudo apt-get install xdotool wmctrl
    
  2. ディレクトリを作成します~/bin~ホームディレクトリを表します)
  3. 以下のスクリプトを空のファイルにコピーし、windowbox(拡張子なし)として保存し~/binます。

    #!/usr/bin/env python3
    import subprocess
    import sys
    import os
    
    # --- On Unity, there is a (y-wise) deviation in window placement
    # set to zero for other window managers
    deviation = 28
    # ---
    
    args = sys.argv[1:]
    
    get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()
    
    def find_dtop():
        # get the localized path to the Desktop folder
        home = os.environ["HOME"]
        dr_file = home+"/.config/user-dirs.dirs"
        return [home+"/"+ l.split("/")[-1].strip() \
                for l in open(dr_file).readlines() \
                if l.startswith("XDG_DESKTOP_DIR=")][0].replace('"', "")
    
    def check_windowtype(w_id):
        # check the type of window; only unmap "NORMAL" windows
        return "_NET_WM_WINDOW_TYPE_NORMAL" in get(["xprop", "-id", w_id])
    
    def get_process(w_id):
        # get the name of the process, owning the window and window x/y position
        w_list = get(["wmctrl", "-lpG"]).splitlines()
        pid = [l for l in w_list if w_id in l][0].split()
        proc = get(["ps", "-p", pid[2], "-o", "comm="])
        xy = (" ").join(pid[3:5])
        return (proc, xy)
    
    def read_f(f, string, proc):
        # search for a possible match in a targeted .desktop file
        try:
            with open(f) as read:
                for l in read:
                    if all([l.startswith(string), proc in l]):
                        in_f = True
                        break
                    else:
                        in_f = False
        except:
            in_f = False
        return in_f
    
    def get_icon(proc, w_name):
        # search appropriate icon in /usr/share/applications
        exceptions = [item for item in [
            ["soffice", "libreoffice-main"],
            ["gnome-terminal", "utilities-terminal"],
            ["nautilus", "folder"],
            ] if item[0] in proc]
        if exceptions:
            if exceptions == [["soffice", "libreoffice-main"]]:
                loffice = [
                    ["Calc", "libreoffice-calc"],
                    ["Writer", "libreoffice-writer"],
                    ["Base", "libreoffice-base"],
                    ["Draw", "libreoffice-draw"],
                    ["Impress", "libreoffice-impress"],
                    ]
                match = [m[1] for m in loffice if m[0] in w_name]
                if match:
                    return match[0]
                else:
                    return exceptions[0][1]
            else:      
                return exceptions[0][1]
        else:
            default = "/usr/share/applications"
            dtfiles = [default+"/"+f for f in os.listdir(default)]
            for f in dtfiles:
                if read_f(f, "Exec=", proc) == True:   
                    for l in open(f).readlines():
                        if l.startswith("Icon="):
                            icon = l.replace("Icon=", "").strip()
                            print(f)
                            break
                    break
            return icon
    
    def create_name():
        # create unique (file-) name for boxed window
        n = 1
        while True:
            name = dtop+"/"+"boxed_"+str(n)+".desktop"
            if os.path.exists(name):
                n += 1
            else:
                break
        return name
    
    def convert_wid(w_id):
        # convert window- id, xdotool format, into wmctrl format
        w_id = hex(int(w_id))
        return w_id[:2]+(10-len(w_id))*"0"+w_id[2:]
    
    def create_icon(w_id, w_name, icon, pos):
        # create the launcher, representing the boxed window
        boxedwindow = create_name()
        f_content =[
                "[Desktop Entry]",
                "Name=[WINDOW] "+w_name,
                "Exec=windowbox show "+w_id+" '"+boxedwindow+"' "+pos,
                "Icon="+icon,
                "Type=Application",
                ]
        if icon == "generic":
            f_content.pop(3)
        with open(boxedwindow, "wt") as boxed:
            for l in f_content:
                boxed.write(l+"\n")
        command = "chmod +x "+"'"+boxedwindow+"'"
        subprocess.call(["/bin/bash", "-c", command])
    
    if args[0] == "box":
        dtop = find_dtop()
        w_id = convert_wid(get(["xdotool", "getactivewindow"]))
        w_name = get(["xdotool", "getwindowname", w_id])
        if check_windowtype(w_id) == True:
            procdata = get_process(w_id)
            procname = procdata[0]
            icon = get_icon(procname, w_name); icon = icon if icon != None else "generic"
            create_icon(w_id, w_name, icon, procdata[1])
            subprocess.call(["xdotool", "windowunmap", w_id])
    
    elif args[0] == "show":
        w_id = args[1]
        subprocess.call(["xdotool", "windowmap", w_id])    
        subprocess.call(["xdotool", "windowmove", "--sync", w_id, args[3], str(int(args[4])-deviation)])
        os.remove(args[2])
  4. スクリプトを実行可能にする

  5. 新しく作成したディレクトリを「ポップアップ」で作成するには$PATH、ログアウト/ログインするか、source ~/.profile(ターミナルウィンドウから)実行します
  6. 次のコマンドにより、ターミナルウィンドウからスクリプトをテスト実行します。

    windowbox box
    

    ウィンドウが消え、「ボックス化された」ウィンドウがデスクトップに表示されます。

  7. すべてが正常に機能する場合は、次のコマンドをショートカットキーに追加します。画面の右上にある歯車アイコンを選択します。

    歯車のアイコン

  8. 行きますSystem SettingsKeyboardShortcutsCustom Shortcuts。をクリックして+、コマンドを追加します。

    windowbox box
    

それはそれを行う必要があります。

重要な注意点

スクリプトの使用xdotoolwindowunmapウィンドウを非表示にします。デスクトップに作成された「ボックス」(アイコン)は、非表示ウィンドウへの唯一の「ゲート」です。つまり、デスクトップファイルを手動で削除しないでください。そうすると、ウィンドウは永久に失われます。

仕事[編集20-12:完了 ]

スクリプトはまだいくつかの改良を使用できます。

  • ウィンドウジオメトリは、定義により復元されません。非常にうまく修正できますが、最初の結果を表示すると思いました。
  • ほとんどの場合、ボックス化されたウィンドウには正しいアイコンがあります。get_process(w_id)ただし、この関数はいくつかの改善を使用できます。でコマンドとしてプロセスが見つからない場合、/usr/share/applicationsファイルには一般的なアイコンがあります。

枠付きウィンドウのアイコンに他のアイコンとは異なるサイズを与える

スクリプト名作成した.desktopファイルは常に boxed_1.desktopboxed_2.desktopなど、創造の瞬間に「利用可能」の名前に応じて(ファイル名ではなく、表示される名前)。

(一般的に)ファイルのサイズを変更するには、右クリック>アイコンサイズを選択します。良いニュースは、ファイルを削除して再作成すると、サイズが記憶されることです。再起動後にファイルを再度作成しても。あなたがあればことを意味し、これまで箱入りの窓(例えば)1-5をリサイズ、彼らはなります常にあなた(スクリプト)が再びそれらを作成するときに、同じ大きさを持っています!

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


2
コメントを残すことなく自分自身に抵抗することはできません、あなたからの非常に良い答え:)
Ravan

いいね!いくつかのコメント:1.行dtop = "/home/jacob/Bureaublad"をデスクトップへのパスに置き換えました(dtop = "/home/" + user + "/Desktop")2.ダブルクリックによる復元が機能しませんでした。source ~/.profileこれをテストするために、すぐにログイン/ログアウトするだけでは不十分だと思う。3.団結して、アイコンのサイズを手動で変更できます(右クリック->アイコンのサイズ変更)f_content。アイコンのサイズを設定するパラメーターを追加することは可能ですか?
アルティウム

4
この回答の最初の段落を読み始めたとき、一番下にオレンジ色のアイコンがあることを知りました! ;-):P
ファビー

1
こんにちは@Artiumスクリプトを更新しました。アイコンの検索やジオメトリの復元など、いくつかの重要な改善点があります。楽しんでください!
ジェイコブVlijm

1
@Artium知っていますが、スクリプトの1つを試してください。これは通常のフォルダアイコンで、画像に似ています。おそらく同じアイコンへの単なるリンクです。
ジェイコブVlijm

7

これを実現するには、fvwmを使用できます。

  1. fvwmをインストールします。

    sudo apt-get update
    sudo apt-get install fvwm
    
  2. アイコン化機能を使用するそれらを見つけてください-ここにいくつかあります:http ://www.jmcunx.com/fvwm_theme.html いくつかはあなたが示すスクリーンショットのように見えます。

  3. テーマのテキストをコピーし、~/.fvwm/(隠しファイルを最初に表示)に移動してからファイルを作成します.fvwm2rc

  4. そのファイルをテキストエディター(geditなど)で開き、テーマテキストを貼り付けます。

  5. コンピューターを再起動し、fvwmを選択してログインします。

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

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