Вчера я только начал изучать X11, и мне очень трудно найти информацию о нем.
Я бы хотел получить заголовок UTF-8 _NET_WM_NAME окна X11. Проблема в том, что вы должны вызывать его с параметром длины. Мое текущее решение состоит в том, чтобы сначала получить длину строки, используя XGetWindowProperty
с параметром длины 0, а затем снова вызвать XGetWindowProperty
, используя информацию bytes_after_return
для length
.
Проблема заключается в том, что включает в себя два распределения и освобождения. Я не очень продвинутый программист, но это, вероятно, не хорошо, верно? Хотя на практике два выделения для чего-то небольшого и нечастого, например, получения заголовка окна, вероятно, не будут иметь большого значения, я везде слышу, что все еще следует избегать ненужных выделений и освобождений.
Вот мой код:
Atom actualType;
int actualFormat;
unsigned long nItems;
unsigned long bytesAfter;
unsigned char* prop;
XGetWindowProperty(
display,
window,
_NET_WM_NAME,
0UL,
0UL,
False,
UTF8_STRING,
&actualType,
&actualFormat,
&nItems,
&bytesAfter,
&prop
);
XFree(prop);
XGetWindowProperty(
display,
window,
_NET_WM_NAME,
0UL,
(bytesAfter + 3UL) / 4UL, // Divide by four and round up
False,
UTF8_STRING,
&actualType,
&actualFormat,
&nItems,
&bytesAfter,
&prop
);
printf("title: %s", prop);
XFree(prop);
Есть ли лучший способ сделать это?
Альтернативным решением будет просто сохранить заголовок каждый раз, когда он установлен, но я не уверен, возможно ли это для сохраненный и фактический заголовок для десинхронизации.
Спасибо, чел <3 </p>