X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtktextbuffer.c;h=a877e345995348e4ce5b57406de23301a25f93ef;hb=02e915273845b21af223e7e5e2425569afcf1b83;hp=a15ea87df25a6c70c27e962b9261b9da102866d4;hpb=d97cdbdf53832729141b3b66de00f770b44e3390;p=~andy%2Fgtk diff --git a/gtk/gtktextbuffer.c b/gtk/gtktextbuffer.c index a15ea87df..a877e3459 100644 --- a/gtk/gtktextbuffer.c +++ b/gtk/gtktextbuffer.c @@ -13,9 +13,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ /* @@ -38,24 +36,48 @@ #include "gtktextbufferrichtext.h" #include "gtktextbtree.h" #include "gtktextiterprivate.h" +#include "gtktexttagprivate.h" #include "gtkprivate.h" #include "gtkintl.h" -#include "gtkalias.h" -#define GTK_TEXT_BUFFER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_TEXT_BUFFER, GtkTextBufferPrivate)) +/** + * SECTION:gtktextbuffer + * @Short_description: Stores attributed text for display in a GtkTextView + * @Title: GtkTextBuffer + * @See_also: #GtkTextView, #GtkTextIter, #GtkTextMark + * + * You may wish to begin by reading the text widget + * conceptual overview which gives an overview of all the objects and data + * types related to the text widget and how they work together. + */ -typedef struct _GtkTextBufferPrivate GtkTextBufferPrivate; + +typedef struct _GtkTextLogAttrCache GtkTextLogAttrCache; struct _GtkTextBufferPrivate { GtkTargetList *copy_target_list; GtkTargetEntry *copy_target_entries; - gint n_copy_target_entries; - GtkTargetList *paste_target_list; GtkTargetEntry *paste_target_entries; + + gint n_copy_target_entries; gint n_paste_target_entries; + + GtkTextTagTable *tag_table; + GtkTextBTree *btree; + + GSList *clipboard_contents_buffers; + GSList *selection_clipboards; + + GtkTextLogAttrCache *log_attr_cache; + + guint user_action_count; + + /* Whether the buffer has been modified since last save */ + guint modified : 1; + guint has_selection : 1; }; @@ -64,10 +86,9 @@ typedef struct _ClipboardRequest ClipboardRequest; struct _ClipboardRequest { GtkTextBuffer *buffer; - gboolean interactive; - gboolean default_editable; - gboolean is_clipboard; - gboolean replace_selection; + guint interactive : 1; + guint default_editable : 1; + guint replace_selection : 1; }; enum { @@ -83,6 +104,7 @@ enum { REMOVE_TAG, BEGIN_USER_ACTION, END_USER_ACTION, + PASTE_DONE, LAST_SIGNAL }; @@ -270,7 +292,7 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * @text: the UTF-8 text to be inserted * @len: length of the inserted text in bytes * - * The insert_text signal is emitted to insert text in a #GtkTextBuffer. + * The ::insert-text signal is emitted to insert text in a #GtkTextBuffer. * Insertion actually occurs in the default handler. * * Note that if your handler runs before the default handler it must not @@ -283,7 +305,7 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * gtk_text_buffer_insert_range(). */ signals[INSERT_TEXT] = - g_signal_new (I_("insert_text"), + g_signal_new (I_("insert-text"), G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GtkTextBufferClass, insert_text), @@ -294,6 +316,8 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) GTK_TYPE_TEXT_ITER | G_SIGNAL_TYPE_STATIC_SCOPE, G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE, G_TYPE_INT); + g_signal_set_va_marshaller (signals[INSERT_TEXT], G_TYPE_FROM_CLASS (klass), + _gtk_marshal_VOID__BOXED_STRING_INTv); /** * GtkTextBuffer::insert-pixbuf: @@ -301,7 +325,7 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * @location: position to insert @pixbuf in @textbuffer * @pixbuf: the #GdkPixbuf to be inserted * - * The insert_pixbuf signal is emitted to insert a #GdkPixbuf + * The ::insert-pixbuf signal is emitted to insert a #GdkPixbuf * in a #GtkTextBuffer. Insertion actually occurs in the default handler. * * Note that if your handler runs before the default handler it must not @@ -312,7 +336,7 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * See also: gtk_text_buffer_insert_pixbuf(). */ signals[INSERT_PIXBUF] = - g_signal_new (I_("insert_pixbuf"), + g_signal_new (I_("insert-pixbuf"), G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GtkTextBufferClass, insert_pixbuf), @@ -330,7 +354,7 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * @location: position to insert @anchor in @textbuffer * @anchor: the #GtkTextChildAnchor to be inserted * - * The insert_child_anchor signal is emitted to insert a + * The ::insert-child-anchor signal is emitted to insert a * #GtkTextChildAnchor in a #GtkTextBuffer. * Insertion actually occurs in the default handler. * @@ -342,7 +366,7 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * See also: gtk_text_buffer_insert_child_anchor(). */ signals[INSERT_CHILD_ANCHOR] = - g_signal_new (I_("insert_child_anchor"), + g_signal_new (I_("insert-child-anchor"), G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GtkTextBufferClass, insert_child_anchor), @@ -359,7 +383,7 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * @start: the start of the range to be deleted * @end: the end of the range to be deleted * - * The delete_range signal is emitted to delete a range + * The ::delete-range signal is emitted to delete a range * from a #GtkTextBuffer. * * Note that if your handler runs before the default handler it must not @@ -372,7 +396,7 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * See also: gtk_text_buffer_delete(). */ signals[DELETE_RANGE] = - g_signal_new (I_("delete_range"), + g_signal_new (I_("delete-range"), G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GtkTextBufferClass, delete_range), @@ -387,7 +411,7 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * GtkTextBuffer::changed: * @textbuffer: the object which received the signal * - * The changed signal is emitted when the content of a #GtkTextBuffer + * The ::changed signal is emitted when the content of a #GtkTextBuffer * has changed. */ signals[CHANGED] = @@ -404,14 +428,14 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * GtkTextBuffer::modified-changed: * @textbuffer: the object which received the signal * - * The modified_changed signal is emitted when the modified bit of a + * The ::modified-changed signal is emitted when the modified bit of a * #GtkTextBuffer flips. * * See also: * gtk_text_buffer_set_modified(). */ signals[MODIFIED_CHANGED] = - g_signal_new (I_("modified_changed"), + g_signal_new (I_("modified-changed"), G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GtkTextBufferClass, modified_changed), @@ -426,7 +450,7 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * @location: The location of @mark in @textbuffer * @mark: The mark that is set * - * The mark_set signal is emitted as notification + * The ::mark-set signal is emitted as notification * after a #GtkTextMark is set. * * See also: @@ -434,7 +458,7 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * gtk_text_buffer_move_mark(). */ signals[MARK_SET] = - g_signal_new (I_("mark_set"), + g_signal_new (I_("mark-set"), G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GtkTextBufferClass, mark_set), @@ -450,14 +474,14 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * @textbuffer: the object which received the signal * @mark: The mark that was deleted * - * The mark_deleted signal is emitted as notification + * The ::mark-deleted signal is emitted as notification * after a #GtkTextMark is deleted. * * See also: * gtk_text_buffer_delete_mark(). */ signals[MARK_DELETED] = - g_signal_new (I_("mark_deleted"), + g_signal_new (I_("mark-deleted"), G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GtkTextBufferClass, mark_deleted), @@ -474,7 +498,7 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * @start: the start of the range the tag is applied to * @end: the end of the range the tag is applied to * - * The apply_tag signal is emitted to apply a tag to a + * The ::apply-tag signal is emitted to apply a tag to a * range of text in a #GtkTextBuffer. * Applying actually occurs in the default handler. * @@ -487,7 +511,7 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * gtk_text_buffer_insert_range(). */ signals[APPLY_TAG] = - g_signal_new (I_("apply_tag"), + g_signal_new (I_("apply-tag"), G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GtkTextBufferClass, apply_tag), @@ -507,8 +531,8 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * @start: the start of the range the tag is removed from * @end: the end of the range the tag is removed from * - * The remove_tag signal is emitted to remove all occurrences of @tag from a - * range of text in a #GtkTextBuffer. + * The ::remove-tag signal is emitted to remove all occurrences of @tag from + * a range of text in a #GtkTextBuffer. * Removal actually occurs in the default handler. * * Note that if your handler runs before the default handler it must not @@ -518,7 +542,7 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * gtk_text_buffer_remove_tag(). */ signals[REMOVE_TAG] = - g_signal_new (I_("remove_tag"), + g_signal_new (I_("remove-tag"), G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GtkTextBufferClass, remove_tag), @@ -534,7 +558,7 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * GtkTextBuffer::begin-user-action: * @textbuffer: the object which received the signal * - * The begin_user_action signal is emitted at the beginning of a single + * The ::begin-user-action signal is emitted at the beginning of a single * user-visible operation on a #GtkTextBuffer. * * See also: @@ -546,7 +570,7 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * gtk_text_buffer_delete_selection(). */ signals[BEGIN_USER_ACTION] = - g_signal_new (I_("begin_user_action"), + g_signal_new (I_("begin-user-action"), G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GtkTextBufferClass, begin_user_action), @@ -559,8 +583,8 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * GtkTextBuffer::end-user-action: * @textbuffer: the object which received the signal * - * The end_user_action signal is emitted at the end of a single - * user-visible operation #GtkTextBuffer. + * The ::end-user-action signal is emitted at the end of a single + * user-visible operation on the #GtkTextBuffer. * * See also: * gtk_text_buffer_end_user_action(), @@ -572,7 +596,7 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) * gtk_text_buffer_backspace(). */ signals[END_USER_ACTION] = - g_signal_new (I_("end_user_action"), + g_signal_new (I_("end-user-action"), G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GtkTextBufferClass, end_user_action), @@ -581,14 +605,39 @@ gtk_text_buffer_class_init (GtkTextBufferClass *klass) G_TYPE_NONE, 0); + /** + * GtkTextBuffer::paste-done: + * @textbuffer: the object which received the signal + * + * The paste-done signal is emitted after paste operation has been completed. + * This is useful to properly scroll the view to the end of the pasted text. + * See gtk_text_buffer_paste_clipboard() for more details. + * + * Since: 2.16 + */ + signals[PASTE_DONE] = + g_signal_new (I_("paste-done"), + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkTextBufferClass, paste_done), + NULL, NULL, + _gtk_marshal_VOID__OBJECT, + G_TYPE_NONE, + 1, + GTK_TYPE_CLIPBOARD); + g_type_class_add_private (object_class, sizeof (GtkTextBufferPrivate)); } static void gtk_text_buffer_init (GtkTextBuffer *buffer) { - buffer->clipboard_contents_buffers = NULL; - buffer->tag_table = NULL; + buffer->priv = G_TYPE_INSTANCE_GET_PRIVATE (buffer, + GTK_TYPE_TEXT_BUFFER, + GtkTextBufferPrivate); + + buffer->priv->clipboard_contents_buffers = NULL; + buffer->priv->tag_table = NULL; /* allow copying of arbiatray stuff in the internal rich text format */ gtk_text_buffer_register_serialize_tagset (buffer, NULL); @@ -597,12 +646,14 @@ gtk_text_buffer_init (GtkTextBuffer *buffer) static void set_table (GtkTextBuffer *buffer, GtkTextTagTable *table) { - g_return_if_fail (buffer->tag_table == NULL); + GtkTextBufferPrivate *priv = buffer->priv; + + g_return_if_fail (priv->tag_table == NULL); if (table) { - buffer->tag_table = table; - g_object_ref (buffer->tag_table); + priv->tag_table = table; + g_object_ref (priv->tag_table); _gtk_text_tag_table_add_buffer (table, buffer); } } @@ -610,13 +661,15 @@ set_table (GtkTextBuffer *buffer, GtkTextTagTable *table) static GtkTextTagTable* get_table (GtkTextBuffer *buffer) { - if (buffer->tag_table == NULL) + GtkTextBufferPrivate *priv = buffer->priv; + + if (priv->tag_table == NULL) { - buffer->tag_table = gtk_text_tag_table_new (); - _gtk_text_tag_table_add_buffer (buffer->tag_table, buffer); + priv->tag_table = gtk_text_tag_table_new (); + _gtk_text_tag_table_add_buffer (priv->tag_table, buffer); } - return buffer->tag_table; + return priv->tag_table; } static void @@ -677,7 +730,7 @@ gtk_text_buffer_get_property (GObject *object, } case PROP_HAS_SELECTION: - g_value_set_boolean (value, text_buffer->has_selection); + g_value_set_boolean (value, text_buffer->priv->has_selection); break; case PROP_CURSOR_POSITION: @@ -713,7 +766,7 @@ gtk_text_buffer_notify (GObject *object, /** * gtk_text_buffer_new: - * @table: a tag table, or %NULL to create a new one + * @table: (allow-none): a tag table, or %NULL to create a new one * * Creates a new text buffer. * @@ -733,28 +786,30 @@ static void gtk_text_buffer_finalize (GObject *object) { GtkTextBuffer *buffer; + GtkTextBufferPrivate *priv; buffer = GTK_TEXT_BUFFER (object); + priv = buffer->priv; remove_all_selection_clipboards (buffer); - if (buffer->tag_table) + if (priv->tag_table) { - _gtk_text_tag_table_remove_buffer (buffer->tag_table, buffer); - g_object_unref (buffer->tag_table); - buffer->tag_table = NULL; + _gtk_text_tag_table_remove_buffer (priv->tag_table, buffer); + g_object_unref (priv->tag_table); + priv->tag_table = NULL; } - if (buffer->btree) + if (priv->btree) { - _gtk_text_btree_unref (buffer->btree); - buffer->btree = NULL; + _gtk_text_btree_unref (priv->btree); + priv->btree = NULL; } - if (buffer->log_attr_cache) - free_log_attr_cache (buffer->log_attr_cache); + if (priv->log_attr_cache) + free_log_attr_cache (priv->log_attr_cache); - buffer->log_attr_cache = NULL; + priv->log_attr_cache = NULL; gtk_text_buffer_free_target_lists (buffer); @@ -764,11 +819,13 @@ gtk_text_buffer_finalize (GObject *object) static GtkTextBTree* get_btree (GtkTextBuffer *buffer) { - if (buffer->btree == NULL) - buffer->btree = _gtk_text_btree_new (gtk_text_buffer_get_tag_table (buffer), - buffer); + GtkTextBufferPrivate *priv = buffer->priv; + + if (priv->btree == NULL) + priv->btree = _gtk_text_btree_new (gtk_text_buffer_get_tag_table (buffer), + buffer); - return buffer->btree; + return priv->btree; } GtkTextBTree* @@ -783,7 +840,7 @@ _gtk_text_buffer_get_btree (GtkTextBuffer *buffer) * * Get the #GtkTextTagTable associated with this buffer. * - * Return value: the buffer's tag table + * Return value: (transfer none): the buffer's tag table **/ GtkTextTagTable* gtk_text_buffer_get_tag_table (GtkTextBuffer *buffer) @@ -875,12 +932,12 @@ gtk_text_buffer_emit_insert (GtkTextBuffer *buffer, * gtk_text_buffer_insert: * @buffer: a #GtkTextBuffer * @iter: a position in the buffer - * @text: UTF-8 format text to insert + * @text: text in UTF-8 format * @len: length of text in bytes, or -1 * * Inserts @len bytes of @text at position @iter. If @len is -1, * @text must be nul-terminated and will be inserted in its - * entirety. Emits the "insert_text" signal; insertion actually occurs + * entirety. Emits the "insert-text" signal; insertion actually occurs * in the default handler for the signal. @iter is invalidated when * insertion occurs (because the buffer contents change), but the * default signal handler revalidates it to point to the end of the @@ -903,7 +960,7 @@ gtk_text_buffer_insert (GtkTextBuffer *buffer, /** * gtk_text_buffer_insert_at_cursor: * @buffer: a #GtkTextBuffer - * @text: some text in UTF-8 format + * @text: text in UTF-8 format * @len: length of text, in bytes * * Simply calls gtk_text_buffer_insert(), using the current @@ -1377,8 +1434,8 @@ gtk_text_buffer_insert_range (GtkTextBuffer *buffer, g_return_if_fail (end != NULL); g_return_if_fail (gtk_text_iter_get_buffer (start) == gtk_text_iter_get_buffer (end)); - g_return_if_fail (gtk_text_iter_get_buffer (start)->tag_table == - buffer->tag_table); + g_return_if_fail (gtk_text_iter_get_buffer (start)->priv->tag_table == + buffer->priv->tag_table); g_return_if_fail (gtk_text_iter_get_buffer (iter) == buffer); gtk_text_buffer_real_insert_range (buffer, iter, start, end, FALSE); @@ -1413,8 +1470,8 @@ gtk_text_buffer_insert_range_interactive (GtkTextBuffer *buffer, g_return_val_if_fail (end != NULL, FALSE); g_return_val_if_fail (gtk_text_iter_get_buffer (start) == gtk_text_iter_get_buffer (end), FALSE); - g_return_val_if_fail (gtk_text_iter_get_buffer (start)->tag_table == - buffer->tag_table, FALSE); + g_return_val_if_fail (gtk_text_iter_get_buffer (start)->priv->tag_table == + buffer->priv->tag_table, FALSE); if (gtk_text_iter_can_insert (iter, default_editable)) { @@ -1432,10 +1489,10 @@ gtk_text_buffer_insert_range_interactive (GtkTextBuffer *buffer, * @text: UTF-8 text * @len: length of @text, or -1 * @first_tag: first tag to apply to @text - * @Varargs: NULL-terminated list of tags to apply + * @...: %NULL-terminated list of tags to apply * * Inserts @text into @buffer at @iter, applying the list of tags to - * the newly-inserted text. The last tag specified must be NULL to + * the newly-inserted text. The last tag specified must be %NULL to * terminate the list. Equivalent to calling gtk_text_buffer_insert(), * then gtk_text_buffer_apply_tag() on the inserted text; * gtk_text_buffer_insert_with_tags() is just a convenience function. @@ -1486,7 +1543,7 @@ gtk_text_buffer_insert_with_tags (GtkTextBuffer *buffer, * @text: UTF-8 text * @len: length of @text, or -1 * @first_tag_name: name of a tag to apply to @text - * @Varargs: more tag names + * @...: more tag names * * Same as gtk_text_buffer_insert_with_tags(), but allows you * to pass in tag names instead of tag objects. @@ -1524,12 +1581,13 @@ gtk_text_buffer_insert_with_tags_by_name (GtkTextBuffer *buffer, { GtkTextTag *tag; - tag = gtk_text_tag_table_lookup (buffer->tag_table, + tag = gtk_text_tag_table_lookup (buffer->priv->tag_table, tag_name); if (tag == NULL) { g_warning ("%s: no tag with name '%s'!", G_STRLOC, tag_name); + va_end (args); return; } @@ -1563,9 +1621,9 @@ gtk_text_buffer_real_delete_range (GtkTextBuffer *buffer, update_selection_clipboards (buffer); has_selection = gtk_text_buffer_get_selection_bounds (buffer, NULL, NULL); - if (has_selection != buffer->has_selection) + if (has_selection != buffer->priv->has_selection) { - buffer->has_selection = has_selection; + buffer->priv->has_selection = has_selection; g_object_notify (G_OBJECT (buffer), "has-selection"); } @@ -1601,7 +1659,7 @@ gtk_text_buffer_emit_delete (GtkTextBuffer *buffer, * * Deletes text between @start and @end. The order of @start and @end * is not actually relevant; gtk_text_buffer_delete() will reorder - * them. This function actually emits the "delete_range" signal, and + * them. This function actually emits the "delete-range" signal, and * the default handler of that signal deletes the text. Because the * buffer is modified, all outstanding iterators become invalid after * calling this function; however, the @start and @end will be @@ -1725,8 +1783,9 @@ gtk_text_buffer_delete_interactive (GtkTextBuffer *buffer, /* It's more robust to ask for the state again then to assume that * we're on the next not-editable segment. We don't know what the - * ::delete-range handler did.... maybe it deleted the following not-editable - * segment because it was associated with the editable segment. + * ::delete-range handler did.... maybe it deleted the following + * not-editable segment because it was associated with the editable + * segment. */ current_state = gtk_text_iter_editable (&iter, default_editable); deleted_stuff = TRUE; @@ -1938,7 +1997,7 @@ gtk_text_buffer_insert_child_anchor (GtkTextBuffer *buffer, * owned by the buffer; no reference count is returned to * the caller of gtk_text_buffer_create_child_anchor(). * - * Return value: the created child anchor + * Return value: (transfer none): the created child anchor **/ GtkTextChildAnchor* gtk_text_buffer_create_child_anchor (GtkTextBuffer *buffer, @@ -2037,7 +2096,7 @@ gtk_text_buffer_set_mark (GtkTextBuffer *buffer, /** * gtk_text_buffer_create_mark: * @buffer: a #GtkTextBuffer - * @mark_name: name for mark, or %NULL + * @mark_name: (allow-none): name for mark, or %NULL * @where: location to place mark * @left_gravity: whether the mark has left gravity * @@ -2056,10 +2115,10 @@ gtk_text_buffer_set_mark (GtkTextBuffer *buffer, * return value if you like. Marks are owned by the buffer and go * away when the buffer does. * - * Emits the "mark_set" signal as notification of the mark's initial + * Emits the "mark-set" signal as notification of the mark's initial * placement. * - * Return value: the new #GtkTextMark object + * Return value: (transfer none): the new #GtkTextMark object **/ GtkTextMark* gtk_text_buffer_create_mark (GtkTextBuffer *buffer, @@ -2083,7 +2142,7 @@ gtk_text_buffer_create_mark (GtkTextBuffer *buffer, * another buffer, and if its name is not %NULL then there must not * be another mark in the buffer with the same name. * - * Emits the "mark_set" signal as notification of the mark's initial + * Emits the "mark-set" signal as notification of the mark's initial * placement. * * Since: 2.12 @@ -2117,7 +2176,7 @@ gtk_text_buffer_add_mark (GtkTextBuffer *buffer, * @mark: a #GtkTextMark * @where: new location for @mark in @buffer * - * Moves @mark to the new location @where. Emits the "mark_set" signal + * Moves @mark to the new location @where. Emits the "mark-set" signal * as notification of the move. **/ void @@ -2135,7 +2194,7 @@ gtk_text_buffer_move_mark (GtkTextBuffer *buffer, /** * gtk_text_buffer_get_iter_at_mark: * @buffer: a #GtkTextBuffer - * @iter: iterator to initialize + * @iter: (out): iterator to initialize * @mark: a #GtkTextMark in @buffer * * Initializes @iter with the current position of @mark. @@ -2166,7 +2225,7 @@ gtk_text_buffer_get_iter_at_mark (GtkTextBuffer *buffer, * invalid, until it gets added to a buffer again with * gtk_text_buffer_add_mark(). Use gtk_text_mark_get_deleted() to * find out if a mark has been removed from its buffer. - * The "mark_deleted" signal will be emitted as notification after + * The "mark-deleted" signal will be emitted as notification after * the mark is deleted. **/ void @@ -2200,7 +2259,7 @@ gtk_text_buffer_delete_mark (GtkTextBuffer *buffer, * Returns the mark named @name in buffer @buffer, or %NULL if no such * mark exists in the buffer. * - * Return value: a #GtkTextMark, or %NULL + * Return value: (transfer none): a #GtkTextMark, or %NULL **/ GtkTextMark* gtk_text_buffer_get_mark (GtkTextBuffer *buffer, @@ -2283,7 +2342,7 @@ gtk_text_buffer_delete_mark_by_name (GtkTextBuffer *buffer, * named "insert", but very slightly more efficient, and involves less * typing. * - * Return value: insertion point mark + * Return value: (transfer none): insertion point mark **/ GtkTextMark* gtk_text_buffer_get_insert (GtkTextBuffer *buffer) @@ -2309,7 +2368,7 @@ gtk_text_buffer_get_insert (GtkTextBuffer *buffer) * for handling the selection, if you just want to know whether there's a * selection and what its bounds are. * - * Return value: selection bound mark + * Return value: (transfer none): selection bound mark **/ GtkTextMark* gtk_text_buffer_get_selection_bound (GtkTextBuffer *buffer) @@ -2322,7 +2381,7 @@ gtk_text_buffer_get_selection_bound (GtkTextBuffer *buffer) /** * gtk_text_buffer_get_iter_at_child_anchor: * @buffer: a #GtkTextBuffer - * @iter: an iterator to be initialized + * @iter: (out): an iterator to be initialized * @anchor: a child anchor that appears in @buffer * * Obtains the location of @anchor within @buffer. @@ -2405,10 +2464,9 @@ gtk_text_buffer_select_range (GtkTextBuffer *buffer, /** * gtk_text_buffer_create_tag: * @buffer: a #GtkTextBuffer - * @tag_name: name of the new tag, or %NULL - * @first_property_name: name of first property to set, or %NULL - * @Varargs: %NULL-terminated list of property names and values - * + * @tag_name: (allow-none): name of the new tag, or %NULL + * @first_property_name: (allow-none): name of first property to set, or %NULL + * @...: %NULL-terminated list of property names and values * * Creates a tag and adds it to the tag table for @buffer. * Equivalent to calling gtk_text_tag_new() and then adding the @@ -2423,8 +2481,8 @@ gtk_text_buffer_select_range (GtkTextBuffer *buffer, * The @first_property_name argument and subsequent arguments are a list * of properties to set on the tag, as with g_object_set(). * - * Return value: a new tag - **/ + * Return value: (transfer none): a new tag + */ GtkTextTag* gtk_text_buffer_create_tag (GtkTextBuffer *buffer, const gchar *tag_name, @@ -2458,7 +2516,7 @@ gtk_text_buffer_real_apply_tag (GtkTextBuffer *buffer, const GtkTextIter *start, const GtkTextIter *end) { - if (tag->table != buffer->tag_table) + if (tag->priv->table != buffer->priv->tag_table) { g_warning ("Can only apply tags that are in the tag table for the buffer"); return; @@ -2473,7 +2531,7 @@ gtk_text_buffer_real_remove_tag (GtkTextBuffer *buffer, const GtkTextIter *start, const GtkTextIter *end) { - if (tag->table != buffer->tag_table) + if (tag->priv->table != buffer->priv->tag_table) { g_warning ("Can only remove tags that are in the tag table for the buffer"); return; @@ -2507,9 +2565,9 @@ gtk_text_buffer_real_mark_set (GtkTextBuffer *buffer, NULL, NULL); - if (has_selection != buffer->has_selection) + if (has_selection != buffer->priv->has_selection) { - buffer->has_selection = has_selection; + buffer->priv->has_selection = has_selection; g_object_notify (G_OBJECT (buffer), "has-selection"); } } @@ -2549,7 +2607,7 @@ gtk_text_buffer_emit_tag (GtkTextBuffer *buffer, * @start: one bound of range to be tagged * @end: other bound of range to be tagged * - * Emits the "apply_tag" signal on @buffer. The default + * Emits the "apply-tag" signal on @buffer. The default * handler for the signal applies @tag to the given range. * @start and @end do not have to be in order. **/ @@ -2565,7 +2623,7 @@ gtk_text_buffer_apply_tag (GtkTextBuffer *buffer, g_return_if_fail (end != NULL); g_return_if_fail (gtk_text_iter_get_buffer (start) == buffer); g_return_if_fail (gtk_text_iter_get_buffer (end) == buffer); - g_return_if_fail (tag->table == buffer->tag_table); + g_return_if_fail (tag->priv->table == buffer->priv->tag_table); gtk_text_buffer_emit_tag (buffer, tag, TRUE, start, end); } @@ -2577,7 +2635,7 @@ gtk_text_buffer_apply_tag (GtkTextBuffer *buffer, * @start: one bound of range to be untagged * @end: other bound of range to be untagged * - * Emits the "remove_tag" signal. The default handler for the signal + * Emits the "remove-tag" signal. The default handler for the signal * removes all occurrences of @tag from the given range. @start and * @end don't have to be in order. **/ @@ -2594,7 +2652,7 @@ gtk_text_buffer_remove_tag (GtkTextBuffer *buffer, g_return_if_fail (end != NULL); g_return_if_fail (gtk_text_iter_get_buffer (start) == buffer); g_return_if_fail (gtk_text_iter_get_buffer (end) == buffer); - g_return_if_fail (tag->table == buffer->tag_table); + g_return_if_fail (tag->priv->table == buffer->priv->tag_table); gtk_text_buffer_emit_tag (buffer, tag, FALSE, start, end); } @@ -2805,7 +2863,7 @@ gtk_text_buffer_remove_all_tags (GtkTextBuffer *buffer, /** * gtk_text_buffer_get_iter_at_line_offset: * @buffer: a #GtkTextBuffer - * @iter: iterator to initialize + * @iter: (out): iterator to initialize * @line_number: line number counting from 0 * @char_offset: char offset from start of line * @@ -2830,7 +2888,7 @@ gtk_text_buffer_get_iter_at_line_offset (GtkTextBuffer *buffer, /** * gtk_text_buffer_get_iter_at_line_index: * @buffer: a #GtkTextBuffer - * @iter: iterator to initialize + * @iter: (out): iterator to initialize * @line_number: line number counting from 0 * @byte_index: byte index from start of line * @@ -2855,7 +2913,7 @@ gtk_text_buffer_get_iter_at_line_index (GtkTextBuffer *buffer, /** * gtk_text_buffer_get_iter_at_line: * @buffer: a #GtkTextBuffer - * @iter: iterator to initialize + * @iter: (out): iterator to initialize * @line_number: line number counting from 0 * * Initializes @iter to the start of the given line. @@ -2874,7 +2932,7 @@ gtk_text_buffer_get_iter_at_line (GtkTextBuffer *buffer, /** * gtk_text_buffer_get_iter_at_offset: * @buffer: a #GtkTextBuffer - * @iter: iterator to initialize + * @iter: (out): iterator to initialize * @char_offset: char offset from start of buffer, counting from 0, or -1 * * Initializes @iter to a position @char_offset chars from the start @@ -2896,7 +2954,7 @@ gtk_text_buffer_get_iter_at_offset (GtkTextBuffer *buffer, /** * gtk_text_buffer_get_start_iter: * @buffer: a #GtkTextBuffer - * @iter: iterator to initialize + * @iter: (out): iterator to initialize * * Initialized @iter with the first position in the text buffer. This * is the same as using gtk_text_buffer_get_iter_at_offset() to get @@ -2915,7 +2973,7 @@ gtk_text_buffer_get_start_iter (GtkTextBuffer *buffer, /** * gtk_text_buffer_get_end_iter: * @buffer: a #GtkTextBuffer - * @iter: iterator to initialize + * @iter: (out): iterator to initialize * * Initializes @iter with the "end iterator," one past the last valid * character in the text buffer. If dereferenced with @@ -2937,8 +2995,8 @@ gtk_text_buffer_get_end_iter (GtkTextBuffer *buffer, /** * gtk_text_buffer_get_bounds: * @buffer: a #GtkTextBuffer - * @start: iterator to initialize with first position in the buffer - * @end: iterator to initialize with the end iterator + * @start: (out): iterator to initialize with first position in the buffer + * @end: (out): iterator to initialize with the end iterator * * Retrieves the first and last iterators in the buffer, i.e. the * entire buffer lies within the range [@start,@end). @@ -2976,7 +3034,7 @@ gtk_text_buffer_get_modified (GtkTextBuffer *buffer) { g_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), FALSE); - return buffer->modified; + return buffer->priv->modified; } /** @@ -2988,7 +3046,7 @@ gtk_text_buffer_get_modified (GtkTextBuffer *buffer) * last time it was saved. Whenever the buffer is saved to disk, call * gtk_text_buffer_set_modified (@buffer, FALSE). When the buffer is modified, * it will automatically toggled on the modified bit again. When the modified - * bit flips, the buffer emits a "modified_changed" signal. + * bit flips, the buffer emits a "modified-changed" signal. **/ void gtk_text_buffer_set_modified (GtkTextBuffer *buffer, @@ -3000,11 +3058,11 @@ gtk_text_buffer_set_modified (GtkTextBuffer *buffer, fixed_setting = setting != FALSE; - if (buffer->modified == fixed_setting) + if (buffer->priv->modified == fixed_setting) return; else { - buffer->modified = fixed_setting; + buffer->priv->modified = fixed_setting; g_signal_emit (buffer, signals[MODIFIED_CHANGED], 0); } } @@ -3024,7 +3082,7 @@ gtk_text_buffer_get_has_selection (GtkTextBuffer *buffer) { g_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), FALSE); - return buffer->has_selection; + return buffer->priv->has_selection; } @@ -3110,7 +3168,7 @@ clipboard_get_selection_cb (GtkClipboard *clipboard, * used within-process */ gtk_selection_data_set (selection_data, - selection_data->target, + gtk_selection_data_get_target (selection_data), 8, /* bytes */ (void*)&buffer, sizeof (buffer)); @@ -3121,11 +3179,11 @@ clipboard_get_selection_cb (GtkClipboard *clipboard, gsize len; str = gtk_text_buffer_serialize (buffer, buffer, - selection_data->target, + gtk_selection_data_get_target (selection_data), &start, &end, &len); gtk_selection_data_set (selection_data, - selection_data->target, + gtk_selection_data_get_target (selection_data), 8, /* bytes */ str, len); g_free (str); @@ -3180,7 +3238,7 @@ clipboard_get_contents_cb (GtkClipboard *clipboard, * be used within-process. OK to supply a NULL value for contents. */ gtk_selection_data_set (selection_data, - selection_data->target, + gtk_selection_data_get_target (selection_data), 8, /* bytes */ (void*)&contents, sizeof (contents)); @@ -3198,11 +3256,11 @@ clipboard_get_contents_cb (GtkClipboard *clipboard, gtk_text_buffer_get_bounds (contents, &start, &end); str = gtk_text_buffer_serialize (clipboard_source_buffer, contents, - selection_data->target, + gtk_selection_data_get_target (selection_data), &start, &end, &len); gtk_selection_data_set (selection_data, - selection_data->target, + gtk_selection_data_get_target (selection_data), 8, /* bytes */ str, len); g_free (str); @@ -3245,9 +3303,7 @@ get_paste_point (GtkTextBuffer *buffer, gtk_text_buffer_get_iter_at_mark (buffer, &insert_point, paste_point_override); if (clear_afterward) - gtk_text_buffer_delete_mark (buffer, - gtk_text_buffer_get_mark (buffer, - "gtk_paste_point_override")); + gtk_text_buffer_delete_mark (buffer, paste_point_override); } else { @@ -3299,6 +3355,13 @@ post_paste_cleanup (ClipboardRequest *request_data) } } +static void +emit_paste_done (GtkTextBuffer *buffer, + GtkClipboard *clipboard) +{ + g_signal_emit (buffer, signals[PASTE_DONE], 0, clipboard); +} + static void free_clipboard_request (ClipboardRequest *request_data) { @@ -3336,6 +3399,20 @@ clipboard_text_received (GtkClipboard *clipboard, if (request_data->interactive) gtk_text_buffer_end_user_action (buffer); + + emit_paste_done (buffer, clipboard); + } + else + { + /* It may happen that we set a point override but we are not inserting + any text, so we must remove it afterwards */ + GtkTextMark *paste_point_override; + + paste_point_override = gtk_text_buffer_get_mark (buffer, + "gtk_paste_point_override"); + + if (paste_point_override != NULL) + gtk_text_buffer_delete_mark (buffer, paste_point_override); } free_clipboard_request (request_data); @@ -3349,23 +3426,22 @@ selection_data_get_buffer (GtkSelectionData *selection_data, GtkTextBuffer *src_buffer = NULL; /* If we can get the owner, the selection is in-process */ - owner = gdk_selection_owner_get_for_display (selection_data->display, - selection_data->selection); + owner = gdk_selection_owner_get_for_display (gtk_selection_data_get_display (selection_data), + gtk_selection_data_get_selection (selection_data)); if (owner == NULL) return NULL; if (gdk_window_get_window_type (owner) == GDK_WINDOW_FOREIGN) return NULL; - - if (selection_data->type != - gdk_atom_intern_static_string ("GTK_TEXT_BUFFER_CONTENTS")) + + if (gtk_selection_data_get_data_type (selection_data) != gdk_atom_intern_static_string ("GTK_TEXT_BUFFER_CONTENTS")) return NULL; - if (selection_data->length != sizeof (src_buffer)) + if (gtk_selection_data_get_length (selection_data) != sizeof (src_buffer)) return NULL; - - memcpy (&src_buffer, selection_data->data, sizeof (src_buffer)); + + memcpy (&src_buffer, gtk_selection_data_get_data (selection_data), sizeof (src_buffer)); if (src_buffer == NULL) return NULL; @@ -3446,6 +3522,8 @@ clipboard_rich_text_received (GtkClipboard *clipboard, if (request_data->interactive) gtk_text_buffer_end_user_action (request_data->buffer); + emit_paste_done (request_data->buffer, clipboard); + if (retval) { post_paste_cleanup (request_data); @@ -3460,7 +3538,8 @@ clipboard_rich_text_received (GtkClipboard *clipboard, } static void -paste_from_buffer (ClipboardRequest *request_data, +paste_from_buffer (GtkClipboard *clipboard, + ClipboardRequest *request_data, GtkTextBuffer *src_buffer, const GtkTextIter *start, const GtkTextIter *end) @@ -3493,6 +3572,8 @@ paste_from_buffer (ClipboardRequest *request_data, if (request_data->interactive) gtk_text_buffer_end_user_action (buffer); + emit_paste_done (buffer, clipboard); + g_object_unref (src_buffer); free_clipboard_request (request_data); @@ -3516,13 +3597,13 @@ clipboard_clipboard_buffer_received (GtkClipboard *clipboard, { gtk_text_buffer_get_bounds (src_buffer, &start, &end); - paste_from_buffer (request_data, src_buffer, + paste_from_buffer (clipboard, request_data, src_buffer, &start, &end); } else { if (gtk_text_buffer_get_selection_bounds (src_buffer, &start, &end)) - paste_from_buffer (request_data, src_buffer, + paste_from_buffer (clipboard, request_data, src_buffer, &start, &end); } } @@ -3557,9 +3638,9 @@ static void update_selection_clipboards (GtkTextBuffer *buffer) { GtkTextBufferPrivate *priv; - GSList *tmp_list = buffer->selection_clipboards; + GSList *tmp_list = buffer->priv->selection_clipboards; - priv = GTK_TEXT_BUFFER_GET_PRIVATE (buffer); + priv = buffer->priv; gtk_text_buffer_get_copy_target_list (buffer); @@ -3601,7 +3682,7 @@ static SelectionClipboard * find_selection_clipboard (GtkTextBuffer *buffer, GtkClipboard *clipboard) { - GSList *tmp_list = buffer->selection_clipboards; + GSList *tmp_list = buffer->priv->selection_clipboards; while (tmp_list) { SelectionClipboard *selection_clipboard = tmp_list->data; @@ -3644,7 +3725,8 @@ gtk_text_buffer_add_selection_clipboard (GtkTextBuffer *buffer, selection_clipboard->clipboard = clipboard; selection_clipboard->ref_count = 1; - buffer->selection_clipboards = g_slist_prepend (buffer->selection_clipboards, selection_clipboard); + buffer->priv->selection_clipboards = g_slist_prepend (buffer->priv->selection_clipboards, + selection_clipboard); } } @@ -3675,8 +3757,8 @@ gtk_text_buffer_remove_selection_clipboard (GtkTextBuffer *buffer, if (gtk_clipboard_get_owner (selection_clipboard->clipboard) == G_OBJECT (buffer)) gtk_clipboard_clear (selection_clipboard->clipboard); - buffer->selection_clipboards = g_slist_remove (buffer->selection_clipboards, - selection_clipboard); + buffer->priv->selection_clipboards = g_slist_remove (buffer->priv->selection_clipboards, + selection_clipboard); g_free (selection_clipboard); } @@ -3685,23 +3767,25 @@ gtk_text_buffer_remove_selection_clipboard (GtkTextBuffer *buffer, static void remove_all_selection_clipboards (GtkTextBuffer *buffer) { - g_slist_foreach (buffer->selection_clipboards, (GFunc)g_free, NULL); - g_slist_free (buffer->selection_clipboards); - buffer->selection_clipboards = NULL; + GtkTextBufferPrivate *priv = buffer->priv; + + g_slist_foreach (priv->selection_clipboards, (GFunc)g_free, NULL); + g_slist_free (priv->selection_clipboards); + priv->selection_clipboards = NULL; } /** * gtk_text_buffer_paste_clipboard: * @buffer: a #GtkTextBuffer * @clipboard: the #GtkClipboard to paste from - * @override_location: location to insert pasted text, or %NULL for + * @override_location: (allow-none): location to insert pasted text, or %NULL for * at the cursor * @default_editable: whether the buffer is editable by default * - * Pastes the contents of a clipboard at the insertion point, or at - * @override_location. (Note: pasting is asynchronous, that is, we'll - * ask for the paste data and return, and at some point later after - * the main loop runs, the paste data will be inserted.) + * Pastes the contents of a clipboard at the insertion point, or + * at @override_location. (Note: pasting is asynchronous, that is, + * we'll ask for the paste data and return, and at some point later + * after the main loop runs, the paste data will be inserted.) **/ void gtk_text_buffer_paste_clipboard (GtkTextBuffer *buffer, @@ -3720,7 +3804,7 @@ gtk_text_buffer_paste_clipboard (GtkTextBuffer *buffer, data->buffer = g_object_ref (buffer); data->interactive = TRUE; - data->default_editable = default_editable; + data->default_editable = !!default_editable; /* When pasting with the cursor inside the selection area, you * replace the selection with the new text, otherwise, you @@ -3769,11 +3853,7 @@ gtk_text_buffer_delete_selection (GtkTextBuffer *buffer, else { if (interactive) - { - gtk_text_buffer_begin_user_action (buffer); - gtk_text_buffer_delete_interactive (buffer, &start, &end, default_editable); - gtk_text_buffer_end_user_action (buffer); - } + gtk_text_buffer_delete_interactive (buffer, &start, &end, default_editable); else gtk_text_buffer_delete (buffer, &start, &end); @@ -3849,13 +3929,14 @@ gtk_text_buffer_backspace (GtkTextBuffer *buffer, if (gtk_text_buffer_delete_interactive (buffer, &start, &end, default_editable)) { - if (backspace_deletes_character) + /* special case \r\n, since we never want to reinsert \r */ + if (backspace_deletes_character && strcmp ("\r\n", cluster_text)) { gchar *normalized_text = g_utf8_normalize (cluster_text, strlen (cluster_text), G_NORMALIZE_NFD); glong len = g_utf8_strlen (normalized_text, -1); - + if (len > 1) gtk_text_buffer_insert_interactive (buffer, &start, @@ -3899,7 +3980,7 @@ cut_or_copy (GtkTextBuffer *buffer, GtkTextIter start; GtkTextIter end; - priv = GTK_TEXT_BUFFER_GET_PRIVATE (buffer); + priv = buffer->priv; gtk_text_buffer_get_copy_target_list (buffer); @@ -3981,16 +4062,14 @@ void gtk_text_buffer_copy_clipboard (GtkTextBuffer *buffer, GtkClipboard *clipboard) { - gtk_text_buffer_begin_user_action (buffer); cut_or_copy (buffer, clipboard, FALSE, TRUE, TRUE); - gtk_text_buffer_end_user_action (buffer); } /** * gtk_text_buffer_get_selection_bounds: * @buffer: a #GtkTextBuffer a #GtkTextBuffer - * @start: iterator to initialize with selection start - * @end: iterator to initialize with selection end + * @start: (out): iterator to initialize with selection start + * @end: (out): iterator to initialize with selection end * * Returns %TRUE if some text is selected; places the bounds * of the selection in @start and @end (if the selection has length 0, @@ -4023,7 +4102,7 @@ gtk_text_buffer_get_selection_bounds (GtkTextBuffer *buffer, * an undo stack. #GtkTextBuffer maintains a count of calls to * gtk_text_buffer_begin_user_action() that have not been closed with * a call to gtk_text_buffer_end_user_action(), and emits the - * "begin_user_action" and "end_user_action" signals only for the + * "begin-user-action" and "end-user-action" signals only for the * outermost pair of calls. This allows you to build user actions * from other user actions. * @@ -4038,9 +4117,9 @@ gtk_text_buffer_begin_user_action (GtkTextBuffer *buffer) { g_return_if_fail (GTK_IS_TEXT_BUFFER (buffer)); - buffer->user_action_count += 1; + buffer->priv->user_action_count += 1; - if (buffer->user_action_count == 1) + if (buffer->priv->user_action_count == 1) { /* Outermost nested user action begin emits the signal */ g_signal_emit (buffer, signals[BEGIN_USER_ACTION], 0); @@ -4058,11 +4137,11 @@ void gtk_text_buffer_end_user_action (GtkTextBuffer *buffer) { g_return_if_fail (GTK_IS_TEXT_BUFFER (buffer)); - g_return_if_fail (buffer->user_action_count > 0); + g_return_if_fail (buffer->priv->user_action_count > 0); - buffer->user_action_count -= 1; + buffer->priv->user_action_count -= 1; - if (buffer->user_action_count == 0) + if (buffer->priv->user_action_count == 0) { /* Ended the outermost-nested user action end, so emit the signal */ g_signal_emit (buffer, signals[END_USER_ACTION], 0); @@ -4072,7 +4151,7 @@ gtk_text_buffer_end_user_action (GtkTextBuffer *buffer) static void gtk_text_buffer_free_target_lists (GtkTextBuffer *buffer) { - GtkTextBufferPrivate *priv = GTK_TEXT_BUFFER_GET_PRIVATE (buffer); + GtkTextBufferPrivate *priv = buffer->priv; if (priv->copy_target_list) { @@ -4135,7 +4214,7 @@ gtk_text_buffer_get_target_list (GtkTextBuffer *buffer, * using gtk_target_list_add_rich_text_targets() and * gtk_target_list_add_text_targets(). * - * Return value: the #GtkTargetList + * Return value: (transfer none): the #GtkTargetList * * Since: 2.10 **/ @@ -4146,7 +4225,7 @@ gtk_text_buffer_get_copy_target_list (GtkTextBuffer *buffer) g_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), NULL); - priv = GTK_TEXT_BUFFER_GET_PRIVATE (buffer); + priv = buffer->priv; if (! priv->copy_target_list) priv->copy_target_list = @@ -4167,7 +4246,7 @@ gtk_text_buffer_get_copy_target_list (GtkTextBuffer *buffer) * using gtk_target_list_add_rich_text_targets() and * gtk_target_list_add_text_targets(). * - * Return value: the #GtkTargetList + * Return value: (transfer none): the #GtkTargetList * * Since: 2.10 **/ @@ -4178,7 +4257,7 @@ gtk_text_buffer_get_paste_target_list (GtkTextBuffer *buffer) g_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), NULL); - priv = GTK_TEXT_BUFFER_GET_PRIVATE (buffer); + priv = buffer->priv; if (! priv->paste_target_list) priv->paste_target_list = @@ -4280,6 +4359,7 @@ _gtk_text_buffer_get_line_log_attrs (GtkTextBuffer *buffer, const GtkTextIter *anywhere_in_line, gint *char_len) { + GtkTextBufferPrivate *priv; gint line; GtkTextLogAttrCache *cache; gint i; @@ -4287,6 +4367,8 @@ _gtk_text_buffer_get_line_log_attrs (GtkTextBuffer *buffer, g_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), NULL); g_return_val_if_fail (anywhere_in_line != NULL, NULL); + priv = buffer->priv; + /* special-case for empty last line in buffer */ if (gtk_text_iter_is_end (anywhere_in_line) && gtk_text_iter_get_line_offset (anywhere_in_line) == 0) @@ -4300,19 +4382,19 @@ _gtk_text_buffer_get_line_log_attrs (GtkTextBuffer *buffer, * the start of a paragraph changes */ - if (buffer->log_attr_cache == NULL) + if (priv->log_attr_cache == NULL) { - buffer->log_attr_cache = g_new0 (GtkTextLogAttrCache, 1); - buffer->log_attr_cache->chars_changed_stamp = + priv->log_attr_cache = g_new0 (GtkTextLogAttrCache, 1); + priv->log_attr_cache->chars_changed_stamp = _gtk_text_btree_get_chars_changed_stamp (get_btree (buffer)); } - else if (buffer->log_attr_cache->chars_changed_stamp != + else if (priv->log_attr_cache->chars_changed_stamp != _gtk_text_btree_get_chars_changed_stamp (get_btree (buffer))) { - clear_log_attr_cache (buffer->log_attr_cache); + clear_log_attr_cache (priv->log_attr_cache); } - cache = buffer->log_attr_cache; + cache = priv->log_attr_cache; line = gtk_text_iter_get_line (anywhere_in_line); i = 0; @@ -4349,12 +4431,12 @@ _gtk_text_buffer_notify_will_remove_tag (GtkTextBuffer *buffer, GtkTextTag *tag) { /* This removes tag from the buffer, but DOESN'T emit the - * remove_tag signal, because we can't afford to have user + * remove-tag signal, because we can't afford to have user * code messing things up at this point; the tag MUST be removed * entirely. */ - if (buffer->btree) - _gtk_text_btree_notify_will_remove_tag (buffer->btree, tag); + if (buffer->priv->btree) + _gtk_text_btree_notify_will_remove_tag (buffer->priv->btree, tag); } /* @@ -4367,5 +4449,301 @@ _gtk_text_buffer_spew (GtkTextBuffer *buffer) _gtk_text_btree_spew (get_btree (buffer)); } -#define __GTK_TEXT_BUFFER_C__ -#include "gtkaliasdef.c" +void +_gtk_text_buffer_get_text_before (GtkTextBuffer *buffer, + AtkTextBoundary boundary_type, + GtkTextIter *position, + GtkTextIter *start, + GtkTextIter *end) +{ + gint line_number; + + *start = *position; + *end = *start; + + switch (boundary_type) + { + case ATK_TEXT_BOUNDARY_CHAR: + gtk_text_iter_backward_char (start); + break; + + case ATK_TEXT_BOUNDARY_WORD_START: + if (!gtk_text_iter_starts_word (start)) + gtk_text_iter_backward_word_start (start); + *end = *start; + gtk_text_iter_backward_word_start (start); + break; + + case ATK_TEXT_BOUNDARY_WORD_END: + if (gtk_text_iter_inside_word (start) && + !gtk_text_iter_starts_word (start)) + gtk_text_iter_backward_word_start (start); + while (!gtk_text_iter_ends_word (start)) + { + if (!gtk_text_iter_backward_char (start)) + break; + } + *end = *start; + gtk_text_iter_backward_word_start (start); + while (!gtk_text_iter_ends_word (start)) + { + if (!gtk_text_iter_backward_char (start)) + break; + } + break; + + case ATK_TEXT_BOUNDARY_SENTENCE_START: + if (!gtk_text_iter_starts_sentence (start)) + gtk_text_iter_backward_sentence_start (start); + *end = *start; + gtk_text_iter_backward_sentence_start (start); + break; + + case ATK_TEXT_BOUNDARY_SENTENCE_END: + if (gtk_text_iter_inside_sentence (start) && + !gtk_text_iter_starts_sentence (start)) + gtk_text_iter_backward_sentence_start (start); + while (!gtk_text_iter_ends_sentence (start)) + { + if (!gtk_text_iter_backward_char (start)) + break; + } + *end = *start; + gtk_text_iter_backward_sentence_start (start); + while (!gtk_text_iter_ends_sentence (start)) + { + if (!gtk_text_iter_backward_char (start)) + break; + } + break; + + case ATK_TEXT_BOUNDARY_LINE_START: + line_number = gtk_text_iter_get_line (start); + if (line_number == 0) + { + gtk_text_buffer_get_iter_at_offset (buffer, start, 0); + } + else + { + gtk_text_iter_backward_line (start); + gtk_text_iter_forward_line (start); + } + *end = *start; + gtk_text_iter_backward_line (start); + break; + + case ATK_TEXT_BOUNDARY_LINE_END: + line_number = gtk_text_iter_get_line (start); + if (line_number == 0) + { + gtk_text_buffer_get_iter_at_offset (buffer, start, 0); + *end = *start; + } + else + { + gtk_text_iter_backward_line (start); + *end = *start; + while (!gtk_text_iter_ends_line (start)) + { + if (!gtk_text_iter_backward_char (start)) + break; + } + gtk_text_iter_forward_to_line_end (end); + } + break; + } +} + +void +_gtk_text_buffer_get_text_at (GtkTextBuffer *buffer, + AtkTextBoundary boundary_type, + GtkTextIter *position, + GtkTextIter *start, + GtkTextIter *end) +{ + gint line_number; + + *start = *position; + *end = *start; + + switch (boundary_type) + { + case ATK_TEXT_BOUNDARY_CHAR: + gtk_text_iter_forward_char (end); + break; + + case ATK_TEXT_BOUNDARY_WORD_START: + if (!gtk_text_iter_starts_word (start)) + gtk_text_iter_backward_word_start (start); + if (gtk_text_iter_inside_word (end)) + gtk_text_iter_forward_word_end (end); + while (!gtk_text_iter_starts_word (end)) + { + if (!gtk_text_iter_forward_char (end)) + break; + } + break; + + case ATK_TEXT_BOUNDARY_WORD_END: + if (gtk_text_iter_inside_word (start) && + !gtk_text_iter_starts_word (start)) + gtk_text_iter_backward_word_start (start); + while (!gtk_text_iter_ends_word (start)) + { + if (!gtk_text_iter_backward_char (start)) + break; + } + gtk_text_iter_forward_word_end (end); + break; + + case ATK_TEXT_BOUNDARY_SENTENCE_START: + if (!gtk_text_iter_starts_sentence (start)) + gtk_text_iter_backward_sentence_start (start); + if (gtk_text_iter_inside_sentence (end)) + gtk_text_iter_forward_sentence_end (end); + while (!gtk_text_iter_starts_sentence (end)) + { + if (!gtk_text_iter_forward_char (end)) + break; + } + break; + + case ATK_TEXT_BOUNDARY_SENTENCE_END: + if (gtk_text_iter_inside_sentence (start) && + !gtk_text_iter_starts_sentence (start)) + gtk_text_iter_backward_sentence_start (start); + while (!gtk_text_iter_ends_sentence (start)) + { + if (!gtk_text_iter_backward_char (start)) + break; + } + gtk_text_iter_forward_sentence_end (end); + break; + + case ATK_TEXT_BOUNDARY_LINE_START: + line_number = gtk_text_iter_get_line (start); + if (line_number == 0) + { + gtk_text_buffer_get_iter_at_offset (buffer, start, 0); + } + else + { + gtk_text_iter_backward_line (start); + gtk_text_iter_forward_line (start); + } + gtk_text_iter_forward_line (end); + break; + + case ATK_TEXT_BOUNDARY_LINE_END: + line_number = gtk_text_iter_get_line (start); + if (line_number == 0) + { + gtk_text_buffer_get_iter_at_offset (buffer, start, 0); + } + else + { + gtk_text_iter_backward_line (start); + gtk_text_iter_forward_line (start); + } + while (!gtk_text_iter_ends_line (start)) + { + if (!gtk_text_iter_backward_char (start)) + break; + } + gtk_text_iter_forward_to_line_end (end); + break; + } +} + +void +_gtk_text_buffer_get_text_after (GtkTextBuffer *buffer, + AtkTextBoundary boundary_type, + GtkTextIter *position, + GtkTextIter *start, + GtkTextIter *end) +{ + *start = *position; + *end = *start; + + switch (boundary_type) + { + case ATK_TEXT_BOUNDARY_CHAR: + gtk_text_iter_forward_char (start); + gtk_text_iter_forward_chars (end, 2); + break; + + case ATK_TEXT_BOUNDARY_WORD_START: + if (gtk_text_iter_inside_word (end)) + gtk_text_iter_forward_word_end (end); + while (!gtk_text_iter_starts_word (end)) + { + if (!gtk_text_iter_forward_char (end)) + break; + } + *start = *end; + if (!gtk_text_iter_is_end (end)) + { + gtk_text_iter_forward_word_end (end); + while (!gtk_text_iter_starts_word (end)) + { + if (!gtk_text_iter_forward_char (end)) + break; + } + } + break; + + case ATK_TEXT_BOUNDARY_WORD_END: + gtk_text_iter_forward_word_end (end); + *start = *end; + if (!gtk_text_iter_is_end (end)) + gtk_text_iter_forward_word_end (end); + break; + + case ATK_TEXT_BOUNDARY_SENTENCE_START: + if (gtk_text_iter_inside_sentence (end)) + gtk_text_iter_forward_sentence_end (end); + while (!gtk_text_iter_starts_sentence (end)) + { + if (!gtk_text_iter_forward_char (end)) + break; + } + *start = *end; + if (!gtk_text_iter_is_end (end)) + { + gtk_text_iter_forward_sentence_end (end); + while (!gtk_text_iter_starts_sentence (end)) + { + if (!gtk_text_iter_forward_char (end)) + break; + } + } + break; + + case ATK_TEXT_BOUNDARY_SENTENCE_END: + gtk_text_iter_forward_sentence_end (end); + *start = *end; + if (!gtk_text_iter_is_end (end)) + gtk_text_iter_forward_sentence_end (end); + break; + + case ATK_TEXT_BOUNDARY_LINE_START: + gtk_text_iter_forward_line (end); + *start = *end; + gtk_text_iter_forward_line (end); + break; + + case ATK_TEXT_BOUNDARY_LINE_END: + gtk_text_iter_forward_line (start); + *end = *start; + if (!gtk_text_iter_is_end (start)) + { + while (!gtk_text_iter_ends_line (start)) + { + if (!gtk_text_iter_backward_char (start)) + break; + } + gtk_text_iter_forward_to_line_end (end); + } + break; + } +}