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