From: Ray Strode Date: Mon, 9 Mar 2009 16:18:56 +0000 (-0400) Subject: Remove event handlers on destroy in plugins X-Git-Tag: 0.7.0~203 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=546fbdc0b8bff126066778ef789e00ddb47dfd49;p=thirdparty%2Fplymouth.git Remove event handlers on destroy in plugins This is because we can end up in scenarios where a plugin gets destroyed, and readded without getting hidden in between. --- diff --git a/src/plugins/splash/details/plugin.c b/src/plugins/splash/details/plugin.c index c25b75ac..2eed3418 100644 --- a/src/plugins/splash/details/plugin.c +++ b/src/plugins/splash/details/plugin.c @@ -64,6 +64,14 @@ typedef enum { typedef void (* ply_boot_splash_plugin_window_handler_t) (ply_window_t *window, ply_boot_splash_plugin_t *, void *user_data, void *other_user_data); +static void uninitialize_window (ply_window_t *window, + ply_boot_splash_plugin_t *plugin); + +static void for_each_window (ply_boot_splash_plugin_t *plugin, + ply_boot_splash_plugin_window_handler_t handler, + void *user_data, + void *other_user_data); + ply_boot_splash_plugin_interface_t *ply_boot_splash_plugin_get_interface (void); struct _ply_boot_splash_plugin { @@ -94,6 +102,10 @@ destroy_plugin (ply_boot_splash_plugin_t *plugin) if (plugin == NULL) return; + for_each_window (plugin, + (ply_boot_splash_plugin_window_handler_t) + uninitialize_window, NULL, NULL); + ply_list_free (plugin->windows); free (plugin); diff --git a/src/plugins/splash/fade-in/plugin.c b/src/plugins/splash/fade-in/plugin.c index 598bc08a..f06f4988 100644 --- a/src/plugins/splash/fade-in/plugin.c +++ b/src/plugins/splash/fade-in/plugin.c @@ -167,6 +167,8 @@ destroy_plugin (ply_boot_splash_plugin_t *plugin) if (plugin == NULL) return; + remove_handlers (plugin); + if (plugin->loop != NULL) { ply_event_loop_stop_watching_for_exit (plugin->loop, (ply_event_loop_exit_handler_t) diff --git a/src/plugins/splash/glow/plugin.c b/src/plugins/splash/glow/plugin.c index c81c9215..25f7ba6b 100644 --- a/src/plugins/splash/glow/plugin.c +++ b/src/plugins/splash/glow/plugin.c @@ -125,6 +125,8 @@ destroy_plugin (ply_boot_splash_plugin_t *plugin) if (plugin == NULL) return; + remove_handlers (plugin); + if (plugin->loop != NULL) { ply_event_loop_stop_watching_for_exit (plugin->loop, (ply_event_loop_exit_handler_t) diff --git a/src/plugins/splash/pulser/plugin.c b/src/plugins/splash/pulser/plugin.c index 122139ed..adfb7128 100644 --- a/src/plugins/splash/pulser/plugin.c +++ b/src/plugins/splash/pulser/plugin.c @@ -102,6 +102,8 @@ destroy_plugin (ply_boot_splash_plugin_t *plugin) if (plugin == NULL) return; + remove_handlers (plugin); + /* It doesn't ever make sense to keep this plugin on screen * after exit */ diff --git a/src/plugins/splash/solar/plugin.c b/src/plugins/splash/solar/plugin.c index d80d97f9..8ca3beb0 100644 --- a/src/plugins/splash/solar/plugin.c +++ b/src/plugins/splash/solar/plugin.c @@ -245,6 +245,7 @@ destroy_plugin (ply_boot_splash_plugin_t *plugin) if (plugin == NULL) return; + remove_handlers (plugin); if (plugin->loop != NULL) { diff --git a/src/plugins/splash/spinfinity/plugin.c b/src/plugins/splash/spinfinity/plugin.c index 07460f1b..604a7daf 100644 --- a/src/plugins/splash/spinfinity/plugin.c +++ b/src/plugins/splash/spinfinity/plugin.c @@ -126,6 +126,8 @@ destroy_plugin (ply_boot_splash_plugin_t *plugin) if (plugin == NULL) return; + remove_handlers (plugin); + if (plugin->loop != NULL) { ply_event_loop_stop_watching_for_exit (plugin->loop, (ply_event_loop_exit_handler_t) diff --git a/src/plugins/splash/text/plugin.c b/src/plugins/splash/text/plugin.c index bbc5a3b7..f58474e0 100644 --- a/src/plugins/splash/text/plugin.c +++ b/src/plugins/splash/text/plugin.c @@ -107,6 +107,8 @@ destroy_plugin (ply_boot_splash_plugin_t *plugin) if (plugin == NULL) return; + remove_handlers (plugin); + /* It doesn't ever make sense to keep this plugin on screen * after exit */