Unity Launcher에서 GUI 애플리케이션을 실행하는 방법은 무엇입니까?


8

아이콘 왼쪽에 작은 흰색 화살표가있는 Dash에서 현재 열려 있거나 실행중인 앱만있는 목록이 필요합니다.

그것을 얻는 방법이 있습니까?

화살표가있는 대시 스크린 샷


1
컨텍스트는 무엇이며 목록을 사용하려면 어떻게해야합니까 (어떤 형식으로)?
Jacob Vlijm

열린 창 목록? 쉽게 할 수 있지만 Jacob이 말했듯이 더 많은 정보가 필요할 것입니다.
Sergiy Kolodyazhnyy

관련, 매우 가능성이 중복 : askubuntu.com/q/483554/295286
세르지 Kolodyazhnyy

답변:


4

방법은 그것을 할 수 있습니다 qdbusorg.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 이것에 더 많은 변형이 있지만 특정 목적을 가지고 있으며 더 많은 코드와 구문 분석이 필요합니다. 방금 가장 간단한 것을 붙여 넣었습니다. 그러나 감사합니다 :)
Sergiy Kolodyazhnyy

5

흥미로운 질문입니다.

항상 그렇듯이 이러한 응용 프로그램 목록을 얻는 방법에는 여러 가지가 있으며 각 응용 프로그램에는 특정 광고 및 단점이 있습니다.

창 목록을 사용하여 실행기에 표시된 프로세스 목록 가져 오기

(매핑 된) 창이있는 응용 프로그램 만 런처에 표시되므로 다음을 사용하십시오.

wmctrl -lp 

( wmctrl기본적으로 설치되어 있지 않습니다), 열린 창 목록과 창이 속한 프로세스 ID를 얻을 수 있습니다. 출력 형식은 다음과 같습니다.

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

우리에게 가장 중요한 정보는 다음과 같습니다.

  • 첫 번째 문자열 ( 0x05204641); 이것은 창 -id입니다
  • 세 번째 문자열 ( 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 에 속하며 속성을 얻으려고 할 때 오류가 발생합니다. 의 윈도우 Idle( pythonIDE) 또는 tkinter같은 창입니다.
  2. 일부 창은 임시 창 (다른 창에서 호출되어 다른 창에 속하는 창)과 같이 "실제"창이나 바탕 화면 자체가 아닙니다. 이 창은의 출력에 창으로 wmctrl표시되지만 Dash에는 별도로 표시되지 않습니다.
  3. 경우에 따라 응용 프로그램 이름이 프로세스 이름과 상당히 다른 경우가 있습니다 (예 : LibreOffice모든 모듈의 프로세스 이름이 인 경우) soffice.bin. 동시에 명령 soffice.bin 을 실행 해도 작동하지 않습니다. 경우 당신은 확인해야 모듈 ( Calc, Writer윈도우의에서 별도로 추가 정보를 얻기 위해 필요한 것 등)을 이름 , 예를 들어.
  4. 또 다른 예는의 프로세스 gnome-terminal출력에 표시 되는 프로세스 이름 입니다 ps -e ww. 14.04에서는 15.04 / 15.10에서는 다음 gnome-terminal과 같이 나타납니다 .gnome-terminal/usr/lib/gnome-terminal/gnome-terminal-server

우리가 적어도 고쳐야 할 것

위의 가장 중요한 문제를 해결하려면 다음을 수행해야합니다.

  • 윈도우가 "실제"또는 "정상"윈도우인지 확인하고,

    xprop -id <window_id>
    

    출력에 라인이 포함 된 경우 :

    _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
    

    이 창은 Unity Launcher와 관련하여 유효한 창입니다.

  • 의 프로세스 이름 해결하려면 gnome-terminal에서 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.