# HG changeset patch # User tdrhq@soc.pidgin.im # Date 1249880629 0 # Node ID 3b1a130f7e885faa1340d22ebcbf836cc8921349 # Parent 9ad4257f5e8ff990c4cf366f1eb214b8063bb81e more changes, but I still can't find the stupid bug. Valgrind gives me some information about the uninialized bytes, but it doesn't make sense. :(x diff -r 9ad4257f5e8f -r 3b1a130f7e88 pidgin/plugins/adiumthemes/webkit.c --- a/pidgin/plugins/adiumthemes/webkit.c Mon Aug 10 03:25:35 2009 +0000 +++ b/pidgin/plugins/adiumthemes/webkit.c Mon Aug 10 05:03:49 2009 +0000 @@ -48,6 +48,10 @@ #include #include + +/* GObject data keys */ +#define MESSAGE_STYLE_KEY "message-style" + /* * I'm going to allow a different style for each PidginConversation. * This way I can do two things: 1) change the theme on the fly and not @@ -78,10 +82,17 @@ static char *cur_style_dir = NULL; static void *handle = NULL; -static PidginMessageStyle* pidgin_message_style_new () +static PidginMessageStyle* pidgin_message_style_new (const char* styledir) { PidginMessageStyle* ret = g_new0 (PidginMessageStyle, 1); + GList *iter; + + /* sanity check */ + for (iter = style_list; iter; iter = g_list_next (iter)) + g_assert (!g_str_equal (((PidginMessageStyle*)iter->data)->style_dir, styledir)); + ret->ref_counter ++; + ret->style_dir = g_strdup (styledir); style_list = g_list_append (style_list, ret); return ret; @@ -89,6 +100,8 @@ static void pidgin_message_style_unref (PidginMessageStyle *style) { + if (!style) return; + style->ref_counter--; if (style->ref_counter) return; @@ -124,8 +137,7 @@ } /* else we need to load it */ - style = pidgin_message_style_new (); - style->style_dir = g_strdup (styledir); + style = pidgin_message_style_new (styledir); /* find some variant file (or load from user's settings) */ variant_set_default (style); @@ -166,8 +178,6 @@ g_file_get_contents(file, &style->footer_html, NULL, NULL); g_free (file); - - file = g_build_filename(styledir, "Contents", "Resources", "Incoming", "Content.html", NULL); if (!g_file_get_contents(file, &style->incoming_content_html, NULL, NULL)) { pidgin_message_style_unref (style); @@ -427,7 +437,10 @@ char* basedir; char* baseuri; - PidginMessageStyle *style; + PidginMessageStyle *style, *oldStyle; + oldStyle = g_object_get_data (G_OBJECT(webkit), MESSAGE_STYLE_KEY); + if (oldStyle) return; + style = pidgin_message_style_load (style_dir); g_assert (style); @@ -437,10 +450,10 @@ footer = replace_header_tokens(style->footer_html, strlen(style->footer_html), conv); template = replace_template_tokens(style, style->template_html, strlen(style->template_html) + strlen(style->header_html), header, footer); - if (!g_object_get_data (G_OBJECT(webkit), "adium-themed")) - webkit_web_view_load_string(WEBKIT_WEB_VIEW(webkit), template, "text/html", "UTF-8", baseuri); - - g_object_set_data (G_OBJECT(webkit), "adium-themed", style); + webkit_web_view_load_string(WEBKIT_WEB_VIEW(webkit), template, "text/html", "UTF-8", baseuri); + pidgin_message_style_unref (oldStyle); + g_object_set_data (G_OBJECT(webkit), MESSAGE_STYLE_KEY, style); + g_free (basedir); g_free (baseuri); @@ -455,10 +468,11 @@ finalize_theme_for_webkit (PurpleConversation *conv) { GtkWidget *webview = PIDGIN_CONVERSATION(conv)->webview; - PidginMessageStyle *style = g_object_get_data (G_OBJECT(webview), "adium-themed"); + PidginMessageStyle *style = g_object_get_data (G_OBJECT(webview), MESSAGE_STYLE_KEY); webkit_web_view_load_string(WEBKIT_WEB_VIEW(webview), "", "text/html", "UTF-8", ""); - g_object_set_data (G_OBJECT(webview), "adium-themed", NULL); + + g_object_set_data (G_OBJECT(webview), MESSAGE_STYLE_KEY, NULL); pidgin_message_style_unref (style); } @@ -505,7 +519,7 @@ webkit = get_webkit(conv); stripped = g_strdup(message); - style = g_object_get_data (G_OBJECT (webkit), "adium-themed"); + style = g_object_get_data (G_OBJECT (webkit), MESSAGE_STYLE_KEY); if (flags & PURPLE_MESSAGE_SEND && old_flags & PURPLE_MESSAGE_SEND) { message_html = style->outgoing_next_content_html; @@ -721,9 +735,12 @@ { PidginConversation *gtkconv = PIDGIN_CONVERSATION (conv); WebKitWebView *webview = WEBKIT_WEB_VIEW (gtkconv->webview); - PidginMessageStyle *style = (PidginMessageStyle*) g_object_get_data (G_OBJECT(webview), "adium-themed"); + PidginMessageStyle *style = (PidginMessageStyle*) g_object_get_data (G_OBJECT(webview), MESSAGE_STYLE_KEY); + char *script; - char* script = g_strdup_printf ("setStylesheet(\"mainStyle\",\"%s\")", style->css_path); + g_assert (style && style->css_path); + + script = g_strdup_printf ("setStylesheet(\"mainStyle\",\"%s\")", style->css_path); webkit_web_view_execute_script (webview, script); g_free (script); } @@ -772,19 +789,19 @@ get_config_frame(PurplePlugin *plugin) { PidginMessageStyle *style = pidgin_message_style_load (cur_style_dir); - GList *themes = get_theme_files(style); - GList *theme = themes; + GList *variants = get_theme_files(style); + GList *iter = variants; char *curdir = NULL; GtkWidget *combobox = gtk_combo_box_new_text(); int def = -1, index = 0; - char* css_path = style->css_path; + char* css_path = g_strdup (style->css_path); pidgin_message_style_unref (style); - while (theme) { - char *basename = g_path_get_basename(theme->data); - char *dirname = g_path_get_dirname(theme->data); - if (!curdir || strcmp(curdir, dirname)) { + for (; iter; iter = g_list_next (iter)) { + char *basename = g_path_get_basename(iter->data); + char *dirname = g_path_get_dirname(iter->data); + if (!curdir || !g_str_equal (curdir, dirname)) { char *plist, *plist_xml; gsize plist_len; xmlnode *node; @@ -818,12 +835,15 @@ if (g_str_has_suffix (css_path, basename)) def = index; index ++; - theme = theme->next; + + g_free (basename); + g_free (dirname); } gtk_combo_box_set_active (GTK_COMBO_BOX(combobox), def); g_signal_connect (G_OBJECT(combobox), "changed", G_CALLBACK(variant_changed), NULL); + g_free (css_path); return combobox; }