Mercurial > pidgin.yaz
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) |