Mercurial > pidgin.yaz
comparison src/gtkimhtml.c @ 10100:fad5d3354cc1
[gaim-migrate @ 11123]
The slashing begins. I moved the formatting bindings to gtk_binding stuff
from a key_press_event. This will not interfere with gtkrc keybindings.
I'm hoping moving GDK_Enter here will fix the input method bug, but I'll try
that some other time.
This took me FOREVER to figure out.
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Fri, 15 Oct 2004 03:14:46 +0000 |
parents | fbab7f05b054 |
children | f0100b414d98 |
comparison
equal
deleted
inserted
replaced
10099:c49cc5b818cf | 10100:fad5d3354cc1 |
---|---|
69 /* GTK+ 2.0 hack */ | 69 /* GTK+ 2.0 hack */ |
70 #if (!GTK_CHECK_VERSION(2,2,0)) | 70 #if (!GTK_CHECK_VERSION(2,2,0)) |
71 #define gtk_widget_get_clipboard(x, y) gtk_clipboard_get(y) | 71 #define gtk_widget_get_clipboard(x, y) gtk_clipboard_get(y) |
72 #endif | 72 #endif |
73 | 73 |
74 static GtkTextViewClass *parent_class = NULL; | |
75 | |
74 static gboolean | 76 static gboolean |
75 gtk_text_view_drag_motion (GtkWidget *widget, | 77 gtk_text_view_drag_motion (GtkWidget *widget, |
76 GdkDragContext *context, | 78 GdkDragContext *context, |
77 gint x, | 79 gint x, |
78 gint y, | 80 gint y, |
503 * | 505 * |
504 * It's supposed to be fixed in gtk2.2. You can view the bug report at | 506 * It's supposed to be fixed in gtk2.2. You can view the bug report at |
505 * http://bugzilla.gnome.org/show_bug.cgi?id=107939 | 507 * http://bugzilla.gnome.org/show_bug.cgi?id=107939 |
506 */ | 508 */ |
507 | 509 |
508 /* | |
509 * I'm adding some keyboard shortcuts too. | |
510 */ | |
511 | |
512 gboolean gtk_key_pressed_cb(GtkIMHtml *imhtml, GdkEventKey *event, gpointer data) | 510 gboolean gtk_key_pressed_cb(GtkIMHtml *imhtml, GdkEventKey *event, gpointer data) |
513 { | 511 { |
514 char buf[7]; | 512 char buf[7]; |
515 buf[0] = '\0'; | 513 buf[0] = '\0'; |
516 | 514 |
526 break; | 524 break; |
527 | 525 |
528 case GDK_End: | 526 case GDK_End: |
529 return TRUE; | 527 return TRUE; |
530 break; | 528 break; |
529 | |
531 #endif /* !(Gtk+ >= 2.2.0) */ | 530 #endif /* !(Gtk+ >= 2.2.0) */ |
532 | 531 } |
533 case 'b': /* ctrl-b is GDK_Left, which moves backwards. */ | |
534 case 'B': | |
535 if (imhtml->format_functions & GTK_IMHTML_BOLD) { | |
536 if(imhtml->html_shortcuts) { | |
537 gtk_imhtml_toggle_bold(imhtml); | |
538 return TRUE; | |
539 } | |
540 } | |
541 return FALSE; | |
542 break; | |
543 | |
544 case 'i': | |
545 case 'I': | |
546 if (imhtml->format_functions & GTK_IMHTML_ITALIC) { | |
547 if(imhtml->html_shortcuts) { | |
548 gtk_imhtml_toggle_italic(imhtml); | |
549 return TRUE; | |
550 } | |
551 } | |
552 return FALSE; | |
553 break; | |
554 | |
555 case 'u': /* ctrl-u is GDK_Clear, which clears the line. */ | |
556 case 'U': | |
557 if (imhtml->format_functions & GTK_IMHTML_UNDERLINE) { | |
558 if(imhtml->html_shortcuts) { | |
559 gtk_imhtml_toggle_underline(imhtml); | |
560 return TRUE; | |
561 } | |
562 } | |
563 return FALSE; | |
564 break; | |
565 | |
566 case '-': | |
567 if (imhtml->format_functions & GTK_IMHTML_SHRINK) | |
568 gtk_imhtml_font_shrink(imhtml); | |
569 return TRUE; | |
570 break; | |
571 | |
572 case '=': | |
573 case '+': | |
574 if (imhtml->format_functions & GTK_IMHTML_GROW) | |
575 gtk_imhtml_font_grow(imhtml); | |
576 return TRUE; | |
577 break; | |
578 | |
579 case '1': strcpy(buf, ":-)"); break; | |
580 case '2': strcpy(buf, ":-("); break; | |
581 case '3': strcpy(buf, ";-)"); break; | |
582 case '4': strcpy(buf, ":-P"); break; | |
583 case '5': strcpy(buf, "=-O"); break; | |
584 case '6': strcpy(buf, ":-*"); break; | |
585 case '7': strcpy(buf, ">:o"); break; | |
586 case '8': strcpy(buf, "8-)"); break; | |
587 case '!': strcpy(buf, ":-$"); break; | |
588 case '@': strcpy(buf, ":-!"); break; | |
589 case '#': strcpy(buf, ":-["); break; | |
590 case '$': strcpy(buf, "O:-)"); break; | |
591 case '%': strcpy(buf, ":-/"); break; | |
592 case '^': strcpy(buf, ":'("); break; | |
593 case '&': strcpy(buf, ":-X"); break; | |
594 case '*': strcpy(buf, ":-D"); break; | |
595 } | |
596 if (*buf && imhtml->smiley_shortcuts) { | |
597 gtk_imhtml_insert_smiley(imhtml, imhtml->protocol_name, buf); | |
598 return TRUE; | |
599 } | |
600 return FALSE; | 532 return FALSE; |
601 } | 533 } |
602 | |
603 static void paste_unformatted_cb(GtkMenuItem *menu, GtkIMHtml *imhtml) | 534 static void paste_unformatted_cb(GtkMenuItem *menu, GtkIMHtml *imhtml) |
604 { | 535 { |
605 GtkClipboard *clipboard = gtk_widget_get_clipboard(GTK_WIDGET(imhtml), GDK_SELECTION_CLIPBOARD); | 536 GtkClipboard *clipboard = gtk_widget_get_clipboard(GTK_WIDGET(imhtml), GDK_SELECTION_CLIPBOARD); |
606 | 537 |
607 gtk_clipboard_request_text(clipboard, paste_plaintext_received_cb, imhtml); | 538 gtk_clipboard_request_text(clipboard, paste_plaintext_received_cb, imhtml); |
955 } | 886 } |
956 | 887 |
957 return FALSE; | 888 return FALSE; |
958 } | 889 } |
959 | 890 |
960 static GtkTextViewClass *parent_class = NULL; | 891 static void imhtml_toggle_format(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons) |
892 { | |
893 switch (buttons) { | |
894 case GTK_IMHTML_BOLD: | |
895 gtk_imhtml_toggle_bold(imhtml); | |
896 break; | |
897 case GTK_IMHTML_ITALIC: | |
898 gtk_imhtml_toggle_italic(imhtml); | |
899 break; | |
900 case GTK_IMHTML_UNDERLINE: | |
901 gtk_imhtml_toggle_underline(imhtml); | |
902 break; | |
903 case GTK_IMHTML_SHRINK: | |
904 gtk_imhtml_font_shrink(imhtml); | |
905 break; | |
906 case GTK_IMHTML_GROW: | |
907 gtk_imhtml_font_grow(imhtml); | |
908 break; | |
909 default: | |
910 break; | |
911 } | |
912 } | |
961 | 913 |
962 static void | 914 static void |
963 gtk_imhtml_finalize (GObject *object) | 915 gtk_imhtml_finalize (GObject *object) |
964 { | 916 { |
965 GtkIMHtml *imhtml = GTK_IMHTML(object); | 917 GtkIMHtml *imhtml = GTK_IMHTML(object); |
1005 /* Boring GTK stuff */ | 957 /* Boring GTK stuff */ |
1006 static void gtk_imhtml_class_init (GtkIMHtmlClass *klass) | 958 static void gtk_imhtml_class_init (GtkIMHtmlClass *klass) |
1007 { | 959 { |
1008 GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; | 960 GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; |
1009 GtkObjectClass *object_class; | 961 GtkObjectClass *object_class; |
962 GtkBindingSet *binding_set; | |
1010 GObjectClass *gobject_class; | 963 GObjectClass *gobject_class; |
1011 object_class = (GtkObjectClass*) klass; | 964 object_class = (GtkObjectClass*) klass; |
1012 gobject_class = (GObjectClass*) klass; | 965 gobject_class = (GObjectClass*) klass; |
1013 parent_class = gtk_type_class(GTK_TYPE_TEXT_VIEW); | 966 parent_class = gtk_type_class(GTK_TYPE_TEXT_VIEW); |
1014 signals[URL_CLICKED] = g_signal_new("url_clicked", | 967 signals[URL_CLICKED] = g_signal_new("url_clicked", |
1029 g_cclosure_marshal_VOID__INT, | 982 g_cclosure_marshal_VOID__INT, |
1030 G_TYPE_NONE, 1, | 983 G_TYPE_NONE, 1, |
1031 G_TYPE_INT); | 984 G_TYPE_INT); |
1032 signals[TOGGLE_FORMAT] = g_signal_new("format_function_toggle", | 985 signals[TOGGLE_FORMAT] = g_signal_new("format_function_toggle", |
1033 G_TYPE_FROM_CLASS(gobject_class), | 986 G_TYPE_FROM_CLASS(gobject_class), |
1034 G_SIGNAL_RUN_FIRST, | 987 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, |
1035 G_STRUCT_OFFSET(GtkIMHtmlClass, toggle_format), | 988 G_STRUCT_OFFSET(GtkIMHtmlClass, toggle_format), |
1036 NULL, | 989 NULL, |
1037 0, | 990 0, |
1038 g_cclosure_marshal_VOID__INT, | 991 g_cclosure_marshal_VOID__INT, |
1039 G_TYPE_NONE, 1, | 992 G_TYPE_NONE, 1, |
1042 G_TYPE_FROM_CLASS(gobject_class), | 995 G_TYPE_FROM_CLASS(gobject_class), |
1043 G_SIGNAL_RUN_FIRST, | 996 G_SIGNAL_RUN_FIRST, |
1044 G_STRUCT_OFFSET(GtkIMHtmlClass, clear_format), | 997 G_STRUCT_OFFSET(GtkIMHtmlClass, clear_format), |
1045 NULL, | 998 NULL, |
1046 0, | 999 0, |
1047 g_cclosure_marshal_VOID__VOID, | 1000 g_cclosure_marshal_VOID__VOID, |
1048 G_TYPE_NONE, 0); | 1001 G_TYPE_NONE, 0); |
1049 signals[UPDATE_FORMAT] = g_signal_new("format_function_update", | 1002 signals[UPDATE_FORMAT] = g_signal_new("format_function_update", |
1050 G_TYPE_FROM_CLASS(gobject_class), | 1003 G_TYPE_FROM_CLASS(gobject_class), |
1051 G_SIGNAL_RUN_FIRST, | 1004 G_SIGNAL_RUN_FIRST, |
1052 G_STRUCT_OFFSET(GtkIMHtmlClass, update_format), | 1005 G_STRUCT_OFFSET(GtkIMHtmlClass, update_format), |
1053 NULL, | 1006 NULL, |
1054 0, | 1007 0, |
1055 g_cclosure_marshal_VOID__VOID, | 1008 g_cclosure_marshal_VOID__VOID, |
1056 G_TYPE_NONE, 0); | 1009 G_TYPE_NONE, 0); |
1010 | |
1011 klass->toggle_format = imhtml_toggle_format; | |
1012 | |
1057 gobject_class->finalize = gtk_imhtml_finalize; | 1013 gobject_class->finalize = gtk_imhtml_finalize; |
1058 widget_class->drag_motion = gtk_text_view_drag_motion; | 1014 widget_class->drag_motion = gtk_text_view_drag_motion; |
1059 gtk_widget_class_install_style_property(widget_class, g_param_spec_boxed("hyperlink-color", | 1015 gtk_widget_class_install_style_property(widget_class, g_param_spec_boxed("hyperlink-color", |
1060 _("Hyperlink color"), | 1016 _("Hyperlink color"), |
1061 _("Color to draw hyperlinks."), | 1017 _("Color to draw hyperlinks."), |
1062 GDK_TYPE_COLOR, G_PARAM_READABLE)); | 1018 GDK_TYPE_COLOR, G_PARAM_READABLE)); |
1019 | |
1020 binding_set = gtk_binding_set_by_class (parent_class); | |
1021 gtk_binding_entry_add_signal (binding_set, GDK_a, GDK_CONTROL_MASK, "format_function_toggle", 1, G_TYPE_INT, GTK_IMHTML_BOLD); | |
1022 gtk_binding_entry_add_signal (binding_set, GDK_i, GDK_CONTROL_MASK, "format_function_toggle", 1, G_TYPE_INT, GTK_IMHTML_ITALIC); | |
1023 gtk_binding_entry_add_signal (binding_set, GDK_u, GDK_CONTROL_MASK, "format_function_toggle", 1, G_TYPE_INT, GTK_IMHTML_UNDERLINE); | |
1024 gtk_binding_entry_add_signal (binding_set, GDK_plus, GDK_CONTROL_MASK, "format_function_toggle", 1, G_TYPE_INT, GTK_IMHTML_GROW); | |
1025 gtk_binding_entry_add_signal (binding_set, GDK_equal, GDK_CONTROL_MASK, "format_function_toggle", 1, G_TYPE_INT, GTK_IMHTML_GROW); | |
1026 gtk_binding_entry_add_signal (binding_set, GDK_minus, GDK_CONTROL_MASK, "format_function_toggle", 1, G_TYPE_INT, GTK_IMHTML_SHRINK); | |
1063 } | 1027 } |
1064 | 1028 |
1065 static void gtk_imhtml_init (GtkIMHtml *imhtml) | 1029 static void gtk_imhtml_init (GtkIMHtml *imhtml) |
1066 { | 1030 { |
1067 GtkTextIter iter; | 1031 GtkTextIter iter; |
3538 else | 3502 else |
3539 gtk_text_buffer_remove_tag_by_name(imhtml->text_buffer, "BOLD", &start, &end); | 3503 gtk_text_buffer_remove_tag_by_name(imhtml->text_buffer, "BOLD", &start, &end); |
3540 | 3504 |
3541 } | 3505 } |
3542 object = g_object_ref(G_OBJECT(imhtml)); | 3506 object = g_object_ref(G_OBJECT(imhtml)); |
3543 g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_BOLD); | |
3544 g_object_unref(object); | 3507 g_object_unref(object); |
3545 | 3508 |
3546 return (imhtml->edit.bold != FALSE); | 3509 return (imhtml->edit.bold != FALSE); |
3547 } | 3510 } |
3548 | 3511 |
3564 gtk_text_buffer_apply_tag_by_name(imhtml->text_buffer, "ITALICS", &start, &end); | 3527 gtk_text_buffer_apply_tag_by_name(imhtml->text_buffer, "ITALICS", &start, &end); |
3565 else | 3528 else |
3566 gtk_text_buffer_remove_tag_by_name(imhtml->text_buffer, "ITALICS", &start, &end); | 3529 gtk_text_buffer_remove_tag_by_name(imhtml->text_buffer, "ITALICS", &start, &end); |
3567 } | 3530 } |
3568 object = g_object_ref(G_OBJECT(imhtml)); | 3531 object = g_object_ref(G_OBJECT(imhtml)); |
3569 g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_ITALIC); | |
3570 g_object_unref(object); | 3532 g_object_unref(object); |
3571 | 3533 |
3572 return imhtml->edit.italic != FALSE; | 3534 return imhtml->edit.italic != FALSE; |
3573 } | 3535 } |
3574 | 3536 |
3590 gtk_text_buffer_apply_tag_by_name(imhtml->text_buffer, "UNDERLINE", &start, &end); | 3552 gtk_text_buffer_apply_tag_by_name(imhtml->text_buffer, "UNDERLINE", &start, &end); |
3591 else | 3553 else |
3592 gtk_text_buffer_remove_tag_by_name(imhtml->text_buffer, "UNDERLINE", &start, &end); | 3554 gtk_text_buffer_remove_tag_by_name(imhtml->text_buffer, "UNDERLINE", &start, &end); |
3593 } | 3555 } |
3594 object = g_object_ref(G_OBJECT(imhtml)); | 3556 object = g_object_ref(G_OBJECT(imhtml)); |
3595 g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_UNDERLINE); | |
3596 g_object_unref(object); | 3557 g_object_unref(object); |
3597 | 3558 |
3598 return imhtml->edit.underline != FALSE; | 3559 return imhtml->edit.underline != FALSE; |
3599 } | 3560 } |
3600 | 3561 |
3616 gtk_text_buffer_apply_tag_by_name(imhtml->text_buffer, "STRIKE", &start, &end); | 3577 gtk_text_buffer_apply_tag_by_name(imhtml->text_buffer, "STRIKE", &start, &end); |
3617 else | 3578 else |
3618 gtk_text_buffer_remove_tag_by_name(imhtml->text_buffer, "STRIKE", &start, &end); | 3579 gtk_text_buffer_remove_tag_by_name(imhtml->text_buffer, "STRIKE", &start, &end); |
3619 } | 3580 } |
3620 object = g_object_ref(G_OBJECT(imhtml)); | 3581 object = g_object_ref(G_OBJECT(imhtml)); |
3621 g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_STRIKE); | |
3622 g_object_unref(object); | 3582 g_object_unref(object); |
3623 | 3583 |
3624 return imhtml->edit.strike != FALSE; | 3584 return imhtml->edit.strike != FALSE; |
3625 } | 3585 } |
3626 | 3586 |
3645 } | 3605 } |
3646 | 3606 |
3647 object = g_object_ref(G_OBJECT(imhtml)); | 3607 object = g_object_ref(G_OBJECT(imhtml)); |
3648 b |= GTK_IMHTML_SHRINK; | 3608 b |= GTK_IMHTML_SHRINK; |
3649 b |= GTK_IMHTML_GROW; | 3609 b |= GTK_IMHTML_GROW; |
3650 g_signal_emit(object, signals[TOGGLE_FORMAT], 0, b); | |
3651 g_object_unref(object); | 3610 g_object_unref(object); |
3652 } | 3611 } |
3653 | 3612 |
3654 void gtk_imhtml_font_shrink(GtkIMHtml *imhtml) | 3613 void gtk_imhtml_font_shrink(GtkIMHtml *imhtml) |
3655 { | 3614 { |
3673 remove_font_size(imhtml, &start, &end, FALSE); | 3632 remove_font_size(imhtml, &start, &end, FALSE); |
3674 gtk_text_buffer_apply_tag(imhtml->text_buffer, | 3633 gtk_text_buffer_apply_tag(imhtml->text_buffer, |
3675 find_font_size_tag(imhtml, imhtml->edit.fontsize), &start, &end); | 3634 find_font_size_tag(imhtml, imhtml->edit.fontsize), &start, &end); |
3676 } | 3635 } |
3677 object = g_object_ref(G_OBJECT(imhtml)); | 3636 object = g_object_ref(G_OBJECT(imhtml)); |
3678 g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_SHRINK); | |
3679 g_object_unref(object); | 3637 g_object_unref(object); |
3680 } | 3638 } |
3681 | 3639 |
3682 void gtk_imhtml_font_grow(GtkIMHtml *imhtml) | 3640 void gtk_imhtml_font_grow(GtkIMHtml *imhtml) |
3683 { | 3641 { |
3701 remove_font_size(imhtml, &start, &end, FALSE); | 3659 remove_font_size(imhtml, &start, &end, FALSE); |
3702 gtk_text_buffer_apply_tag(imhtml->text_buffer, | 3660 gtk_text_buffer_apply_tag(imhtml->text_buffer, |
3703 find_font_size_tag(imhtml, imhtml->edit.fontsize), &start, &end); | 3661 find_font_size_tag(imhtml, imhtml->edit.fontsize), &start, &end); |
3704 } | 3662 } |
3705 object = g_object_ref(G_OBJECT(imhtml)); | 3663 object = g_object_ref(G_OBJECT(imhtml)); |
3706 g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_GROW); | |
3707 g_object_unref(object); | 3664 g_object_unref(object); |
3708 } | 3665 } |
3709 | 3666 |
3710 gboolean gtk_imhtml_toggle_forecolor(GtkIMHtml *imhtml, const char *color) | 3667 gboolean gtk_imhtml_toggle_forecolor(GtkIMHtml *imhtml, const char *color) |
3711 { | 3668 { |
3735 remove_font_forecolor(imhtml, &start, &end, TRUE); | 3692 remove_font_forecolor(imhtml, &start, &end, TRUE); |
3736 } | 3693 } |
3737 } | 3694 } |
3738 | 3695 |
3739 object = g_object_ref(G_OBJECT(imhtml)); | 3696 object = g_object_ref(G_OBJECT(imhtml)); |
3740 g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_FORECOLOR); | |
3741 g_object_unref(object); | 3697 g_object_unref(object); |
3742 | 3698 |
3743 return imhtml->edit.forecolor != NULL; | 3699 return imhtml->edit.forecolor != NULL; |
3744 } | 3700 } |
3745 | 3701 |
3772 remove_font_backcolor(imhtml, &start, &end, TRUE); | 3728 remove_font_backcolor(imhtml, &start, &end, TRUE); |
3773 } | 3729 } |
3774 } | 3730 } |
3775 | 3731 |
3776 object = g_object_ref(G_OBJECT(imhtml)); | 3732 object = g_object_ref(G_OBJECT(imhtml)); |
3777 g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_BACKCOLOR); | |
3778 g_object_unref(object); | 3733 g_object_unref(object); |
3779 | 3734 |
3780 return imhtml->edit.backcolor != NULL; | 3735 return imhtml->edit.backcolor != NULL; |
3781 } | 3736 } |
3782 | 3737 |
3809 remove_font_face(imhtml, &start, &end, TRUE); | 3764 remove_font_face(imhtml, &start, &end, TRUE); |
3810 } | 3765 } |
3811 } | 3766 } |
3812 | 3767 |
3813 object = g_object_ref(G_OBJECT(imhtml)); | 3768 object = g_object_ref(G_OBJECT(imhtml)); |
3814 g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_FACE); | |
3815 g_object_unref(object); | 3769 g_object_unref(object); |
3816 | 3770 |
3817 return imhtml->edit.fontface != NULL; | 3771 return imhtml->edit.fontface != NULL; |
3818 } | 3772 } |
3819 | 3773 |