summaryrefslogtreecommitdiff
path: root/xwayland
diff options
context:
space:
mode:
authorGiulio Camuffo <giuliocamuffo@gmail.com>2015-01-27 19:10:37 +0200
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>2015-03-30 16:04:57 +0300
commita8e9b415784bf978722caa3d53b4a99a064b060a (patch)
tree1966ece1df2a8ada4a21efef4d103f7446cc52d7 /xwayland
parent5d1d2ca32513a04f01e5f4cf938f6aa5ae513fcc (diff)
downloadweston-a8e9b415784bf978722caa3d53b4a99a064b060a.tar.gz
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>
Diffstat (limited to 'xwayland')
-rw-r--r--xwayland/window-manager.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c
index 59cf39ae..145d940e 100644
--- a/xwayland/window-manager.c
+++ b/xwayland/window-manager.c
@@ -403,6 +403,7 @@ weston_wm_window_read_properties(struct weston_wm_window *window)
uint32_t *xid;
xcb_atom_t *atom;
uint32_t i;
+ char name[1024];
if (!window->properties_dirty)
return;
@@ -494,10 +495,28 @@ weston_wm_window_read_properties(struct weston_wm_window *window)
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 @@ weston_wm_kill_client(struct wl_listener *listener, void *data)
{
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 @@ xserver_map_shell_surface(struct weston_wm_window *window,
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;