Unity Launcherで実行中のGUIアプリケーションのリストを取得するにはどうすればよいですか?


8

現在Dashで開いている/実行しているアプリのみのリストが必要です。これらのアプリには、アイコンの左側に小さな白い矢印があります。

入手する方法はありますか?

矢印付きのダッシュスクリーンショット


1
コンテキストとは何ですか?また、リストを(どのような形式で)利用できるようにする必要がありますか?
Jacob Vlijm 2016

開いているウィンドウのリスト?簡単にできますが、ジェイコブが言ったように、おそらくもっと詳しい情報を知る必要があるでしょう
Sergiy Kolodyazhnyy

関連、重複の可能性が非常に高い:askubuntu.com/q/483554/295286
Sergiy Kolodyazhnyy

回答:


4

でそれを行うための方法qdbusおよびorg.ayatana.bamfインタフェース。

.desktopファイルごとの開いているアプリケーションのリスト:

$ qdbus org.ayatana.bamf /org/ayatana/bamf/matcher \                           
> org.ayatana.bamf.matcher.RunningApplicationsDesktopFiles
/usr/share/applications/compiz.desktop
/usr/share/applications/firefox.desktop
/usr/share/applications/x-terminal-emulator.desktop

使用org.ayatana.bamf.matcher.RunningApplicationsorg.ayatana.bamf.view.Name方法

$ qdbus org.ayatana.bamf /org/ayatana/bamf/matcher  \                          
> org.ayatana.bamf.matcher.RunningApplications | \                             
> xargs -I {} qdbus org.ayatana.bamf {} org.ayatana.bamf.view.Name
Firefox Web Browser
MY CUSTOM TERMINAL
Compiz

今それは印象的です!
Jacob Vlijm

@JacobVlijmこれには他にもバリエーションがありますが、それらには特定の目的があり、より多くのコードと解析が必要です。最も単純なものをここに貼り付けました。しかし、ありがとう:)
セルギー・コロディアズニー

5

興味深い質問です。

いつものように、これらのアプリケーションのリストを取得するにはさまざまな方法があり、それぞれに特定の利点と欠点があります。

ウィンドウリストを使用して、Launcherで表されるプロセスのリストを取得する

(マップされた)ウィンドウのあるアプリケーションのみがランチャーに表示されるため、以下を使用します。

wmctrl -lp 

wmctrlデフォルトではインストールされていません)、開いているウィンドウとそのウィンドウが属するプロセスIDのリストを取得できます。出力の形式は次のとおりです。

0x05204641  0 12618  jacob-System-Product-Name verhaal (~) - gedit

私たちにとって最も重要な情報は次のとおりです。

  • 最初の文字列(0x05204641); これはウィンドウ-idです
  • 3番目の文字列(12618); これは、ウィンドウが属するプロセスID(pid)であり、
  • 最後のセクション(verhaal (~) - gedit); これはウィンドウです。

pidを取得したら、次のコマンドで対応するプロセス名を検索できます。

ps -p <pid> -o comm=

上記の手順をスクリプト化し、既存のウィンドウの出力をリストすることができます(を使用してpython):

{'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'thunderbird', 'soffice.bin'}

合併症

これは簡単に思えます。ただし、いつものように、現実はもう少し複雑です。いくつかの例外と面倒な問題があります。

  1. 一部のウィンドウはpid 0に属し、そのプロパティを取得しようとするとエラーが発生します。WindowsのIdlepythonIDE)、またはtkinter、そのようなウィンドウです。
  2. 一部のウィンドウは、「実際の」ウィンドウではありません。一時ウィンドウ(他のウィンドウから呼び出され、それに属しているウィンドウ)やデスクトップ自体などのウィンドウです。これらのウィンドウは、の出力ではウィンドウとしてリストされますが、wmctrlDashでは個別に表示されません。
  3. LibreOfficeすべてのモジュールのプロセス名がである場合など、アプリケーションの名前がプロセス名とはかなり異なる場合がありますsoffice.bin。同時に、コマンド soffice.binを実行しても機能しません。ケースでは、識別するために必要なモジュールCalcWriterなど)を個別に、あなたは窓のから、追加情報を取得する必要があると思いたとえば。
  4. 別の例は、gnome-terminalの出力のようにプロセスリストに表示されるのプロセス名ですps -e ww。14.04ではとgnome-terminal表示されますがgnome-terminal、15.04 / 15.10ではと表示されます/usr/lib/gnome-terminal/gnome-terminal-server

少なくとも修正する必要があるもの

上記の最も重要な問題を修正するには、次のことを行う必要があります。

  • ウィンドウが「実際の」ウィンドウか「通常の」ウィンドウかを確認し、

    xprop -id <window_id>
    

    出力に次の行が含まれる場合:

    _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
    

    ウィンドウはUnityランチャーの意味で有効なウィンドウです

  • gnome-terminalin のプロセス名を修正するには15.x(表示されたプロセス名をにする場合gnome-terminal)、例外を追加して、次のgnome-terminalように表示される場合にプロセス名をに変更する必要があります。 /usr/lib/gnome-terminal/gnome-terminal-server

脚本

#!/usr/bin/env python3
import subprocess
import sys

try:
    listed = sys.argv[1]
except IndexError:
    listed = []

get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()

def check_wtype(w_id):
    # check the type of window; only list "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
    proc = get(["ps", "-p", w_id, "-o", "comm="])
    proc = "gnome-terminal" if "gnome-terminal" in proc else proc
    return proc

wlist = [l.split() for l in subprocess.check_output(["wmctrl", "-lp"])\
         .decode("utf-8").splitlines()]

validprocs = set([get_process(w[2]) for w in wlist if check_wtype(w[0]) == True])

if listed == "-list":
    for p in validprocs:
        print(p)
else:
    print(validprocs)

使い方

  1. スクリプトに必要なものwmctrl

    sudo apt-get install wmctrl
    
  2. 上記のスクリプトを空のファイルにコピーし、名前を付けて保存します get_running.py

  3. 次のコマンドで実行します。

    python3 /path/to/get_running.py
    

    次のように出力されます:

    {'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'thunderbird', 'soffice.bin'}
    

    または、引数を指定して実行します-list

    thunderbird
    nautilus
    gnome-terminal
    firefox
    gedit
    GuitarPro.exe
    soffice.bin
    

ノート

あなたの質問から、見つかったリストの目的が正確に何であるかは完全に明確ではありません。アプリケーションの名前(インターフェースに表示される名前)が必要な場合(「読み取り可能な」名前)、まったく異なるアプローチが適している可能性があります。

  • グローバルにインストールされたすべてのアプリケーションには、に.desktopファイルがあります/usr/share/applications。ほとんどの場合、ファイルからアプリケーションのプロセス名インターフェース名を結論付けることができ.desktopます。この情報を使用して、実行可能なGUIアプリケーションのリストを、「読み取り可能な」名前で提示することで、比較的簡単に作成できます。

ただし、この場合も、ここで説明するように、現実は理論よりも複雑です

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