Mercurial > pidgin.yaz
comparison src/gtkimhtml.c @ 10776:b640d066eb51
[gaim-migrate @ 12387]
this makes us do full backgrounds only for body tags,
and changes how full backgrounds work.
Sean, I left a lot of your code there, #if 0'd out.
This probably isn't prefect yet, and I think I might have removed one of
Sean's more recent changes. So I'm hoping Sean finishes this for me. Or
at least yells at me about what to fix. Or at least tries it.
committer: Tailor Script <tailor@pidgin.im>
author | Tim Ringenbach <marv@pidgin.im> |
---|---|
date | Sat, 02 Apr 2005 23:59:49 +0000 |
parents | cb94f248a74e |
children | ffa44a5159e0 |
comparison
equal
deleted
inserted
replaced
10775:d47e82ac9918 | 10776:b640d066eb51 |
---|---|
520 } | 520 } |
521 | 521 |
522 return FALSE; | 522 return FALSE; |
523 } | 523 } |
524 | 524 |
525 struct backcolor_tag { | |
526 GtkTextMark *start; | |
527 GtkTextMark *end; | |
528 char *color; | |
529 }; | |
530 | 525 |
531 static gint | 526 static gint |
532 gtk_imhtml_expose_event (GtkWidget *widget, | 527 gtk_imhtml_expose_event (GtkWidget *widget, |
533 GdkEventExpose *event) | 528 GdkEventExpose *event) |
534 { | 529 { |
535 GSList *l = GTK_IMHTML(widget)->backcolor_tags; | 530 GtkTextIter start, end, cur; |
531 int buf_x, buf_y; | |
532 GSList *tags, *l; | |
533 GdkRectangle visible_rect; | |
534 | |
535 gtk_text_view_get_visible_rect(GTK_TEXT_VIEW(widget), &visible_rect); | |
536 gtk_text_view_buffer_to_window_coords(GTK_TEXT_VIEW(widget), | |
537 GTK_TEXT_WINDOW_TEXT, | |
538 visible_rect.x, | |
539 visible_rect.y, | |
540 &visible_rect.x, | |
541 &visible_rect.y); | |
542 | |
543 gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(widget), GTK_TEXT_WINDOW_TEXT, | |
544 event->area.x, event->area.y, &buf_x, &buf_y); | |
545 | |
546 gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(widget), &start, buf_x, buf_y); | |
547 gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(widget), &end, | |
548 buf_x + event->area.width, buf_y + event->area.height); | |
549 | |
550 | |
551 | |
552 cur = start; | |
553 | |
554 while (gtk_text_iter_in_range(&cur, &start, &end)) { | |
555 GdkGC *gc = gdk_gc_new(GDK_DRAWABLE(event->window)); | |
556 tags = gtk_text_iter_get_tags(&cur); | |
557 | |
558 for (l = tags; l; l = l->next) { | |
559 GtkTextTag *tag = l->data; | |
560 GdkRectangle rect; | |
561 GdkRectangle tag_area; | |
562 const char *color; | |
563 GdkColor gcolor; | |
564 | |
565 if (strncmp(tag->name, "BACKGROUND ", 11)) | |
566 continue; | |
567 | |
568 if (gtk_text_iter_ends_tag(&cur, tag)) | |
569 continue; | |
570 | |
571 gtk_text_view_get_iter_location(GTK_TEXT_VIEW(widget), &cur, &tag_area); | |
572 gtk_text_view_buffer_to_window_coords(GTK_TEXT_VIEW(widget), | |
573 GTK_TEXT_WINDOW_TEXT, | |
574 tag_area.x, | |
575 tag_area.y, | |
576 &tag_area.x, | |
577 &tag_area.y); | |
578 rect.x = visible_rect.x; | |
579 rect.y = tag_area.y; | |
580 | |
581 while (!gtk_text_iter_is_end(&cur) && gtk_text_iter_begins_tag(&cur, tag)) | |
582 gtk_text_iter_forward_to_tag_toggle(&cur, tag); | |
583 gtk_text_view_get_iter_location(GTK_TEXT_VIEW(widget), &cur, &tag_area); | |
584 gtk_text_view_buffer_to_window_coords(GTK_TEXT_VIEW(widget), | |
585 GTK_TEXT_WINDOW_TEXT, | |
586 tag_area.x, | |
587 tag_area.y, | |
588 &tag_area.x, | |
589 &tag_area.y); | |
590 | |
591 rect.width = visible_rect.width; | |
592 if (gtk_text_iter_is_end(&cur)) | |
593 rect.height = visible_rect.y + visible_rect.height - rect.y; | |
594 else | |
595 rect.height = tag_area.y + tag_area.height - rect.y | |
596 + gtk_text_view_get_pixels_below_lines(GTK_TEXT_VIEW(widget)); | |
597 | |
598 color = tag->name + 11; | |
599 | |
600 gdk_color_parse(color, &gcolor); | |
601 gdk_gc_set_rgb_fg_color(gc, &gcolor); | |
602 | |
603 | |
604 gdk_draw_rectangle(event->window, | |
605 gc, | |
606 TRUE, | |
607 rect.x, rect.y, rect.width, rect.height); | |
608 gaim_debug_info("gtkimhtml", "drawing rect at %d,%d to %d,%d\n", | |
609 rect.x, rect.y, rect.x+rect.width, rect.y+rect.height); | |
610 gtk_text_iter_backward_char(&cur); | |
611 break; | |
612 } | |
613 | |
614 g_slist_free(tags); | |
615 gdk_gc_unref(gc); | |
616 gtk_text_iter_forward_to_tag_toggle(&cur, NULL); | |
617 } | |
618 #if 0 | |
536 while (l) { | 619 while (l) { |
537 struct backcolor_tag *tag = (struct backcolor_tag*)l->data; | 620 struct backcolor_tag *tag = (struct backcolor_tag*)l->data; |
538 GdkRectangle visible_rect; | 621 GdkRectangle visible_rect; |
539 GdkRectangle redraw_rect; | 622 GdkRectangle redraw_rect; |
540 int top, bottom, height, win_top, win_bottom; | 623 int top, bottom, height, win_top, win_bottom; |
541 GtkTextIter start, end; | 624 GtkTextIter start, end; |
542 | 625 |
543 GdkGC *gc = gdk_gc_new(GDK_DRAWABLE(event->window)); | 626 GdkGC *gc = gdk_gc_new(GDK_DRAWABLE(event->window)); |
544 GdkColor color; | 627 GdkColor color; |
545 | 628 |
546 gtk_text_view_get_visible_rect (GTK_TEXT_VIEW(widget), &visible_rect); | 629 gtk_text_view_get_visible_rect(GTK_TEXT_VIEW(widget), &visible_rect); |
547 gtk_text_view_buffer_to_window_coords (GTK_TEXT_VIEW(widget), | 630 gtk_text_view_buffer_to_window_coords (GTK_TEXT_VIEW(widget), |
548 GTK_TEXT_WINDOW_TEXT, | 631 GTK_TEXT_WINDOW_TEXT, |
549 visible_rect.x, | 632 visible_rect.x, |
550 visible_rect.y, | 633 visible_rect.y, |
551 &redraw_rect.x, | 634 &redraw_rect.x, |
598 TRUE, | 681 TRUE, |
599 redraw_rect.x, win_top, redraw_rect.width, win_bottom - win_top); | 682 redraw_rect.x, win_top, redraw_rect.width, win_bottom - win_top); |
600 gdk_gc_unref(gc); | 683 gdk_gc_unref(gc); |
601 l = l->next; | 684 l = l->next; |
602 } | 685 } |
686 #endif | |
603 if (GTK_WIDGET_CLASS (parent_class)->expose_event) | 687 if (GTK_WIDGET_CLASS (parent_class)->expose_event) |
604 return (* GTK_WIDGET_CLASS (parent_class)->expose_event) | 688 return (* GTK_WIDGET_CLASS (parent_class)->expose_event) |
605 (widget, event); | 689 (widget, event); |
690 | |
606 return FALSE; | 691 return FALSE; |
607 } | 692 } |
608 | 693 |
609 | 694 |
610 static void paste_unformatted_cb(GtkMenuItem *menu, GtkIMHtml *imhtml) | 695 static void paste_unformatted_cb(GtkMenuItem *menu, GtkIMHtml *imhtml) |
1218 | 1303 |
1219 #ifdef _WIN32 | 1304 #ifdef _WIN32 |
1220 /* Register HTML Format as desired clipboard format */ | 1305 /* Register HTML Format as desired clipboard format */ |
1221 win_html_fmt = RegisterClipboardFormat("HTML Format"); | 1306 win_html_fmt = RegisterClipboardFormat("HTML Format"); |
1222 #endif | 1307 #endif |
1223 imhtml->backcolor_tags = NULL; | |
1224 } | 1308 } |
1225 | 1309 |
1226 GtkWidget *gtk_imhtml_new(void *a, void *b) | 1310 GtkWidget *gtk_imhtml_new(void *a, void *b) |
1227 { | 1311 { |
1228 return GTK_WIDGET(g_object_new(gtk_imhtml_get_type(), NULL)); | 1312 return GTK_WIDGET(g_object_new(gtk_imhtml_get_type(), NULL)); |
2363 case 31: /* H3 */ | 2447 case 31: /* H3 */ |
2364 case 32: /* /H3 */ | 2448 case 32: /* /H3 */ |
2365 case 33: /* HTML */ | 2449 case 33: /* HTML */ |
2366 case 34: /* /HTML */ | 2450 case 34: /* /HTML */ |
2367 case 35: /* BODY */ | 2451 case 35: /* BODY */ |
2452 break; | |
2368 case 36: /* /BODY */ | 2453 case 36: /* /BODY */ |
2454 gtk_imhtml_toggle_background(imhtml, NULL); | |
2455 break; | |
2369 case 37: /* FONT */ | 2456 case 37: /* FONT */ |
2370 case 38: /* HEAD */ | 2457 case 38: /* HEAD */ |
2371 case 39: /* /HEAD */ | 2458 case 39: /* /HEAD */ |
2372 case 40: /* BINARY */ | 2459 case 40: /* BINARY */ |
2373 case 41: /* /BINARY */ | 2460 case 41: /* /BINARY */ |
2447 ws[0] = '\0'; wpos = 0; | 2534 ws[0] = '\0'; wpos = 0; |
2448 /* NEW_BIT(NEW_TEXT_BIT); */ | 2535 /* NEW_BIT(NEW_TEXT_BIT); */ |
2449 if (bg) | 2536 if (bg) |
2450 g_free(bg); | 2537 g_free(bg); |
2451 bg = bgcolor; | 2538 bg = bgcolor; |
2452 gtk_imhtml_toggle_backcolor(imhtml, bg); | 2539 gtk_imhtml_toggle_background(imhtml, bg); |
2453 } | 2540 } |
2454 } | 2541 } |
2455 break; | 2542 break; |
2456 case 45: /* A (opt) */ | 2543 case 45: /* A (opt) */ |
2457 { | 2544 { |
2791 | 2878 |
2792 void | 2879 void |
2793 gtk_imhtml_clear (GtkIMHtml *imhtml) | 2880 gtk_imhtml_clear (GtkIMHtml *imhtml) |
2794 { | 2881 { |
2795 GList *del; | 2882 GList *del; |
2796 GSList *dels; | |
2797 GtkTextIter start, end; | 2883 GtkTextIter start, end; |
2798 GObject *object = g_object_ref(G_OBJECT(imhtml)); | 2884 GObject *object = g_object_ref(G_OBJECT(imhtml)); |
2799 | |
2800 for (dels = imhtml->backcolor_tags; dels; dels = dels->next) { | |
2801 struct backcolor_tag *tag = dels->data; | |
2802 g_free(tag->color); | |
2803 g_free(tag); | |
2804 } | |
2805 g_slist_free(imhtml->backcolor_tags); | |
2806 imhtml->backcolor_tags = NULL; | |
2807 | 2885 |
2808 gtk_text_buffer_get_start_iter(imhtml->text_buffer, &start); | 2886 gtk_text_buffer_get_start_iter(imhtml->text_buffer, &start); |
2809 gtk_text_buffer_get_end_iter(imhtml->text_buffer, &end); | 2887 gtk_text_buffer_get_end_iter(imhtml->text_buffer, &end); |
2810 gtk_text_buffer_delete(imhtml->text_buffer, &start, &end); | 2888 gtk_text_buffer_delete(imhtml->text_buffer, &start, &end); |
2811 | 2889 |
3254 tag = gtk_text_buffer_create_tag(imhtml->text_buffer, str, "background", color, NULL); | 3332 tag = gtk_text_buffer_create_tag(imhtml->text_buffer, str, "background", color, NULL); |
3255 | 3333 |
3256 return tag; | 3334 return tag; |
3257 } | 3335 } |
3258 | 3336 |
3337 static GtkTextTag *find_font_background_tag(GtkIMHtml *imhtml, gchar *color) | |
3338 { | |
3339 gchar str[19]; | |
3340 GtkTextTag *tag; | |
3341 | |
3342 g_snprintf(str, sizeof(str), "BACKGROUND %s", color); | |
3343 | |
3344 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(imhtml->text_buffer), str); | |
3345 if (!tag) | |
3346 tag = gtk_text_buffer_create_tag(imhtml->text_buffer, str, NULL); | |
3347 | |
3348 return tag; | |
3349 } | |
3350 | |
3259 static GtkTextTag *find_font_face_tag(GtkIMHtml *imhtml, gchar *face) | 3351 static GtkTextTag *find_font_face_tag(GtkIMHtml *imhtml, gchar *face) |
3260 { | 3352 { |
3261 gchar str[256]; | 3353 gchar str[256]; |
3262 GtkTextTag *tag; | 3354 GtkTextTag *tag; |
3263 | 3355 |
3352 static void remove_font_backcolor(GtkIMHtml *imhtml, GtkTextIter *i, GtkTextIter *e, gboolean homo) | 3444 static void remove_font_backcolor(GtkIMHtml *imhtml, GtkTextIter *i, GtkTextIter *e, gboolean homo) |
3353 { | 3445 { |
3354 remove_tag_by_prefix(imhtml, i, e, "BACKCOLOR ", 10, homo); | 3446 remove_tag_by_prefix(imhtml, i, e, "BACKCOLOR ", 10, homo); |
3355 } | 3447 } |
3356 | 3448 |
3449 static void remove_font_background(GtkIMHtml *imhtml, GtkTextIter *i, GtkTextIter *e, gboolean homo) | |
3450 { | |
3451 remove_tag_by_prefix(imhtml, i, e, "BACKGROUND ", 10, homo); | |
3452 } | |
3453 | |
3357 static void remove_font_link(GtkIMHtml *imhtml, GtkTextIter *i, GtkTextIter *e, gboolean homo) | 3454 static void remove_font_link(GtkIMHtml *imhtml, GtkTextIter *i, GtkTextIter *e, gboolean homo) |
3358 { | 3455 { |
3359 remove_tag_by_prefix(imhtml, i, e, "LINK ", 5, homo); | 3456 remove_tag_by_prefix(imhtml, i, e, "LINK ", 5, homo); |
3360 } | 3457 } |
3361 | 3458 |
3422 gtk_text_buffer_apply_tag(imhtml->text_buffer, | 3519 gtk_text_buffer_apply_tag(imhtml->text_buffer, |
3423 find_font_backcolor_tag(imhtml, imhtml->edit.backcolor), | 3520 find_font_backcolor_tag(imhtml, imhtml->edit.backcolor), |
3424 start, end); | 3521 start, end); |
3425 } | 3522 } |
3426 | 3523 |
3524 if (imhtml->edit.background) { | |
3525 remove_font_background(imhtml, start, end, TRUE); | |
3526 gtk_text_buffer_apply_tag(imhtml->text_buffer, | |
3527 find_font_background_tag(imhtml, imhtml->edit.background), | |
3528 start, end); | |
3529 } | |
3427 if (imhtml->edit.fontface) { | 3530 if (imhtml->edit.fontface) { |
3428 remove_font_face(imhtml, start, end, TRUE); | 3531 remove_font_face(imhtml, start, end, TRUE); |
3429 gtk_text_buffer_apply_tag(imhtml->text_buffer, | 3532 gtk_text_buffer_apply_tag(imhtml->text_buffer, |
3430 find_font_face_tag(imhtml, imhtml->edit.fontface), | 3533 find_font_face_tag(imhtml, imhtml->edit.fontface), |
3431 start, end); | 3534 start, end); |
3786 } | 3889 } |
3787 object = g_object_ref(G_OBJECT(imhtml)); | 3890 object = g_object_ref(G_OBJECT(imhtml)); |
3788 g_object_unref(object); | 3891 g_object_unref(object); |
3789 } | 3892 } |
3790 | 3893 |
3894 #define gtk_imhtml_toggle_str_tag(imhtml, color, edit_field, remove_func, find_func) { \ | |
3895 GObject *object; \ | |
3896 GtkTextIter start, end; \ | |
3897 \ | |
3898 g_free(edit_field); \ | |
3899 edit_field = NULL; \ | |
3900 \ | |
3901 if (color && strcmp(color, "") != 0) { \ | |
3902 edit_field = g_strdup(color); \ | |
3903 \ | |
3904 if (imhtml->wbfo) { \ | |
3905 gtk_text_buffer_get_bounds(imhtml->text_buffer, &start, &end); \ | |
3906 remove_func(imhtml, &start, &end, TRUE); \ | |
3907 gtk_text_buffer_apply_tag(imhtml->text_buffer, \ | |
3908 find_func(imhtml, edit_field), &start, &end); \ | |
3909 } else { \ | |
3910 gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &start, \ | |
3911 gtk_text_buffer_get_mark(imhtml->text_buffer, "insert")); \ | |
3912 if (imhtml->editable && gtk_text_buffer_get_selection_bounds(imhtml->text_buffer, &start, &end)) { \ | |
3913 remove_func(imhtml, &start, &end, FALSE); \ | |
3914 gtk_text_buffer_apply_tag(imhtml->text_buffer, \ | |
3915 find_func(imhtml, \ | |
3916 edit_field), \ | |
3917 &start, &end); \ | |
3918 } \ | |
3919 } \ | |
3920 } else { \ | |
3921 if (imhtml->wbfo) { \ | |
3922 gtk_text_buffer_get_bounds(imhtml->text_buffer, &start, &end); \ | |
3923 remove_func(imhtml, &start, &end, TRUE); \ | |
3924 } \ | |
3925 } \ | |
3926 \ | |
3927 object = g_object_ref(G_OBJECT(imhtml)); \ | |
3928 g_object_unref(object); \ | |
3929 \ | |
3930 return edit_field != NULL; \ | |
3931 } | |
3932 | |
3791 gboolean gtk_imhtml_toggle_forecolor(GtkIMHtml *imhtml, const char *color) | 3933 gboolean gtk_imhtml_toggle_forecolor(GtkIMHtml *imhtml, const char *color) |
3792 { | 3934 { |
3793 GObject *object; | 3935 gtk_imhtml_toggle_str_tag(imhtml, color, imhtml->edit.forecolor, remove_font_forecolor, find_font_forecolor_tag); |
3794 GtkTextIter start, end; | |
3795 | |
3796 if (imhtml->edit.forecolor != NULL) | |
3797 g_free(imhtml->edit.forecolor); | |
3798 | |
3799 if (color && strcmp(color, "") != 0) { | |
3800 imhtml->edit.forecolor = g_strdup(color); | |
3801 if (imhtml->wbfo) { | |
3802 gtk_text_buffer_get_bounds(imhtml->text_buffer, &start, &end); | |
3803 remove_font_forecolor(imhtml, &start, &end, TRUE); | |
3804 gtk_text_buffer_apply_tag(imhtml->text_buffer, | |
3805 find_font_forecolor_tag(imhtml, imhtml->edit.forecolor), &start, &end); | |
3806 } else if (imhtml->editable && gtk_text_buffer_get_selection_bounds(imhtml->text_buffer, &start, &end)) { | |
3807 remove_font_forecolor(imhtml, &start, &end, FALSE); | |
3808 gtk_text_buffer_apply_tag(imhtml->text_buffer, | |
3809 find_font_forecolor_tag(imhtml, imhtml->edit.forecolor), | |
3810 &start, &end); | |
3811 } | |
3812 } else { | |
3813 imhtml->edit.forecolor = NULL; | |
3814 if (imhtml->wbfo) { | |
3815 gtk_text_buffer_get_bounds(imhtml->text_buffer, &start, &end); | |
3816 remove_font_forecolor(imhtml, &start, &end, TRUE); | |
3817 } | |
3818 } | |
3819 | |
3820 object = g_object_ref(G_OBJECT(imhtml)); | |
3821 g_object_unref(object); | |
3822 | |
3823 return imhtml->edit.forecolor != NULL; | |
3824 } | 3936 } |
3825 | 3937 |
3826 gboolean gtk_imhtml_toggle_backcolor(GtkIMHtml *imhtml, const char *color) | 3938 gboolean gtk_imhtml_toggle_backcolor(GtkIMHtml *imhtml, const char *color) |
3827 { | 3939 { |
3828 GObject *object; | 3940 gtk_imhtml_toggle_str_tag(imhtml, color, imhtml->edit.backcolor, remove_font_backcolor, find_font_backcolor_tag); |
3829 GtkTextIter start, end; | 3941 } |
3830 struct backcolor_tag *bct = NULL; | 3942 |
3831 | 3943 gboolean gtk_imhtml_toggle_background(GtkIMHtml *imhtml, const char *color) |
3832 if (imhtml->edit.backcolor != NULL) | 3944 { |
3833 g_free(imhtml->edit.backcolor); | 3945 gtk_imhtml_toggle_str_tag(imhtml, color, imhtml->edit.background, remove_font_background, find_font_background_tag); |
3834 | |
3835 imhtml->edit.backcolor = NULL; | |
3836 | |
3837 if (color && strcmp(color, "") != 0) { | |
3838 imhtml->edit.backcolor = g_strdup(color); | |
3839 | |
3840 if (imhtml->wbfo) { | |
3841 gtk_text_buffer_get_bounds(imhtml->text_buffer, &start, &end); | |
3842 remove_font_backcolor(imhtml, &start, &end, TRUE); | |
3843 gtk_text_buffer_apply_tag(imhtml->text_buffer, | |
3844 find_font_backcolor_tag(imhtml, imhtml->edit.backcolor), &start, &end); | |
3845 bct = g_malloc(sizeof(struct backcolor_tag)); | |
3846 bct->color = strdup(imhtml->edit.backcolor); | |
3847 bct->start = gtk_text_buffer_create_mark(imhtml->text_buffer, NULL, &start, TRUE); | |
3848 bct->end = gtk_text_buffer_create_mark(imhtml->text_buffer, NULL, &end, TRUE); | |
3849 imhtml->backcolor_tags = g_slist_prepend(imhtml->backcolor_tags, bct); | |
3850 } else { | |
3851 bct = g_malloc(sizeof(struct backcolor_tag)); | |
3852 bct->color = strdup(imhtml->edit.backcolor); | |
3853 gtk_text_buffer_get_iter_at_mark (imhtml->text_buffer, &start, | |
3854 gtk_text_buffer_get_mark(imhtml->text_buffer, "insert")); | |
3855 bct->start = gtk_text_buffer_create_mark(imhtml->text_buffer, NULL, &start, TRUE); | |
3856 bct->end = NULL; | |
3857 imhtml->backcolor_tags = g_slist_prepend(imhtml->backcolor_tags, bct); | |
3858 if (imhtml->editable && gtk_text_buffer_get_selection_bounds(imhtml->text_buffer, &start, &end)) { | |
3859 remove_font_backcolor(imhtml, &start, &end, FALSE); | |
3860 gtk_text_buffer_apply_tag(imhtml->text_buffer, | |
3861 find_font_backcolor_tag(imhtml, | |
3862 imhtml->edit.backcolor), &start, &end); | |
3863 } | |
3864 } | |
3865 } else { | |
3866 if (imhtml->backcolor_tags) { | |
3867 bct = ((struct backcolor_tag*)(imhtml->backcolor_tags->data)); | |
3868 if (bct->end == NULL) { | |
3869 gtk_text_buffer_get_iter_at_mark (imhtml->text_buffer, &end, | |
3870 gtk_text_buffer_get_mark(imhtml->text_buffer, "insert")); | |
3871 bct->end = gtk_text_buffer_create_mark(imhtml->text_buffer, NULL, &end, TRUE); | |
3872 } | |
3873 } | |
3874 if (imhtml->wbfo) { | |
3875 gtk_text_buffer_get_bounds(imhtml->text_buffer, &start, &end); | |
3876 remove_font_backcolor(imhtml, &start, &end, TRUE); | |
3877 } | |
3878 } | |
3879 | |
3880 object = g_object_ref(G_OBJECT(imhtml)); | |
3881 g_object_unref(object); | |
3882 | |
3883 return imhtml->edit.backcolor != NULL; | |
3884 } | 3946 } |
3885 | 3947 |
3886 gboolean gtk_imhtml_toggle_fontface(GtkIMHtml *imhtml, const char *face) | 3948 gboolean gtk_imhtml_toggle_fontface(GtkIMHtml *imhtml, const char *face) |
3887 { | 3949 { |
3888 GObject *object; | 3950 gtk_imhtml_toggle_str_tag(imhtml, face, imhtml->edit.fontface, remove_font_face, find_font_face_tag); |
3889 GtkTextIter start, end; | |
3890 | |
3891 if (imhtml->edit.fontface != NULL) | |
3892 g_free(imhtml->edit.fontface); | |
3893 | |
3894 if (face && strcmp(face, "") != 0) { | |
3895 imhtml->edit.fontface = g_strdup(face); | |
3896 | |
3897 if (imhtml->wbfo) { | |
3898 gtk_text_buffer_get_bounds(imhtml->text_buffer, &start, &end); | |
3899 remove_font_face(imhtml, &start, &end, TRUE); | |
3900 gtk_text_buffer_apply_tag(imhtml->text_buffer, | |
3901 find_font_face_tag(imhtml, imhtml->edit.fontface), &start, &end); | |
3902 } else if (imhtml->editable && gtk_text_buffer_get_selection_bounds(imhtml->text_buffer, &start, &end)) { | |
3903 remove_font_face(imhtml, &start, &end, FALSE); | |
3904 gtk_text_buffer_apply_tag(imhtml->text_buffer, | |
3905 find_font_face_tag(imhtml, imhtml->edit.fontface), | |
3906 &start, &end); | |
3907 } | |
3908 } else { | |
3909 imhtml->edit.fontface = NULL; | |
3910 if (imhtml->wbfo) { | |
3911 gtk_text_buffer_get_bounds(imhtml->text_buffer, &start, &end); | |
3912 remove_font_face(imhtml, &start, &end, TRUE); | |
3913 } | |
3914 } | |
3915 | |
3916 object = g_object_ref(G_OBJECT(imhtml)); | |
3917 g_object_unref(object); | |
3918 | |
3919 return imhtml->edit.fontface != NULL; | |
3920 } | 3951 } |
3921 | 3952 |
3922 void gtk_imhtml_toggle_link(GtkIMHtml *imhtml, const char *url) | 3953 void gtk_imhtml_toggle_link(GtkIMHtml *imhtml, const char *url) |
3923 { | 3954 { |
3924 GObject *object; | 3955 GObject *object; |
4114 g_snprintf(buf, sizeof(buf), "<font color=\"%s\">", &name[10]); | 4145 g_snprintf(buf, sizeof(buf), "<font color=\"%s\">", &name[10]); |
4115 return buf; | 4146 return buf; |
4116 } else if (strncmp(name, "BACKCOLOR ", 10) == 0) { | 4147 } else if (strncmp(name, "BACKCOLOR ", 10) == 0) { |
4117 g_snprintf(buf, sizeof(buf), "<font back=\"%s\">", &name[10]); | 4148 g_snprintf(buf, sizeof(buf), "<font back=\"%s\">", &name[10]); |
4118 return buf; | 4149 return buf; |
4150 } else if (strncmp(name, "BACKGROUND ", 10) == 0) { | |
4151 g_snprintf(buf, sizeof(buf), "<body bgcolor=\"%s\">", &name[11]); | |
4152 return buf; | |
4119 } else if (strncmp(name, "FONT FACE ", 10) == 0) { | 4153 } else if (strncmp(name, "FONT FACE ", 10) == 0) { |
4120 g_snprintf(buf, sizeof(buf), "<font face=\"%s\">", &name[10]); | 4154 g_snprintf(buf, sizeof(buf), "<font face=\"%s\">", &name[10]); |
4121 return buf; | 4155 return buf; |
4122 } else if (strncmp(name, "FONT SIZE ", 10) == 0) { | 4156 } else if (strncmp(name, "FONT SIZE ", 10) == 0) { |
4123 g_snprintf(buf, sizeof(buf), "<font size=\"%s\">", &name[10]); | 4157 g_snprintf(buf, sizeof(buf), "<font size=\"%s\">", &name[10]); |
4146 return "</a>"; | 4180 return "</a>"; |
4147 } else if (strncmp(name, "FORECOLOR ", 10) == 0) { | 4181 } else if (strncmp(name, "FORECOLOR ", 10) == 0) { |
4148 return "</font>"; | 4182 return "</font>"; |
4149 } else if (strncmp(name, "BACKCOLOR ", 10) == 0) { | 4183 } else if (strncmp(name, "BACKCOLOR ", 10) == 0) { |
4150 return "</font>"; | 4184 return "</font>"; |
4185 } else if (strncmp(name, "BACKGROUND ", 10) == 0) { | |
4186 return "</body>"; | |
4151 } else if (strncmp(name, "FONT FACE ", 10) == 0) { | 4187 } else if (strncmp(name, "FONT FACE ", 10) == 0) { |
4152 return "</font>"; | 4188 return "</font>"; |
4153 } else if (strncmp(name, "FONT SIZE ", 10) == 0) { | 4189 } else if (strncmp(name, "FONT SIZE ", 10) == 0) { |
4154 return "</font>"; | 4190 return "</font>"; |
4155 } else { | 4191 } else { |