]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtktextmark.c
Changes to gtktreeview to better support thicker focus lines,
[~andy/gtk] / gtk / gtktextmark.c
index 13587007bc2ab064b6f475c395b3ca65377f7a0b..b17fc345889ac32b764bfa3dd1fb6e9e6470d3cf 100644 (file)
@@ -47,7 +47,7 @@
  *
  */
 
-
+#define GTK_TEXT_USE_INTERNAL_UNSUPPORTED_API
 #include "gtktextbtree.h"
 
 static void gtk_text_mark_init       (GtkTextMark      *mark);
@@ -113,8 +113,6 @@ gtk_text_mark_finalize (GObject *obj)
 
   if (seg)
     {
-      g_return_if_fail (seg->body.mark.tree == NULL);
-
       if (seg->body.mark.tree != NULL)
         g_warning ("GtkTextMark being finalized while still in the buffer; "
                    "someone removed a reference they didn't own! Crash "
@@ -125,10 +123,13 @@ gtk_text_mark_finalize (GObject *obj)
 
       mark->segment = NULL;
     }
+
+  /* chain parent_class' handler */
+  G_OBJECT_CLASS (parent_class)->finalize (obj);
 }
 
 /**
- * gtk_text_mark_is_visible:
+ * gtk_text_mark_get_visible:
  * @mark: a #GtkTextMark
  * 
  * Returns %TRUE if the mark is visible (i.e. a cursor is displayed
@@ -137,7 +138,7 @@ gtk_text_mark_finalize (GObject *obj)
  * Return value: %TRUE if visible
  **/
 gboolean
-gtk_text_mark_is_visible (GtkTextMark *mark)
+gtk_text_mark_get_visible (GtkTextMark *mark)
 {
   GtkTextLineSegment *seg;
 
@@ -179,7 +180,7 @@ gtk_text_mark_get_deleted (GtkTextMark *mark)
 {
   GtkTextLineSegment *seg;
 
-  g_return_val_if_fail (mark != NULL, FALSE);
+  g_return_val_if_fail (GTK_IS_TEXT_MARK (mark), FALSE);
 
   seg = mark->segment;
 
@@ -189,6 +190,50 @@ gtk_text_mark_get_deleted (GtkTextMark *mark)
   return seg->body.mark.tree == NULL;
 }
 
+/**
+ * gtk_text_mark_get_buffer:
+ * @mark: a #GtkTextMark
+ * 
+ * Gets the buffer this mark is located inside,
+ * or NULL if the mark is deleted.
+ * 
+ * Return value: the mark's #GtkTextBuffer
+ **/
+GtkTextBuffer*
+gtk_text_mark_get_buffer (GtkTextMark *mark)
+{
+  GtkTextLineSegment *seg;
+
+  g_return_val_if_fail (GTK_IS_TEXT_MARK (mark), FALSE);
+
+  seg = mark->segment;
+
+  if (seg->body.mark.tree == NULL)
+    return NULL;
+  else
+    return _gtk_text_btree_get_buffer (seg->body.mark.tree);
+}
+
+/**
+ * gtk_text_mark_get_left_gravity:
+ * @mark: a #GtkTextMark
+ * 
+ * Determines whether the mark has left gravity.
+ * 
+ * Return value: %TRUE if the mark has left gravity, %FALSE otherwise
+ **/
+gboolean
+gtk_text_mark_get_left_gravity (GtkTextMark *mark)
+{
+  GtkTextLineSegment *seg;
+
+  g_return_val_if_fail (GTK_IS_TEXT_MARK (mark), FALSE);
+  
+  seg = mark->segment;
+
+  return seg->type == &gtk_text_left_mark_type;
+}
+
 /*
  * Macro that determines the size of a mark segment:
  */
@@ -273,21 +318,27 @@ GtkTextLineSegmentClass gtk_text_left_mark_type = {
  *      a mark lies in a range of characters being deleted.
  *
  * Results:
- *      Returns 1 to indicate that deletion has been rejected.
+ *      Returns 1 to indicate that deletion has been rejected,
+ *      or 0 otherwise
  *
  * Side effects:
- *      None (even if the whole tree is being deleted we don't
- *      free up the mark;  it will be done elsewhere).
+ *      Frees mark if tree is going away
  *
  *--------------------------------------------------------------
  */
 
 static gboolean
-mark_segment_delete_func (GtkTextLineSegment *segPtr,
+mark_segment_delete_func (GtkTextLineSegment *seg,
                           GtkTextLine        *line,
                           gboolean            tree_gone)
 {
-  return TRUE;
+  if (tree_gone)
+    {
+      _gtk_text_btree_release_mark_segment (seg->body.mark.tree, seg);
+      return FALSE;
+    }
+  else
+    return TRUE;
 }
 
 /*