Default CSS file NULL
[rodin/chimara.git] / libchimara / chimara-glk.c
index 4f1d39102dd9db62754eb4ecc30a6bfe5a8f3b6c..c7d0c52c91c9ff7710eee3af82e846708f0371d0 100644 (file)
@@ -85,9 +85,10 @@ chimara_glk_init(ChimaraGlk *self)
     priv->protect = FALSE;
        priv->default_font_desc = pango_font_description_from_string("Serif");
        priv->monospace_font_desc = pango_font_description_from_string("Monospace");
-       priv->css_file = "style.css";
+       priv->css_file = NULL;
        priv->default_styles = g_new0(StyleSet,1);
        priv->current_styles = g_new0(StyleSet,1);
+       priv->pager_attr_list = pango_attr_list_new();
        priv->style_initialized = FALSE;
        priv->final_message = g_strdup("[ The game has finished ]");
        priv->running = FALSE;
@@ -107,10 +108,11 @@ chimara_glk_init(ChimaraGlk *self)
        priv->ignore_next_arrange_event = FALSE;
        priv->char_input_queue = g_async_queue_new();
        priv->line_input_queue = g_async_queue_new();
+       /* Should be g_async_queue_new_full(g_free); but only in GTK >= 2.16 */
        priv->resource_lock = g_mutex_new();
        priv->resource_loaded = g_cond_new();
        priv->resource_info_available = g_cond_new();
-       /* Should be g_async_queue_new_full(g_free); but only in GTK >= 2.16 */
+       priv->image_cache = NULL;
        priv->interrupt_handler = NULL;
     priv->root_window = NULL;
     priv->fileref_list = NULL;
@@ -190,6 +192,7 @@ chimara_glk_finalize(GObject *object)
        g_hash_table_destroy(priv->default_styles->text_grid);
        g_hash_table_destroy(priv->current_styles->text_buffer);
        g_hash_table_destroy(priv->current_styles->text_grid);
+       pango_attr_list_unref(priv->pager_attr_list);
        priv->style_initialized = FALSE;
        
     /* Free the event queue */
@@ -223,6 +226,8 @@ chimara_glk_finalize(GObject *object)
        g_cond_free(priv->resource_info_available);
        g_mutex_unlock(priv->resource_lock);
        g_mutex_free(priv->resource_lock);
+       g_slist_foreach(priv->image_cache, (GFunc)clear_image_cache, NULL);
+       g_slist_free(priv->image_cache);
        /* Unref input queues (this should destroy them since any Glk thread has stopped by now */
        g_async_queue_unref(priv->char_input_queue);
        g_async_queue_unref(priv->line_input_queue);
@@ -574,11 +579,6 @@ chimara_glk_stopped(ChimaraGlk *self)
 {
     CHIMARA_GLK_USE_PRIVATE(self, priv);
     priv->running = FALSE;
-
-    /* Free the plugin */
-       if( priv->program && !g_module_close(priv->program) )
-           g_warning( "Error closing module: %s", g_module_error() );
-       priv->program = NULL;
 }
 
 static void
@@ -612,9 +612,16 @@ chimara_glk_text_buffer_output(ChimaraGlk *self, guint window_rock, gchar *text)
        /* Default signal handler */
 }
 
-/* G_PARAM_STATIC_STRINGS only appeared in GTK 2.13.0 */
+/* COMPAT: G_PARAM_STATIC_STRINGS only appeared in GTK 2.13.0 */
 #ifndef G_PARAM_STATIC_STRINGS
+
+/* COMPAT: G_PARAM_STATIC_NAME and friends only appeared in GTK 2.8 */
+#if GTK_CHECK_VERSION(2,8,0)
 #define G_PARAM_STATIC_STRINGS (G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)
+#else
+#define G_PARAM_STATIC_STRINGS (0)
+#endif
+
 #endif
 
 static void
@@ -837,6 +844,7 @@ chimara_glk_set_interactive(ChimaraGlk *glk, gboolean interactive)
     
     ChimaraGlkPrivate *priv = CHIMARA_GLK_PRIVATE(glk);
     priv->interactive = interactive;
+    g_object_notify(G_OBJECT(glk), "interactive");
 }
 
 /**
@@ -873,6 +881,7 @@ chimara_glk_set_protect(ChimaraGlk *glk, gboolean protect)
     
     ChimaraGlkPrivate *priv = CHIMARA_GLK_PRIVATE(glk);
     priv->protect = protect;
+    g_object_notify(G_OBJECT(glk), "protect");
 }
 
 /**
@@ -910,7 +919,7 @@ chimara_glk_set_default_font_description(ChimaraGlk *glk, PangoFontDescription *
        ChimaraGlkPrivate *priv = CHIMARA_GLK_PRIVATE(glk);
        pango_font_description_free(priv->default_font_desc);
        priv->default_font_desc = pango_font_description_copy(font);
-       
+       g_object_notify(G_OBJECT(glk), "default-font-description");
        /* TODO: Apply the font description to all the windows and recalculate the sizes */
 }
 
@@ -938,6 +947,7 @@ chimara_glk_set_default_font_string(ChimaraGlk *glk, const gchar *font)
        ChimaraGlkPrivate *priv = CHIMARA_GLK_PRIVATE(glk);
        pango_font_description_free(priv->default_font_desc);
        priv->default_font_desc = fontdesc;
+       g_object_notify(G_OBJECT(glk), "default-font-description");
        
        /* TODO: Apply the font description to all the windows and recalculate the sizes */
 }
@@ -977,6 +987,7 @@ chimara_glk_set_monospace_font_description(ChimaraGlk *glk, PangoFontDescription
        ChimaraGlkPrivate *priv = CHIMARA_GLK_PRIVATE(glk);
        pango_font_description_free(priv->monospace_font_desc);
        priv->monospace_font_desc = pango_font_description_copy(font);
+       g_object_notify(G_OBJECT(glk), "monospace-font-description");
        
        /* TODO: Apply the font description to all the windows and recalculate the sizes */
 }
@@ -1005,6 +1016,7 @@ chimara_glk_set_monospace_font_string(ChimaraGlk *glk, const gchar *font)
        ChimaraGlkPrivate *priv = CHIMARA_GLK_PRIVATE(glk);
        pango_font_description_free(priv->monospace_font_desc);
        priv->monospace_font_desc = fontdesc;
+       g_object_notify(G_OBJECT(glk), "monospace-font-description");
        
        /* TODO: Apply the font description to all the windows and recalculate the sizes */
 }
@@ -1042,6 +1054,7 @@ chimara_glk_set_spacing(ChimaraGlk *glk, guint spacing)
        
        ChimaraGlkPrivate *priv = CHIMARA_GLK_PRIVATE(glk);
        priv->spacing = spacing;
+       g_object_notify(G_OBJECT(glk), "spacing");
 }
 
 /**
@@ -1096,7 +1109,9 @@ glk_enter(struct StartupData *startup)
        
        /* Run main function */
        glk_main_t glk_main = startup->glk_main;
-       g_slice_free(struct StartupData, startup);
+       
+       /* COMPAT: avoid usage of slices */
+       g_free(startup);
     g_signal_emit_by_name(startup->glk_data->self, "started");
        glk_main();
        glk_exit(); /* Run shutdown code in glk_exit() even if glk_main() returns normally */
@@ -1135,10 +1150,16 @@ chimara_glk_run(ChimaraGlk *glk, const gchar *plugin, int argc, char *argv[], GE
        }
     
     ChimaraGlkPrivate *priv = CHIMARA_GLK_PRIVATE(glk);
-       struct StartupData *startup = g_slice_new0(struct StartupData);
+
+       /* COMPAT: avoid usage of slices */
+       struct StartupData *startup = g_new0(struct StartupData,1);
        
-    /* Open the module to run */
     g_assert( g_module_supported() );
+       /* If there is already a module loaded, free it first -- you see, we want to
+        * keep modules loaded as long as possible to avoid crashes in stack unwinding */
+       if( priv->program && !g_module_close(priv->program) )
+               g_warning( "Error closing module :%s", g_module_error() );
+       /* Open the module to run */
     priv->program = g_module_open(plugin, G_MODULE_BIND_LAZY);
     
     if(!priv->program)