Mercurial > pidgin
changeset 13090:0aa231ebbfd5
[gaim-migrate @ 15452]
Changes to some pixbuf stuff.
I added a 'gaim_gtk_create_gaim_icon_with_status()' function to util.c,
and changed 'gaim_gtk_create_prpl_icon_with_status()' to accept a scale
factor because almost everywhere this function was used we would scale
the pixbuf to a smaller size as soon as we got it. So there's a bit less
code duplication.
Also, I think I added some g_object_unref()'s in one or two places where
it was missing.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Wed, 01 Feb 2006 22:38:34 +0000 |
parents | b553326bc468 |
children | 7aea8de78463 |
files | plugins/gevolution/add_buddy_dialog.c plugins/gevolution/gevolution.c src/gtkaccount.c src/gtkblist.c src/gtkconv.c src/gtklog.c src/gtknotify.c src/gtkpounce.c src/gtksavedstatuses.c src/gtkstatusbox.c src/gtkutils.c src/gtkutils.h |
diffstat | 12 files changed, 261 insertions(+), 248 deletions(-) [+] |
line wrap: on
line diff
--- a/plugins/gevolution/add_buddy_dialog.c Wed Feb 01 06:07:53 2006 +0000 +++ b/plugins/gevolution/add_buddy_dialog.c Wed Feb 01 22:38:34 2006 +0000 @@ -163,7 +163,7 @@ GaimAccount *account = NULL; GList *l; GtkTreeIter iter; - GdkPixbuf *pixbuf, *icon = NULL; + GdkPixbuf *pixbuf; if (list == NULL) return; @@ -183,11 +183,7 @@ if (account == NULL) return; - pixbuf = gaim_gtk_create_prpl_icon(account); - - if (pixbuf != NULL) - icon = gdk_pixbuf_scale_simple(pixbuf, 16, 16, - GDK_INTERP_BILINEAR); + pixbuf = gaim_gtk_create_prpl_icon(account, 0.5); for (l = list; l != NULL; l = l->next) { @@ -203,7 +199,7 @@ gtk_list_store_set(dialog->model, &iter, COLUMN_NAME, name, - COLUMN_PRPL_ICON, icon, + COLUMN_PRPL_ICON, pixbuf, COLUMN_USERNAME, account_name, COLUMN_DATA, contact, -1); @@ -223,8 +219,8 @@ } } - if (pixbuf != NULL) g_object_unref(G_OBJECT(pixbuf)); - if (icon != NULL) g_object_unref(G_OBJECT(icon)); + if (pixbuf != NULL) + g_object_unref(G_OBJECT(pixbuf)); g_list_foreach(list, (GFunc)g_free, NULL); g_list_free(list); @@ -611,19 +607,16 @@ EContact *contact, const char *name, GaimAccount *account, const char *screenname) { - GdkPixbuf *pixbuf, *icon = NULL; + GdkPixbuf *pixbuf; GtkTreeIter iter; - pixbuf = gaim_gtk_create_prpl_icon(account); - - if (pixbuf != NULL) - icon = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR); + pixbuf = gaim_gtk_create_prpl_icon(account, 0.5); gtk_list_store_append(dialog->model, &iter); gtk_list_store_set(dialog->model, &iter, COLUMN_NAME, name, - COLUMN_PRPL_ICON, icon, + COLUMN_PRPL_ICON, pixbuf, COLUMN_DATA, contact, COLUMN_USERNAME, screenname, -1); @@ -631,6 +624,6 @@ if (contact != NULL) dialog->contacts = g_list_append(dialog->contacts, contact); - if (pixbuf != NULL) g_object_unref(G_OBJECT(pixbuf)); - if (icon != NULL) g_object_unref(G_OBJECT(icon)); + if (pixbuf != NULL) + g_object_unref(G_OBJECT(pixbuf)); }
--- a/plugins/gevolution/gevolution.c Wed Feb 01 06:07:53 2006 +0000 +++ b/plugins/gevolution/gevolution.c Wed Feb 01 22:38:34 2006 +0000 @@ -405,7 +405,7 @@ GtkWidget *treeview; GtkTreeViewColumn *column; GtkCellRenderer *renderer; - GdkPixbuf *pixbuf, *scale = NULL; + GdkPixbuf *pixbuf; GtkListStore *model; GList *l; @@ -483,29 +483,22 @@ gtk_list_store_append(model, &iter); - pixbuf = gaim_gtk_create_prpl_icon(account); - - if (pixbuf != NULL) - { - scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, - GDK_INTERP_BILINEAR); - - if (!gaim_account_is_connected(account)) - gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.0, FALSE); - } + pixbuf = gaim_gtk_create_prpl_icon(account, 0.5); + if ((pixbuf != NULL) && (!gaim_account_is_connected(account))) + gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE); gtk_list_store_set(model, &iter, COLUMN_AUTOADD, gaim_account_get_bool(account, "gevo-autoadd", FALSE), - COLUMN_ICON, scale, + COLUMN_ICON, pixbuf, COLUMN_SCREENNAME, gaim_account_get_username(account), COLUMN_DATA, account, -1); - if (pixbuf != NULL) g_object_unref(G_OBJECT(pixbuf)); - if (scale != NULL) g_object_unref(G_OBJECT(scale)); + if (pixbuf != NULL) + g_object_unref(G_OBJECT(pixbuf)); } gtk_widget_show_all(ret);
--- a/src/gtkaccount.c Wed Feb 01 06:07:53 2006 +0000 +++ b/src/gtkaccount.c Wed Feb 01 22:38:34 2006 +0000 @@ -1828,7 +1828,7 @@ GaimGtkPulseData *pulse_data; GtkTreeModel *model; GtkTreeIter iter; - GdkPixbuf *pixbuf, *scale = NULL; + GdkPixbuf *pixbuf; size_t index; /* Don't need to do anything if the accounts window is not visible */ @@ -1854,24 +1854,18 @@ g_free(pulse_data); } - pixbuf = gaim_gtk_create_prpl_icon(account); + pixbuf = gaim_gtk_create_prpl_icon(account, 0.5); + if ((pixbuf != NULL) && gaim_account_is_disconnected(account)) + gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE); + + gtk_list_store_set(accounts_window->model, &iter, + COLUMN_ICON, pixbuf, + COLUMN_PULSE_DATA, NULL, + -1); + if (pixbuf != NULL) - { - scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, - GDK_INTERP_BILINEAR); - - if (gaim_account_is_disconnected(account)) - gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.0, FALSE); - } - gtk_list_store_set(accounts_window->model, &iter, - COLUMN_ICON, scale, - COLUMN_PULSE_DATA, NULL, - -1); - - - if (pixbuf != NULL) g_object_unref(G_OBJECT(pixbuf)); - if (scale != NULL) g_object_unref(G_OBJECT(scale)); + g_object_unref(G_OBJECT(pixbuf)); } } @@ -2259,30 +2253,21 @@ set_account(GtkListStore *store, GtkTreeIter *iter, GaimAccount *account) { GdkPixbuf *pixbuf; - GdkPixbuf *scale; - - scale = NULL; - - pixbuf = gaim_gtk_create_prpl_icon(account); - - if (pixbuf != NULL) - { - scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR); - - if (gaim_account_is_disconnected(account)) - gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.0, FALSE); - } + + pixbuf = gaim_gtk_create_prpl_icon(account, 0.5); + if ((pixbuf != NULL) && gaim_account_is_disconnected(account)) + gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE); gtk_list_store_set(store, iter, - COLUMN_ICON, scale, + COLUMN_ICON, pixbuf, COLUMN_SCREENNAME, gaim_account_get_username(account), COLUMN_ENABLED, gaim_account_get_enabled(account, GAIM_GTK_UI), COLUMN_PROTOCOL, gaim_account_get_protocol_name(account), COLUMN_DATA, account, -1); - if (pixbuf != NULL) g_object_unref(G_OBJECT(pixbuf)); - if (scale != NULL) g_object_unref(G_OBJECT(scale)); + if (pixbuf != NULL) + g_object_unref(G_OBJECT(pixbuf)); } static void
--- a/src/gtkblist.c Wed Feb 01 06:07:53 2006 +0000 +++ b/src/gtkblist.c Wed Feb 01 22:38:34 2006 +0000 @@ -3492,9 +3492,10 @@ gpointer user_data) { GaimAccount *account; - gchar *escaped, *text, *filename; + GaimStatusType *status_type; + gchar *escaped, *text; GtkWidget *button, *label, *image, *hbox; - GdkPixbuf *pixbuf, *emblem, *scale; + GdkPixbuf *pixbuf; account = key; escaped = g_markup_escape_text((const gchar *)value, -1); @@ -3506,32 +3507,12 @@ hbox = gtk_hbox_new(FALSE, 0); /* Create the icon */ - filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", "offline.png", NULL); - pixbuf = gdk_pixbuf_new_from_file(filename, NULL); - g_free(filename); + status_type = gaim_account_get_status_type_with_primitive(account, + GAIM_STATUS_OFFLINE); + pixbuf = gaim_gtk_create_prpl_icon_with_status(account, status_type, 0.5); if (pixbuf != NULL) { - scale = gdk_pixbuf_scale_simple(pixbuf, 10, 10, - GDK_INTERP_BILINEAR); + image = gtk_image_new_from_pixbuf(pixbuf); g_object_unref(pixbuf); - emblem = scale; - scale = NULL; - - pixbuf = gaim_gtk_create_prpl_icon(account); - if (pixbuf != NULL) { - scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, - GDK_INTERP_BILINEAR); - gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.0, FALSE); - g_object_unref(G_OBJECT(pixbuf)); - - gdk_pixbuf_composite(emblem, scale, 6, 6, 10, 10, 6, 6, 1, 1, - GDK_INTERP_BILINEAR, 255); - g_object_unref(emblem); - - emblem = scale; - } - - image = gtk_image_new_from_pixbuf(emblem); - g_object_unref(emblem); gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, GAIM_HIG_BOX_SPACE); @@ -5545,7 +5526,7 @@ GaimConnection *gc = NULL; GaimAccount *account = NULL; GaimStatus *status = NULL; - GdkPixbuf *pixbuf = NULL, *scale = NULL; + GdkPixbuf *pixbuf = NULL; account = accounts->data; @@ -5555,16 +5536,14 @@ menuitem = gtk_image_menu_item_new_with_label(buf); g_free(buf); status = gaim_account_get_active_status(account); - pixbuf = gaim_gtk_create_prpl_icon_with_status(account, gaim_status_get_type(status)); - if (pixbuf) { - scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, - GDK_INTERP_BILINEAR); + pixbuf = gaim_gtk_create_prpl_icon_with_status(account, gaim_status_get_type(status), 0.5); + if (pixbuf != NULL) + { if (!gaim_account_is_connected(account)) - gdk_pixbuf_saturate_and_pixelate(scale, scale, + gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE); - image = gtk_image_new_from_pixbuf(scale); + image = gtk_image_new_from_pixbuf(pixbuf); g_object_unref(G_OBJECT(pixbuf)); - g_object_unref(G_OBJECT(scale)); gtk_widget_show(image); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image); } @@ -5647,7 +5626,7 @@ char *buf = NULL; GtkWidget *image = NULL; GaimAccount *account = NULL; - GdkPixbuf *pixbuf = NULL, *scale = NULL; + GdkPixbuf *pixbuf = NULL; account = accounts->data; @@ -5659,15 +5638,13 @@ gaim_account_get_protocol_name(account), ")", NULL); menuitem = gtk_image_menu_item_new_with_label(buf); g_free(buf); - pixbuf = gaim_gtk_create_prpl_icon(account); - if (pixbuf) { - scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, - GDK_INTERP_BILINEAR); - if (gaim_account_is_disconnected(account)) - gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.00, FALSE); - image = gtk_image_new_from_pixbuf(scale); + pixbuf = gaim_gtk_create_prpl_icon(account, 0.5); + if (pixbuf != NULL) + { + if (!gaim_account_is_connected(account)) + gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE); + image = gtk_image_new_from_pixbuf(pixbuf); g_object_unref(G_OBJECT(pixbuf)); - g_object_unref(G_OBJECT(scale)); gtk_widget_show(image); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image); }
--- a/src/gtkconv.c Wed Feb 01 06:07:53 2006 +0000 +++ b/src/gtkconv.c Wed Feb 01 22:38:34 2006 +0000 @@ -2220,6 +2220,7 @@ g_return_val_if_fail(account != NULL, NULL); g_return_val_if_fail(name != NULL, NULL); + /* Use the buddy icon, if possible */ if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) { GaimBuddy *b = gaim_find_buddy(account, name); if (b != NULL) { @@ -2228,19 +2229,10 @@ } } - if (!status) { - GdkPixbuf *pixbuf; - pixbuf = gaim_gtk_create_prpl_icon(account); - - if (small_icon && pixbuf != NULL) - { - status = gdk_pixbuf_scale_simple(pixbuf, 15, 15, - GDK_INTERP_BILINEAR); - g_object_unref(pixbuf); - } - else - status = pixbuf; - } + /* If they don't have a buddy icon, then use the PRPL icon */ + if (status == NULL) + status = gaim_gtk_create_prpl_icon(account, small_icon ? 0.5 : 1.0); + return status; } @@ -3036,25 +3028,19 @@ if (buddy != NULL) pixbuf = gaim_gtk_blist_get_status_icon((GaimBlistNode*)buddy, GAIM_STATUS_ICON_SMALL); else - { - GdkPixbuf *unscaled = gaim_gtk_create_prpl_icon(account); - - /* XXX: 15 is the size for GAIM_STATUS_ICON_SMALL in gtkblist.c */ - pixbuf = gdk_pixbuf_scale_simple(unscaled, 15, 15, - GDK_INTERP_BILINEAR); - g_object_unref(G_OBJECT(unscaled)); - } + pixbuf = gaim_gtk_create_prpl_icon(account, 0.5); /* Now convert it to GtkImage */ if (pixbuf == NULL) image = gtk_image_new(); else + { image = gtk_image_new_from_pixbuf(pixbuf); + g_object_unref(G_OBJECT(pixbuf)); + } gtk_size_group_add_widget(sg, image); - g_object_unref(G_OBJECT(pixbuf)); - /* Make our menu item */ text = g_strdup_printf("%s (%s)", name, gaim_account_get_username(account)); menuitem = gtk_radio_menu_item_new_with_label(*group, text); @@ -5542,7 +5528,7 @@ win = gaim_gtkconv_get_window(gtkconv); if (!win) return; - + if (fields & GAIM_GTKCONV_SET_TITLE) { gaim_conversation_autoset_title(conv);
--- a/src/gtklog.c Wed Feb 01 06:07:53 2006 +0000 +++ b/src/gtklog.c Wed Feb 01 22:38:34 2006 +0000 @@ -501,7 +501,7 @@ } display_log_viewer(ht, gaim_log_get_logs(type, screenname, account), - title, gaim_gtk_create_prpl_icon(account), gaim_log_get_total_size(type, screenname, account)); + title, gaim_gtk_create_prpl_icon(account, 0.5), gaim_log_get_total_size(type, screenname, account)); g_free(title); }
--- a/src/gtknotify.c Wed Feb 01 06:07:53 2006 +0000 +++ b/src/gtknotify.c Wed Feb 01 22:38:34 2006 +0000 @@ -392,7 +392,7 @@ gtk_tree_view_column_pack_start(column, rend, TRUE); gtk_tree_view_column_set_attributes(column, rend, "markup", GAIM_MAIL_SUBJECT, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(mail_dialog->treeview), column); - + gtk_container_add(GTK_CONTAINER(sw), mail_dialog->treeview); label = gtk_label_new(NULL); @@ -410,7 +410,7 @@ while (count--) { char *from_text = NULL, *subject_text = NULL; - GdkPixbuf *pixbuf, *scale = NULL; + GdkPixbuf *pixbuf; if (froms != NULL) from_text = g_markup_escape_text(*froms, -1); @@ -421,22 +421,18 @@ data = g_new0(GaimNotifyMailData, 1); data->url = g_strdup(*urls); - pixbuf = gaim_gtk_create_prpl_icon(account); - if (pixbuf != NULL) - { - scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, - GDK_INTERP_BILINEAR); - g_object_unref(pixbuf); - } + pixbuf = gaim_gtk_create_prpl_icon(account, 0.5); gtk_tree_store_append(mail_dialog->treemodel, &iter, NULL); gtk_tree_store_set(mail_dialog->treemodel, &iter, - GAIM_MAIL_ICON, scale, + GAIM_MAIL_ICON, pixbuf, GAIM_MAIL_TO, *tos, GAIM_MAIL_FROM, from_text, GAIM_MAIL_SUBJECT, subject_text, GAIM_MAIL_DATA, data, -1); + if (pixbuf != NULL) + g_object_unref(pixbuf); data->iter = iter; urls++; froms++; @@ -581,15 +577,14 @@ GaimNotifySearchResultsData *data = data_; GtkListStore *model = data->model; GtkTreeIter iter; - GdkPixbuf *icon, *scaled; + GdkPixbuf *pixbuf; guint col_num; guint i; guint j; - + gtk_list_store_clear(data->model); - icon = gaim_gtk_create_prpl_icon(gaim_connection_get_account(gc)); - scaled = gdk_pixbuf_scale_simple(icon, 16, 16, GDK_INTERP_BILINEAR); + pixbuf = gaim_gtk_create_prpl_icon(gaim_connection_get_account(gc), 0.5); /* +1 is for the automagically created Status column. */ col_num = gaim_notify_searchresults_get_columns_count(results) + 1; @@ -598,7 +593,7 @@ GList *row = gaim_notify_searchresults_row_get(results, i); gtk_list_store_append(model, &iter); - gtk_list_store_set(model, &iter, 0, scaled, -1); + gtk_list_store_set(model, &iter, 0, pixbuf, -1); for (j = 1; j < col_num; j++) { GValue v; @@ -611,6 +606,9 @@ g_free(escaped); } } + + if (pixbuf != NULL) + g_object_unref(pixbuf); } static void *
--- a/src/gtkpounce.c Wed Feb 01 06:07:53 2006 +0000 +++ b/src/gtkpounce.c Wed Feb 01 22:38:34 2006 +0000 @@ -185,7 +185,7 @@ gboolean recurring; const char *pouncer; const char *pouncee; - GdkPixbuf *pixbuf, *scale = NULL; + GdkPixbuf *pixbuf; account = gaim_pounce_get_pouncer(pounce); @@ -194,11 +194,7 @@ events = gaim_pounce_get_events(pounce); - pixbuf = gaim_gtk_create_prpl_icon(account); - - if (pixbuf != NULL) - scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, - GDK_INTERP_BILINEAR); + pixbuf = gaim_gtk_create_prpl_icon(account, 0.5); pouncer = gaim_account_get_username(account); pouncee = gaim_pounce_get_pouncee(pounce); @@ -207,11 +203,14 @@ gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, POUNCES_MANAGER_COLUMN_POUNCE, pounce, - POUNCES_MANAGER_COLUMN_ICON, scale, + POUNCES_MANAGER_COLUMN_ICON, pixbuf, POUNCES_MANAGER_COLUMN_TARGET, pouncee, POUNCES_MANAGER_COLUMN_ACCOUNT, pouncer, POUNCES_MANAGER_COLUMN_RECURRING, recurring, -1); + + if (pixbuf != NULL) + g_object_unref(pixbuf); } static void
--- a/src/gtksavedstatuses.c Wed Feb 01 06:07:53 2006 +0000 +++ b/src/gtksavedstatuses.c Wed Feb 01 22:38:34 2006 +0000 @@ -921,19 +921,12 @@ GtkTreeIter *iter, GaimSavedStatusSub *substatus) { GdkPixbuf *pixbuf; - GdkPixbuf *scale; const char *id = NULL, *name = NULL, *message = NULL; - scale = NULL; - - pixbuf = gaim_gtk_create_prpl_icon(account); - - if (pixbuf != NULL) + pixbuf = gaim_gtk_create_prpl_icon(account, 0.5); + if ((pixbuf != NULL) && !gaim_account_is_connected(account)) { - scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR); - - if (gaim_account_is_disconnected(account)) - gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.0, FALSE); + gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE); } if (substatus != NULL) @@ -950,15 +943,15 @@ gtk_list_store_set(store, iter, STATUS_EDITOR_COLUMN_ACCOUNT, account, STATUS_EDITOR_COLUMN_ENABLE_SUBSTATUS, (substatus != NULL), - STATUS_EDITOR_COLUMN_ICON, scale, + STATUS_EDITOR_COLUMN_ICON, pixbuf, STATUS_EDITOR_COLUMN_SCREENNAME, gaim_account_get_username(account), STATUS_EDITOR_COLUMN_STATUS_ID, id, STATUS_EDITOR_COLUMN_STATUS_NAME, name, STATUS_EDITOR_COLUMN_STATUS_MESSAGE, message, -1); - if (pixbuf != NULL) g_object_unref(G_OBJECT(pixbuf)); - if (scale != NULL) g_object_unref(G_OBJECT(scale)); + if (pixbuf != NULL) + g_object_unref(G_OBJECT(pixbuf)); } static void @@ -1459,7 +1452,7 @@ for (list = gaim_account_get_status_types(account); list; list = list->next) { GaimStatusType *status_type; - GdkPixbuf *pixbuf, *scale = NULL; + GdkPixbuf *pixbuf; const char *id, *name; status_type = list->data; @@ -1469,18 +1462,18 @@ continue; id = gaim_status_type_get_id(status_type); - pixbuf = gaim_gtk_create_prpl_icon_with_status(account, status_type); - if (pixbuf != NULL) - scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR); + pixbuf = gaim_gtk_create_prpl_icon_with_status(account, status_type, 0.5); name = gaim_status_type_get_name(status_type); gtk_list_store_append(dialog->model, &iter); gtk_list_store_set(dialog->model, &iter, SUBSTATUS_COLUMN_ACCOUNT, account, - SUBSTATUS_COLUMN_ICON, scale, + SUBSTATUS_COLUMN_ICON, pixbuf, SUBSTATUS_COLUMN_STATUS_ID, id, SUBSTATUS_COLUMN_STATUS_NAME, name, -1); + if (pixbuf != NULL) + g_object_unref(pixbuf); if (id && !strcmp(id, gaim_status_type_get_id(status_type))) { gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combo), &iter);
--- a/src/gtkstatusbox.c Wed Feb 01 06:07:53 2006 +0000 +++ b/src/gtkstatusbox.c Wed Feb 01 22:38:34 2006 +0000 @@ -488,9 +488,9 @@ static void add_popular_statuses(GtkGaimStatusBox *statusbox) { + gboolean show_buddy_icons; GList *list, *cur; GtkIconSize icon_size; - const GdkPixbuf *orig; GdkPixbuf *pixbuf, *emblem; int width, height; @@ -499,27 +499,12 @@ /* Odd... oh well, nothing we can do about it. */ return; - if (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) + show_buddy_icons = gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons"); + if (show_buddy_icons) icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS); else icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS_SMALL); - /* Create the icon to use for non-transient saved-statuses */ - orig = gtk_widget_render_icon(GTK_WIDGET(statusbox->vbox), - GAIM_STOCK_STATUS_ONLINE, icon_size, "GtkGaimStatusBox"); - pixbuf = gdk_pixbuf_copy(orig); - g_object_unref(G_OBJECT(orig)); - - emblem = gtk_widget_render_icon(GTK_WIDGET(statusbox->vbox), - GTK_STOCK_SAVE, icon_size, "GtkGaimStatusBox"); - width = gdk_pixbuf_get_width(pixbuf) / 2; - height = gdk_pixbuf_get_height(pixbuf) / 2; - - gdk_pixbuf_composite(emblem, pixbuf, width, height, - width, height, width, height, - 0.5, 0.5, GDK_INTERP_BILINEAR, 255); - g_object_unref(G_OBJECT(emblem)); - gtk_gaim_status_box_add_separator(statusbox); for (cur = list; cur != NULL; cur = cur->next) @@ -528,7 +513,9 @@ const gchar *message; gchar *stripped; - /* TODO: For transient saved-statuses, make a new icon showing the primitive */ + /* Get an appropriate status icon */ + pixbuf = gaim_gtk_create_gaim_icon_with_status(gaim_savedstatus_get_type(saved), + show_buddy_icons ? 1.0 : 0.5); if (gaim_savedstatus_is_transient(saved)) { @@ -544,11 +531,27 @@ message = gaim_savedstatus_get_message(saved); stripped = gaim_markup_strip_html(message); gaim_util_chrreplace(stripped, '\n', ' '); + + /* Overlay a disk in the bottom left corner */ + emblem = gtk_widget_render_icon(GTK_WIDGET(statusbox->vbox), + GTK_STOCK_SAVE, icon_size, "GtkGaimStatusBox"); + if (emblem != NULL) + { + width = gdk_pixbuf_get_width(pixbuf) / 2; + height = gdk_pixbuf_get_height(pixbuf) / 2; + gdk_pixbuf_composite(emblem, pixbuf, 0, height, + width, height, 0, height, + 0.5, 0.5, GDK_INTERP_BILINEAR, 255); + g_object_unref(G_OBJECT(emblem)); + } } + gtk_gaim_status_box_add(statusbox, GTK_GAIM_STATUS_BOX_TYPE_POPULAR, pixbuf, gaim_savedstatus_get_title(saved), stripped, GINT_TO_POINTER(gaim_savedstatus_get_creation_time(saved))); g_free(stripped); + if (pixbuf != NULL) + g_object_unref(G_OBJECT(pixbuf)); } g_list_free(list); @@ -557,11 +560,13 @@ static void gtk_gaim_status_box_regenerate(GtkGaimStatusBox *status_box) { + gboolean show_buddy_icons; GaimAccount *account; - GdkPixbuf *pixbuf, *pixbuf2, *pixbuf3, *pixbuf4; + GdkPixbuf *pixbuf, *pixbuf2, *pixbuf3, *pixbuf4, *tmp; GtkIconSize icon_size; - if (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) + show_buddy_icons = gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons"); + if (show_buddy_icons) icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS); else icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS_SMALL); @@ -608,11 +613,15 @@ if (!gaim_status_type_is_user_settable(status_type)) continue; + tmp = gaim_gtk_create_prpl_icon_with_status(account, status_type, + show_buddy_icons ? 1.0 : 0.5); gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), gaim_status_type_get_primitive(status_type), - gaim_gtk_create_prpl_icon_with_status(account, status_type), + tmp, gaim_status_type_get_name(status_type), NULL, NULL); + if (tmp != NULL) + g_object_unref(tmp); } update_to_reflect_account_status(status_box, account, gaim_account_get_active_status(account));
--- a/src/gtkutils.c Wed Feb 01 06:07:53 2006 +0000 +++ b/src/gtkutils.c Wed Feb 01 22:38:34 2006 +0000 @@ -57,6 +57,7 @@ #include "gtkdialogs.h" #include "gtkimhtml.h" #include "gtkimhtmltoolbar.h" +#include "gtkstock.h" #include "gtkthemes.h" #include "gtkutils.h" @@ -1543,26 +1544,26 @@ } GdkPixbuf * -gaim_gtk_create_prpl_icon(GaimAccount *account) +gaim_gtk_create_prpl_icon(GaimAccount *account, double scale_factor) { GaimPlugin *prpl; - GaimPluginProtocolInfo *prpl_info = NULL; - GdkPixbuf *status = NULL; - char *filename = NULL; + GaimPluginProtocolInfo *prpl_info; const char *protoname = NULL; char buf[256]; /* TODO: We should use a define for max file length */ + char *filename = NULL; + GdkPixbuf *pixbuf, *scaled; g_return_val_if_fail(account != NULL, NULL); prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); - - if (prpl != NULL) { - prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); + if (prpl == NULL) + return NULL; - if (prpl_info->list_icon != NULL) - protoname = prpl_info->list_icon(account, NULL); - } + prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); + if (prpl_info->list_icon == NULL) + return NULL; + protoname = prpl_info->list_icon(account, NULL); if (protoname == NULL) return NULL; @@ -1574,53 +1575,90 @@ filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", buf, NULL); - status = gdk_pixbuf_new_from_file(filename, NULL); + pixbuf = gdk_pixbuf_new_from_file(filename, NULL); g_free(filename); - return status; + scaled = gdk_pixbuf_scale_simple(pixbuf, 30*scale_factor, + 30*scale_factor, GDK_INTERP_BILINEAR); + g_object_unref(pixbuf); + + return scaled; +} + +static GdkPixbuf * +overlay_status_onto_icon(GdkPixbuf *pixbuf, GaimStatusPrimitive primitive) +{ + const char *type_name; + char basename[256]; + char *filename; + GdkPixbuf *emblem; + + type_name = gaim_primitive_get_id_from_type(primitive); + + g_snprintf(basename, sizeof(basename), "%s.png", type_name); + filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", + "default", basename, NULL); + emblem = gdk_pixbuf_new_from_file(filename, NULL); + g_free(filename); + + if (emblem != NULL) { + int width, height, emblem_width, emblem_height, new_emblem_width, new_emblem_height; + width = gdk_pixbuf_get_width(pixbuf); + height = gdk_pixbuf_get_height(pixbuf); + emblem_width = gdk_pixbuf_get_width(emblem); + emblem_height = gdk_pixbuf_get_height(emblem); + new_emblem_width = width / 2; + new_emblem_height = height / 2; + /* Overlay emblem onto the bottom right corner of pixbuf */ + gdk_pixbuf_composite(emblem, pixbuf, + width - new_emblem_width, height - new_emblem_height, + new_emblem_width, new_emblem_height, + width - new_emblem_width, height - new_emblem_height, + (double)new_emblem_width / (double)emblem_width, + (double)new_emblem_height / (double)emblem_height, + GDK_INTERP_BILINEAR, + 255); + g_object_unref(emblem); + } + + return pixbuf; } GdkPixbuf * -gaim_gtk_create_prpl_icon_with_status(GaimAccount *account, GaimStatusType *status_type) +gaim_gtk_create_prpl_icon_with_status(GaimAccount *account, GaimStatusType *status_type, double scale_factor) { - char basename2[256]; - char *filename; - const char *type_name; - GdkPixbuf *pixbuf, *scale = NULL, *emblem; + GdkPixbuf *pixbuf; + + pixbuf = gaim_gtk_create_prpl_icon(account, scale_factor); + if (pixbuf == NULL) + return NULL; - pixbuf = gaim_gtk_create_prpl_icon(account); + /* + * TODO: Let the prpl pick the emblem on a per status basis, + * and only use the primitive as a fallback? + */ - if (pixbuf != NULL) { - scale = gdk_pixbuf_scale_simple(pixbuf, 32, 32, - GDK_INTERP_BILINEAR); - g_object_unref(G_OBJECT(pixbuf)); - } else { - return NULL; - } + return overlay_status_onto_icon(pixbuf, + gaim_status_type_get_primitive(status_type)); +} - /* TODO: let the prpl pick the emblem on a per status basis, and only - * use the primitive as a fallback */ - type_name = gaim_primitive_get_id_from_type(gaim_status_type_get_primitive(status_type)); - - g_snprintf(basename2, sizeof(basename2), "%s.png", - type_name); - filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", - basename2, NULL); - emblem = gdk_pixbuf_new_from_file(filename, NULL); - g_free(filename); +GdkPixbuf * +gaim_gtk_create_gaim_icon_with_status(GaimStatusPrimitive primitive, double scale_factor) +{ + gchar *filename; + GdkPixbuf *orig, *pixbuf; - if (emblem) { - gdk_pixbuf_composite(emblem, - scale, 32-15, 32-15, - 15, 15, - 32-15, 32-15, - 1, 1, - GDK_INTERP_BILINEAR, - 255); + filename = g_build_filename(DATADIR, "pixmaps", "gaim.png", NULL); + orig = gdk_pixbuf_new_from_file(filename, NULL); + g_free(filename); + if (orig == NULL) + return NULL; - g_object_unref(emblem); - } - return scale; + pixbuf = gdk_pixbuf_scale_simple(orig, 30*scale_factor, + 30*scale_factor, GDK_INTERP_BILINEAR); + g_object_unref(G_OBJECT(orig)); + + return overlay_status_onto_icon(pixbuf, primitive); } static void
--- a/src/gtkutils.h Wed Feb 01 06:07:53 2006 +0000 +++ b/src/gtkutils.h Wed Feb 01 22:38:34 2006 +0000 @@ -355,21 +355,63 @@ * Returns the base image to represent the account, based on * the currently selected theme. * - * @param account The account. + * @param account The account. + * @param scale_factor The amount to scale to the original image. + * The default size is 30x30 pixels. A scale + * factor of 1 means no scaling will be done. + * A scale factor of 0.5 means the length + * and width will be 15 pixels each. * - * @return The icon. + * @return A newly-created pixbuf with a reference count of 1, + * or NULL if any of several error conditions occurred: + * the file could not be opened, there was no loader + * for the file's format, there was not enough memory + * to allocate the image buffer, or the image file + * contained invalid data. */ -GdkPixbuf *gaim_gtk_create_prpl_icon(GaimAccount *account); +GdkPixbuf *gaim_gtk_create_prpl_icon(GaimAccount *account, double scale_factor); /** - * Create a protocol-icon with the status emblem. + * Create a protocol icon with the status emblem overlayed in + * the lower right corner. + * + * @param account The account. + * @param status_type The status type of the emblem to overlay. + * @param scale_factor The amount to scale to the original image. + * The default size is 30x30 pixels. A scale + * factor of 1 means no scaling will be done. + * A scale factor of 0.5 means the length + * and width will be 15 pixels each. * - * @param account The account. - * @param status_type The status type to set the emblem for. + * @return A newly-created pixbuf with a reference count of 1, + * or NULL if any of several error conditions occurred: + * the file could not be opened, there was no loader + * for the file's format, there was not enough memory + * to allocate the image buffer, or the image file + * contained invalid data. + */ +GdkPixbuf *gaim_gtk_create_prpl_icon_with_status(GaimAccount *account, GaimStatusType *status_type, double scale_factor); + +/** + * Create a Gaim running-man icon with the status emblem overlayed + * in the lower right corner. * - * @return The icon. + * @param status_type The status type to set the emblem for. + * @param scale_factor The amount to scale to the original image. + * The default size is 30x30 pixels. A scale + * factor of 1 means no scaling will be done. + * A scale factor of 0.5 means the length + * and width will be 15 pixels each. + * + * @return A newly-created pixbuf with a reference count of 1, + * or NULL if any of several error conditions occurred: + * the file could not be opened, there was no loader for + * the file's format, there was not enough memory to + * allocate the image buffer, or the image file contained + * invalid data. */ -GdkPixbuf * gaim_gtk_create_prpl_icon_with_status(GaimAccount *account, GaimStatusType *status_type); +GdkPixbuf *gaim_gtk_create_gaim_icon_with_status(GaimStatusPrimitive primitve, double scale_factor); + /** * Append a GaimMenuAction to a menu.