Mercurial > pidgin.yaz
comparison src/gtkimhtmltoolbar.c @ 10138:5fb5c447eb4f
[gaim-migrate @ 11208]
Bring back the old smiley selection dialog for gtk<2.4 and play around
with the signals for both of them. We're not explicitly freeing the
smiley menu in gtk2.4 anymore... can someone verify that gtk is
freeing it for us? Or write a patch to free it, if not? This would
probably be a pretty big memleak if gtk isn't taking care of it...
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Mon, 25 Oct 2004 02:48:38 +0000 |
parents | 3855d3467437 |
children | ec140184437b |
comparison
equal
deleted
inserted
replaced
10137:94167af56ace | 10138:5fb5c447eb4f |
---|---|
552 } | 552 } |
553 | 553 |
554 gtk_widget_grab_focus(toolbar->imhtml); | 554 gtk_widget_grab_focus(toolbar->imhtml); |
555 } | 555 } |
556 | 556 |
557 static void | 557 #if GTK_CHECK_VERSION(2,4,0) /* Smiley selection menu */ |
558 destroy_smiley_menu(GtkWidget *widget, GtkIMHtmlToolbar *toolbar) | 558 static void |
559 { | 559 smiley_dialog_closed_cb(GtkWidget *widget, GtkIMHtmlToolbar *toolbar) |
560 if (toolbar->smiley_menu != NULL) | 560 { |
561 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->smiley), FALSE); | |
562 } | |
563 #else | |
564 static void | |
565 destroy_smiley_dialog(GtkIMHtmlToolbar *toolbar) | |
566 { | |
567 if (toolbar->smiley_dialog != NULL) | |
561 { | 568 { |
562 gtk_widget_destroy(toolbar->smiley_menu); | 569 gtk_widget_destroy(toolbar->smiley_dialog); |
563 toolbar->smiley_menu = NULL; | 570 toolbar->smiley_dialog = NULL; |
564 } | 571 } |
565 } | 572 } |
566 | 573 |
567 static void | 574 static void |
568 deactivate_smiley_menu(GtkWidget *widget, GtkIMHtmlToolbar *toolbar) | 575 close_smiley_dialog(GtkWidget *widget, GdkEvent *event, |
576 GtkIMHtmlToolbar *toolbar) | |
569 { | 577 { |
570 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->smiley), FALSE); | 578 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->smiley), FALSE); |
571 gtk_button_released(GTK_BUTTON(toolbar->smiley)); | 579 } |
572 } | 580 #endif |
573 | 581 |
574 static void | 582 static void |
575 insert_smiley_text(GtkWidget *widget, GtkIMHtmlToolbar *toolbar) | 583 insert_smiley_text(GtkWidget *widget, GtkIMHtmlToolbar *toolbar) |
576 { | 584 { |
577 char *smiley_text, *escaped_smiley; | 585 char *smiley_text, *escaped_smiley; |
582 gtk_imhtml_insert_smiley(GTK_IMHTML(toolbar->imhtml), | 590 gtk_imhtml_insert_smiley(GTK_IMHTML(toolbar->imhtml), |
583 GTK_IMHTML(toolbar->imhtml)->protocol_name, | 591 GTK_IMHTML(toolbar->imhtml)->protocol_name, |
584 escaped_smiley); | 592 escaped_smiley); |
585 | 593 |
586 g_free(escaped_smiley); | 594 g_free(escaped_smiley); |
587 destroy_smiley_menu(NULL, toolbar); | 595 |
588 } | 596 #if !GTK_CHECK_VERSION(2,4,0) /* Smiley selection menu */ |
589 | 597 close_smiley_dialog(NULL, NULL, toolbar); |
590 static void add_smiley(GtkIMHtmlToolbar *toolbar, GtkWidget *menu, int row, int col, char *filename, char *face) | 598 #endif |
599 } | |
600 | |
601 #if GTK_CHECK_VERSION(2,4,0) /* Smiley selection menu */ | |
602 static void | |
603 add_smiley(GtkIMHtmlToolbar *toolbar, GtkWidget *menu, int row, int col, char *filename, char *face) | |
591 { | 604 { |
592 GtkWidget *image; | 605 GtkWidget *image; |
593 GtkWidget *menuitem; | 606 GtkWidget *menuitem; |
594 | 607 |
595 image = gtk_image_new_from_file(filename); | 608 image = gtk_image_new_from_file(filename); |
598 g_object_set_data(G_OBJECT(menuitem), "smiley_text", face); | 611 g_object_set_data(G_OBJECT(menuitem), "smiley_text", face); |
599 gtk_tooltips_set_tip(toolbar->tooltips, menuitem, face, NULL); | 612 gtk_tooltips_set_tip(toolbar->tooltips, menuitem, face, NULL); |
600 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(insert_smiley_text), toolbar); | 613 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(insert_smiley_text), toolbar); |
601 gtk_menu_attach(GTK_MENU(menu), menuitem, col, col+1, row, row+1); | 614 gtk_menu_attach(GTK_MENU(menu), menuitem, col, col+1, row, row+1); |
602 } | 615 } |
603 | 616 #else |
604 static gboolean smiley_is_unique(GSList *list, GtkIMHtmlSmiley *smiley) { | 617 static void |
618 add_smiley(GtkIMHtmlToolbar *toolbar, GtkWidget *table, int row, int col, char *filename, char *face) | |
619 { | |
620 GtkWidget *image; | |
621 GtkWidget *button; | |
622 | |
623 image = gtk_image_new_from_file(filename); | |
624 button = gtk_button_new(); | |
625 gtk_container_add(GTK_CONTAINER(button), image); | |
626 g_object_set_data(G_OBJECT(button), "smiley_text", face); | |
627 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(insert_smiley_text), toolbar); | |
628 | |
629 gtk_tooltips_set_tip(toolbar->tooltips, button, face, NULL); | |
630 | |
631 gtk_table_attach_defaults(GTK_TABLE(table), button, col, col+1, row, row+1); | |
632 | |
633 /* these look really weird with borders */ | |
634 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); | |
635 | |
636 gtk_widget_show(button); | |
637 } | |
638 #endif | |
639 | |
640 static gboolean | |
641 smiley_is_unique(GSList *list, GtkIMHtmlSmiley *smiley) { | |
605 while(list) { | 642 while(list) { |
606 GtkIMHtmlSmiley *cur = list->data; | 643 GtkIMHtmlSmiley *cur = list->data; |
607 if(!strcmp(cur->file, smiley->file)) | 644 if(!strcmp(cur->file, smiley->file)) |
608 return FALSE; | 645 return FALSE; |
609 list = list->next; | 646 list = list->next; |
610 } | 647 } |
611 return TRUE; | 648 return TRUE; |
612 } | 649 } |
613 | 650 |
614 | 651 |
652 #if GTK_CHECK_VERSION(2,4,0) /* Smiley selection menu */ | |
615 static void | 653 static void |
616 insert_smiley_cb(GtkWidget *smiley, GtkIMHtmlToolbar *toolbar) | 654 insert_smiley_cb(GtkWidget *smiley, GtkIMHtmlToolbar *toolbar) |
617 { | 655 { |
618 GtkWidget *menu; | 656 GtkWidget *menu; |
619 GSList *smileys, *unique_smileys = NULL; | 657 GSList *smileys, *unique_smileys = NULL; |
620 int width; | 658 int width; |
621 int row = 0, col = 0; | 659 int row = 0, col = 0; |
622 | 660 |
623 destroy_smiley_menu(NULL, toolbar); | 661 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(smiley))) |
662 return; | |
624 | 663 |
625 if (toolbar->sml) | 664 if (toolbar->sml) |
626 smileys = get_proto_smileys(toolbar->sml); | 665 smileys = get_proto_smileys(toolbar->sml); |
627 else | 666 else |
628 smileys = get_proto_smileys(NULL); | 667 smileys = get_proto_smileys(NULL); |
661 menuitem = gtk_menu_item_new_with_label(_("This theme has no available smileys.")); | 700 menuitem = gtk_menu_item_new_with_label(_("This theme has no available smileys.")); |
662 gtk_widget_set_sensitive(menuitem, FALSE); | 701 gtk_widget_set_sensitive(menuitem, FALSE); |
663 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); | 702 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
664 } | 703 } |
665 | 704 |
666 /* connect signals */ | 705 /* |
706 * The menu itself is free'd automatically, but we need to un-press | |
707 * the "insert smiley" button whenever the menu is closed. | |
708 * | |
709 * XXX - Make sure the menu really is freed! | |
710 */ | |
667 g_signal_connect(G_OBJECT(menu), "deactivate", | 711 g_signal_connect(G_OBJECT(menu), "deactivate", |
668 G_CALLBACK(deactivate_smiley_menu), toolbar); | 712 G_CALLBACK(smiley_dialog_closed_cb), toolbar); |
669 g_signal_connect(G_OBJECT(menu), "selection-done", | |
670 G_CALLBACK(destroy_smiley_menu), toolbar); | |
671 | 713 |
672 /* show everything */ | 714 /* show everything */ |
673 gtk_widget_show_all(menu); | 715 gtk_widget_show_all(menu); |
674 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time()); | 716 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time()); |
675 toolbar->smiley_menu = menu; | 717 toolbar->smiley_dialog = menu; |
676 | 718 |
677 gtk_widget_grab_focus(toolbar->imhtml); | 719 gtk_widget_grab_focus(toolbar->imhtml); |
678 } | 720 } |
721 #else | |
722 static void | |
723 insert_smiley_cb(GtkWidget *smiley, GtkIMHtmlToolbar *toolbar) | |
724 { | |
725 GtkWidget *dialog; | |
726 GtkWidget *smiley_table = NULL; | |
727 GSList *smileys, *unique_smileys = NULL; | |
728 int width; | |
729 int row = 0, col = 0; | |
730 | |
731 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(smiley))) { | |
732 destroy_smiley_dialog(toolbar); | |
733 gtk_widget_grab_focus(toolbar->imhtml); | |
734 return; | |
735 } | |
736 | |
737 if (toolbar->sml) | |
738 smileys = get_proto_smileys(toolbar->sml); | |
739 else | |
740 smileys = get_proto_smileys(NULL); | |
741 | |
742 while(smileys) { | |
743 GtkIMHtmlSmiley *smiley = smileys->data; | |
744 if(!smiley->hidden) { | |
745 if(smiley_is_unique(unique_smileys, smiley)) | |
746 unique_smileys = g_slist_append(unique_smileys, smiley); | |
747 } | |
748 smileys = smileys->next; | |
749 } | |
750 | |
751 GAIM_DIALOG(dialog); | |
752 | |
753 gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); | |
754 gtk_window_set_role(GTK_WINDOW(dialog), "smiley_dialog"); | |
755 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE); | |
756 | |
757 if(g_slist_length(unique_smileys)) { | |
758 | |
759 width = floor(sqrt(g_slist_length(unique_smileys))); | |
760 | |
761 smiley_table = gtk_table_new(width, width, TRUE); | |
762 | |
763 /* pack buttons */ | |
764 | |
765 while(unique_smileys) { | |
766 GtkIMHtmlSmiley *smiley = unique_smileys->data; | |
767 if(!smiley->hidden) { | |
768 add_smiley(toolbar, smiley_table, row, col, smiley->file, smiley->smile); | |
769 if(++col >= width) { | |
770 col = 0; | |
771 row++; | |
772 } | |
773 } | |
774 unique_smileys = unique_smileys->next; | |
775 } | |
776 } | |
777 else { | |
778 smiley_table = gtk_label_new(_("This theme has no available smileys.")); | |
779 } | |
780 | |
781 gtk_container_add(GTK_CONTAINER(dialog), smiley_table); | |
782 | |
783 gtk_widget_show(smiley_table); | |
784 | |
785 gtk_container_set_border_width(GTK_CONTAINER(dialog), 5); | |
786 | |
787 /* connect signals */ | |
788 g_signal_connect(G_OBJECT(dialog), "delete_event", | |
789 G_CALLBACK(close_smiley_dialog), toolbar); | |
790 | |
791 /* show everything */ | |
792 gtk_window_set_title(GTK_WINDOW(dialog), _("Smile!")); | |
793 gtk_widget_show_all(dialog); | |
794 | |
795 toolbar->smiley_dialog = dialog; | |
796 | |
797 gtk_widget_grab_focus(toolbar->imhtml); | |
798 } | |
799 #endif | |
679 | 800 |
680 static void update_buttons_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, GtkIMHtmlToolbar *toolbar) | 801 static void update_buttons_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, GtkIMHtmlToolbar *toolbar) |
681 { | 802 { |
682 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->bold), buttons & GTK_IMHTML_BOLD); | 803 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->bold), buttons & GTK_IMHTML_BOLD); |
683 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->italic), buttons & GTK_IMHTML_ITALIC); | 804 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->italic), buttons & GTK_IMHTML_ITALIC); |
796 gtk_widget_destroy(toolbar->image_dialog); | 917 gtk_widget_destroy(toolbar->image_dialog); |
797 toolbar->image_dialog = NULL; | 918 toolbar->image_dialog = NULL; |
798 } | 919 } |
799 | 920 |
800 destroy_toolbar_font(NULL, NULL, toolbar); | 921 destroy_toolbar_font(NULL, NULL, toolbar); |
801 destroy_smiley_menu(NULL, toolbar); | 922 #if !GTK_CHECK_VERSION(2,4,0) /* Smiley selection menu */ |
923 destroy_smiley_dialog(toolbar); | |
924 #endif | |
802 destroy_toolbar_bgcolor(NULL, NULL, toolbar); | 925 destroy_toolbar_bgcolor(NULL, NULL, toolbar); |
803 destroy_toolbar_fgcolor(NULL, NULL, toolbar); | 926 destroy_toolbar_fgcolor(NULL, NULL, toolbar); |
804 close_link_dialog(toolbar); | 927 close_link_dialog(toolbar); |
805 | 928 |
806 if (toolbar->sml) | 929 if (toolbar->sml) |
831 toolbar->imhtml = NULL; | 954 toolbar->imhtml = NULL; |
832 toolbar->font_dialog = NULL; | 955 toolbar->font_dialog = NULL; |
833 toolbar->fgcolor_dialog = NULL; | 956 toolbar->fgcolor_dialog = NULL; |
834 toolbar->bgcolor_dialog = NULL; | 957 toolbar->bgcolor_dialog = NULL; |
835 toolbar->link_dialog = NULL; | 958 toolbar->link_dialog = NULL; |
836 toolbar->smiley_menu = NULL; | 959 toolbar->smiley_dialog = NULL; |
837 toolbar->image_dialog = NULL; | 960 toolbar->image_dialog = NULL; |
838 | 961 |
839 toolbar->tooltips = gtk_tooltips_new(); | 962 toolbar->tooltips = gtk_tooltips_new(); |
840 | 963 |
841 gtk_box_set_spacing(GTK_BOX(toolbar), 6); | 964 gtk_box_set_spacing(GTK_BOX(toolbar), 6); |
972 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_SMILEY); | 1095 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_SMILEY); |
973 gtk_size_group_add_widget(sg, button); | 1096 gtk_size_group_add_widget(sg, button); |
974 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | 1097 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
975 gtk_tooltips_set_tip(toolbar->tooltips, button, _("Insert smiley"), NULL); | 1098 gtk_tooltips_set_tip(toolbar->tooltips, button, _("Insert smiley"), NULL); |
976 | 1099 |
977 g_signal_connect(G_OBJECT(button), "pressed", | 1100 g_signal_connect(G_OBJECT(button), "clicked", |
978 G_CALLBACK(insert_smiley_cb), toolbar); | 1101 G_CALLBACK(insert_smiley_cb), toolbar); |
979 | 1102 |
980 toolbar->smiley = button; | 1103 toolbar->smiley = button; |
981 | 1104 |
982 toolbar->sml = NULL; | 1105 toolbar->sml = NULL; |