Mercurial > pidgin.yaz
comparison pidgin/gtkblist-theme.c @ 26636:548871664d3b
PidginBlistTheme now copies all its parameters instead of taking ownership.
This was needed so that we can ensure the GdkColor*s we're freeing were
allocated using gdk_color_copy() so gdk_color_free() will work (it uses the
slice allocator).
FontColorPair's parameters are const /mostly/ to silence warnings in the loader
since we're using the strings directly from the xmlnodes. However, it seems
right that anyone wanting to muck with them should use the PidginBlistTheme API
author | Paul Aurich <paul@darkrain42.org> |
---|---|
date | Sun, 12 Apr 2009 23:46:55 +0000 |
parents | 842b3034d4c6 |
children | b6534ef99dc8 |
comparison
equal
deleted
inserted
replaced
26635:842b3034d4c6 | 26636:548871664d3b |
---|---|
94 | 94 |
95 void | 95 void |
96 free_font_and_color(FontColorPair *pair) | 96 free_font_and_color(FontColorPair *pair) |
97 { | 97 { |
98 if (pair != NULL) { | 98 if (pair != NULL) { |
99 if (pair->font) | 99 g_free((gchar *)pair->font); |
100 g_free(pair->font); | 100 g_free((gchar *)pair->color); |
101 if (pair->color) | |
102 g_free(pair->color); | |
103 g_free(pair); | 101 g_free(pair); |
104 } | 102 } |
103 } | |
104 | |
105 static FontColorPair * | |
106 copy_font_and_color(const FontColorPair *pair) | |
107 { | |
108 FontColorPair *copy = g_new0(FontColorPair, 1); | |
109 copy->font = g_strdup(pair->font); | |
110 copy->color = g_strdup(pair->color); | |
111 return copy; | |
105 } | 112 } |
106 | 113 |
107 /****************************************************************************** | 114 /****************************************************************************** |
108 * GObject Stuff | 115 * GObject Stuff |
109 *****************************************************************************/ | 116 *****************************************************************************/ |
247 /* Buddy List */ | 254 /* Buddy List */ |
248 g_free(priv->bgcolor); | 255 g_free(priv->bgcolor); |
249 g_free(priv->layout); | 256 g_free(priv->layout); |
250 | 257 |
251 /* Group */ | 258 /* Group */ |
252 g_free(priv->expanded_color); | 259 gdk_color_free(priv->expanded_color); |
253 free_font_and_color(priv->expanded); | 260 free_font_and_color(priv->expanded); |
254 g_free(priv->collapsed_color); | 261 gdk_color_free(priv->collapsed_color); |
255 free_font_and_color(priv->collapsed); | 262 free_font_and_color(priv->collapsed); |
256 | 263 |
257 /* Buddy */ | 264 /* Buddy */ |
258 g_free(priv->contact_color); | 265 gdk_color_free(priv->contact_color); |
259 free_font_and_color(priv->contact); | 266 free_font_and_color(priv->contact); |
260 free_font_and_color(priv->online); | 267 free_font_and_color(priv->online); |
261 free_font_and_color(priv->away); | 268 free_font_and_color(priv->away); |
262 free_font_and_color(priv->offline); | 269 free_font_and_color(priv->offline); |
263 free_font_and_color(priv->idle); | 270 free_font_and_color(priv->idle); |
584 return priv->status; | 591 return priv->status; |
585 } | 592 } |
586 | 593 |
587 /* Set Methods */ | 594 /* Set Methods */ |
588 void | 595 void |
589 pidgin_blist_theme_set_background_color(PidginBlistTheme *theme, GdkColor *color) | 596 pidgin_blist_theme_set_background_color(PidginBlistTheme *theme, const GdkColor *color) |
590 { | 597 { |
591 PidginBlistThemePrivate *priv; | 598 PidginBlistThemePrivate *priv; |
592 | 599 |
593 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); | 600 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); |
594 | 601 |
595 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); | 602 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); |
596 | 603 |
597 g_free(priv->bgcolor); | 604 gdk_color_free(priv->bgcolor); |
598 priv->bgcolor = color; | 605 priv->bgcolor = gdk_color_copy(color); |
599 } | 606 } |
600 | 607 |
601 void | 608 void |
602 pidgin_blist_theme_set_opacity(PidginBlistTheme *theme, gdouble opacity) | 609 pidgin_blist_theme_set_opacity(PidginBlistTheme *theme, gdouble opacity) |
603 { | 610 { |
609 | 616 |
610 priv->opacity = opacity; | 617 priv->opacity = opacity; |
611 } | 618 } |
612 | 619 |
613 void | 620 void |
614 pidgin_blist_theme_set_layout(PidginBlistTheme *theme, PidginBlistLayout *layout) | 621 pidgin_blist_theme_set_layout(PidginBlistTheme *theme, const PidginBlistLayout *layout) |
615 { | 622 { |
616 PidginBlistThemePrivate *priv; | 623 PidginBlistThemePrivate *priv; |
617 | 624 |
618 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); | 625 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); |
619 | 626 |
620 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); | 627 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); |
621 | 628 |
622 g_free(priv->layout); | 629 g_free(priv->layout); |
623 priv->layout = layout; | 630 priv->layout = g_memdup(layout, sizeof(PidginBlistLayout)); |
624 } | 631 } |
625 | 632 |
626 void | 633 void |
627 pidgin_blist_theme_set_expanded_background_color(PidginBlistTheme *theme, GdkColor *color) | 634 pidgin_blist_theme_set_expanded_background_color(PidginBlistTheme *theme, const GdkColor *color) |
628 { | 635 { |
629 PidginBlistThemePrivate *priv; | 636 PidginBlistThemePrivate *priv; |
630 | 637 |
631 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); | 638 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); |
632 | 639 |
633 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); | 640 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); |
634 | 641 |
635 g_free(priv->expanded_color); | 642 gdk_color_free(priv->expanded_color); |
636 priv->expanded_color = color; | 643 priv->expanded_color = gdk_color_copy(color); |
637 } | 644 } |
638 | 645 |
639 void | 646 void |
640 pidgin_blist_theme_set_expanded_text_info(PidginBlistTheme *theme, FontColorPair *pair) | 647 pidgin_blist_theme_set_expanded_text_info(PidginBlistTheme *theme, const FontColorPair *pair) |
641 { | 648 { |
642 PidginBlistThemePrivate *priv; | 649 PidginBlistThemePrivate *priv; |
643 | 650 |
644 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); | 651 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); |
645 | 652 |
646 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); | 653 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); |
647 | 654 |
648 free_font_and_color(priv->expanded); | 655 free_font_and_color(priv->expanded); |
649 priv->expanded = pair; | 656 priv->expanded = copy_font_and_color(pair); |
650 } | 657 } |
651 | 658 |
652 void | 659 void |
653 pidgin_blist_theme_set_collapsed_background_color(PidginBlistTheme *theme, GdkColor *color) | 660 pidgin_blist_theme_set_collapsed_background_color(PidginBlistTheme *theme, const GdkColor *color) |
654 { | 661 { |
655 PidginBlistThemePrivate *priv; | 662 PidginBlistThemePrivate *priv; |
656 | 663 |
657 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); | 664 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); |
658 | 665 |
659 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); | 666 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); |
660 | 667 |
661 g_free(priv->collapsed_color); | 668 gdk_color_free(priv->collapsed_color); |
662 priv->collapsed_color = color; | 669 priv->collapsed_color = gdk_color_copy(color); |
663 } | 670 } |
664 | 671 |
665 void | 672 void |
666 pidgin_blist_theme_set_collapsed_text_info(PidginBlistTheme *theme, FontColorPair *pair) | 673 pidgin_blist_theme_set_collapsed_text_info(PidginBlistTheme *theme, const FontColorPair *pair) |
667 { | 674 { |
668 PidginBlistThemePrivate *priv; | 675 PidginBlistThemePrivate *priv; |
669 | 676 |
670 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); | 677 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); |
671 | 678 |
672 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); | 679 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); |
673 | 680 |
674 free_font_and_color(priv->collapsed); | 681 free_font_and_color(priv->collapsed); |
675 priv->collapsed = pair; | 682 priv->collapsed = copy_font_and_color(pair); |
676 } | 683 } |
677 | 684 |
678 void | 685 void |
679 pidgin_blist_theme_set_contact_color(PidginBlistTheme *theme, GdkColor *color) | 686 pidgin_blist_theme_set_contact_color(PidginBlistTheme *theme, const GdkColor *color) |
680 { | 687 { |
681 PidginBlistThemePrivate *priv; | 688 PidginBlistThemePrivate *priv; |
682 | 689 |
683 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); | 690 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); |
684 | 691 |
685 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); | 692 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); |
686 | 693 |
687 g_free(priv->contact_color); | 694 gdk_color_free(priv->contact_color); |
688 priv->contact_color = color; | 695 priv->contact_color = gdk_color_copy(color); |
689 } | 696 } |
690 | 697 |
691 void | 698 void |
692 pidgin_blist_theme_set_contact_text_info(PidginBlistTheme *theme, FontColorPair *pair) | 699 pidgin_blist_theme_set_contact_text_info(PidginBlistTheme *theme, const FontColorPair *pair) |
693 { | 700 { |
694 PidginBlistThemePrivate *priv; | 701 PidginBlistThemePrivate *priv; |
695 | 702 |
696 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); | 703 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); |
697 | 704 |
698 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); | 705 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); |
699 | 706 |
700 free_font_and_color(priv->contact); | 707 free_font_and_color(priv->contact); |
701 priv->contact = pair; | 708 priv->contact = copy_font_and_color(pair); |
702 } | 709 } |
703 | 710 |
704 void | 711 void |
705 pidgin_blist_theme_set_online_text_info(PidginBlistTheme *theme, FontColorPair *pair) | 712 pidgin_blist_theme_set_online_text_info(PidginBlistTheme *theme, const FontColorPair *pair) |
706 { | 713 { |
707 PidginBlistThemePrivate *priv; | 714 PidginBlistThemePrivate *priv; |
708 | 715 |
709 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); | 716 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); |
710 | 717 |
711 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); | 718 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); |
712 | 719 |
713 free_font_and_color(priv->online); | 720 free_font_and_color(priv->online); |
714 priv->online = pair; | 721 priv->online = copy_font_and_color(pair); |
715 } | 722 } |
716 | 723 |
717 void | 724 void |
718 pidgin_blist_theme_set_away_text_info(PidginBlistTheme *theme, FontColorPair *pair) | 725 pidgin_blist_theme_set_away_text_info(PidginBlistTheme *theme, const FontColorPair *pair) |
719 { | 726 { |
720 PidginBlistThemePrivate *priv; | 727 PidginBlistThemePrivate *priv; |
721 | 728 |
722 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); | 729 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); |
723 | 730 |
724 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); | 731 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); |
725 | 732 |
726 free_font_and_color(priv->away); | 733 free_font_and_color(priv->away); |
727 priv->away = pair; | 734 priv->away = copy_font_and_color(pair); |
728 } | 735 } |
729 | 736 |
730 void | 737 void |
731 pidgin_blist_theme_set_offline_text_info(PidginBlistTheme *theme, FontColorPair *pair) | 738 pidgin_blist_theme_set_offline_text_info(PidginBlistTheme *theme, const FontColorPair *pair) |
732 { | 739 { |
733 PidginBlistThemePrivate *priv; | 740 PidginBlistThemePrivate *priv; |
734 | 741 |
735 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); | 742 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); |
736 | 743 |
737 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); | 744 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); |
738 | 745 |
739 free_font_and_color(priv->offline); | 746 free_font_and_color(priv->offline); |
740 priv->offline = pair; | 747 priv->offline = copy_font_and_color(pair); |
741 } | 748 } |
742 | 749 |
743 void | 750 void |
744 pidgin_blist_theme_set_idle_text_info(PidginBlistTheme *theme, FontColorPair *pair) | 751 pidgin_blist_theme_set_idle_text_info(PidginBlistTheme *theme, const FontColorPair *pair) |
745 { | 752 { |
746 PidginBlistThemePrivate *priv; | 753 PidginBlistThemePrivate *priv; |
747 | 754 |
748 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); | 755 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); |
749 | 756 |
750 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); | 757 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); |
751 | 758 |
752 free_font_and_color(priv->idle); | 759 free_font_and_color(priv->idle); |
753 priv->idle = pair; | 760 priv->idle = copy_font_and_color(pair); |
754 } | 761 } |
755 | 762 |
756 void | 763 void |
757 pidgin_blist_theme_set_unread_message_text_info(PidginBlistTheme *theme, FontColorPair *pair) | 764 pidgin_blist_theme_set_unread_message_text_info(PidginBlistTheme *theme, const FontColorPair *pair) |
758 { | 765 { |
759 PidginBlistThemePrivate *priv; | 766 PidginBlistThemePrivate *priv; |
760 | 767 |
761 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); | 768 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); |
762 | 769 |
763 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); | 770 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); |
764 | 771 |
765 free_font_and_color(priv->message); | 772 free_font_and_color(priv->message); |
766 priv->message = pair; | 773 priv->message = copy_font_and_color(pair); |
767 } | 774 } |
768 | 775 |
769 void | 776 void |
770 pidgin_blist_theme_set_unread_message_nick_said_text_info(PidginBlistTheme *theme, FontColorPair *pair) | 777 pidgin_blist_theme_set_unread_message_nick_said_text_info(PidginBlistTheme *theme, const FontColorPair *pair) |
771 { | 778 { |
772 PidginBlistThemePrivate *priv; | 779 PidginBlistThemePrivate *priv; |
773 | 780 |
774 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); | 781 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); |
775 | 782 |
776 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); | 783 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); |
777 | 784 |
778 free_font_and_color(priv->message_nick_said); | 785 free_font_and_color(priv->message_nick_said); |
779 priv->message_nick_said = pair; | 786 priv->message_nick_said = copy_font_and_color(pair); |
780 } | 787 } |
781 | 788 |
782 void | 789 void |
783 pidgin_blist_theme_set_status_text_info(PidginBlistTheme *theme, FontColorPair *pair) | 790 pidgin_blist_theme_set_status_text_info(PidginBlistTheme *theme, const FontColorPair *pair) |
784 { | 791 { |
785 PidginBlistThemePrivate *priv; | 792 PidginBlistThemePrivate *priv; |
786 | 793 |
787 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); | 794 g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); |
788 | 795 |
789 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); | 796 priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); |
790 | 797 |
791 free_font_and_color(priv->status); | 798 free_font_and_color(priv->status); |
792 priv->status = pair; | 799 priv->status = copy_font_and_color(pair); |
793 } | 800 } |