static void error_console_save_response (GtkWidget *dialog, gint response_id, GimpErrorConsole *console) { if (response_id == GTK_RESPONSE_OK) { GFile *file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog)); GError *error = NULL; if (! gimp_text_buffer_save (GIMP_TEXT_BUFFER (console->text_buffer), file, console->save_selection, &error)) { gimp_message (console->gimp, G_OBJECT (dialog), GIMP_MESSAGE_ERROR, _("Error writing file '%s':\n%s"), gimp_file_get_utf8_name (file), error->message); g_clear_error (&error); g_object_unref (file); return; } g_object_unref (file); } gtk_widget_destroy (dialog); }
static void gimp_text_buffer_constructed (GObject *object) { GimpTextBuffer *buffer = GIMP_TEXT_BUFFER (object); G_OBJECT_CLASS (parent_class)->constructed (object); gtk_text_buffer_set_text (GTK_TEXT_BUFFER (buffer), "", -1); buffer->bold_tag = gtk_text_buffer_create_tag (GTK_TEXT_BUFFER (buffer), "bold", "weight", PANGO_WEIGHT_BOLD, NULL); buffer->italic_tag = gtk_text_buffer_create_tag (GTK_TEXT_BUFFER (buffer), "italic", "style", PANGO_STYLE_ITALIC, NULL); buffer->underline_tag = gtk_text_buffer_create_tag (GTK_TEXT_BUFFER (buffer), "underline", "underline", PANGO_UNDERLINE_SINGLE, NULL); buffer->strikethrough_tag = gtk_text_buffer_create_tag (GTK_TEXT_BUFFER (buffer), "strikethrough", "strikethrough", TRUE, NULL); }
static void gimp_text_buffer_mark_set (GtkTextBuffer *buffer, const GtkTextIter *location, GtkTextMark *mark) { gimp_text_buffer_clear_insert_tags (GIMP_TEXT_BUFFER (buffer)); GTK_TEXT_BUFFER_CLASS (parent_class)->mark_set (buffer, location, mark); }
gchar * gimp_text_editor_get_text (GimpTextEditor *editor) { GtkTextBuffer *buffer; g_return_val_if_fail (GIMP_IS_TEXT_EDITOR (editor), NULL); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (editor->view)); return gimp_text_buffer_get_text (GIMP_TEXT_BUFFER (buffer)); }
static void gimp_text_buffer_finalize (GObject *object) { GimpTextBuffer *buffer = GIMP_TEXT_BUFFER (object); if (buffer->size_tags) { g_list_free (buffer->size_tags); buffer->size_tags = NULL; } if (buffer->baseline_tags) { g_list_free (buffer->baseline_tags); buffer->baseline_tags = NULL; } if (buffer->kerning_tags) { g_list_free (buffer->kerning_tags); buffer->kerning_tags = NULL; } if (buffer->font_tags) { g_list_free (buffer->font_tags); buffer->font_tags = NULL; } if (buffer->color_tags) { g_list_free (buffer->color_tags); buffer->color_tags = NULL; } gimp_text_buffer_clear_insert_tags (buffer); G_OBJECT_CLASS (parent_class)->finalize (object); }
static void parse_tag_element (GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, ParseInfo *info, GError **error) { GtkTextTag *tag; const gchar *attribute_name = NULL; const gchar *attribute_value = NULL; g_assert (peek_state (info) == STATE_MARKUP || peek_state (info) == STATE_TAG || peek_state (info) == STATE_UNKNOWN); if (attribute_names) attribute_name = attribute_names[0]; if (attribute_values) attribute_value = attribute_values[0]; tag = gimp_text_buffer_name_to_tag (GIMP_TEXT_BUFFER (info->register_buffer), element_name, attribute_name, attribute_value); if (tag) { info->tag_stack = g_slist_prepend (info->tag_stack, tag); push_state (info, STATE_TAG); } else { push_state (info, STATE_UNKNOWN); } }
guint8 * gimp_text_buffer_serialize (GtkTextBuffer *register_buffer, GtkTextBuffer *content_buffer, const GtkTextIter *start, const GtkTextIter *end, gsize *length, gpointer user_data) { GString *string; GtkTextIter iter, old_iter; GSList *tag_list; GSList *active_tags; string = g_string_new ("<markup>"); iter = *start; tag_list = NULL; active_tags = NULL; do { GSList *tmp; gchar *tmp_text, *escaped_text; active_tags = NULL; tag_list = gtk_text_iter_get_tags (&iter); /* Handle added tags */ for (tmp = tag_list; tmp; tmp = tmp->next) { GtkTextTag *tag = tmp->data; open_tag (GIMP_TEXT_BUFFER (register_buffer), string, tag); active_tags = g_slist_prepend (active_tags, tag); } g_slist_free (tag_list); old_iter = iter; /* Now try to go to either the next tag toggle, or if a pixbuf appears */ while (TRUE) { gunichar ch = gtk_text_iter_get_char (&iter); if (ch == 0xFFFC) { /* pixbuf? can't happen! */ } else if (ch == 0) { break; } else { gtk_text_iter_forward_char (&iter); } if (gtk_text_iter_toggles_tag (&iter, NULL)) break; } /* We might have moved too far */ if (gtk_text_iter_compare (&iter, end) > 0) iter = *end; /* Append the text */ tmp_text = gtk_text_iter_get_slice (&old_iter, &iter); escaped_text = g_markup_escape_text (tmp_text, -1); g_free (tmp_text); g_string_append (string, escaped_text); g_free (escaped_text); /* Close any open tags */ for (tmp = active_tags; tmp; tmp = tmp->next) close_tag (GIMP_TEXT_BUFFER (register_buffer), string, tmp->data); g_slist_free (active_tags); } while (! gtk_text_iter_equal (&iter, end)); g_string_append (string, "</markup>"); *length = string->len; return (guint8 *) g_string_free (string, FALSE); }
guint8 * gimp_text_buffer_serialize (GtkTextBuffer *register_buffer, GtkTextBuffer *content_buffer, const GtkTextIter *start, const GtkTextIter *end, gsize *length, gpointer user_data) { GString *string; GtkTextIter iter, old_iter; GSList *tag_list, *new_tag_list; GSList *active_tags; string = g_string_new ("<markup>"); iter = *start; tag_list = NULL; active_tags = NULL; do { GList *added, *removed; GList *tmp; gchar *tmp_text, *escaped_text; new_tag_list = gtk_text_iter_get_tags (&iter); find_list_delta (tag_list, new_tag_list, &added, &removed); /* Handle removed tags */ for (tmp = removed; tmp; tmp = tmp->next) { GtkTextTag *tag = tmp->data; /* Only close the tag if we didn't close it before (by using * the stack logic in the while() loop below) */ if (g_slist_find (active_tags, tag)) { /* Drop all tags that were opened after this one (which are * above this on in the stack), but move them to the added * list so they get re-opened again, *unless* they are also * closed at this iter */ while (active_tags->data != tag) { close_tag (GIMP_TEXT_BUFFER (register_buffer), string, active_tags->data); /* if it also in the list of removed tags, *don't* add * it to the list of added tags again */ if (! g_list_find (removed, active_tags->data)) added = g_list_prepend (added, active_tags->data); active_tags = g_slist_remove (active_tags, active_tags->data); } /* then, close the tag itself */ close_tag (GIMP_TEXT_BUFFER (register_buffer), string, tag); active_tags = g_slist_remove (active_tags, active_tags->data); } } /* Handle added tags */ for (tmp = added; tmp; tmp = tmp->next) { GtkTextTag *tag = tmp->data; open_tag (GIMP_TEXT_BUFFER (register_buffer), string, tag); active_tags = g_slist_prepend (active_tags, tag); } g_slist_free (tag_list); tag_list = new_tag_list; g_list_free (added); g_list_free (removed); old_iter = iter; /* Now try to go to either the next tag toggle, or if a pixbuf appears */ while (TRUE) { gunichar ch = gtk_text_iter_get_char (&iter); if (ch == 0xFFFC) { /* pixbuf? can't happen! */ } else if (ch == 0) { break; } else { gtk_text_iter_forward_char (&iter); } if (gtk_text_iter_toggles_tag (&iter, NULL)) break; } /* We might have moved too far */ if (gtk_text_iter_compare (&iter, end) > 0) iter = *end; /* Append the text */ tmp_text = gtk_text_iter_get_slice (&old_iter, &iter); escaped_text = g_markup_escape_text (tmp_text, -1); g_free (tmp_text); g_string_append (string, escaped_text); g_free (escaped_text); } while (! gtk_text_iter_equal (&iter, end)); g_slist_free (tag_list); /* Close any open tags */ for (tag_list = active_tags; tag_list; tag_list = tag_list->next) close_tag (GIMP_TEXT_BUFFER (register_buffer), string, tag_list->data); g_slist_free (active_tags); g_string_append (string, "</markup>"); *length = string->len; return (guint8 *) g_string_free (string, FALSE); }