summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugen Friedrich <efriedrich@de.adit-jv.com>2020-06-23 13:27:35 +0200
committerEugen Friedrich <efriedrich@de.adit-jv.com>2020-06-23 13:27:35 +0200
commit2767985c5bed27fc9d0f97ae8d762f9adf8eff9d (patch)
treed1474698d14e6f953ad6e0b919df3dbe40e480dd
parent8815ae5fcd11f3cfa53f8a7bda134e771143f3c3 (diff)
parent8cb9a6c3b876242caf532aa783d8a2ac8468002f (diff)
downloadwayland-ivi-extension-2767985c5bed27fc9d0f97ae8d762f9adf8eff9d.tar.gz
Merge remote-tracking branch 'upstream/pull/109'
* upstream/pull/109 Fix segmentation fault observed at compositor termination Reviewed-by: Eugen Friedrich <efriedrich@de.adit-jv.com> Tested-by: Eugen Friedrich <efriedrich@de.adit-jv.com>
-rw-r--r--weston-ivi-shell/src/ivi-controller.c27
-rw-r--r--weston-ivi-shell/src/ivi-controller.h2
2 files changed, 26 insertions, 3 deletions
diff --git a/weston-ivi-shell/src/ivi-controller.c b/weston-ivi-shell/src/ivi-controller.c
index 87ebd2e..69f0cda 100644
--- a/weston-ivi-shell/src/ivi-controller.c
+++ b/weston-ivi-shell/src/ivi-controller.c
@@ -1566,7 +1566,7 @@ output_destroyed_event(struct wl_listener *listener, void *data)
destroy_screen(iviscrn);
}
- if (shell->bkgnd_view)
+ if (shell->bkgnd_view && shell->client)
set_bkgnd_surface_prop(shell);
else
weston_compositor_schedule_repaint(shell->compositor);
@@ -1577,7 +1577,7 @@ output_resized_event(struct wl_listener *listener, void *data)
{
struct ivishell *shell = wl_container_of(listener, shell, output_destroyed);
- if (shell->bkgnd_view)
+ if (shell->bkgnd_view && shell->client)
set_bkgnd_surface_prop(shell);
}
@@ -1589,7 +1589,7 @@ output_created_event(struct wl_listener *listener, void *data)
create_screen(shell, created_output);
- if (shell->bkgnd_view)
+ if (shell->bkgnd_view && shell->client)
set_bkgnd_surface_prop(shell);
else
weston_compositor_schedule_repaint(shell->compositor);
@@ -2033,6 +2033,11 @@ ivi_shell_destroy(struct wl_listener *listener, void *data)
struct ivishell *shell =
wl_container_of(listener, shell, destroy_listener);
+ if (shell->client) {
+ wl_list_remove(&shell->client_destroy_listener.link);
+ wl_client_destroy(shell->client);
+ }
+
wl_list_remove(&shell->destroy_listener.link);
wl_list_remove(&shell->output_created.link);
@@ -2165,6 +2170,18 @@ load_input_module(struct ivishell *shell)
}
static void
+ivi_shell_client_destroy(struct wl_listener *listener, void *data)
+{
+ struct ivishell *shell = wl_container_of(listener, shell,
+ client_destroy_listener);
+
+ weston_log("ivi shell client %p destroyed \n", shell->client);
+
+ wl_list_remove(&shell->client_destroy_listener.link);
+ shell->client = NULL;
+}
+
+static void
launch_client_process(void *data)
{
struct ivishell *shell =
@@ -2185,6 +2202,10 @@ launch_client_process(void *data)
shell->client = weston_client_start(shell->compositor,
shell->ivi_client_name);
+ shell->client_destroy_listener.notify = ivi_shell_client_destroy;
+ wl_client_add_destroy_listener(shell->client,
+ &shell->client_destroy_listener);
+
free(shell->ivi_client_name);
}
diff --git a/weston-ivi-shell/src/ivi-controller.h b/weston-ivi-shell/src/ivi-controller.h
index aeaba03..9abb843 100644
--- a/weston-ivi-shell/src/ivi-controller.h
+++ b/weston-ivi-shell/src/ivi-controller.h
@@ -80,6 +80,8 @@ struct ivishell {
struct wl_listener destroy_listener;
+ struct wl_listener client_destroy_listener;
+
struct wl_array screen_ids;
uint32_t screen_id_offset;