Добрый день. Есть оконное приложение написанное на qt. Надо каким то образом программно из другой проги изменить размер окна первого приложения. Как это можно сделать?
Единственное что известно о той проге у к торой надо менять размер окна так это ее pid (идентификатор процесса) а XResizeWindow требует xid который не известен.
pid напрямую тут не поможет. Нужно получить список всех окон (_NET_CLIENT_LIST),
как-то отделить нужное (по WM_CLASS например, или _NET_WM_PID) и уже работать с ним.
Функция для вынимания NETWM свойств:
void* property(Window win, Atom prop, Atom type, int *nitems)
{
Atom type_ret;
int format_ret;
unsigned long items_ret;
unsigned long after_ret;
unsigned char *prop_data = 0;
if(XGetWindowProperty(QX11Info::display(), win, prop, 0, 0x7fffffff, False,
type, &type_ret, &format_ret, &items_ret,
&after_ret, &prop_data) != Success)
return 0;
if(nitems)
*nitems = items_ret;
return prop_data;
}
Список окон:
int num;
Window *win = reinterpret_cast<Window *>(property(QX11Info::appRootWindow(), NET_CLIENT_LIST, XA_WINDOW, &num));
if(!win)
return;
// win - массив идентификаторов Window длиной num,
// сканируем его, определяем pidы каждого окна
// ...
XFree(win);
---
Pid можно получить из атома _NET_WM_PID, который может не поддерживаться WM-ом (KWin поддерживает):
long *pid = reinterpret_cast<long *>(property(window, NET_WM_PID, XA_CARDINAL, 0));
// где window - идентификатор окна
qDebug("PID %ld", *pid);
XFree(pid);
---
свойства можно ещё посмотреть через xprop.
Спек: http://standards.freedesktop.org/wm-spec/wm-spec-latest.html