Я пишу программу на C ++ (Linux, XWindow), которая должна изменять заголовок активного окна. Более конкретно, добавьте к нему определенный текст.
Можно ли получить дескриптор окна активного окна (даже если оно не связано с этой программой), чтобы использовать его в XFetchName и XStoreName? Или, может быть, есть какой-то другой способ изменить заголовок определенного окна?
Спасибо.
обновление 1:
я использовал
xprop -root | grep ^_NET_ACTIVE_WINDOW | cut -c41-49
и он возвращает правильную ручку. Спасибо за этот совет. Это то, что я использовал раньше
xdpyinfo | grep focus: | cut -c16-24
Похоже, он возвращает число, которое больше фактического дескриптора на 1.
Новый вопрос возникает сейчас. Похоже, что XStoreName изменяет WM_NAME. У меня есть рабочий стол Unity, и кажется, что он читает _NET_WM_NAME. Как я могу изменить это тоже?
обновление 2: нашел ответ
Atom Atom_name = XInternAtom(xdisplay,"_NET_WM_NAME",false);
Atom Atom_utf_type = XInternAtom(xdisplay,"UTF8_STRING",false);
XChangeProperty(xdisplay,window_handle,Atom_name,Atom_utf_type,8,PropModeReplace,(unsigned char*)new_name,strlen(new_name));
кажется, сейчас работает нормально
Нет никаких ограничений на работу с иностранными, не связанными окнами, поэтому XFetchName
а также XStoreName
будет работать (т.е. они получат доступ WM_NAME
свойство, которое может иметь желаемый эффект … или нет).
Как определить ток окно, вы можете начать с примера кода здесь:
Как узнать, какое окно имеет фокус и как его изменить? Обратите внимание на непринятый ответ: _NET_ACTIVE_WINDOW
свойство корневого окна (когда wm устанавливает его) является наиболее разумным значением для ток окно вы можете получить.
Обратите внимание, что есть _NET_WM_NAME
свойство типа UTF8_STRING
, который, вероятно, будет использоваться современным оконным менеджером вместо WM_NAME
когда они оба установлены. Не все приложения его устанавливают (на моем текущем рабочем столе я вижу, что Firefox делает, а Xterm нет). Вы должны быть готовы изменить _NET_WM_NAME
а также, если вы хотите изменить заголовок.
И, конечно же, приложение может решить сбросить свой заголовок в любое время. Вы можете подписаться на XPropertyNotify
событие, если вы хотите заметить это и обновить заголовок. Убедитесь, что есть обходной путь для приложений, которые могут сделать то же самое (то есть получить XPropertyNotify
на обновлении заголовка и сбросьте его обратно к тому, что они хотят).
Других решений пока нет …