Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get an X11 Window from a Process ID?

Tags:

x11

Under Linux, my C++ application is using fork() and execv() to launch multiple instances of OpenOffice so as to view some powerpoint slide shows. This part works.

Next I want to be able to move the OpenOffice windows to specific locations on the display. I can do that with the XMoveResizeWindow() function but I need to find the Window for each instance.

I have the process ID of each instance, how can I find the X11 Window from that ?


UPDATE - Thanks to Andy's suggestion, I have pulled this off. I'm posting the code here to share it with the Stack Overflow community.

Unfortunately Open Office does not seem to set the _NET_WM_PID property so this doesn't ultimately solve my problem but it does answer the question.

// Attempt to identify a window by name or attribute. // by Adam Pierce <[email protected]>  #include <X11/Xlib.h> #include <X11/Xatom.h> #include <iostream> #include <list>  using namespace std;  class WindowsMatchingPid { public:     WindowsMatchingPid(Display *display, Window wRoot, unsigned long pid)         : _display(display)         , _pid(pid)     {     // Get the PID property atom.         _atomPID = XInternAtom(display, "_NET_WM_PID", True);         if(_atomPID == None)         {             cout << "No such atom" << endl;             return;         }          search(wRoot);     }      const list<Window> &result() const { return _result; }  private:     unsigned long  _pid;     Atom           _atomPID;     Display       *_display;     list<Window>   _result;      void search(Window w)     {     // Get the PID for the current Window.         Atom           type;         int            format;         unsigned long  nItems;         unsigned long  bytesAfter;         unsigned char *propPID = 0;         if(Success == XGetWindowProperty(_display, w, _atomPID, 0, 1, False, XA_CARDINAL,                                          &type, &format, &nItems, &bytesAfter, &propPID))         {             if(propPID != 0)             {             // If the PID matches, add this window to the result set.                 if(_pid == *((unsigned long *)propPID))                     _result.push_back(w);                  XFree(propPID);             }         }      // Recurse into child windows.         Window    wRoot;         Window    wParent;         Window   *wChild;         unsigned  nChildren;         if(0 != XQueryTree(_display, w, &wRoot, &wParent, &wChild, &nChildren))         {             for(unsigned i = 0; i < nChildren; i++)                 search(wChild[i]);         }     } };  int main(int argc, char **argv) {     if(argc < 2)         return 1;      int pid = atoi(argv[1]);     cout << "Searching for windows associated with PID " << pid << endl;  // Start with the root window.     Display *display = XOpenDisplay(0);      WindowsMatchingPid match(display, XDefaultRootWindow(display), pid);  // Print the result.     const list<Window> &result = match.result();     for(list<Window>::const_iterator it = result.begin(); it != result.end(); it++)         cout << "Window #" << (unsigned long)(*it) << endl;      return 0; } 
like image 443
Adam Pierce Avatar asked Sep 30 '08 01:09

Adam Pierce


People also ask

How do you get the window ID?

Go to Settings -> System -> About (or right-click on Start and select System from the context menu). In the section Device Specifications, there is an item labeled Device ID.


2 Answers

The only way I know to do this is to traverse the tree of windows until you find what you're looking for. Traversing isn't hard (just see what xwininfo -root -tree does by looking at xwininfo.c if you need an example).

But how do you identify the window you are looking for? Some applications set a window property called _NET_WM_PID.

I believe that OpenOffice is one of the applications that sets that property (as do most Gnome apps), so you're in luck.

like image 98
andy Avatar answered Oct 14 '22 05:10

andy


Check if /proc/PID/environ contains a variable called WINDOWID

like image 27
hoho Avatar answered Oct 14 '22 04:10

hoho