diff options
author | Giulio Camuffo <giuliocamuffo@gmail.com> | 2015-01-27 19:10:37 +0200 |
---|---|---|
committer | Pekka Paalanen <pekka.paalanen@collabora.co.uk> | 2015-03-30 16:04:57 +0300 |
commit | a8e9b415784bf978722caa3d53b4a99a064b060a (patch) | |
tree | 1966ece1df2a8ada4a21efef4d103f7446cc52d7 /xwayland | |
parent | 5d1d2ca32513a04f01e5f4cf938f6aa5ae513fcc (diff) | |
download | weston-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.c | 30 |
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; |