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;