changeset 28976:ef1c3791ad32

merge of '1042c695d02b49cb9360bb4ef591c4ff3209c5e5' and '46f6d47a97be4bbe0262771c328eda1419d62542'
author Mark Doliner <mark@kingant.net>
date Thu, 04 Feb 2010 23:03:24 +0000
parents d73ec122554d (diff) 52fffd4cdd62 (current diff)
children e137c1fc216a 61ea136df111
files
diffstat 4 files changed, 63 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/libpurple/buddyicon.c	Thu Feb 04 22:41:02 2010 +0000
+++ b/libpurple/buddyicon.c	Thu Feb 04 23:03:24 2010 +0000
@@ -1300,6 +1300,9 @@
 	g_hash_table_destroy(pointer_icon_cache);
 	g_free(old_icons_dir);
 	g_free(cache_dir);
+
+	cache_dir = NULL;
+	old_icons_dir = NULL;
 }
 
 void purple_buddy_icon_get_scale_size(PurpleBuddyIconSpec *spec, int *width, int *height)
--- a/pidgin/gtkblist-theme-loader.c	Thu Feb 04 22:41:02 2010 +0000
+++ b/pidgin/gtkblist-theme-loader.c	Thu Feb 04 23:03:24 2010 +0000
@@ -58,6 +58,20 @@
 	return pidgin_theme_font_new(font, &color);
 }
 
+static GdkColor *
+parse_color(xmlnode *node, const char *tag)
+{
+	const char *temp = xmlnode_get_attrib(node, tag);
+	GdkColor color;
+
+	if (temp && gdk_color_parse(temp, &color)) {
+		gdk_colormap_alloc_color(gdk_colormap_get_system(), &color, FALSE, TRUE);
+		return gdk_color_copy(&color);
+	} else {
+		return NULL;
+	}
+}
+
 static PurpleTheme *
 pidgin_blist_loader_build(const gchar *dir)
 {
@@ -65,7 +79,7 @@
 	gchar *filename_full, *data = NULL;
 	const gchar *temp, *name;
 	gboolean success = TRUE;
-	GdkColor bgcolor, expanded_bgcolor, collapsed_bgcolor, contact_color;
+	GdkColor *bgcolor, *expanded_bgcolor, *collapsed_bgcolor, *contact_color;
 	PidginThemeFont *expanded, *collapsed, *contact, *online, *away, *offline, *idle, *message, *message_nick_said, *status;
 	PidginBlistLayout layout;
 	PidginBlistTheme *theme;
@@ -119,14 +133,10 @@
 		purple_debug_warning("gtkblist-theme-loader", "Missing attribute or problem with the root element\n");
 
 	if (success) {
-		if ((success = (sub_node = xmlnode_get_child(root_node, "blist")) != NULL)) {
-
-			if ((temp = xmlnode_get_attrib(sub_node, "color")) != NULL && gdk_color_parse(temp, &bgcolor))
-				gdk_colormap_alloc_color(gdk_colormap_get_system(), &bgcolor, FALSE, TRUE);
-			else
-				memset(&bgcolor, 0, sizeof(GdkColor));
-
-		} else purple_debug_warning("gtkblist-theme-loader", "Missing or problem with tags: <blist>.\n");
+		if ((success = (sub_node = xmlnode_get_child(root_node, "blist")) != NULL))
+			bgcolor = parse_color(sub_node, "color");
+		else 
+			purple_debug_warning("gtkblist-theme-loader", "Missing or problem with tags: <blist>.\n");
 	}
 
 	/* <groups> */
@@ -134,26 +144,17 @@
 		if ((success = (sub_node = xmlnode_get_child(root_node, "groups")) != NULL
 			     && (sub_sub_node = xmlnode_get_child(sub_node, "expanded")) != NULL)) {
 			expanded = pidgin_theme_font_parse(sub_sub_node);
-
-			if ((temp = xmlnode_get_attrib(sub_sub_node, "background")) != NULL && gdk_color_parse(temp, &expanded_bgcolor))
-				gdk_colormap_alloc_color(gdk_colormap_get_system(), &expanded_bgcolor, FALSE, TRUE);
-			else
-				memset(&expanded_bgcolor, 0, sizeof(GdkColor));
-
-		} else purple_debug_warning("gtkblist-theme-loader", "Missing or problem with tags: <groups> <expanded>.\n");
+			expanded_bgcolor = parse_color(sub_sub_node, "background");
+		} else
+			purple_debug_warning("gtkblist-theme-loader", "Missing or problem with tags: <groups> <expanded>.\n");
 	}
 
 	if (success) {
 		if ((success = sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "collapsed")) != NULL)) {
-
 			collapsed = pidgin_theme_font_parse(sub_sub_node);
-
-			if ((temp = xmlnode_get_attrib(sub_sub_node, "background")) != NULL && gdk_color_parse(temp, &collapsed_bgcolor))
-				gdk_colormap_alloc_color(gdk_colormap_get_system(), &collapsed_bgcolor, FALSE, TRUE);
-			else
-				memset(&collapsed_bgcolor, 0, sizeof(GdkColor));
-
-		} else purple_debug_warning("gtkblist-theme-loader", "Missing or problem with tags: <groups> <collapsed>.\n");
+			collapsed_bgcolor = parse_color(sub_sub_node, "background");
+		} else
+			purple_debug_warning("gtkblist-theme-loader", "Missing or problem with tags: <groups> <collapsed>.\n");
 	}
 
 	/* <buddys> */
@@ -172,13 +173,10 @@
 	}
 
 	if (success) {
-		if ((success = (sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "background")) != NULL))) {
-			if(gdk_color_parse(xmlnode_get_attrib(sub_sub_node, "color"), &contact_color))
-				gdk_colormap_alloc_color(gdk_colormap_get_system(), &contact_color, FALSE, TRUE);
-			else
-				memset(&contact_color, 0, sizeof(GdkColor));
-
-		} else purple_debug_warning("gtkblist-theme-loader", "Missing or problem with tags: <buddys> <background>.\n");
+		if ((success = (sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "background")) != NULL)))
+			contact_color = parse_color(sub_sub_node, "color");
+		else
+			purple_debug_warning("gtkblist-theme-loader", "Missing or problem with tags: <buddys> <background>.\n");
 	}
 
 	for (i = 0; success && lookups[i].tag; i++) {
@@ -201,13 +199,13 @@
 			"image", xmlnode_get_attrib(root_node, "image"),
 			"directory", dir,
 			"description", data,
-			"background-color", &bgcolor,
+			"background-color", bgcolor,
 			"layout", &layout,
-			"expanded-color", &expanded_bgcolor,
+			"expanded-color", expanded_bgcolor,
 			"expanded-text", expanded,
-			"collapsed-color", &collapsed_bgcolor,
+			"collapsed-color", collapsed_bgcolor,
 			"collapsed-text", collapsed,
-			"contact-color", &contact_color,
+			"contact-color", contact_color,
 			"contact", contact,
 			"online", online,
 			"away", away,
@@ -235,6 +233,15 @@
 		theme = NULL;
 	}
 
+	if (bgcolor)
+		gdk_color_free(bgcolor);
+	if (expanded_bgcolor)
+		gdk_color_free(expanded_bgcolor);
+	if (collapsed_bgcolor)
+		gdk_color_free(collapsed_bgcolor);
+	if (contact_color)
+		gdk_color_free(contact_color);
+
 	return PURPLE_THEME(theme);
 }
 
--- a/pidgin/gtkblist-theme.c	Thu Feb 04 22:41:02 2010 +0000
+++ b/pidgin/gtkblist-theme.c	Thu Feb 04 23:03:24 2010 +0000
@@ -133,7 +133,7 @@
 	copy->font  = g_strdup(pair->font);
 	strncpy(copy->color, pair->color, sizeof(copy->color) - 1);
 	if (pair->gdkcolor)
-		copy->gdkcolor = gdk_color_copy(pair->gdkcolor);
+		copy->gdkcolor = pair->gdkcolor ? gdk_color_copy(pair->gdkcolor) : NULL;
 	return copy;
 }
 
@@ -704,7 +704,7 @@
 
 	if (priv->bgcolor)
 		gdk_color_free(priv->bgcolor);
-	priv->bgcolor = gdk_color_copy(color);
+	priv->bgcolor = color ? gdk_color_copy(color) : NULL;
 }
 
 void
@@ -743,7 +743,7 @@
 
 	if (priv->expanded_color)
 		gdk_color_free(priv->expanded_color);
-	priv->expanded_color = gdk_color_copy(color);
+	priv->expanded_color = color ? gdk_color_copy(color) : NULL;
 }
 
 void
@@ -770,7 +770,7 @@
 
 	if (priv->collapsed_color)
 		gdk_color_free(priv->collapsed_color);
-	priv->collapsed_color = gdk_color_copy(color);
+	priv->collapsed_color = color ? gdk_color_copy(color) : NULL;
 }
 
 void
@@ -797,7 +797,7 @@
 
 	if (priv->contact_color)
 		gdk_color_free(priv->contact_color);
-	priv->contact_color = gdk_color_copy(color);
+	priv->contact_color = color ? gdk_color_copy(color) : NULL;
 }
 
 void
--- a/pidgin/plugins/timestamp.c	Thu Feb 04 22:41:02 2010 +0000
+++ b/pidgin/plugins/timestamp.c	Thu Feb 04 23:03:24 2010 +0000
@@ -49,25 +49,33 @@
 	const char *mdate;
 	int y, height;
 	GdkRectangle rect;
+	gboolean scrolled = FALSE;
+	GtkTextTag *tag;
 
 	/* display timestamp */
 	mdate = purple_utf8_strftime(then == 0 ? "%H:%M" : "\n%H:%M",
 		localtime(&now));
 	gtk_text_buffer_get_end_iter(buffer, &iter);
 
-	if (gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(buffer), "TIMESTAMP") == NULL)
-		gtk_text_buffer_create_tag(buffer, "TIMESTAMP",
+	/* is the view already scrolled? */
+	gtk_text_view_get_visible_rect(GTK_TEXT_VIEW(imhtml), &rect);
+	gtk_text_view_get_line_yrange(GTK_TEXT_VIEW(imhtml), &iter, &y, &height);
+	if (((y + height) - (rect.y + rect.height)) > height)
+		scrolled = TRUE;
+
+	if ((tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(buffer), "TIMESTAMP")) == NULL)
+		tag = gtk_text_buffer_create_tag(buffer, "TIMESTAMP",
 			"foreground", "#888888", "justification", GTK_JUSTIFY_CENTER,
 			"weight", PANGO_WEIGHT_BOLD, NULL);
 
-	gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, mdate,
-		strlen(mdate), "TIMESTAMP", NULL);
+	gtk_text_buffer_insert_with_tags(buffer, &iter, mdate,
+		strlen(mdate), tag, NULL);
 
 	/* scroll view if necessary */
 	gtk_text_view_get_visible_rect(GTK_TEXT_VIEW(imhtml), &rect);
 	gtk_text_view_get_line_yrange(
 		GTK_TEXT_VIEW(imhtml), &iter, &y, &height);
-	if (((y + height) - (rect.y + rect.height)) > height &&
+	if (!scrolled && ((y + height) - (rect.y + rect.height)) > height &&
 	    gtk_text_buffer_get_char_count(buffer)) {
 		gboolean smooth = purple_prefs_get_bool(
 			PIDGIN_PREFS_ROOT "/conversations/use_smooth_scrolling");