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 }