diff --git a/src/text-backend.c b/src/text-backend.c index a92aebed2..e5badc12a 100644 --- a/src/text-backend.c +++ b/src/text-backend.c @@ -23,6 +23,8 @@ #include #include +#include +#include #include "compositor.h" #include "text-server-protocol.h" @@ -89,6 +91,9 @@ struct text_backend { struct wl_resource *binding; struct weston_process process; struct wl_client *client; + + unsigned deathcount; + uint32_t deathstamp; } input_method; struct wl_listener seat_created_listener; @@ -761,14 +766,33 @@ input_method_init_seat(struct weston_seat *seat) seat->input_method->focus_listener_initialized = 1; } +static void launch_input_method(struct text_backend *text_backend); + static void handle_input_method_sigchld(struct weston_process *process, int status) { + uint32_t time; struct text_backend *text_backend = container_of(process, struct text_backend, input_method.process); text_backend->input_method.process.pid = 0; text_backend->input_method.client = NULL; + + /* if input_method dies more than 5 times in 10 seconds, give up */ + time = weston_compositor_get_time(); + if (time - text_backend->input_method.deathstamp > 10000) { + text_backend->input_method.deathstamp = time; + text_backend->input_method.deathcount = 0; + } + + text_backend->input_method.deathcount++; + if (text_backend->input_method.deathcount > 5) { + weston_log("input_method died, giving up.\n"); + return; + } + + weston_log("input_method died, respawning...\n"); + launch_input_method(text_backend); } static void