xwm: tell the shell the pid of the X clients

All the surfaces from all the X clients share the same wl_client so
wl_client_get_credentials can't be used to get the pid of the X
clients.
The shell may need to know the pid to be able to associate a surface
with e.g. a DBus service.

[Pekka: fixed trivial merge conflicts.]
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c
index 59cf39a..145d940 100644
--- a/xwayland/window-manager.c
+++ b/xwayland/window-manager.c
@@ -403,6 +403,7 @@
 	uint32_t *xid;
 	xcb_atom_t *atom;
 	uint32_t i;
+	char name[1024];
 
 	if (!window->properties_dirty)
 		return;
@@ -494,10 +495,28 @@
 		free(reply);
 	}
 
+	if (window->pid > 0) {
+		gethostname(name, sizeof(name));
+		for (i = 0; i < sizeof(name); i++) {
+			if (name[i] == '\0')
+				break;
+		}
+		if (i == sizeof(name))
+			name[0] = '\0'; /* ignore stupid hostnames */
+
+		/* this is only one heuristic to guess the PID of a client is
+		* valid, assuming it's compliant with icccm and ewmh.
+		* Non-compliants and remote applications of course fail. */
+		if (!window->machine || strcmp(window->machine, name))
+			window->pid = 0;
+	}
+
 	if (window->shsurf && window->name)
 		shell_interface->set_title(window->shsurf, window->name);
 	if (window->frame && window->name)
 		frame_set_title(window->frame, window->name);
+	if (window->shsurf && window->pid > 0)
+		shell_interface->set_pid(window->shsurf, window->pid);
 }
 
 static void
@@ -658,17 +677,10 @@
 {
 	struct weston_surface *surface = data;
 	struct weston_wm_window *window = get_wm_window(surface);
-	char name[1024];
-
 	if (!window)
 		return;
 
-	gethostname(name, 1024);
-
-	/* this is only one heuristic to guess the PID of a client is valid,
-	 * assuming it's compliant with icccm and ewmh. Non-compliants and
-	 * remote applications of course fail. */
-	if (!strcmp(window->machine, name) && window->pid != 0)
+	if (window->pid > 0)
 		kill(window->pid, SIGKILL);
 }
 
@@ -2430,6 +2442,8 @@
 
 	if (window->name)
 		shell_interface->set_title(window->shsurf, window->name);
+	if (window->pid > 0)
+		shell_interface->set_pid(window->shsurf, window->pid);
 
 	if (window->fullscreen) {
 		window->saved_width = window->width;