comparison src/gtkutils.c @ 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 1dc109c12ef5
children 7aea8de78463
comparison
equal deleted inserted replaced
13089:b553326bc468 13090:0aa231ebbfd5
55 55
56 #include "gtkconv.h" 56 #include "gtkconv.h"
57 #include "gtkdialogs.h" 57 #include "gtkdialogs.h"
58 #include "gtkimhtml.h" 58 #include "gtkimhtml.h"
59 #include "gtkimhtmltoolbar.h" 59 #include "gtkimhtmltoolbar.h"
60 #include "gtkstock.h"
60 #include "gtkthemes.h" 61 #include "gtkthemes.h"
61 #include "gtkutils.h" 62 #include "gtkutils.h"
62 63
63 static guint accels_save_timer = 0; 64 static guint accels_save_timer = 0;
64 65
1541 if(*height > 100) 1542 if(*height > 100)
1542 *height = 100; 1543 *height = 100;
1543 } 1544 }
1544 1545
1545 GdkPixbuf * 1546 GdkPixbuf *
1546 gaim_gtk_create_prpl_icon(GaimAccount *account) 1547 gaim_gtk_create_prpl_icon(GaimAccount *account, double scale_factor)
1547 { 1548 {
1548 GaimPlugin *prpl; 1549 GaimPlugin *prpl;
1549 GaimPluginProtocolInfo *prpl_info = NULL; 1550 GaimPluginProtocolInfo *prpl_info;
1550 GdkPixbuf *status = NULL;
1551 char *filename = NULL;
1552 const char *protoname = NULL; 1551 const char *protoname = NULL;
1553 char buf[256]; /* TODO: We should use a define for max file length */ 1552 char buf[256]; /* TODO: We should use a define for max file length */
1553 char *filename = NULL;
1554 GdkPixbuf *pixbuf, *scaled;
1554 1555
1555 g_return_val_if_fail(account != NULL, NULL); 1556 g_return_val_if_fail(account != NULL, NULL);
1556 1557
1557 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); 1558 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account));
1558 1559 if (prpl == NULL)
1559 if (prpl != NULL) { 1560 return NULL;
1560 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); 1561
1561 1562 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl);
1562 if (prpl_info->list_icon != NULL) 1563 if (prpl_info->list_icon == NULL)
1563 protoname = prpl_info->list_icon(account, NULL); 1564 return NULL;
1564 } 1565
1565 1566 protoname = prpl_info->list_icon(account, NULL);
1566 if (protoname == NULL) 1567 if (protoname == NULL)
1567 return NULL; 1568 return NULL;
1568 1569
1569 /* 1570 /*
1570 * Status icons will be themeable too, and then it will look up 1571 * Status icons will be themeable too, and then it will look up
1572 */ 1573 */
1573 g_snprintf(buf, sizeof(buf), "%s.png", protoname); 1574 g_snprintf(buf, sizeof(buf), "%s.png", protoname);
1574 1575
1575 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", 1576 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status",
1576 "default", buf, NULL); 1577 "default", buf, NULL);
1577 status = gdk_pixbuf_new_from_file(filename, NULL); 1578 pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
1578 g_free(filename); 1579 g_free(filename);
1579 1580
1580 return status; 1581 scaled = gdk_pixbuf_scale_simple(pixbuf, 30*scale_factor,
1581 } 1582 30*scale_factor, GDK_INTERP_BILINEAR);
1582 1583 g_object_unref(pixbuf);
1583 GdkPixbuf * 1584
1584 gaim_gtk_create_prpl_icon_with_status(GaimAccount *account, GaimStatusType *status_type) 1585 return scaled;
1585 { 1586 }
1586 char basename2[256]; 1587
1588 static GdkPixbuf *
1589 overlay_status_onto_icon(GdkPixbuf *pixbuf, GaimStatusPrimitive primitive)
1590 {
1591 const char *type_name;
1592 char basename[256];
1587 char *filename; 1593 char *filename;
1588 const char *type_name; 1594 GdkPixbuf *emblem;
1589 GdkPixbuf *pixbuf, *scale = NULL, *emblem; 1595
1590 1596 type_name = gaim_primitive_get_id_from_type(primitive);
1591 pixbuf = gaim_gtk_create_prpl_icon(account); 1597
1592 1598 g_snprintf(basename, sizeof(basename), "%s.png", type_name);
1593 if (pixbuf != NULL) { 1599 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status",
1594 scale = gdk_pixbuf_scale_simple(pixbuf, 32, 32, 1600 "default", basename, NULL);
1595 GDK_INTERP_BILINEAR);
1596 g_object_unref(G_OBJECT(pixbuf));
1597 } else {
1598 return NULL;
1599 }
1600
1601 /* TODO: let the prpl pick the emblem on a per status basis, and only
1602 * use the primitive as a fallback */
1603 type_name = gaim_primitive_get_id_from_type(gaim_status_type_get_primitive(status_type));
1604
1605 g_snprintf(basename2, sizeof(basename2), "%s.png",
1606 type_name);
1607 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default",
1608 basename2, NULL);
1609 emblem = gdk_pixbuf_new_from_file(filename, NULL); 1601 emblem = gdk_pixbuf_new_from_file(filename, NULL);
1610 g_free(filename); 1602 g_free(filename);
1611 1603
1612 if (emblem) { 1604 if (emblem != NULL) {
1613 gdk_pixbuf_composite(emblem, 1605 int width, height, emblem_width, emblem_height, new_emblem_width, new_emblem_height;
1614 scale, 32-15, 32-15, 1606 width = gdk_pixbuf_get_width(pixbuf);
1615 15, 15, 1607 height = gdk_pixbuf_get_height(pixbuf);
1616 32-15, 32-15, 1608 emblem_width = gdk_pixbuf_get_width(emblem);
1617 1, 1, 1609 emblem_height = gdk_pixbuf_get_height(emblem);
1618 GDK_INTERP_BILINEAR, 1610 new_emblem_width = width / 2;
1619 255); 1611 new_emblem_height = height / 2;
1620 1612 /* Overlay emblem onto the bottom right corner of pixbuf */
1613 gdk_pixbuf_composite(emblem, pixbuf,
1614 width - new_emblem_width, height - new_emblem_height,
1615 new_emblem_width, new_emblem_height,
1616 width - new_emblem_width, height - new_emblem_height,
1617 (double)new_emblem_width / (double)emblem_width,
1618 (double)new_emblem_height / (double)emblem_height,
1619 GDK_INTERP_BILINEAR,
1620 255);
1621 g_object_unref(emblem); 1621 g_object_unref(emblem);
1622 } 1622 }
1623 return scale; 1623
1624 return pixbuf;
1625 }
1626
1627 GdkPixbuf *
1628 gaim_gtk_create_prpl_icon_with_status(GaimAccount *account, GaimStatusType *status_type, double scale_factor)
1629 {
1630 GdkPixbuf *pixbuf;
1631
1632 pixbuf = gaim_gtk_create_prpl_icon(account, scale_factor);
1633 if (pixbuf == NULL)
1634 return NULL;
1635
1636 /*
1637 * TODO: Let the prpl pick the emblem on a per status basis,
1638 * and only use the primitive as a fallback?
1639 */
1640
1641 return overlay_status_onto_icon(pixbuf,
1642 gaim_status_type_get_primitive(status_type));
1643 }
1644
1645 GdkPixbuf *
1646 gaim_gtk_create_gaim_icon_with_status(GaimStatusPrimitive primitive, double scale_factor)
1647 {
1648 gchar *filename;
1649 GdkPixbuf *orig, *pixbuf;
1650
1651 filename = g_build_filename(DATADIR, "pixmaps", "gaim.png", NULL);
1652 orig = gdk_pixbuf_new_from_file(filename, NULL);
1653 g_free(filename);
1654 if (orig == NULL)
1655 return NULL;
1656
1657 pixbuf = gdk_pixbuf_scale_simple(orig, 30*scale_factor,
1658 30*scale_factor, GDK_INTERP_BILINEAR);
1659 g_object_unref(G_OBJECT(orig));
1660
1661 return overlay_status_onto_icon(pixbuf, primitive);
1624 } 1662 }
1625 1663
1626 static void 1664 static void
1627 menu_action_cb(GtkMenuItem *item, gpointer object) 1665 menu_action_cb(GtkMenuItem *item, gpointer object)
1628 { 1666 {