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);