Created open game functionality in the player. Fix #37.
[rodin/chimara.git] / libchimara / chimara-glk.c
index 0fabb3943eabe4d6823d04a07dddc15165070e8d..a00ae659b7cb9dc900871dcb156f3228e3ae1567 100644 (file)
@@ -235,8 +235,10 @@ void
 _chimara_glk_free_window_private_data(ChimaraGlkPrivate *priv)
 {
        /* Destroy the window tree */
-       trash_windows_recursive(priv, priv->root_window->data);
-       g_node_destroy(priv->root_window);
+       if(priv->root_window) {
+               trash_windows_recursive(priv, priv->root_window->data);
+               g_node_destroy(priv->root_window);
+       }
        
        /* Free the window arrangement signaling */
        g_mutex_lock(priv->arrange_lock);
@@ -244,6 +246,12 @@ _chimara_glk_free_window_private_data(ChimaraGlkPrivate *priv)
        g_mutex_unlock(priv->arrange_lock);
        g_mutex_free(priv->arrange_lock);
        priv->arrange_lock = NULL;
+
+       /* Remove the dispatch callbacks */
+       priv->register_obj = NULL;
+       priv->unregister_obj = NULL;
+       priv->register_arr = NULL;
+       priv->unregister_arr = NULL;
 }
 
 static void
@@ -1153,6 +1161,10 @@ chimara_glk_run(ChimaraGlk *glk, const gchar *plugin, int argc, char *argv[], GE
 {
     g_return_val_if_fail(glk || CHIMARA_IS_GLK(glk), FALSE);
     g_return_val_if_fail(plugin, FALSE);
+       if(chimara_glk_get_running(glk)) {
+               g_set_error(error, CHIMARA_ERROR, CHIMARA_PLUGIN_ALREADY_RUNNING, _("There was already a plugin running."));
+               return FALSE;
+       }
     
     ChimaraGlkPrivate *priv = CHIMARA_GLK_PRIVATE(glk);
        struct StartupData *startup = g_slice_new0(struct StartupData);