Mercurial > pidgin
comparison src/gtkimhtmltoolbar.c @ 10894:1a0e699521c3
[gaim-migrate @ 12608]
sf patch #1122730, from BookeldOr
"compact placing in smiley popup"
See the bug for some discussion
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Tue, 03 May 2005 01:28:05 +0000 |
parents | 364a2ef907ae |
children | a511b77a368b |
comparison
equal
deleted
inserted
replaced
10893:3f85d6fc763a | 10894:1a0e699521c3 |
---|---|
561 } | 561 } |
562 | 562 |
563 gtk_widget_grab_focus(toolbar->imhtml); | 563 gtk_widget_grab_focus(toolbar->imhtml); |
564 } | 564 } |
565 | 565 |
566 #if GTK_CHECK_VERSION(2,4,0) /* Smiley selection menu */ | 566 |
567 static void | |
568 smiley_dialog_closed_cb(GtkWidget *widget, GtkIMHtmlToolbar *toolbar) | |
569 { | |
570 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->smiley), FALSE); | |
571 } | |
572 #else | |
573 static void | 567 static void |
574 destroy_smiley_dialog(GtkIMHtmlToolbar *toolbar) | 568 destroy_smiley_dialog(GtkIMHtmlToolbar *toolbar) |
575 { | 569 { |
576 if (toolbar->smiley_dialog != NULL) | 570 if (toolbar->smiley_dialog != NULL) |
577 { | 571 { |
584 close_smiley_dialog(GtkWidget *widget, GdkEvent *event, | 578 close_smiley_dialog(GtkWidget *widget, GdkEvent *event, |
585 GtkIMHtmlToolbar *toolbar) | 579 GtkIMHtmlToolbar *toolbar) |
586 { | 580 { |
587 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->smiley), FALSE); | 581 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->smiley), FALSE); |
588 } | 582 } |
589 #endif | 583 |
590 | 584 |
591 static void | 585 static void |
592 insert_smiley_text(GtkWidget *widget, GtkIMHtmlToolbar *toolbar) | 586 insert_smiley_text(GtkWidget *widget, GtkIMHtmlToolbar *toolbar) |
593 { | 587 { |
594 char *smiley_text, *escaped_smiley; | 588 char *smiley_text, *escaped_smiley; |
600 GTK_IMHTML(toolbar->imhtml)->protocol_name, | 594 GTK_IMHTML(toolbar->imhtml)->protocol_name, |
601 escaped_smiley); | 595 escaped_smiley); |
602 | 596 |
603 g_free(escaped_smiley); | 597 g_free(escaped_smiley); |
604 | 598 |
605 #if !GTK_CHECK_VERSION(2,4,0) /* Smiley selection menu */ | |
606 close_smiley_dialog(NULL, NULL, toolbar); | 599 close_smiley_dialog(NULL, NULL, toolbar); |
607 #endif | 600 } |
608 } | 601 |
609 | 602 /* smiley buttons list */ |
610 #if GTK_CHECK_VERSION(2,4,0) /* Smiley selection menu */ | 603 struct smiley_button_list { |
611 static void | 604 int width, height; |
612 add_smiley(GtkIMHtmlToolbar *toolbar, GtkWidget *menu, int row, int col, char *filename, char *face) | 605 GtkWidget *button; |
613 { | 606 struct smiley_button_list *next; |
614 GtkWidget *image; | 607 }; |
615 GtkWidget *menuitem; | 608 |
616 | 609 struct smiley_button_list * |
617 image = gtk_image_new_from_file(filename); | 610 sort_smileys(struct smiley_button_list *ls, GtkIMHtmlToolbar *toolbar, int *width, char *filename, char *face) |
618 menuitem = gtk_image_menu_item_new_with_label(""); | |
619 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image); | |
620 g_object_set_data(G_OBJECT(menuitem), "smiley_text", face); | |
621 gtk_tooltips_set_tip(toolbar->tooltips, menuitem, face, NULL); | |
622 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(insert_smiley_text), toolbar); | |
623 gtk_menu_attach(GTK_MENU(menu), menuitem, col, col+1, row, row+1); | |
624 } | |
625 #else | |
626 static void | |
627 add_smiley(GtkIMHtmlToolbar *toolbar, GtkWidget *table, int row, int col, char *filename, char *face) | |
628 { | 611 { |
629 GtkWidget *image; | 612 GtkWidget *image; |
630 GtkWidget *button; | 613 GtkWidget *button; |
631 | 614 GtkRequisition size; |
615 struct smiley_button_list *cur; | |
616 struct smiley_button_list *it, *it_last; | |
617 | |
618 cur = malloc(sizeof(struct smiley_button_list)); | |
619 it = ls; | |
620 it_last = ls; /* list iterators*/ | |
632 image = gtk_image_new_from_file(filename); | 621 image = gtk_image_new_from_file(filename); |
622 | |
623 gtk_widget_size_request(image, &size); | |
624 (*width) += size.width; | |
625 | |
633 button = gtk_button_new(); | 626 button = gtk_button_new(); |
634 gtk_container_add(GTK_CONTAINER(button), image); | 627 gtk_container_add(GTK_CONTAINER(button), image); |
628 | |
635 g_object_set_data(G_OBJECT(button), "smiley_text", face); | 629 g_object_set_data(G_OBJECT(button), "smiley_text", face); |
636 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(insert_smiley_text), toolbar); | 630 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(insert_smiley_text), toolbar); |
637 | 631 |
638 gtk_tooltips_set_tip(toolbar->tooltips, button, face, NULL); | 632 gtk_tooltips_set_tip(toolbar->tooltips, button, face, NULL); |
639 | 633 |
640 gtk_table_attach_defaults(GTK_TABLE(table), button, col, col+1, row, row+1); | |
641 | |
642 /* these look really weird with borders */ | 634 /* these look really weird with borders */ |
643 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); | 635 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); |
644 | 636 |
645 gtk_widget_show(button); | 637 /* set current element to add */ |
646 } | 638 cur->height = size.height; |
647 #endif | 639 cur->width = size.width; |
640 cur->button = button; | |
641 cur->next = ls; | |
642 | |
643 /* check where to insert by height */ | |
644 if (ls == NULL) | |
645 return cur; | |
646 while (it != NULL) { | |
647 it_last = it; | |
648 it = it->next; | |
649 } | |
650 cur->next = it; | |
651 it_last->next = cur; | |
652 return ls; | |
653 } | |
654 | |
648 | 655 |
649 static gboolean | 656 static gboolean |
650 smiley_is_unique(GSList *list, GtkIMHtmlSmiley *smiley) { | 657 smiley_is_unique(GSList *list, GtkIMHtmlSmiley *smiley) |
651 while(list) { | 658 { |
659 while (list) { | |
652 GtkIMHtmlSmiley *cur = list->data; | 660 GtkIMHtmlSmiley *cur = list->data; |
653 if(!strcmp(cur->file, smiley->file)) | 661 if (!strcmp(cur->file, smiley->file)) |
654 return FALSE; | 662 return FALSE; |
655 list = list->next; | 663 list = list->next; |
656 } | 664 } |
657 return TRUE; | 665 return TRUE; |
658 } | 666 } |
659 | 667 |
660 | 668 |
661 #if GTK_CHECK_VERSION(2,4,0) /* Smiley selection menu */ | |
662 static void | 669 static void |
663 insert_smiley_cb(GtkWidget *smiley, GtkIMHtmlToolbar *toolbar) | 670 insert_smiley_cb(GtkWidget *smiley, GtkIMHtmlToolbar *toolbar) |
664 { | 671 { |
665 GtkWidget *menu; | 672 GtkWidget *dialog; |
673 GtkWidget *smiley_table = NULL; | |
666 GSList *smileys, *unique_smileys = NULL; | 674 GSList *smileys, *unique_smileys = NULL; |
667 int width; | 675 |
668 int row = 0, col = 0; | 676 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(smiley))) { |
669 | 677 destroy_smiley_dialog(toolbar); |
670 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(smiley))) | 678 gtk_widget_grab_focus(toolbar->imhtml); |
671 return; | 679 return; |
680 } | |
672 | 681 |
673 if (toolbar->sml) | 682 if (toolbar->sml) |
674 smileys = get_proto_smileys(toolbar->sml); | 683 smileys = get_proto_smileys(toolbar->sml); |
675 else | 684 else |
676 smileys = get_proto_smileys(NULL); | 685 smileys = get_proto_smileys(NULL); |
682 unique_smileys = g_slist_append(unique_smileys, smiley); | 691 unique_smileys = g_slist_append(unique_smileys, smiley); |
683 } | 692 } |
684 smileys = smileys->next; | 693 smileys = smileys->next; |
685 } | 694 } |
686 | 695 |
687 menu = gtk_menu_new(); | 696 GAIM_DIALOG(dialog); |
688 | 697 |
689 if(g_slist_length(unique_smileys)) { | 698 gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); |
690 | 699 gtk_window_set_role(GTK_WINDOW(dialog), "smiley_dialog"); |
691 width = floor(sqrt(g_slist_length(unique_smileys))); | 700 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE); |
692 | 701 |
693 /* build menu */ | 702 if (g_slist_length(unique_smileys)) { |
694 while(unique_smileys) { | 703 struct smiley_button_list *ls, *it, *it_tmp; |
704 GtkWidget *line; | |
705 int line_width = 0; | |
706 int max_line_width, num_lines; | |
707 int col=0; | |
708 | |
709 /* We use hboxes packed in a vbox */ | |
710 ls = NULL; | |
711 line = gtk_hbox_new(FALSE, 0); | |
712 line_width = 0; | |
713 max_line_width = 0; | |
714 num_lines = floor(sqrt(g_slist_length(unique_smileys))); | |
715 smiley_table = gtk_vbox_new(FALSE, 0); | |
716 | |
717 /* create list of smileys sorted by height */ | |
718 while (unique_smileys) { | |
695 GtkIMHtmlSmiley *smiley = unique_smileys->data; | 719 GtkIMHtmlSmiley *smiley = unique_smileys->data; |
696 if(!smiley->hidden) { | 720 if (!smiley->hidden) { |
697 add_smiley(toolbar, menu, row, col, smiley->file, smiley->smile); | 721 fflush(stdout); |
698 | 722 ls = sort_smileys(ls, toolbar, &max_line_width, smiley->file, smiley->smile); |
699 if(++col >= width) { | |
700 col = 0; | |
701 row++; | |
702 } | |
703 } | 723 } |
704 unique_smileys = unique_smileys->next; | 724 unique_smileys = unique_smileys->next; |
705 } | 725 } |
706 } | 726 /* pack buttons of the list */ |
707 else { | 727 max_line_width = max_line_width / num_lines; |
708 GtkWidget *menuitem; | 728 it = ls; |
709 menuitem = gtk_menu_item_new_with_label(_("This theme has no available smileys.")); | 729 while (it != NULL) |
710 gtk_widget_set_sensitive(menuitem, FALSE); | 730 { |
711 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); | 731 it_tmp = it; |
712 } | 732 gtk_box_pack_start(GTK_BOX(line), it->button, TRUE, TRUE, 0); |
713 | 733 gtk_widget_show(it->button); |
714 /* | 734 line_width += it->width; |
715 * The menu itself is free'd automatically, but we need to un-press | 735 if (line_width >= max_line_width) { |
716 * the "insert smiley" button whenever the menu is closed. | 736 gtk_box_pack_start(GTK_BOX(smiley_table), line, FALSE, TRUE, 0); |
717 * | 737 line = gtk_hbox_new(FALSE, 0); |
718 * XXX - Make sure the menu really is freed! | 738 line_width = 0; |
719 */ | 739 col = 0; |
720 g_signal_connect(G_OBJECT(menu), "deactivate", | 740 } |
721 G_CALLBACK(smiley_dialog_closed_cb), toolbar); | 741 col++; |
722 | 742 it = it->next; |
723 /* show everything */ | 743 free(it_tmp); |
724 gtk_widget_show_all(menu); | |
725 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time()); | |
726 toolbar->smiley_dialog = menu; | |
727 | |
728 gtk_widget_grab_focus(toolbar->imhtml); | |
729 } | |
730 #else | |
731 static void | |
732 insert_smiley_cb(GtkWidget *smiley, GtkIMHtmlToolbar *toolbar) | |
733 { | |
734 GtkWidget *dialog; | |
735 GtkWidget *smiley_table = NULL; | |
736 GSList *smileys, *unique_smileys = NULL; | |
737 int width; | |
738 int row = 0, col = 0; | |
739 | |
740 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(smiley))) { | |
741 destroy_smiley_dialog(toolbar); | |
742 gtk_widget_grab_focus(toolbar->imhtml); | |
743 return; | |
744 } | |
745 | |
746 if (toolbar->sml) | |
747 smileys = get_proto_smileys(toolbar->sml); | |
748 else | |
749 smileys = get_proto_smileys(NULL); | |
750 | |
751 while(smileys) { | |
752 GtkIMHtmlSmiley *smiley = smileys->data; | |
753 if(!smiley->hidden) { | |
754 if(smiley_is_unique(unique_smileys, smiley)) | |
755 unique_smileys = g_slist_append(unique_smileys, smiley); | |
756 } | 744 } |
757 smileys = smileys->next; | 745 gtk_box_pack_start(GTK_BOX(smiley_table), line, FALSE, TRUE, 0); |
758 } | |
759 | |
760 GAIM_DIALOG(dialog); | |
761 | |
762 gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); | |
763 gtk_window_set_role(GTK_WINDOW(dialog), "smiley_dialog"); | |
764 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE); | |
765 | |
766 if(g_slist_length(unique_smileys)) { | |
767 | |
768 width = floor(sqrt(g_slist_length(unique_smileys))); | |
769 | |
770 smiley_table = gtk_table_new(width, width, TRUE); | |
771 | |
772 /* pack buttons */ | |
773 | |
774 while(unique_smileys) { | |
775 GtkIMHtmlSmiley *smiley = unique_smileys->data; | |
776 if(!smiley->hidden) { | |
777 add_smiley(toolbar, smiley_table, row, col, smiley->file, smiley->smile); | |
778 if(++col >= width) { | |
779 col = 0; | |
780 row++; | |
781 } | |
782 } | |
783 unique_smileys = unique_smileys->next; | |
784 } | |
785 } | 746 } |
786 else { | 747 else { |
787 smiley_table = gtk_label_new(_("This theme has no available smileys.")); | 748 smiley_table = gtk_label_new(_("This theme has no available smileys.")); |
788 } | 749 } |
789 | 750 |
803 | 764 |
804 toolbar->smiley_dialog = dialog; | 765 toolbar->smiley_dialog = dialog; |
805 | 766 |
806 gtk_widget_grab_focus(toolbar->imhtml); | 767 gtk_widget_grab_focus(toolbar->imhtml); |
807 } | 768 } |
808 #endif | |
809 | 769 |
810 static void update_buttons_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, GtkIMHtmlToolbar *toolbar) | 770 static void update_buttons_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, GtkIMHtmlToolbar *toolbar) |
811 { | 771 { |
812 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->bold), buttons & GTK_IMHTML_BOLD); | 772 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->bold), buttons & GTK_IMHTML_BOLD); |
813 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->italic), buttons & GTK_IMHTML_ITALIC); | 773 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->italic), buttons & GTK_IMHTML_ITALIC); |