LINUX.ORG.RU

X win id (2)


0

0

Можно ли при запуске программы назначить win id для ее главного окна или сделать так, чтобы нужная программа отрисовывала свое окно в нужном нам (и созданном нами окне) ?

anonymous
Ответ на: комментарий от cvv

Еще вопрос - может можно при старте приложения для его главного окна назначить wm_class или wm_name. Если можно, то какой прогой ??

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

А как тогда mozplugger отслеживает окна.

Вобщем заморочил я тебе голову... Проще будет указать конкретную задачу. При работе моего приложения запускается куча других. Я управляю их окнами с помощью wmctrl. Для управления окно мне нужен его id. Вот и стоит проблема, когда мне нужно в одно время (задается в плэйлисте) запустить сразу два одинаковых приложения (у них одинаковый wm_class и wm_name). В этом случае сложно определить кому какое окно соответствует. А запускать одно за другим не допустимо. Единственное найденное ВОЗМОЖНО решение - это то что PID в порядке возрастания и вроде win id также. Но надо отслеживать, когда PID начнет выдаватся по второму кругу и др. проблемы. Т. о. это решение мне не очень нравится. Поэтому я пытаюсь найти получше. В X System я не очень шарю, а нужно срочно, очень срочно. Поэтому и спрашиваю: как бы делали Вы ???

Спасибо.

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

>А запускать одно за другим не допустимо.

на одно-процессорных системах они в любом случае будут запущены по очереди

кстати а как ты их запускаеш что тебе неизвестных их pid????

оптимальное решение ето когда дети сами передают родителю свои окна через пайпы / шаред мемори / файлы

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

по поводу одно за другим - я понимаю. Просто сейчас я запускаю одно, затем в цикле жду, пока появится окно и после этого получаю win id нового окна из вывода wmctrl. Это занимает приличное время.

Если же я смогу win id находить другим способом, то я просто делаю fork и в потомке запускаю проложение, а в предке продолжаю спокойно работать. Как только мне понадобится управлять окном, я узнаю его win id более хорошим, еще неизвестным мне способом :)

Спасибо.

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

> pid мне известен, а дети - написанные не мной приложения.

некоторые окна выставляют _NET_WM_PID для своих окон...но не все

no1sm ★★
()
Ответ на: комментарий от anonymous

#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;                                                                                                                                          
        }                                                                                                                                                      
}                                                                                                                                                              
//----------------------------------------------------                                                                                                         

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

//Ф-я позволяет получить pid процесса по WINDOWID                                                                                                              
pid_t wid2pid (Window w) {                                                                                                                                     
    Display *dpy = GDK_DISPLAY();                                                                                                                              
                                                                                                                                                               
    Atom atom,actual_type;                                                                                                                                     
    char *atom_name;                                                                                                                                           
    int actual_format;                                                                                                                                         
    unsigned long nitems;                                                                                                                                      
    unsigned long bytes_after;                                                                                                                                 
    unsigned char *prop;                                                                                                                                       
    int status;                                                                                                                                                
    pid_t pid;                                                                                                                                                 
                                                                                                                                                               
    atom = XInternAtom(dpy, "_NET_WM_PID", True);                                                                                                              
    atom_name = XGetAtomName (dpy,atom);                                                                                                                       
                                                                                                                                                               
    status = XGetWindowProperty(                                                                                                                               
        dpy, w, atom, 0, 1024,                                                                                                                                 
        False, AnyPropertyType,                                                                                                                                
        &actual_type,                                                                                                                                          
        &actual_format, &nitems,                                                                                                                               
        &bytes_after,                                                                                                                                          
        &prop                                                                                                                                                  
    );                                                                                                                                                         
                                                                                                                                                               
    if (status!=0)  {if(wid2pid_debug)  syslog(LOG_ERR,"wid2pid:Cannot get _NET_WM_PID for window %lu(0x%lx)",w,w);  return -2; }                              
    if (! prop)     {if(wid2pid_debug)  syslog(LOG_ERR,"wid2pid:window %lu(0x%lx): No properties\n",w,w);            return -3; }//???                         
                                                                                                                                                               
    pid = prop[1] * 256;                                                                                                                                       
    pid += prop[0];                                                                                                                                            
    if(wid2pid_debug)syslog(LOG_INFO,"wid2pid:pid of window %lu(0x%lx) = %d\n",w,w,pid);                                                                       
                                                                                                                                                               
    return pid;                                                                                                                                                
} 

cvv ★★★★★
()
Ответ на: комментарий от no1sm

Я знаю, так вот у меня почему-то не выставляется _NET_WM_PID ни для mplayer, ни для display (просмотрщик картинок).

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

>OK, но все же не все выставляют, вопрос: первой функции это не нужно?

а если хорошо подумать????

как вообще без него вообще можно работать????

cvv ★★★★★
()
Ответ на: комментарий от anonymous

Как без _NET_WM_PID ??? Я пока хоть нашел для display параметр -title - по wm_name я его распознам, но не все этот флаг поддерживают... :(

// anonymous, задавший вопрос

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

Ладно, скажите хоть как это сделать для MPlayer... При ./configure указать --enable-gui ??? Если да, то останется ли он без рюшек ?

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

можно пару строк в исходник xmms (или чего там) добавить. подойдет?

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