Можно ли при запуске программы назначить win id для ее главного окна или сделать так, чтобы нужная программа отрисовывала свое окно в нужном нам (и созданном нами окне) ?
Вобщем заморочил я тебе голову... Проще будет указать конкретную задачу. При работе моего приложения запускается куча других. Я управляю их окнами с помощью wmctrl. Для управления окно мне нужен его id. Вот и стоит проблема, когда мне нужно в одно время (задается в плэйлисте) запустить сразу два одинаковых приложения (у них одинаковый wm_class и wm_name). В этом случае сложно определить кому какое окно соответствует. А запускать одно за другим не допустимо. Единственное найденное ВОЗМОЖНО решение - это то что PID в порядке возрастания и вроде win id также. Но надо отслеживать, когда PID начнет выдаватся по второму кругу и др. проблемы. Т. о. это решение мне не очень нравится. Поэтому я пытаюсь найти получше. В X System я не очень шарю, а нужно срочно, очень срочно. Поэтому и спрашиваю: как бы делали Вы ???
по поводу одно за другим - я понимаю. Просто сейчас я запускаю одно, затем в цикле жду, пока появится окно и после этого получаю win id нового окна из вывода wmctrl. Это занимает приличное время.
Если же я смогу win id находить другим способом, то я просто делаю fork и в потомке запускаю проложение, а в предке продолжаю спокойно работать. Как только мне понадобится управлять окном, я узнаю его win id более хорошим, еще неизвестным мне способом :)
#define ENV_SIZE 8192
unsigned window_debug=FALSE;
//----------------------------------------------------
Window wget_window_by_pid(pid_t pid){
Window w=0;
syslog(LOG_INFO,"wget_window_by_pid:Check WINDOWID for pid=%d\n",pid);
//----------------------------------------------------
Display *dpy=GDK_DISPLAY();
Window root_return;
Window parent_return;
Window *children_return;
unsigned int nchildren_return;
Status status=XQueryTree(dpy, GDK_ROOT_WINDOW(), &root_return, &parent_return, &children_return, &nchildren_return);
unsigned i;
if(children_return){
if(window_debug)syslog (LOG_INFO,"wget_window_by_pid:XQueryTree found %d child windows in root window",nchildren_return);
for (i=0;i<nchildren_return;i++){
Window *children_return1;
unsigned int nchildren_return1;
Status status1=XQueryTree(dpy, children_return[i], &root_return, &parent_return, &children_return1, &nchildren_return1);
unsigned j;
if(children_return1){
if(window_debug)syslog (LOG_INFO,"wget_window_by_pid:XQueryTree found %d child windows in window %lu(0x%lx)",
nchildren_return1,children_return[i],children_return[i]);
for (j=0;j<nchildren_return1;j++){
//Предполагаем что на третьем уровне вложенности имеется только одно окно с нужным нам pid
//которое считаем главным окном приложения.
if (pid == wid2pid(children_return1[j]))/*if(wid2wm_protocols(children_return[i]))*/{w=chil
dren_return1[j];break;}
}
XFree(children_return1);
}
if(w)break;
}
}
XFree(children_return);
//----------------------------------------------------
if(!w){if(window_debug)syslog (LOG_INFO,"wget_window_by_pid:for pid=%d not found any window",pid);return None;}
else {
if(window_debug)syslog (LOG_INFO, "wget_window_by_pid:for pid=%d found some window %lu(0x%lx)."
" Interpret it as main application window",pid,w,w);
// попытка получить родительское(главное) окно приложения которое можно развернуть. Пока не даёт ни какой пользы
return w;
}
}
//----------------------------------------------------