LINUX.ORG.RU

Получить/изменить заголовок окна.


0

0

Необходимо получить текст заголовка активного окна, а затем его изменить. Каким образом это можно сделать в Linux'е на С++ или Python? В Windows я пользовался FindWindow, PostMessage и т.д.
А каким образом это сделать в Linux? Можете просто перечислить функции, а дальше как-нибудь разберусь.


Графическая библиотека какая?

Во многих это есть, можно просто в документации поискать window & title

anonymous
()

в Х "активного окна", аналог ForegroundWindow нет.
Установить имя окна можно с помощью

void SetWindowName(Window id, char *name)
{
// Set window name.

XTextProperty wname;

if (XStringListToTextProperty(&name, 1, &wname) == 0) {
return;
}
XSetWMName(дisplay, id, &wname);
XFree(wname.value);
}

carrot
()
Ответ на: комментарий от carrot

>В Windows я пользовался FindWindow, PostMessage и т.д.

если уж "врать", то по-честному ... ;-)

В Windows - это делается:

GetForegroundWindow

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/... tions/getforegroundwindow.asp

SetWindowText

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/...

исключение составляет консоль:

// fetch current window title
GetConsoleTitle(pszOldWindowTitle, 1024);
// format a "unique" NewWindowTitle
wsprintf(pszNewWindowTitle,"%d/%d", GetTickCount(), GetCurrentProcessId());
// change current window title
SetConsoleTitle(pszNewWindowTitle);
// ensure window title has been updated
Sleep(40);
// look for NewWindowTitle
hwndFound=FindWindow(NULL, pszNewWindowTitle);
// restore original window title
ShowWindow(hwndFound, SW_RESTORE);
SetForegroundWindow(hwndFound);
SetConsoleTitle("ROOT session");

carrot
()
Ответ на: комментарий от carrot

Спасибо за ответы. Забыл сказать, что графическая библиотека Qt.
>void QWidget::setCaption( const QString &caption )
Я так понимаю это изменит заголовок только моего приложения. А мне необходимо изменить заголовок любого приложения, которое становится активным.
Вот как я делал в Windows (на delphi):
tmp:=GetForegroundWindow;
SetWindowText(tmp,”new caption.”);

Т.е. мне нужно две функции. Первая получает handle активного окна, вторая изменяет его заголовок.

PS:
>>В Windows я пользовался FindWindow, PostMessage и т.д.
>если уж "врать", то по-честному ... ;-)

Excusez. :-) Перепутал.
При помощи FindWindow я получал handle по имени заголовка окна.
hw:=FindWindow('Apollo - Main Window',nil);
А с помощью PostMessage я посылал необходимое сообщение. Например такое PostMessage(hw,WM_CLOSE,0,0);

def0e0
() автор топика
Ответ на: комментарий от def0e0

> заголовок любого приложения

не понял. "любого", т.е. "чужого"?

---
Повторяю, в Х-ах "активного окна" - нет.
вернее - это зависит от windows managera.

Есть окно, в котором "фокус" - оно необязательно
должно быть "на верху".

По-конкретнее, пожалуйста.

carrot
()
Ответ на: комментарий от carrot

>не понял. "любого", т.е. "чужого"?
да

Оконный менеджер KDE.

>Есть окно, в котором "фокус" - оно необязательно
>должно быть "на верху".
Ну да. Я думаю под активным окном это и подразумевается. Т.е. окно с которым пользователь в данный момент времени работает. Вводит текст, нажимает на кнопки и т.д.

В общем к чему все это. Я хочу брать название текущей песни и исполнителя из XMMS, а затем вставлять это "дело" в заголовок программы с которой я работаю в текущий момент времени. Например запускаю я браузер, а в заголовке название песни которая сейчас играет. Открываю почтовый клиент, тогда заголовок браузера восстанавливаем, а почтового клиента изменяем и т.д. А вообще это можно сделать как plug-in к XMMS.
В Windows когда-то я подобное реализовывал (для Apollo).

Из всего этого мне непонятно только как изменить заголовок окна.

Поискал вчера в документации по Qt. Что-то даже и не пахнет. Может плохо «нюхал». :)

def0e0
() автор топика
Ответ на: комментарий от def0e0

это уже лучше ;-)

Qt здесь не поможет (могу ошибаться), потому что Qt
работает с windows одного application.

Сам я этого не делал, но могу подсказать, куда копать.

- неким аналогом FindWindow в Х-ах является XQueryTree
http://tronche.com/gui/x/xlib/window-information/XQueryTree.html
который, позволяет "найти" любое окошко на десктопе.

- фокус находится с помощью XGetInputFocus
http://tronche.com/gui/x/xlib/input/XGetInputFocus.html

- заголовок окна меняется с помощью XSetWMName
- заголовок окна берется с помощью XGetWMName
http://tronche.com/gui/x/xlib/ICC/client-to-window-manager/XGetWMName.html

> Я хочу брать название текущей песни и исполнителя из XMMS
как?

Одно из принципиальных отличий между Windows и Х-ами,
Х - это архитектура клиент-сервер, т.е. зная индетификатор окна
нельзя сказать, какому application оно принадлежит (могу ошибаться).

Продолжай задавать вопросы ...

Одним из специалистов по Х-ам на форуме явяется lg
http://www.linux.org.ru/whois.jsp?nick=lg

Странно, что он пропустил эту тему. Попробуй свазаться с ним напрямую

carrot
()
Ответ на: комментарий от carrot

Спасибо за ссылки почитаю и попробую чего-нибудь.

>> Я хочу брать название текущей песни и исполнителя из XMMS
>как?

Ну я знаю только два способа.
1) У XMMS есть plug-in “Смена песни” (libsong_change.so). В его свойствах можно указать команду которая будет выполнятся после смены песни (например: echo "%s" > ~/cur_song.txt), а также команду которая выполнится после того как xmms дойдет до конца списка песен (например: echo "" > ~/cur_song.txt).
Теперь нам нужно только прочитать файл cut_song.txt, чтобы получить текущее название песни.

2) Подключить заголовочный файл /usr/include/xmms/xmmsctrl.h
И использовать две функции:
gint xmms_remote_get_playlist_pos(gint session);
gchar *xmms_remote_get_playlist_title(gint session, gint pos);
Из названий функций думаю понятно что они делают.

def0e0
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.