diff console/libgnt/gntbox.c @ 14389:746d535e9053

[gaim-migrate @ 17095] Completely redrawing the topmost line of a window causes the [X] to be overwritten. So now only the region of the old title will be restored. committer: Tailor Script <tailor@pidgin.im>
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Thu, 31 Aug 2006 05:58:32 +0000
parents f4af666fafe3
children d4a26ada1971
line wrap: on
line diff
--- a/console/libgnt/gntbox.c	Thu Aug 31 04:39:21 2006 +0000
+++ b/console/libgnt/gntbox.c	Thu Aug 31 05:58:32 2006 +0000
@@ -25,6 +25,32 @@
 }
 
 static void
+get_title_thingies(GntBox *box, char *title, int *p, int *r)
+{
+	GntWidget *widget = GNT_WIDGET(box);
+	int pos = g_utf8_strlen(title, -1), right;
+
+	if (pos >= widget->priv.width - 4)
+	{
+		g_utf8_strncpy(title, title, widget->priv.width - 4);
+		pos = 2;
+		right = pos + g_utf8_strlen(title, -1);
+	}
+	else
+	{
+		/* XXX: Position of the title might be configurable */
+		right = pos;
+		pos = (widget->priv.width - pos) / 2;
+		right += pos;
+	}
+
+	if (p)
+		*p = pos;
+	if (r)
+		*r = right;
+}
+
+static void
 gnt_box_draw(GntWidget *widget)
 {
 	GntBox *box = GNT_BOX(widget);
@@ -38,25 +64,10 @@
 
 	if (box->title && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER))
 	{
-		gchar *title = g_strdup(box->title);
-		int pos = g_utf8_strlen(title, -1), right;
-
-		mvwhline(widget->window, 0, 1, ACS_HLINE | COLOR_PAIR(GNT_COLOR_NORMAL),
-				widget->priv.width - 2);
-
-		if (pos >= widget->priv.width - 4)
-		{
-			g_utf8_strncpy(title, box->title, widget->priv.width - 4);
-			pos = 2;
-			right = pos + g_utf8_strlen(title, -1);
-		}
-		else
-		{
-			/* XXX: Position of the title might be configurable */
-			right = pos;
-			pos = (widget->priv.width - pos) / 2;
-			right += pos;
-		}
+		int pos, right;
+		char *title = g_strdup(box->title);
+		
+		get_title_thingies(box, title, &pos, &right);
 
 		if (gnt_widget_has_focus(widget))
 			wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_TITLE));
@@ -578,8 +589,17 @@
 
 void gnt_box_set_title(GntBox *b, const char *title)
 {
-	g_free(b->title);
+	char *prev = b->title;
+	GntWidget *w = GNT_WIDGET(b);
 	b->title = g_strdup(title);
+	if (w->window && !GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_NO_BORDER)) {
+		/* Erase the old title */
+		int pos, right;
+		get_title_thingies(b, prev, &pos, &right);
+		mvwhline(w->window, 0, pos - 1, ACS_HLINE | COLOR_PAIR(GNT_COLOR_NORMAL),
+				right - pos + 2);
+		g_free(prev);
+	}
 }
 
 void gnt_box_set_pad(GntBox *box, int pad)