src/gtkstatusbox.c

changeset 13124
1750c1be8e81
parent 13123
69686b86e79e
child 13125
c5dab3b004ab
--- a/src/gtkstatusbox.c	Sat Feb 04 21:54:55 2006 +0000
+++ b/src/gtkstatusbox.c	Sun Feb 05 18:14:43 2006 +0000
@@ -304,12 +304,13 @@
 
 /**
  * This updates the text displayed on the status box so that it shows
- * the current status.
+ * the current status.  This is the only function in this file that
+ * should modify status_box->store
  */
 static void
 gtk_gaim_status_box_refresh(GtkGaimStatusBox *status_box)
 {
-	char *text = NULL, *title;
+	char *primary, *secondary, *text;
 	char aa_color[8];
 	GdkPixbuf *pixbuf;
 	GtkTreePath *path;
@@ -326,50 +327,83 @@
 
 	saved_status = gaim_savedstatus_get_current();
 
-	title = g_markup_escape_text(gaim_savedstatus_get_title(saved_status), -1);
+	/* Determine the primary text, secondary text, and pixbuf to use */
+	if (status_box->typing != 0)
+	{
+		GtkTreeIter iter;
+		GtkGaimStatusBoxItemType type;
+		gpointer data;
+
+		/* Primary (get the status selected in the dropdown) */
+		gtk_combo_box_get_active_iter(GTK_COMBO_BOX(status_box), &iter);
+		gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter,
+						   TYPE_COLUMN, &type,
+						   DATA_COLUMN, &data,
+						   -1);
+		if (type == GTK_GAIM_STATUS_BOX_TYPE_PRIMITIVE)
+			primary = g_strdup(gaim_primitive_get_name_from_type((GaimStatusPrimitive)GPOINTER_TO_INT(data)));
+		else if (gaim_savedstatus_is_transient(saved_status))
+			primary = g_strdup(gaim_primitive_get_name_from_type(gaim_savedstatus_get_type(saved_status)));
+		else
+			primary = g_markup_escape_text(gaim_savedstatus_get_title(saved_status), -1);
+
+		secondary = g_strdup(_("Typing"));
+		pixbuf = status_box->typing_pixbufs[status_box->typing_index];
+	}
+	else if (status_box->connecting)
+	{
+		/* Primary */
+		if (gaim_savedstatus_is_transient(saved_status))
+			primary = g_strdup(gaim_primitive_get_name_from_type(gaim_savedstatus_get_type(saved_status)));
+		else
+			primary = g_markup_escape_text(gaim_savedstatus_get_title(saved_status), -1);
 
-	if (status_box->typing) {
-		text = g_strdup(_("Typing"));
-	} else if (status_box->connecting) {
-		text = g_strdup(_("Connecting"));
-	} else if (!gaim_savedstatus_is_transient(saved_status)) {
-		const gchar *message;
-		message = gaim_savedstatus_get_message(saved_status);
-		if (message != NULL)
+		secondary = g_strdup(_("Connecting"));
+		pixbuf = status_box->connecting_pixbufs[status_box->connecting_index];
+	}
+	else
+	{
+		/* Primary and secondary */
+		if (gaim_savedstatus_is_transient(saved_status))
+		{
+			primary = g_strdup(gaim_primitive_get_name_from_type(gaim_savedstatus_get_type(saved_status)));
+			secondary = NULL;
+		}
+		else
 		{
-			text = gaim_markup_strip_html(message);
-			gaim_util_chrreplace(text, '\n', ' ');
+			const gchar *message;
+			primary = g_markup_escape_text(gaim_savedstatus_get_title(saved_status), -1);
+
+			message = gaim_savedstatus_get_message(saved_status);
+			if (message != NULL)
+			{
+				secondary = gaim_markup_strip_html(message);
+				gaim_util_chrreplace(secondary, '\n', ' ');
+			}
+			else
+				secondary = NULL;
 		}
+
+		/* Pixbuf */
+		pixbuf = gaim_gtk_create_gaim_icon_with_status(
+					gaim_savedstatus_get_type(saved_status),
+					show_buddy_icons ? 1.0 : 0.5);
 	}
 
 	if (status_box->account != NULL) {
-		char *tmp = g_strdup_printf("%s\n<span size=\"smaller\">%s</span>",
+		text = g_strdup_printf("%s\n<span size=\"smaller\">%s</span>",
 						gaim_account_get_username(status_box->account),
-						text ? text : title);
-		g_free(text);
-		text = tmp;
-	} else if (text != NULL) {
+						secondary ? secondary : primary);
+	} else if (secondary != NULL) {
 		char *separator;
-		char *tmp;
 		separator = show_buddy_icons ? "\n" : " - ";
-		tmp = g_strdup_printf("%s%s<span size=\"smaller\" color=\"%s\">%s</span>",
-							  title, separator, aa_color, text);
-		g_free(text);
-		text = tmp;
+		text = g_strdup_printf("%s<span size=\"smaller\" color=\"%s\">%s%s</span>",
+							  primary, aa_color, separator, secondary);
 	} else {
-		text = g_strdup(title);
+		text = g_strdup(primary);
 	}
-	g_free(title);
-
-	/* Figure out what pixbuf to use */
-	if (status_box->connecting)
-		pixbuf = status_box->connecting_pixbufs[status_box->connecting_index];
-	else if (status_box->typing)
-		pixbuf = status_box->typing_pixbufs[status_box->typing_index];
-	else
-		pixbuf = gaim_gtk_create_gaim_icon_with_status(
-					gaim_savedstatus_get_type(saved_status),
-					show_buddy_icons ? 1.0 : 0.5);
+	g_free(primary);
+	g_free(secondary);
 
 	/*
 	 * Only two columns are used in this list store (does it
@@ -379,11 +413,13 @@
 			   ICON_COLUMN, pixbuf,
 			   TEXT_COLUMN, text,
 			   -1);
+	g_free(text);
+
+	/* Make sure to activate the only row in the tree view */
 	path = gtk_tree_path_new_from_string("0");
 	gtk_cell_view_set_displayed_row(GTK_CELL_VIEW(status_box->cell_view), path);
 	gtk_tree_path_free(path);
 
-	g_free(text);
 	update_size(status_box);
 }
 
@@ -652,7 +688,7 @@
 	return TRUE;
 }
 
-static int imhtml_remove_focus(GtkWidget *w, GdkEventKey *event, GtkGaimStatusBox *box)
+static int imhtml_remove_focus(GtkWidget *w, GdkEventKey *event, GtkGaimStatusBox *status_box)
 {
 	if (event->keyval == GDK_Tab || event->keyval == GDK_KP_Tab)
 	{
@@ -663,11 +699,11 @@
 				                  GTK_DIR_TAB_BACKWARD: GTK_DIR_TAB_FORWARD);
 		return TRUE;
 	}
-	if (!box->typing)
+	if (!status_box->typing != 0)
 		return FALSE;
-	gtk_gaim_status_box_pulse_typing(box);
-	g_source_remove(box->typing);
-	box->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, box);
+	gtk_gaim_status_box_pulse_typing(status_box);
+	g_source_remove(status_box->typing);
+	status_box->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, status_box);
 
 	return FALSE;
 }
@@ -828,8 +864,7 @@
 
 	status_box->imhtml_visible = FALSE;
 	status_box->connecting = FALSE;
-	status_box->typing = FALSE;
-	status_box->pixbuf = NULL;
+	status_box->typing = 0;
 	status_box->toggle_button = gtk_toggle_button_new();
 	status_box->hbox = gtk_hbox_new(FALSE, 6);
 	status_box->cell_view = gtk_cell_view_new();
@@ -1325,10 +1360,7 @@
 			   ICON_COLUMN, &pixbuf,
 			   DATA_COLUMN, &data,
 			   -1);
-	if (status_box->pixbuf)
-		g_object_unref(status_box->pixbuf);
-	status_box->pixbuf = pixbuf;
-	if (status_box->typing)
+	if (status_box->typing != 0)
 		g_source_remove(status_box->typing);
 	status_box->typing = 0;
 
@@ -1442,26 +1474,26 @@
 
 static void imhtml_changed_cb(GtkTextBuffer *buffer, void *data)
 {
-	GtkGaimStatusBox *box = (GtkGaimStatusBox*)data;
-	if (GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(box)))
+	GtkGaimStatusBox *status_box = (GtkGaimStatusBox*)data;
+	if (GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(status_box)))
 	{
-		if (box->typing) {
-			gtk_gaim_status_box_pulse_typing(box);
-			g_source_remove(box->typing);
+		if (status_box->typing != 0) {
+			gtk_gaim_status_box_pulse_typing(status_box);
+			g_source_remove(status_box->typing);
 		} else {
 			gint index;
 			GaimSavedStatus *saved = gaim_savedstatus_get_current();
 
-			index = get_statusbox_index(box, saved);
+			index = get_statusbox_index(status_box, saved);
 
-			gtk_widget_set_sensitive(GTK_WIDGET(box), FALSE);
-			gtk_combo_box_set_active(GTK_COMBO_BOX(box), index);
-			gtk_widget_set_sensitive(GTK_WIDGET(box), TRUE);
-			gtk_widget_grab_focus(box->imhtml);
+			gtk_widget_set_sensitive(GTK_WIDGET(status_box), FALSE);
+			gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), index);
+			gtk_widget_set_sensitive(GTK_WIDGET(status_box), TRUE);
+			gtk_widget_grab_focus(status_box->imhtml);
 		}
-		box->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, box);
+		status_box->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, status_box);
 	}
-	gtk_gaim_status_box_refresh(box);
+	gtk_gaim_status_box_refresh(status_box);
 }
 
 static void imhtml_format_changed_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, void *data)

mercurial