On Tue, May 14, 2013 at 01:09:31PM -0300, Eduardo Lima (Etrunko) wrote:
> From: "Eduardo Lima (Etrunko)" <eduardo.l...@intel.com>
> 
> Just the same as it is done in shell.c, if the input method process exits
> for any reason, we relaunch it automatically, as it is not possible to
> launch a standalone application outside of the weston process.
> 
> In v2:
>  - Proper error message when giving up.

That looks good, thanks Eduardo.

Kristian

> Signed-off-by: Eduardo Lima (Etrunko) <eduardo.l...@intel.com>
> ---
>  src/text-backend.c | 23 +++++++++++++++++++++++
>  1 file changed, 23 insertions(+)
> 
> diff --git a/src/text-backend.c b/src/text-backend.c
> index d7ce31c..5be4a67 100644
> --- a/src/text-backend.c
> +++ b/src/text-backend.c
> @@ -23,6 +23,7 @@
>  
>  #include <stdlib.h>
>  #include <string.h>
> +#include <time.h>
>  
>  #include "compositor.h"
>  #include "text-server-protocol.h"
> @@ -91,6 +92,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;
> @@ -819,14 +823,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
> -- 
> 1.8.1.4
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to