저는 창 관리자를 구축 중이며 실행 중인 실행 파일의 작업 표시줄과 연결된 아이콘을 찾아야 합니다. 아이콘 사양을 찾았고 모든 아이콘을 찾을 수 있었습니다 /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());