diff options
author | Koen Kooi <koen@openembedded.org> | 2005-06-30 08:19:37 +0000 |
---|---|---|
committer | OpenEmbedded Project <openembedded-devel@lists.openembedded.org> | 2005-06-30 08:19:37 +0000 |
commit | c8e5702127e507e82e6f68a4b8c546803accea9d (patch) | |
tree | 00583491f40ecc640f2b28452af995e3a63a09d7 /packages/gtk+/gtk+-2.6.4-1.osso7/gtktextbuffer.c.diff | |
parent | 87ec8ca4d2e2eb4d1c1e1e1a6b46a395d56805b9 (diff) |
import clean BK tree at cset 1.3670
Diffstat (limited to 'packages/gtk+/gtk+-2.6.4-1.osso7/gtktextbuffer.c.diff')
-rw-r--r-- | packages/gtk+/gtk+-2.6.4-1.osso7/gtktextbuffer.c.diff | 443 |
1 files changed, 443 insertions, 0 deletions
diff --git a/packages/gtk+/gtk+-2.6.4-1.osso7/gtktextbuffer.c.diff b/packages/gtk+/gtk+-2.6.4-1.osso7/gtktextbuffer.c.diff index e69de29bb2..7a984dfb8c 100644 --- a/packages/gtk+/gtk+-2.6.4-1.osso7/gtktextbuffer.c.diff +++ b/packages/gtk+/gtk+-2.6.4-1.osso7/gtktextbuffer.c.diff @@ -0,0 +1,443 @@ +--- gtk+-2.6.4/gtk/gtktextbuffer.c 2004-11-01 21:57:13.000000000 +0200 ++++ gtk+-2.6.4/gtk/gtktextbuffer.c 2005-04-06 16:19:38.023757872 +0300 +@@ -1,5 +1,6 @@ + /* GTK - The GIMP Toolkit + * gtktextbuffer.c Copyright (C) 2000 Red Hat, Inc. ++ * Copyright (C) 2004 Nokia Corporation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public +@@ -39,6 +40,17 @@ + #include "gtktextbtree.h" + #include "gtktextiterprivate.h" + #include "gtkintl.h" ++#include "gtktextbufferserialize.h" ++ ++#define GTK_TEXT_BUFFER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_TEXT_BUFFER, GtkTextBufferPrivate)) ++ ++typedef struct _GtkTextBufferPrivate GtkTextBufferPrivate; ++ ++struct _GtkTextBufferPrivate ++{ ++ gboolean can_paste_rich_text; ++ gchar *rich_text_format; ++}; + + typedef struct _ClipboardRequest ClipboardRequest; + +@@ -71,7 +83,10 @@ + PROP_0, + + /* Construct */ +- PROP_TAG_TABLE ++ PROP_TAG_TABLE, ++ ++ PROP_CAN_PASTE_RICH_TEXT, ++ PROP_RICH_TEXT_FORMAT + }; + + enum { +@@ -79,6 +94,8 @@ + TARGET_TEXT, + TARGET_COMPOUND_TEXT, + TARGET_UTF8_STRING, ++ TARGET_TEXT_VIEW_MARKUP, ++ TARGET_TEXT_VIEW_RICH_TEXT_FORMAT, + TARGET_TEXT_BUFFER_CONTENTS + }; + +@@ -185,7 +202,20 @@ + P_("Text Tag Table"), + GTK_TYPE_TEXT_TAG_TABLE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); ++ g_object_class_install_property (object_class, ++ PROP_CAN_PASTE_RICH_TEXT, ++ g_param_spec_boolean ("can_paste_rich_text", ++ P_("Can paste rich text"), ++ P_("Whether it should be possible to paste rich text to the buffer"), ++ FALSE, G_PARAM_READWRITE)); ++ g_object_class_install_property (object_class, ++ PROP_RICH_TEXT_FORMAT, ++ g_param_spec_string ("rich_text_format", ++ P_("Rich Text Format"), ++ P_("Name of a collection of tags that the text view supports"), ++ NULL, G_PARAM_READWRITE)); + ++ + signals[INSERT_TEXT] = + g_signal_new ("insert_text", + G_OBJECT_CLASS_TYPE (object_class), +@@ -335,7 +365,9 @@ + NULL, NULL, + _gtk_marshal_VOID__VOID, + G_TYPE_NONE, +- 0); ++ 0); ++ ++ g_type_class_add_private (object_class, sizeof (GtkTextBufferPrivate)); + } + + static void +@@ -385,7 +417,12 @@ + case PROP_TAG_TABLE: + set_table (text_buffer, g_value_get_object (value)); + break; +- ++ case PROP_CAN_PASTE_RICH_TEXT: ++ gtk_text_buffer_set_can_paste_rich_text (text_buffer, g_value_get_boolean (value)); ++ break; ++ case PROP_RICH_TEXT_FORMAT: ++ gtk_text_buffer_set_rich_text_format (text_buffer, g_value_get_string (value)); ++ break; + default: + break; + } +@@ -406,7 +443,14 @@ + case PROP_TAG_TABLE: + g_value_set_object (value, get_table (text_buffer)); + break; +- ++ case PROP_CAN_PASTE_RICH_TEXT: ++ g_value_set_boolean (value, ++ gtk_text_buffer_get_can_paste_rich_text (text_buffer)); ++ break; ++ case PROP_RICH_TEXT_FORMAT: ++ g_value_set_string (value, ++ gtk_text_buffer_get_rich_text_format (text_buffer)); ++ break; + default: + break; + } +@@ -434,11 +478,14 @@ + gtk_text_buffer_finalize (GObject *object) + { + GtkTextBuffer *buffer; ++ GtkTextBufferPrivate *priv; + + buffer = GTK_TEXT_BUFFER (object); + + remove_all_selection_clipboards (buffer); + ++ priv = GTK_TEXT_BUFFER_GET_PRIVATE (buffer); ++ + if (buffer->tag_table) + { + _gtk_text_tag_table_remove_buffer (buffer->tag_table, buffer); +@@ -456,7 +503,9 @@ + free_log_attr_cache (buffer->log_attr_cache); + + buffer->log_attr_cache = NULL; +- ++ ++ g_free (priv->rich_text_format); ++ + G_OBJECT_CLASS (parent_class)->finalize (object); + } + +@@ -2738,8 +2787,7 @@ + + if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) + { +- if (selection_data->target == +- gdk_atom_intern ("GTK_TEXT_BUFFER_CONTENTS", FALSE)) ++ if (info == TARGET_TEXT_BUFFER_CONTENTS) + { + /* Provide the address of the buffer; this will only be + * used within-process +@@ -2750,6 +2798,32 @@ + (void*)&buffer, + sizeof (buffer)); + } ++ else if (info == TARGET_TEXT_VIEW_MARKUP) ++ { ++ gchar *str; ++ gint len; ++ ++ str = gtk_text_buffer_serialize_rich_text (buffer, &start, &end, &len); ++ ++ gtk_selection_data_set (selection_data, ++ gdk_atom_intern ("application/x-gtk-text-view-markup", FALSE), ++ 8, /* bytes */ ++ str, len); ++ g_free (str); ++ } ++ else if (info == TARGET_TEXT_VIEW_RICH_TEXT_FORMAT) ++ { ++ gint len; ++ gchar *format; ++ ++ format = g_object_get_data (G_OBJECT (buffer), "gtk-text-buffer-clipboard-format"); ++ len = format ? strlen (format) : -1; ++ ++ gtk_selection_data_set (selection_data, ++ gdk_atom_intern ("application/x-gtk-text-view-rich-text-format", FALSE), ++ 8, /* bytes */ ++ format, len); ++ } + else + { + gchar *str; +@@ -2765,10 +2839,16 @@ + create_clipboard_contents_buffer (GtkTextBuffer *buffer) + { + GtkTextBuffer *contents; ++ gchar *format; + + contents = gtk_text_buffer_new (gtk_text_buffer_get_tag_table (buffer)); + ++ format = GTK_TEXT_BUFFER_GET_PRIVATE (buffer)->rich_text_format; ++ + g_object_set_data (G_OBJECT (contents), "gtk-text-buffer-clipboard", GINT_TO_POINTER (1)); ++ ++ g_object_set_data_full (G_OBJECT (contents), "gtk-text-buffer-clipboard-format", ++ format ? g_strdup (format) : NULL, g_free); + + return contents; + } +@@ -2786,8 +2866,7 @@ + + g_assert (contents); /* This should never be called unless we own the clipboard */ + +- if (selection_data->target == +- gdk_atom_intern ("GTK_TEXT_BUFFER_CONTENTS", FALSE)) ++ if (info == TARGET_TEXT_BUFFER_CONTENTS) + { + /* Provide the address of the clipboard buffer; this will only + * be used within-process. OK to supply a NULL value for contents. +@@ -2798,6 +2877,35 @@ + (void*)&contents, + sizeof (contents)); + } ++ else if (info == TARGET_TEXT_VIEW_MARKUP) ++ { ++ gchar *str; ++ gint *len; ++ GtkTextIter start, end; ++ ++ gtk_text_buffer_get_bounds (contents, &start, &end); ++ ++ str = gtk_text_buffer_serialize_rich_text (contents, &start, &end, &len); ++ ++ gtk_selection_data_set (selection_data, ++ gdk_atom_intern ("application/x-gtk-text-view-markup", FALSE), ++ 8, /* bytes */ ++ str, len); ++ g_free (str); ++ } ++ else if (info == TARGET_TEXT_VIEW_RICH_TEXT_FORMAT) ++ { ++ gint len; ++ gchar *format; ++ ++ format = g_object_get_data (G_OBJECT (contents), "gtk-text-buffer-clipboard-format"); ++ len = format ? strlen (format) : -1; ++ ++ gtk_selection_data_set (selection_data, ++ gdk_atom_intern ("application/x-gtk-text-view-rich-text-format", FALSE), ++ 8, /* bytes */ ++ format, len); ++ } + else + { + gchar *str; +@@ -2992,6 +3100,54 @@ + #endif + + static void ++clipboard_text_view_markup_received (GtkClipboard *clipboard, ++ GtkSelectionData *selection_data, ++ gpointer data) ++{ ++ ClipboardRequest *request_data = data; ++ GtkTextIter insert_point; ++ gboolean retval = TRUE; ++ GError *error = NULL; ++ GtkTextBufferPrivate *priv; ++ ++ priv = GTK_TEXT_BUFFER_GET_PRIVATE (request_data->buffer); ++ ++ if (selection_data->target == ++ gdk_atom_intern ("application/x-gtk-text-view-markup", FALSE)) ++ { ++ pre_paste_prep (request_data, &insert_point); ++ ++ if (request_data->interactive) ++ gtk_text_buffer_begin_user_action (request_data->buffer); ++ ++ if (!request_data->interactive || ++ gtk_text_iter_can_insert (&insert_point, request_data->default_editable)) ++ retval = gtk_text_buffer_deserialize_rich_text (request_data->buffer, ++ &insert_point, ++ selection_data->data, selection_data->length, ++ priv->rich_text_format == NULL, &error); ++ ++ if (!retval) ++ { ++ g_warning ("error pasting: %s\n", error->message); ++ } ++ ++ if (request_data->interactive) ++ gtk_text_buffer_end_user_action (request_data->buffer); ++ ++ if (retval) { ++ post_paste_cleanup (request_data); ++ return; ++ } ++ } ++ ++ /* Request the text selection instead */ ++ gtk_clipboard_request_text (clipboard, ++ clipboard_text_received, ++ data); ++} ++ ++static void + paste_from_buffer (ClipboardRequest *request_data, + GtkTextBuffer *src_buffer, + const GtkTextIter *start, +@@ -3029,6 +3185,35 @@ + g_free (request_data); + } + ++static gboolean ++formats_match (GtkClipboard *clipboard, const gchar *format) ++{ ++ GtkSelectionData *data; ++ gchar *tmp; ++ gboolean retval; ++ ++ if (!format) ++ return TRUE; ++ ++ data = gtk_clipboard_wait_for_contents (clipboard, ++ gdk_atom_intern ("application/x-gtk-text-view-rich-text-format", FALSE)); ++ ++ if (data->length <= 0) ++ retval = FALSE; ++ else ++ { ++ tmp = g_strndup (data->data, data->length); ++ ++ retval = (strcmp (tmp, format) == 0); ++ ++ g_free (tmp); ++ } ++ ++ gtk_selection_data_free (data); ++ ++ return retval; ++} ++ + static void + clipboard_clipboard_buffer_received (GtkClipboard *clipboard, + GtkSelectionData *selection_data, +@@ -3036,6 +3221,7 @@ + { + ClipboardRequest *request_data = data; + GtkTextBuffer *src_buffer; ++ GtkTextBufferPrivate *priv; + + src_buffer = selection_data_get_buffer (selection_data, request_data); + +@@ -3059,10 +3245,19 @@ + } + else + { +- /* Request the text selection instead */ +- gtk_clipboard_request_text (clipboard, +- clipboard_text_received, +- data); ++ priv = GTK_TEXT_BUFFER_GET_PRIVATE (request_data->buffer); ++ ++ if (priv->can_paste_rich_text && ++ formats_match (clipboard, priv->rich_text_format)) ++ /* Request markup */ ++ gtk_clipboard_request_contents (clipboard, ++ gdk_atom_intern ("application/x-gtk-text-view-markup", FALSE), ++ clipboard_text_view_markup_received, data); ++ else ++ /* Request the text selection instead */ ++ gtk_clipboard_request_text (clipboard, ++ clipboard_text_received, ++ data); + } + } + +@@ -3071,6 +3266,8 @@ + { "TEXT", 0, TARGET_TEXT }, + { "COMPOUND_TEXT", 0, TARGET_COMPOUND_TEXT }, + { "UTF8_STRING", 0, TARGET_UTF8_STRING }, ++ { "application/x-gtk-text-view-markup", 0, TARGET_TEXT_VIEW_MARKUP }, ++ { "application/x-gtk-text-view-rich-text-format", 0, TARGET_TEXT_VIEW_RICH_TEXT_FORMAT }, + { "GTK_TEXT_BUFFER_CONTENTS", 0, TARGET_TEXT_BUFFER_CONTENTS } + }; + +@@ -3591,6 +3788,68 @@ + } + } + ++void ++gtk_text_buffer_set_can_paste_rich_text (GtkTextBuffer *buffer, ++ gboolean can_paste_rich_text) ++{ ++ GtkTextBufferPrivate *priv; ++ ++ g_return_if_fail (GTK_IS_TEXT_BUFFER (buffer)); ++ ++ priv = GTK_TEXT_BUFFER_GET_PRIVATE (buffer); ++ ++ can_paste_rich_text = (can_paste_rich_text != FALSE); ++ ++ if (priv->can_paste_rich_text != can_paste_rich_text) ++ { ++ priv->can_paste_rich_text = can_paste_rich_text; ++ ++ g_object_notify (G_OBJECT (buffer), "can_paste_rich_text"); ++ } ++} ++ ++gboolean ++gtk_text_buffer_get_can_paste_rich_text (GtkTextBuffer *buffer) ++{ ++ GtkTextBufferPrivate *priv; ++ ++ g_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), FALSE); ++ ++ priv = GTK_TEXT_BUFFER_GET_PRIVATE (buffer); ++ ++ return priv->can_paste_rich_text; ++} ++ ++void ++gtk_text_buffer_set_rich_text_format (GtkTextBuffer *buffer, ++ const gchar *format) ++{ ++ gchar *new_format; ++ GtkTextBufferPrivate *priv; ++ ++ g_return_if_fail (GTK_IS_TEXT_BUFFER (buffer)); ++ ++ priv = GTK_TEXT_BUFFER_GET_PRIVATE (buffer); ++ ++ new_format = g_strdup (format); ++ g_free (priv->rich_text_format); ++ ++ priv->rich_text_format = new_format; ++ g_object_notify (G_OBJECT (buffer), "rich_text_format"); ++} ++ ++G_CONST_RETURN gchar * ++gtk_text_buffer_get_rich_text_format (GtkTextBuffer *buffer) ++{ ++ GtkTextBufferPrivate *priv; ++ ++ g_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), NULL); ++ ++ priv = GTK_TEXT_BUFFER_GET_PRIVATE (buffer); ++ ++ return priv->rich_text_format; ++} ++ + /* + * Logical attribute cache + */ |