comparison src/gtkimhtmltoolbar.c @ 8481:6d0869404696

[gaim-migrate @ 9214] " this fixes and should close 9, 10, and 12 on simguys list... those are... 9 Buttons that are pushed in when text is sent, stay pushed in. They should reset to the default for the line based on the B/I/U preferences. 10 Buttons are not properly pushed in if B/I/U are set in the prefs when the conversation window appears. 12 Buttons don't push in and out when the cursor enters regions that are differently formatted. For example, if you move the cursor to a place where the text is bold, the B button should probably be pushed in. While working on these i uncovered another bug which i'll start working on shortly, but thats no reason to hold this back when someone may find something I missed..." --Gary Kramlich as per his note, this does not fix moving the cursor with the mouse, but that doesn't work without this patch either. committer: Tailor Script <tailor@pidgin.im>
author Luke Schierer <lschiere@pidgin.im>
date Sun, 21 Mar 2004 18:38:30 +0000
parents 5f8d4ab6d375
children 887c0259b47b
comparison
equal deleted inserted replaced
8480:b0cebd011cc0 8481:6d0869404696
34 34
35 static GtkVBoxClass *parent_class = NULL; 35 static GtkVBoxClass *parent_class = NULL;
36 36
37 static void do_bold(GtkWidget *bold, GtkIMHtmlToolbar *toolbar) 37 static void do_bold(GtkWidget *bold, GtkIMHtmlToolbar *toolbar)
38 { 38 {
39 GObject *object;
40
39 g_return_if_fail(toolbar); 41 g_return_if_fail(toolbar);
42
43 /* block the format_function_toggle handler */
44 object = g_object_ref(G_OBJECT(GTK_IMHTML(toolbar->imhtml)));
45 g_signal_handlers_block_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL,
46 NULL, toolbar);
40 gtk_imhtml_toggle_bold(GTK_IMHTML(toolbar->imhtml)); 47 gtk_imhtml_toggle_bold(GTK_IMHTML(toolbar->imhtml));
48 g_signal_handlers_unblock_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL,
49 NULL, toolbar);
50 g_object_unref(object);
51
41 gtk_widget_grab_focus(toolbar->imhtml); 52 gtk_widget_grab_focus(toolbar->imhtml);
42 } 53 }
43 54
44 static void 55 static void
45 do_italic(GtkWidget *italic, GtkIMHtmlToolbar *toolbar) 56 do_italic(GtkWidget *italic, GtkIMHtmlToolbar *toolbar)
46 { 57 {
58 GObject *object;
59
47 g_return_if_fail(toolbar); 60 g_return_if_fail(toolbar);
61
62 /* block the format_function_toggle handler */
63 object = g_object_ref(G_OBJECT(GTK_IMHTML(toolbar->imhtml)));
64 g_signal_handlers_block_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL,
65 NULL, toolbar);
48 gtk_imhtml_toggle_italic(GTK_IMHTML(toolbar->imhtml)); 66 gtk_imhtml_toggle_italic(GTK_IMHTML(toolbar->imhtml));
67 g_signal_handlers_unblock_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL,
68 NULL, toolbar);
69 g_object_unref(object);
70
49 gtk_widget_grab_focus(toolbar->imhtml); 71 gtk_widget_grab_focus(toolbar->imhtml);
50 } 72 }
51 73
52 static void 74 static void
53 do_underline(GtkWidget *underline, GtkIMHtmlToolbar *toolbar) 75 do_underline(GtkWidget *underline, GtkIMHtmlToolbar *toolbar)
54 { 76 {
77 GObject *object;
78
55 g_return_if_fail(toolbar); 79 g_return_if_fail(toolbar);
80
81 /* block the format_function_toggle handler */
82 object = g_object_ref(G_OBJECT(GTK_IMHTML(toolbar->imhtml)));
83 g_signal_handlers_block_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL,
84 NULL, toolbar);
56 gtk_imhtml_toggle_underline(GTK_IMHTML(toolbar->imhtml)); 85 gtk_imhtml_toggle_underline(GTK_IMHTML(toolbar->imhtml));
86 g_signal_handlers_unblock_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL,
87 NULL, toolbar);
88 g_object_unref(object);
89
57 gtk_widget_grab_focus(toolbar->imhtml); 90 gtk_widget_grab_focus(toolbar->imhtml);
58 } 91 }
59 92
60 static void 93 static void
61 do_small(GtkWidget *smalltb, GtkIMHtmlToolbar *toolbar) 94 do_small(GtkWidget *smalltb, GtkIMHtmlToolbar *toolbar)
74 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->larger_size))) 107 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->larger_size)))
75 gtk_imhtml_font_grow(GTK_IMHTML(toolbar->imhtml)); 108 gtk_imhtml_font_grow(GTK_IMHTML(toolbar->imhtml));
76 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->larger_size), FALSE); 109 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->larger_size), FALSE);
77 gtk_widget_grab_focus(toolbar->imhtml); 110 gtk_widget_grab_focus(toolbar->imhtml);
78 } 111 }
79
80
81 112
82 static void 113 static void
83 destroy_toolbar_font(GtkWidget *widget, GdkEvent *event, 114 destroy_toolbar_font(GtkWidget *widget, GdkEvent *event,
84 GtkIMHtmlToolbar *toolbar) 115 GtkIMHtmlToolbar *toolbar)
85 { 116 {
600 gtk_widget_grab_focus(toolbar->imhtml); 631 gtk_widget_grab_focus(toolbar->imhtml);
601 } 632 }
602 633
603 static void update_buttons_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, GtkIMHtmlToolbar *toolbar) 634 static void update_buttons_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, GtkIMHtmlToolbar *toolbar)
604 { 635 {
605
606 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->bold), buttons & GTK_IMHTML_BOLD); 636 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->bold), buttons & GTK_IMHTML_BOLD);
607 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->italic), buttons & GTK_IMHTML_ITALIC); 637 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->italic), buttons & GTK_IMHTML_ITALIC);
608 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->underline), buttons & GTK_IMHTML_UNDERLINE); 638 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->underline), buttons & GTK_IMHTML_UNDERLINE);
609 639
610 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->larger_size), buttons & GTK_IMHTML_GROW); 640 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->larger_size), buttons & GTK_IMHTML_GROW);
615 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->bgcolor), buttons & GTK_IMHTML_BACKCOLOR); 645 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->bgcolor), buttons & GTK_IMHTML_BACKCOLOR);
616 646
617 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->image), buttons & GTK_IMHTML_IMAGE); 647 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->image), buttons & GTK_IMHTML_IMAGE);
618 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->link), buttons & GTK_IMHTML_LINK); 648 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->link), buttons & GTK_IMHTML_LINK);
619 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->smiley), buttons & GTK_IMHTML_SMILEY); 649 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->smiley), buttons & GTK_IMHTML_SMILEY);
620 650 }
651
652 /* we call this when we want to _set_active the toggle button, it'll
653 * block the callback thats connected to the button so we don't have to
654 * do the double toggling hack
655 */
656 static void toggle_button_set_active_block(GtkToggleButton *button,
657 gboolean is_active,
658 GtkIMHtmlToolbar *toolbar)
659 {
660 GObject *object;
661 g_return_if_fail(toolbar);
662
663 object = g_object_ref(button);
664 g_signal_handlers_block_matched(object, G_SIGNAL_MATCH_DATA,
665 0, 0, NULL, NULL, toolbar);
666 gtk_toggle_button_set_active(button, is_active);
667 g_signal_handlers_unblock_matched(object, G_SIGNAL_MATCH_DATA,
668 0, 0, NULL, NULL, toolbar);
669 g_object_unref(object);
621 } 670 }
622 671
623 static void toggle_button_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, GtkIMHtmlToolbar *toolbar) 672 static void toggle_button_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, GtkIMHtmlToolbar *toolbar)
624 { 673 {
625 /* This is hacky. I have to tolerate the fact that set_active causes the signal to be emited, so I wind up 674 if (buttons & GTK_IMHTML_BOLD)
626 * toggling in gtkimhtml twice here */ 675 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->bold),
627 676 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->bold)),
628 if (buttons & GTK_IMHTML_BOLD) { 677 toolbar);
629 gtk_imhtml_toggle_bold(imhtml); 678
630 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->bold), !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->bold))); 679 if (buttons & GTK_IMHTML_ITALIC)
631 } 680 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->italic),
632 681 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->italic)),
633 if (buttons & GTK_IMHTML_ITALIC) { 682 toolbar);
634 gtk_imhtml_toggle_italic(imhtml); 683
635 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->italic), !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->italic))); 684 if (buttons & GTK_IMHTML_UNDERLINE)
636 } 685 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->underline),
637 686 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->underline)),
638 if (buttons & GTK_IMHTML_UNDERLINE) { 687 toolbar);
639 gtk_imhtml_toggle_underline(imhtml);
640 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->underline), !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->underline)));
641 }
642 } 688 }
643 689
644 static void reset_buttons_cb(GtkIMHtml *imhtml, GtkIMHtmlToolbar *toolbar) 690 static void reset_buttons_cb(GtkIMHtml *imhtml, GtkIMHtmlToolbar *toolbar)
645 { 691 {
646 printf("yo!\n"); 692 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->bold)))
693 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->bold), FALSE,
694 toolbar);
695
696 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->italic)))
697 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->italic),
698 FALSE, toolbar);
699
700 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->underline)))
701 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->underline),
702 FALSE, toolbar);
703 }
704
705 static void cursor_moved_cb(GtkIMHtml *imhtml, GtkMovementStep step,
706 gint change, gboolean selected,
707 GtkIMHtmlToolbar *toolbar)
708 {
709 gboolean bold, italic, underline;
710
711 bold = italic = underline = FALSE;
712 gtk_imhtml_get_current_format(imhtml, change, &bold, &italic, &underline);
713
714 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->bold)) != bold)
715 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->bold), bold,
716 toolbar);
717
718 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->italic)) != italic)
719 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->italic), italic,
720 toolbar);
721
722 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->underline)) != underline)
723 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->underline),
724 underline, toolbar);
647 } 725 }
648 726
649 enum { 727 enum {
650 LAST_SIGNAL 728 LAST_SIGNAL
651 }; 729 };
891 } 969 }
892 970
893 971
894 void gtk_imhtmltoolbar_attach(GtkIMHtmlToolbar *toolbar, GtkWidget *imhtml) 972 void gtk_imhtmltoolbar_attach(GtkIMHtmlToolbar *toolbar, GtkWidget *imhtml)
895 { 973 {
974 gboolean bold, italic, underline;
975
896 g_return_if_fail(toolbar != NULL); 976 g_return_if_fail(toolbar != NULL);
897 g_return_if_fail(GTK_IS_IMHTMLTOOLBAR(toolbar)); 977 g_return_if_fail(GTK_IS_IMHTMLTOOLBAR(toolbar));
898 g_return_if_fail(imhtml != NULL); 978 g_return_if_fail(imhtml != NULL);
899 g_return_if_fail(GTK_IS_IMHTML(imhtml)); 979 g_return_if_fail(GTK_IS_IMHTML(imhtml));
900 980
901 toolbar->imhtml = imhtml; 981 toolbar->imhtml = imhtml;
902 g_signal_connect(G_OBJECT(imhtml), "format_functions_update", G_CALLBACK(update_buttons_cb), toolbar); 982 g_signal_connect(G_OBJECT(imhtml), "format_functions_update", G_CALLBACK(update_buttons_cb), toolbar);
903 g_signal_connect(G_OBJECT(imhtml), "format_function_toggle", G_CALLBACK(toggle_button_cb), toolbar); 983 g_signal_connect(G_OBJECT(imhtml), "format_function_toggle", G_CALLBACK(toggle_button_cb), toolbar);
904 g_signal_connect(G_OBJECT(imhtml), "format_function_clear", G_CALLBACK(reset_buttons_cb), toolbar); 984 g_signal_connect(G_OBJECT(imhtml), "format_function_clear", G_CALLBACK(reset_buttons_cb), toolbar);
985 g_signal_connect_after(G_OBJECT(imhtml), "move_cursor", G_CALLBACK(cursor_moved_cb), toolbar);
986
987 bold = italic = underline = FALSE;
988
989 gtk_imhtml_get_current_format(GTK_IMHTML(imhtml), 0, &bold, &italic, &underline);
990
991 if(bold)
992 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->bold), bold,
993 toolbar);
994
995 if(italic)
996 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->italic), italic,
997 toolbar);
998
999 if(underline)
1000 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->underline),
1001 underline, toolbar);
905 } 1002 }
906 1003
907 void gtk_imhtmltoolbar_associate_smileys(GtkIMHtmlToolbar *toolbar, const char *proto_id) 1004 void gtk_imhtmltoolbar_associate_smileys(GtkIMHtmlToolbar *toolbar, const char *proto_id)
908 { 1005 {
909 if (toolbar->sml) 1006 if (toolbar->sml)