Mercurial > pidgin.yaz
comparison src/gtkimhtml.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 | 12fe38c195a6 |
children | f07fbdfbe2e0 |
comparison
equal
deleted
inserted
replaced
8480:b0cebd011cc0 | 8481:6d0869404696 |
---|---|
365 * I'm adding some keyboard shortcuts too. | 365 * I'm adding some keyboard shortcuts too. |
366 */ | 366 */ |
367 | 367 |
368 gboolean gtk_key_pressed_cb(GtkIMHtml *imhtml, GdkEventKey *event, gpointer data) | 368 gboolean gtk_key_pressed_cb(GtkIMHtml *imhtml, GdkEventKey *event, gpointer data) |
369 { | 369 { |
370 GObject *object; | |
371 char buf[7]; | 370 char buf[7]; |
372 buf[0] = '\0'; | 371 buf[0] = '\0'; |
373 | 372 |
374 if (event->state & GDK_CONTROL_MASK) | 373 if (event->state & GDK_CONTROL_MASK) |
375 switch (event->keyval) { | 374 switch (event->keyval) { |
388 case 'b': /* ctrl-b is GDK_Left, which moves backwards. */ | 387 case 'b': /* ctrl-b is GDK_Left, which moves backwards. */ |
389 case 'B': | 388 case 'B': |
390 if (imhtml->format_functions & GTK_IMHTML_BOLD) { | 389 if (imhtml->format_functions & GTK_IMHTML_BOLD) { |
391 if(imhtml->html_shortcuts) { | 390 if(imhtml->html_shortcuts) { |
392 gtk_imhtml_toggle_bold(imhtml); | 391 gtk_imhtml_toggle_bold(imhtml); |
393 object = g_object_ref(G_OBJECT(imhtml)); | |
394 g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_BOLD); | |
395 g_object_unref(object); | |
396 return TRUE; | 392 return TRUE; |
397 } | 393 } |
398 } | 394 } |
399 return FALSE; | 395 return FALSE; |
400 break; | 396 break; |
408 return TRUE; | 404 return TRUE; |
409 break; | 405 break; |
410 | 406 |
411 case 'i': | 407 case 'i': |
412 case 'I': | 408 case 'I': |
413 if (imhtml->format_functions & GTK_IMHTML_ITALIC) | 409 if (imhtml->format_functions & GTK_IMHTML_ITALIC) { |
414 if(imhtml->html_shortcuts) { | 410 if(imhtml->html_shortcuts) { |
415 gtk_imhtml_toggle_italic(imhtml); | 411 gtk_imhtml_toggle_italic(imhtml); |
416 object = g_object_ref(G_OBJECT(imhtml)); | |
417 g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_ITALIC); | |
418 g_object_unref(object); | |
419 return TRUE; | 412 return TRUE; |
420 } | 413 } |
414 } | |
421 return FALSE; | 415 return FALSE; |
422 break; | 416 break; |
423 | 417 |
424 case 'u': /* ctrl-u is GDK_Clear, which clears the line. */ | 418 case 'u': /* ctrl-u is GDK_Clear, which clears the line. */ |
425 case 'U': | 419 case 'U': |
426 if (imhtml->format_functions & GTK_IMHTML_UNDERLINE) | 420 if (imhtml->format_functions & GTK_IMHTML_UNDERLINE) { |
427 if(imhtml->html_shortcuts) { | 421 if(imhtml->html_shortcuts) { |
428 gtk_imhtml_toggle_underline(imhtml); | 422 gtk_imhtml_toggle_underline(imhtml); |
429 object = g_object_ref(G_OBJECT(imhtml)); | |
430 g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_UNDERLINE); | |
431 g_object_unref(object); | |
432 return TRUE; | 423 return TRUE; |
433 } | 424 } |
425 } | |
434 return FALSE; | 426 return FALSE; |
435 break; | 427 break; |
436 | 428 |
437 case '-': | 429 case '-': |
438 if (imhtml->format_functions & GTK_IMHTML_SHRINK) | 430 if (imhtml->format_functions & GTK_IMHTML_SHRINK) |
654 G_TYPE_FROM_CLASS(gobject_class), | 646 G_TYPE_FROM_CLASS(gobject_class), |
655 G_SIGNAL_RUN_FIRST, | 647 G_SIGNAL_RUN_FIRST, |
656 G_STRUCT_OFFSET(GtkIMHtmlClass, clear_format), | 648 G_STRUCT_OFFSET(GtkIMHtmlClass, clear_format), |
657 NULL, | 649 NULL, |
658 0, | 650 0, |
659 g_cclosure_marshal_VOID__VOID, | 651 g_cclosure_marshal_VOID__VOID, |
660 G_TYPE_NONE, 0); | 652 G_TYPE_NONE, 0); |
661 gobject_class->finalize = gtk_imhtml_finalize; | 653 gobject_class->finalize = gtk_imhtml_finalize; |
662 } | 654 } |
663 | 655 |
664 static void gtk_imhtml_init (GtkIMHtml *imhtml) | 656 static void gtk_imhtml_init (GtkIMHtml *imhtml) |
665 { | 657 { |
2076 gtk_smiley_tree_destroy(imhtml->default_smilies); | 2068 gtk_smiley_tree_destroy(imhtml->default_smilies); |
2077 imhtml->smiley_data = g_hash_table_new_full(g_str_hash, g_str_equal, | 2069 imhtml->smiley_data = g_hash_table_new_full(g_str_hash, g_str_equal, |
2078 g_free, (GDestroyNotify)gtk_smiley_tree_destroy); | 2070 g_free, (GDestroyNotify)gtk_smiley_tree_destroy); |
2079 imhtml->default_smilies = gtk_smiley_tree_new(); | 2071 imhtml->default_smilies = gtk_smiley_tree_new(); |
2080 } | 2072 } |
2073 | |
2081 void gtk_imhtml_show_smileys (GtkIMHtml *imhtml, | 2074 void gtk_imhtml_show_smileys (GtkIMHtml *imhtml, |
2082 gboolean show) | 2075 gboolean show) |
2083 { | 2076 { |
2084 imhtml->show_smileys = show; | 2077 imhtml->show_smileys = show; |
2085 } | 2078 } |
2142 imhtml->edit.fontface = NULL; | 2135 imhtml->edit.fontface = NULL; |
2143 imhtml->edit.forecolor = NULL; | 2136 imhtml->edit.forecolor = NULL; |
2144 imhtml->edit.backcolor = NULL; | 2137 imhtml->edit.backcolor = NULL; |
2145 imhtml->edit.sizespan = NULL; | 2138 imhtml->edit.sizespan = NULL; |
2146 imhtml->edit.fontsize = 3; | 2139 imhtml->edit.fontsize = 3; |
2147 printf("Emiting signal\n"); | 2140 |
2148 g_signal_emit(object, signals[CLEAR_FORMAT], 0); | 2141 g_signal_emit(object, signals[CLEAR_FORMAT], 0); |
2149 g_object_unref(object); | 2142 g_object_unref(object); |
2150 } | 2143 } |
2151 | 2144 |
2152 void gtk_imhtml_page_up (GtkIMHtml *imhtml) | 2145 void gtk_imhtml_page_up (GtkIMHtml *imhtml) |
2554 g_signal_emit(object, signals[BUTTONS_UPDATE], 0, buttons); | 2547 g_signal_emit(object, signals[BUTTONS_UPDATE], 0, buttons); |
2555 imhtml->format_functions = buttons; | 2548 imhtml->format_functions = buttons; |
2556 g_object_unref(object); | 2549 g_object_unref(object); |
2557 } | 2550 } |
2558 | 2551 |
2552 void gtk_imhtml_get_current_format(GtkIMHtml *imhtml, gint offset, | |
2553 gboolean *bold, gboolean *italic, | |
2554 gboolean *underline) | |
2555 { | |
2556 GtkTextMark *ins_mark; | |
2557 GtkTextIter ins_iter, adj_iter, end_iter; | |
2558 GSList *tags; | |
2559 gint position, length, adjusted; | |
2560 | |
2561 printf("get_current_format\n"); | |
2562 | |
2563 /* grab the current cursor position compensate for the way that the | |
2564 * direction that the cursor was moved so that we get all the tags | |
2565 * for that current location | |
2566 */ | |
2567 ins_mark = gtk_text_buffer_get_insert(imhtml->text_buffer); | |
2568 gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &ins_iter, ins_mark); | |
2569 position = gtk_text_iter_get_offset(&ins_iter); | |
2570 | |
2571 gtk_text_buffer_get_end_iter(imhtml->text_buffer, &end_iter); | |
2572 length = gtk_text_iter_get_offset(&end_iter); | |
2573 | |
2574 adjusted = position + offset; | |
2575 if(offset < 0) { /* moving left or up */ | |
2576 if(adjusted <= 0) | |
2577 adjusted = 1; | |
2578 } else if(offset > 0) { /* moving right or down */ | |
2579 if(adjusted >= length) | |
2580 adjusted = length - 1; | |
2581 } | |
2582 | |
2583 printf("position: %d, offset: %d, length: %d, adjusted: %d\n", | |
2584 position, offset, length, adjusted); | |
2585 | |
2586 gtk_text_buffer_get_iter_at_offset(imhtml->text_buffer, &adj_iter, adjusted); | |
2587 | |
2588 /* grab the tags that apply to the cursor location */ | |
2589 for(tags = gtk_text_iter_get_tags(&adj_iter); | |
2590 tags != NULL; tags = tags->next) | |
2591 { | |
2592 GtkTextTag *tag = GTK_TEXT_TAG(tags->data); | |
2593 if(tag->name) { | |
2594 printf("tag: %s\n", tag->name); | |
2595 if(g_ascii_strcasecmp(tag->name, "BOLD") == 0) | |
2596 (*bold) = TRUE; | |
2597 if(g_ascii_strcasecmp(tag->name, "ITALICS") == 0) | |
2598 (*italic) = TRUE; | |
2599 if(g_ascii_strcasecmp(tag->name, "UNDERLINE") == 0) | |
2600 (*underline) = TRUE; | |
2601 } | |
2602 } | |
2603 } | |
2604 | |
2559 gboolean gtk_imhtml_get_editable(GtkIMHtml *imhtml) | 2605 gboolean gtk_imhtml_get_editable(GtkIMHtml *imhtml) |
2560 { | 2606 { |
2561 return imhtml->editable; | 2607 return imhtml->editable; |
2562 } | 2608 } |
2563 | 2609 |
2564 gboolean gtk_imhtml_toggle_bold(GtkIMHtml *imhtml) | 2610 gboolean gtk_imhtml_toggle_bold(GtkIMHtml *imhtml) |
2565 { | 2611 { |
2566 GtkIMHtmlFormatSpan *span; | 2612 GtkIMHtmlFormatSpan *span; |
2613 GObject *object; | |
2567 GtkTextMark *ins = gtk_text_buffer_get_insert(imhtml->text_buffer); | 2614 GtkTextMark *ins = gtk_text_buffer_get_insert(imhtml->text_buffer); |
2568 GtkTextIter iter; | 2615 GtkTextIter iter; |
2616 | |
2569 gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &iter, ins); | 2617 gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &iter, ins); |
2618 | |
2570 if (!imhtml->edit.bold) { | 2619 if (!imhtml->edit.bold) { |
2571 span = g_malloc(sizeof(GtkIMHtmlFormatSpan)); | 2620 span = g_new0(GtkIMHtmlFormatSpan, 1); |
2572 span->start = gtk_text_buffer_create_mark(imhtml->text_buffer, NULL, &iter, TRUE); | 2621 span->start = gtk_text_buffer_create_mark(imhtml->text_buffer, NULL, &iter, TRUE); |
2573 span->start_tag = g_strdup("<b>"); | 2622 span->start_tag = g_strdup("<b>"); |
2574 span->end = NULL; | 2623 span->end = NULL; |
2575 span->end_tag = g_strdup("</b>"); | 2624 span->end_tag = g_strdup("</b>"); |
2576 span->buffer = imhtml->text_buffer; | 2625 span->buffer = imhtml->text_buffer; |
2577 span->tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(imhtml->text_buffer), "BOLD"); | 2626 span->tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(imhtml->text_buffer), "BOLD"); |
2578 imhtml->edit.bold = span; | 2627 imhtml->edit.bold = span; |
2579 imhtml->format_spans = g_list_append(imhtml->format_spans, span); | 2628 imhtml->format_spans = g_list_append(imhtml->format_spans, span); |
2580 } else { | 2629 } else { |
2581 GtkTextIter start; | 2630 GtkTextIter start; |
2582 span = imhtml->edit.bold; | 2631 span = imhtml->edit.bold; |
2590 g_free(span->end_tag); | 2639 g_free(span->end_tag); |
2591 g_free(span); | 2640 g_free(span); |
2592 } | 2641 } |
2593 imhtml->edit.bold = NULL; | 2642 imhtml->edit.bold = NULL; |
2594 } | 2643 } |
2595 return imhtml->edit.bold != NULL; | 2644 |
2645 object = g_object_ref(G_OBJECT(imhtml)); | |
2646 g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_BOLD); | |
2647 g_object_unref(object); | |
2648 | |
2649 return (imhtml->edit.bold != NULL); | |
2596 } | 2650 } |
2597 | 2651 |
2598 gboolean gtk_imhtml_toggle_italic(GtkIMHtml *imhtml) | 2652 gboolean gtk_imhtml_toggle_italic(GtkIMHtml *imhtml) |
2599 { | 2653 { |
2600 GtkIMHtmlFormatSpan *span; | 2654 GtkIMHtmlFormatSpan *span; |
2655 GObject *object; | |
2601 GtkTextMark *ins = gtk_text_buffer_get_insert(imhtml->text_buffer); | 2656 GtkTextMark *ins = gtk_text_buffer_get_insert(imhtml->text_buffer); |
2602 GtkTextIter iter; | 2657 GtkTextIter iter; |
2658 | |
2603 gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &iter, ins); | 2659 gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &iter, ins); |
2660 | |
2604 if (!imhtml->edit.italic) { | 2661 if (!imhtml->edit.italic) { |
2605 span = g_malloc(sizeof(GtkIMHtmlFormatSpan)); | 2662 span = g_new0(GtkIMHtmlFormatSpan, 1); |
2606 span->start = gtk_text_buffer_create_mark(imhtml->text_buffer, NULL, &iter, TRUE); | 2663 span->start = gtk_text_buffer_create_mark(imhtml->text_buffer, NULL, &iter, TRUE); |
2607 span->start_tag = g_strdup("<i>"); | 2664 span->start_tag = g_strdup("<i>"); |
2608 span->end = NULL; | 2665 span->end = NULL; |
2609 span->end_tag = g_strdup("</i>"); | 2666 span->end_tag = g_strdup("</i>"); |
2610 span->buffer = imhtml->text_buffer; | 2667 span->buffer = imhtml->text_buffer; |
2624 g_free(span->end_tag); | 2681 g_free(span->end_tag); |
2625 g_free(span); | 2682 g_free(span); |
2626 } | 2683 } |
2627 imhtml->edit.italic = NULL; | 2684 imhtml->edit.italic = NULL; |
2628 } | 2685 } |
2686 | |
2687 object = g_object_ref(G_OBJECT(imhtml)); | |
2688 g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_ITALIC); | |
2689 g_object_unref(object); | |
2690 | |
2629 return imhtml->edit.italic != NULL; | 2691 return imhtml->edit.italic != NULL; |
2630 } | 2692 } |
2631 | 2693 |
2632 gboolean gtk_imhtml_toggle_underline(GtkIMHtml *imhtml) | 2694 gboolean gtk_imhtml_toggle_underline(GtkIMHtml *imhtml) |
2633 { | 2695 { |
2634 GtkIMHtmlFormatSpan *span; | 2696 GtkIMHtmlFormatSpan *span; |
2697 GObject *object; | |
2635 GtkTextMark *ins = gtk_text_buffer_get_insert(imhtml->text_buffer); | 2698 GtkTextMark *ins = gtk_text_buffer_get_insert(imhtml->text_buffer); |
2636 GtkTextIter iter; | 2699 GtkTextIter iter; |
2700 | |
2637 gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &iter, ins); | 2701 gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &iter, ins); |
2702 | |
2638 if (!imhtml->edit.underline) { | 2703 if (!imhtml->edit.underline) { |
2639 span = g_malloc(sizeof(GtkIMHtmlFormatSpan)); | 2704 span = g_new0(GtkIMHtmlFormatSpan, 1); |
2640 span->start = gtk_text_buffer_create_mark(imhtml->text_buffer, NULL, &iter, TRUE); | 2705 span->start = gtk_text_buffer_create_mark(imhtml->text_buffer, NULL, &iter, TRUE); |
2641 span->start_tag = g_strdup("<u>"); | 2706 span->start_tag = g_strdup("<u>"); |
2642 span->end = NULL; | 2707 span->end = NULL; |
2643 span->end_tag = g_strdup("</u>"); | 2708 span->end_tag = g_strdup("</u>"); |
2644 span->buffer = imhtml->text_buffer; | 2709 span->buffer = imhtml->text_buffer; |
2658 g_free(span->end_tag); | 2723 g_free(span->end_tag); |
2659 g_free(span); | 2724 g_free(span); |
2660 } | 2725 } |
2661 imhtml->edit.underline = NULL; | 2726 imhtml->edit.underline = NULL; |
2662 } | 2727 } |
2728 | |
2729 object = g_object_ref(G_OBJECT(imhtml)); | |
2730 g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_UNDERLINE); | |
2731 g_object_unref(object); | |
2732 | |
2663 return imhtml->edit.underline != NULL; | 2733 return imhtml->edit.underline != NULL; |
2664 } | 2734 } |
2665 | 2735 |
2666 void gtk_imhtml_font_set_size(GtkIMHtml *imhtml, gint size) | 2736 void gtk_imhtml_font_set_size(GtkIMHtml *imhtml, gint size) |
2667 { | 2737 { |
2907 GtkIMHtmlFormatSpan *sspan = NULL, *espan = NULL; | 2977 GtkIMHtmlFormatSpan *sspan = NULL, *espan = NULL; |
2908 GtkTextIter iter, siter, eiter; | 2978 GtkTextIter iter, siter, eiter; |
2909 GList *starters = imhtml->format_spans; | 2979 GList *starters = imhtml->format_spans; |
2910 GList *closers = NULL; | 2980 GList *closers = NULL; |
2911 GString *str = g_string_new(""); | 2981 GString *str = g_string_new(""); |
2982 | |
2912 g_list_sort_with_data(starters, (GCompareDataFunc)span_compare_begin, imhtml->text_buffer); | 2983 g_list_sort_with_data(starters, (GCompareDataFunc)span_compare_begin, imhtml->text_buffer); |
2913 | 2984 |
2914 gtk_text_iter_order(start, end); | 2985 gtk_text_iter_order(start, end); |
2915 iter = *start; | 2986 iter = *start; |
2916 | 2987 |
2944 * I don't really know anything about gtkimhtml, but it almost seems like | 3015 * I don't really know anything about gtkimhtml, but it almost seems like |
2945 * the line above this comments expects to find a closing html tag, but | 3016 * the line above this comments expects to find a closing html tag, but |
2946 * can't, for some reason. The warning depends on how much HTML I send | 3017 * can't, for some reason. The warning depends on how much HTML I send |
2947 * in my message, kind of. | 3018 * in my message, kind of. |
2948 */ | 3019 */ |
3020 /* comment this out until myself or someone else finishes | |
3021 * it. This is supposed to apply a tag to selected text, | |
3022 * i believe... | |
2949 gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &eiter, espan->end); | 3023 gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &eiter, espan->end); |
3024 */ | |
2950 } | 3025 } |
2951 sspan = (GtkIMHtmlFormatSpan*)starters->data; | 3026 sspan = (GtkIMHtmlFormatSpan*)starters->data; |
2952 gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &siter, sspan->start); | 3027 gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &siter, sspan->start); |
2953 starters = starters->next; | 3028 starters = starters->next; |
2954 } | 3029 } |