Multiple-OS Header Access

Adam D. Ruppe destructionator at gmail.com
Wed Feb 12 10:07:05 PST 2014


Here's some more functions:

version(linux)
string getProcessCommandLine(long pid) {
         import std.file;
         import std.conv;
         return readText("/proc/" ~ to!string(pid) ~ "/cmdline");
}


And for looking at windows, you'll want my simpledisplay.d and 
color.d from here:
https://github.com/adamdruppe/misc-stuff-including-D-programming-language-web-stuff


Then use these two functions:

import simpledisplay;
Window getActiveWindow() {
         auto display = XDisplayConnection.get();
         auto focusedAtom = GetAtom!"_NET_ACTIVE_WINDOW"(display);

         Atom target;
         int format;
         arch_ulong bytesafter, length;
         char* value;
         XGetWindowProperty(
                 display,
                 RootWindow(display, DefaultScreen(display)),
                 focusedAtom,
                 0,
                 100000 /* length */,
                 false,
                 0 /*AnyPropertyType*/,
                 &target, &format, &length, &bytesafter, &value);

         assert(format == 32);

         auto activeWindowId = *cast(uint*) value;

         XFree(value);

         return cast(Window) activeWindowId;
}

long getWindowPid(Window w) {
         auto display = XDisplayConnection.get();
         auto atom = GetAtom!"_NET_WM_PID"(display);

         Atom target;
         int format;
         arch_ulong bytesafter, length;
         char* value;
         XGetWindowProperty(
                 display,
                 w,
                 atom,
                 0,
                 100000 /* length */,
                 false,
                 0 /*AnyPropertyType*/,
                 &target, &format, &length, &bytesafter, &value);

         long pid;

         if(format == 32)
                 pid = *cast(uint*) value;
         if(format == 64)
                 pid = *cast(long*) value;

         XFree(value);

         return pid;
}



(You might notice they are substantially similar... perhaps I'll 
add a generic wrapper of some sort to simpledisplay.d for this 
stuff.)


Then you can use it:

void main() {
         auto activeWindow = getActiveWindow();
         auto pid = getWindowPid(activeWindow);
         writeln(pid);
         if(pid)
                 writeln(getProcessCommandLine(pid));
}


pid might not be available, so be sure to check that it is 
non-zero before trying to use it.

But I compiled this program:

dmd processes.d simpledisplay.d color.d

And ran it:

$ sleep 2; ./processes
9412
/home/me/firefox9/firefox/firefox


(The sleep was to give me a chance to focus another window before 
the program ran, here I went to firefox and it successfully 
showed that, or xterm if I go there, and so on. My rxvt does not 
set this property though... nor does my own simpledisplay.d 
windows!)



Anywho this is linux/X11 code, if you version them out you should 
be able to make a generic Windows function too.


More information about the Digitalmars-d-learn mailing list