Mercurial > pidgin.yaz
changeset 13123:a9f6d9a68a04
[gaim-migrate @ 15485]
Fix a bug I introduced yesterday. Selecting available and away where
it waits for you to enter the message into the imhtml, the status box
would show your current status instead of "available" or "away"
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sun, 05 Feb 2006 18:14:43 +0000 |
parents | d33a225fcb80 |
children | a0cdde3b06cf |
files | src/gtkstatusbox.c src/gtkstatusbox.h |
diffstat | 2 files changed, 92 insertions(+), 62 deletions(-) [+] |
line wrap: on
line diff
--- 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)
--- a/src/gtkstatusbox.h Sat Feb 04 21:54:55 2006 +0000 +++ b/src/gtkstatusbox.h Sun Feb 05 18:14:43 2006 +0000 @@ -96,11 +96,9 @@ GdkPixbuf *typing_pixbufs[4]; gboolean connecting; - gboolean typing; - + guint typing; GtkTreeIter iter; - GdkPixbuf *pixbuf; char *error; gulong status_changed_signal;