실행 파일에 연결된 아이콘 파일을 찾는 방법은 무엇입니까?

실행 파일에 연결된 아이콘 파일을 찾는 방법은 무엇입니까?

저는 창 관리자를 구축 중이며 실행 중인 실행 파일의 작업 표시줄과 연결된 아이콘을 찾아야 합니다. 아이콘 사양을 찾았고 모든 아이콘을 찾을 수 있었습니다 /usr/share/icons/theme_name(중요하다면 저는 아치 리눅스를 사용하고 있습니다). 나는 또한 .desktop그것을 발견했다 /usr/share/applications.

문제는 .desktop파일을 실행 중인 실행 파일과 연결하는 것입니다. 나는 실행 중인 창의 이름이 .desktop파일 이름과 일치해야 한다고 생각했습니다. 그러나 실행 중인 창의 이름은 창 자체에 더 구체적입니다. 예를 들어 터미널에서 호출하면 XGetWindowProperty터미널이 현재 있는 디렉터리로 이름이 반환되고 Visual Studio Code는 파일 이름, 사용자 이름 및 "Visual Studio Code"가 반환됩니다.

둘을 연결하는 방법은 없을까요? .desktop어떤 실행 창이 어떤 파일을 사용하는지 아는 것과 같습니다 . 아니면 어떤 실행 창에서 어떤 아이콘을 사용해야 하는지 직접 알 수 있나요?

답변1

실행 중인 X11 응용 프로그램은 아이콘 파일을 참조하지 않고 해당 아이콘 이미지 데이터를재산_NET_WM_ICON응용프로그램 창에 첨부합니다. 표시될 이미지 데이터는 다음을 디코딩하여 찾을 수 있습니다.

이는 클라이언트 측에서 사용할 수 있는 아이콘의 배열입니다. 이 사양에서는 이러한 아이콘의 크기를 지정하지 않지만 개별 데스크탑 환경이나 툴킷에서는 이를 지정할 수 있습니다. 창 관리자는 이러한 아이콘을 적절한 크기로 조정할 수 있습니다.

이는 32비트 압축형 CARDINAL ARGB 배열이며 상위 바이트는 A이고 하위 바이트는 B입니다. 처음 두 베이스는 너비와 높이입니다. 데이터는 왼쪽에서 오른쪽, 위에서 아래로 행으로 정렬됩니다.

답변2

Stephen Kitt는 _NET_WM_ICON 속성을 지적했습니다. 마침내 이미지 데이터를 가져오는 방법을 알아냈습니다.

img_data다음은 생성된 ARGB 원시 이미지 데이터가 있는 구현입니다 . 이미지를 표시하기 위해 Imlib2를 사용하고 있습니다.

const Atom NET_WM_ICON = XInternAtom(DISPLAY, "_NET_WM_ICON", false);
const Atom CARDINAL = XInternAtom(DISPLAY, "CARDINAL", false);

Atom type_return;
int format_return;
unsigned long nitems_return;
unsigned long bytes_after_return;
unsigned char* data_return;

XGetWindowProperty(DISPLAY, window, NET_WM_ICON, 0, 1, false, CARDINAL, &type_return, &format_return, &nitems_return, &bytes_after_return, &data_return);
const int width = *(int*)data_return;
XFree(data_return);

XGetWindowProperty(DISPLAY, window, NET_WM_ICON, 1, 1, false, CARDINAL, &type_return, &format_return, &nitems_return, &bytes_after_return, &data_return);
const int height = *(int*)data_return;
XFree(data_return);

XGetWindowProperty(DISPLAY, window, NET_WM_ICON, 2, width * height, false, CARDINAL, &type_return, &format_return, &nitems_return, &bytes_after_return, &data_return);

uint32_t* img_data = new uint32_t[width * height];
const ulong* ul = (ulong*)data_return;

for(int i = 0; i < nitems_return; i++)
{
    img_data[i] = (uint32_t)ul[i];
}

XFree(data_return);

답변3

./gjs-script "org.gnome.Calculator.desktop"아이콘을 얻기 위해 다음 스크립트를 호출할 수 있습니다 .

#!/usr/bin/env gjs

const { Gio } = imports.gi;
let apps = Gio.AppInfo.get_all().find(a => a.get_id() == ARGV[0]);
print(apps.get_icon().to_string());

관련 정보