summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2009-03-09 12:18:56 -0400
committerRay Strode <rstrode@redhat.com>2009-03-09 12:28:27 -0400
commit546fbdc0b8bff126066778ef789e00ddb47dfd49 (patch)
tree87f0075593b7e16d1832cfc5d0c5d85548191d7e
parent2b0d1855464469853dbb1d09182a3c4bea6dd198 (diff)
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.
-rw-r--r--src/plugins/splash/details/plugin.c12
-rw-r--r--src/plugins/splash/fade-in/plugin.c2
-rw-r--r--src/plugins/splash/glow/plugin.c2
-rw-r--r--src/plugins/splash/pulser/plugin.c2
-rw-r--r--src/plugins/splash/solar/plugin.c1
-rw-r--r--src/plugins/splash/spinfinity/plugin.c2
-rw-r--r--src/plugins/splash/text/plugin.c2
7 files changed, 23 insertions, 0 deletions
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
*/