Support _NET_WM_PING protocol so the WM can detect freezes.

diff --git a/dlls/x11drv/window.c b/dlls/x11drv/window.c
index 302f8a7..54e05c1 100644
--- a/dlls/x11drv/window.c
+++ b/dlls/x11drv/window.c
@@ -23,6 +23,7 @@
 #include "config.h"
 
 #include <stdlib.h>
+#include <unistd.h>
 
 #include "ts_xlib.h"
 #include <X11/Xresource.h>
@@ -59,6 +60,8 @@
 Atom wmChangeState = None;
 Atom mwmHints = None;
 Atom kwmDockWindow = None;
+Atom netwmPid = None;
+Atom netwmPing = None;
 Atom _kde_net_wm_system_tray_window_for = None; /* KDE 2 Final */
 
 static LPCSTR whole_window_atom;
@@ -338,6 +341,7 @@
     i = 0;
     protocols[i++] = wmDeleteWindow;
     if (wmTakeFocus) protocols[i++] = wmTakeFocus;
+    if (netwmPing) protocols[i++] = netwmPing;
     XSetWMProtocols( display, data->whole_window, protocols, i );
 
     /* class hints */
@@ -373,6 +377,12 @@
                              XA_WINDOW, 32, PropModeReplace, (char*)&data->whole_window, 1 );
     }
 
+    /* set the WM_CLIENT_MACHINE and WM_LOCALE_NAME properties */
+    XSetWMProperties(display, data->whole_window, NULL, NULL, NULL, 0, NULL, NULL, NULL);
+    /* set the pid. together, these properties are needed so the window manager can kill us if we freeze */
+    i = getpid();
+    XChangeProperty(display, data->whole_window, netwmPid, XA_CARDINAL, 32, PropModeReplace, (char *)&i, 1);
+    
     if (mwmHints != None)
     {
         MwmHints mwm_hints;
@@ -627,6 +637,8 @@
     mwmHints = XInternAtom( display, _XA_MWM_HINTS, False );
     kwmDockWindow = XInternAtom( display, "KWM_DOCKWINDOW", False );
     _kde_net_wm_system_tray_window_for = XInternAtom( display, "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR", False );
+    netwmPid = XInternAtom( display, "_NET_WM_PID", False );
+    netwmPing = XInternAtom( display, "_NET_WM_PING", False );
     wine_tsx11_unlock();
 
     whole_window_atom  = MAKEINTATOMA( GlobalAddAtomA( "__wine_x11_whole_window" ));