2015-01-27 22:00 GMT+02:00 Jasper St. Pierre <[email protected]>: > The only existing use I see for the PID is for killing the client.
There is already a mechanism for that anyway, so nothing needs to be added. > > I'd also argue that using the PID for application tracking is bound to go > awry for a variety of reasons, and you should use WM_CLASS or > _GTK_APPLICATION_ID for more complete tracking. My plan for this is to use the pid to associate a surface to a DBus (mpris) service. I don't see how i could use either of those for this. Not pretty, i know, but the only way i see without additional protocols. > > On Tue, Jan 27, 2015 at 12:29 PM, Giulio Camuffo <[email protected]> > wrote: >> >> 2015-01-27 19:23 GMT+02:00 Jasper St. Pierre <[email protected]>: >> > Are you still not using XKillClient for some reason? >> >> This patch is not about killing X clients, it's about passing the pid >> to the shell, so not sure what relevance it has. >> >> > >> > On Tue, Jan 27, 2015 at 12:10 PM, Giulio Camuffo >> > <[email protected]> >> > wrote: >> >> >> >> 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. >> >> --- >> >> >> >> v5: added the check on the hostname >> >> >> >> desktop-shell/shell.c | 7 +++++++ >> >> src/compositor.h | 1 + >> >> xwayland/window-manager.c | 30 ++++++++++++++++++++++-------- >> >> 3 files changed, 30 insertions(+), 8 deletions(-) >> >> >> >> diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c >> >> index a7514f7..6bb9af8 100644 >> >> --- a/desktop-shell/shell.c >> >> +++ b/desktop-shell/shell.c >> >> @@ -2248,6 +2248,12 @@ set_title(struct shell_surface *shsurf, const >> >> char >> >> *title) >> >> } >> >> >> >> static void >> >> +set_pid(struct shell_surface *shsurf, pid_t pid) >> >> +{ >> >> + /* We have no use for it */ >> >> +} >> >> + >> >> +static void >> >> set_type(struct shell_surface *shsurf, enum shell_surface_type t) >> >> { >> >> shsurf->type = t; >> >> @@ -6624,6 +6630,7 @@ module_init(struct weston_compositor *ec, >> >> ec->shell_interface.resize = surface_resize; >> >> ec->shell_interface.set_title = set_title; >> >> ec->shell_interface.set_window_geometry = set_window_geometry; >> >> + ec->shell_interface.set_pid = set_pid; >> >> >> >> weston_layer_init(&shell->fullscreen_layer, >> >> &ec->cursor_layer.link); >> >> weston_layer_init(&shell->panel_layer, >> >> &shell->fullscreen_layer.link); >> >> diff --git a/src/compositor.h b/src/compositor.h >> >> index aa87ec0..0223f41 100644 >> >> --- a/src/compositor.h >> >> +++ b/src/compositor.h >> >> @@ -121,6 +121,7 @@ struct weston_shell_interface { >> >> void (*set_window_geometry)(struct shell_surface *shsurf, >> >> int32_t x, int32_t y, >> >> int32_t width, int32_t height); >> >> + void (*set_pid)(struct shell_surface *shsurf, pid_t pid); >> >> }; >> >> >> >> struct weston_animation { >> >> diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c >> >> index 6f1996f..c966fd5 100644 >> >> --- a/xwayland/window-manager.c >> >> +++ b/xwayland/window-manager.c >> >> @@ -401,6 +401,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; >> >> @@ -487,10 +488,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 >> >> @@ -651,17 +670,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); >> >> } >> >> >> >> @@ -2333,6 +2345,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; >> >> -- >> >> 2.2.2 >> >> >> >> _______________________________________________ >> >> wayland-devel mailing list >> >> [email protected] >> >> http://lists.freedesktop.org/mailman/listinfo/wayland-devel >> > >> > >> > >> > >> > -- >> > Jasper > > > > > -- > Jasper _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
