summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog30
-rw-r--r--ChangeLog.pre-2-030
-rw-r--r--ChangeLog.pre-2-1030
-rw-r--r--ChangeLog.pre-2-230
-rw-r--r--ChangeLog.pre-2-430
-rw-r--r--ChangeLog.pre-2-630
-rw-r--r--ChangeLog.pre-2-830
-rw-r--r--docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf-unused.sgml8
-rw-r--r--gtk/gtktextbtree.c1
-rw-r--r--gtk/gtktextbuffer.c5
-rw-r--r--gtk/gtktextlayout.c3
-rw-r--r--gtk/gtktextlayout.h8
-rw-r--r--gtk/gtktexttag.c64
-rw-r--r--gtk/gtktexttag.h23
-rw-r--r--gtk/gtktexttypes.c43
-rw-r--r--gtk/gtktexttypes.h75
-rw-r--r--gtk/gtktextview.c131
-rw-r--r--gtk/gtktextview.h2
-rw-r--r--gtk/testtext.c48
-rw-r--r--tests/testtext.c48
20 files changed, 469 insertions, 200 deletions
diff --git a/ChangeLog b/ChangeLog
index 057cf73e96..329d1ec02b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,33 @@
+2000-09-25 Havoc Pennington <hp@redhat.com>
+
+ * gtk/gtktextview.c: Draw the focus, and leave space to do so.
+
+ * gtk/gtktexttypes.c: Remove Latin1 conversion stuff
+
+ * gtk/gtktextbtree.c (gtk_text_btree_node_remove_data):
+ Fix a bug when removing node data, we didn't properly
+ re-splice the linked list after removing the data.
+
+ * gtk/gtktextview.c (gtk_text_view_key_press_event): Pass through
+ GDK_Tab as literal tab, Ctrl-Tab to tab to focus widget
+
+ * gtk/gtktextbuffer.c (selection_received): fix g_convert usage
+
+ * gtk/gtktextlayout.c (set_para_values): Set tab array
+ for the layout from the GtkTextTag.
+
+ * gtk/gtktexttypes.h: delete tab and search cruft,
+ remove g_convert() in favor of GLib version
+
+ * gtk/gtktexttypes.c: remove tab implementation from here,
+ move to Pango
+
+ * gtk/gtktexttag.h, gtk/gtktexttag.c: Implement
+ tab stuff using new PangoTabArray from Pango
+
+ * gtk/gtktexttag.c (gtk_text_attributes_fill_from_tags): Remove
+ unused border_width stuff
+
Thu Sep 14 12:21:12 2000 Owen Taylor <otaylor@redhat.com>
* gtk/gtktexttypes.[ch]: Remove g_convert (moved to
diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0
index 057cf73e96..329d1ec02b 100644
--- a/ChangeLog.pre-2-0
+++ b/ChangeLog.pre-2-0
@@ -1,3 +1,33 @@
+2000-09-25 Havoc Pennington <hp@redhat.com>
+
+ * gtk/gtktextview.c: Draw the focus, and leave space to do so.
+
+ * gtk/gtktexttypes.c: Remove Latin1 conversion stuff
+
+ * gtk/gtktextbtree.c (gtk_text_btree_node_remove_data):
+ Fix a bug when removing node data, we didn't properly
+ re-splice the linked list after removing the data.
+
+ * gtk/gtktextview.c (gtk_text_view_key_press_event): Pass through
+ GDK_Tab as literal tab, Ctrl-Tab to tab to focus widget
+
+ * gtk/gtktextbuffer.c (selection_received): fix g_convert usage
+
+ * gtk/gtktextlayout.c (set_para_values): Set tab array
+ for the layout from the GtkTextTag.
+
+ * gtk/gtktexttypes.h: delete tab and search cruft,
+ remove g_convert() in favor of GLib version
+
+ * gtk/gtktexttypes.c: remove tab implementation from here,
+ move to Pango
+
+ * gtk/gtktexttag.h, gtk/gtktexttag.c: Implement
+ tab stuff using new PangoTabArray from Pango
+
+ * gtk/gtktexttag.c (gtk_text_attributes_fill_from_tags): Remove
+ unused border_width stuff
+
Thu Sep 14 12:21:12 2000 Owen Taylor <otaylor@redhat.com>
* gtk/gtktexttypes.[ch]: Remove g_convert (moved to
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index 057cf73e96..329d1ec02b 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,33 @@
+2000-09-25 Havoc Pennington <hp@redhat.com>
+
+ * gtk/gtktextview.c: Draw the focus, and leave space to do so.
+
+ * gtk/gtktexttypes.c: Remove Latin1 conversion stuff
+
+ * gtk/gtktextbtree.c (gtk_text_btree_node_remove_data):
+ Fix a bug when removing node data, we didn't properly
+ re-splice the linked list after removing the data.
+
+ * gtk/gtktextview.c (gtk_text_view_key_press_event): Pass through
+ GDK_Tab as literal tab, Ctrl-Tab to tab to focus widget
+
+ * gtk/gtktextbuffer.c (selection_received): fix g_convert usage
+
+ * gtk/gtktextlayout.c (set_para_values): Set tab array
+ for the layout from the GtkTextTag.
+
+ * gtk/gtktexttypes.h: delete tab and search cruft,
+ remove g_convert() in favor of GLib version
+
+ * gtk/gtktexttypes.c: remove tab implementation from here,
+ move to Pango
+
+ * gtk/gtktexttag.h, gtk/gtktexttag.c: Implement
+ tab stuff using new PangoTabArray from Pango
+
+ * gtk/gtktexttag.c (gtk_text_attributes_fill_from_tags): Remove
+ unused border_width stuff
+
Thu Sep 14 12:21:12 2000 Owen Taylor <otaylor@redhat.com>
* gtk/gtktexttypes.[ch]: Remove g_convert (moved to
diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2
index 057cf73e96..329d1ec02b 100644
--- a/ChangeLog.pre-2-2
+++ b/ChangeLog.pre-2-2
@@ -1,3 +1,33 @@
+2000-09-25 Havoc Pennington <hp@redhat.com>
+
+ * gtk/gtktextview.c: Draw the focus, and leave space to do so.
+
+ * gtk/gtktexttypes.c: Remove Latin1 conversion stuff
+
+ * gtk/gtktextbtree.c (gtk_text_btree_node_remove_data):
+ Fix a bug when removing node data, we didn't properly
+ re-splice the linked list after removing the data.
+
+ * gtk/gtktextview.c (gtk_text_view_key_press_event): Pass through
+ GDK_Tab as literal tab, Ctrl-Tab to tab to focus widget
+
+ * gtk/gtktextbuffer.c (selection_received): fix g_convert usage
+
+ * gtk/gtktextlayout.c (set_para_values): Set tab array
+ for the layout from the GtkTextTag.
+
+ * gtk/gtktexttypes.h: delete tab and search cruft,
+ remove g_convert() in favor of GLib version
+
+ * gtk/gtktexttypes.c: remove tab implementation from here,
+ move to Pango
+
+ * gtk/gtktexttag.h, gtk/gtktexttag.c: Implement
+ tab stuff using new PangoTabArray from Pango
+
+ * gtk/gtktexttag.c (gtk_text_attributes_fill_from_tags): Remove
+ unused border_width stuff
+
Thu Sep 14 12:21:12 2000 Owen Taylor <otaylor@redhat.com>
* gtk/gtktexttypes.[ch]: Remove g_convert (moved to
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index 057cf73e96..329d1ec02b 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,3 +1,33 @@
+2000-09-25 Havoc Pennington <hp@redhat.com>
+
+ * gtk/gtktextview.c: Draw the focus, and leave space to do so.
+
+ * gtk/gtktexttypes.c: Remove Latin1 conversion stuff
+
+ * gtk/gtktextbtree.c (gtk_text_btree_node_remove_data):
+ Fix a bug when removing node data, we didn't properly
+ re-splice the linked list after removing the data.
+
+ * gtk/gtktextview.c (gtk_text_view_key_press_event): Pass through
+ GDK_Tab as literal tab, Ctrl-Tab to tab to focus widget
+
+ * gtk/gtktextbuffer.c (selection_received): fix g_convert usage
+
+ * gtk/gtktextlayout.c (set_para_values): Set tab array
+ for the layout from the GtkTextTag.
+
+ * gtk/gtktexttypes.h: delete tab and search cruft,
+ remove g_convert() in favor of GLib version
+
+ * gtk/gtktexttypes.c: remove tab implementation from here,
+ move to Pango
+
+ * gtk/gtktexttag.h, gtk/gtktexttag.c: Implement
+ tab stuff using new PangoTabArray from Pango
+
+ * gtk/gtktexttag.c (gtk_text_attributes_fill_from_tags): Remove
+ unused border_width stuff
+
Thu Sep 14 12:21:12 2000 Owen Taylor <otaylor@redhat.com>
* gtk/gtktexttypes.[ch]: Remove g_convert (moved to
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index 057cf73e96..329d1ec02b 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,33 @@
+2000-09-25 Havoc Pennington <hp@redhat.com>
+
+ * gtk/gtktextview.c: Draw the focus, and leave space to do so.
+
+ * gtk/gtktexttypes.c: Remove Latin1 conversion stuff
+
+ * gtk/gtktextbtree.c (gtk_text_btree_node_remove_data):
+ Fix a bug when removing node data, we didn't properly
+ re-splice the linked list after removing the data.
+
+ * gtk/gtktextview.c (gtk_text_view_key_press_event): Pass through
+ GDK_Tab as literal tab, Ctrl-Tab to tab to focus widget
+
+ * gtk/gtktextbuffer.c (selection_received): fix g_convert usage
+
+ * gtk/gtktextlayout.c (set_para_values): Set tab array
+ for the layout from the GtkTextTag.
+
+ * gtk/gtktexttypes.h: delete tab and search cruft,
+ remove g_convert() in favor of GLib version
+
+ * gtk/gtktexttypes.c: remove tab implementation from here,
+ move to Pango
+
+ * gtk/gtktexttag.h, gtk/gtktexttag.c: Implement
+ tab stuff using new PangoTabArray from Pango
+
+ * gtk/gtktexttag.c (gtk_text_attributes_fill_from_tags): Remove
+ unused border_width stuff
+
Thu Sep 14 12:21:12 2000 Owen Taylor <otaylor@redhat.com>
* gtk/gtktexttypes.[ch]: Remove g_convert (moved to
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index 057cf73e96..329d1ec02b 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,33 @@
+2000-09-25 Havoc Pennington <hp@redhat.com>
+
+ * gtk/gtktextview.c: Draw the focus, and leave space to do so.
+
+ * gtk/gtktexttypes.c: Remove Latin1 conversion stuff
+
+ * gtk/gtktextbtree.c (gtk_text_btree_node_remove_data):
+ Fix a bug when removing node data, we didn't properly
+ re-splice the linked list after removing the data.
+
+ * gtk/gtktextview.c (gtk_text_view_key_press_event): Pass through
+ GDK_Tab as literal tab, Ctrl-Tab to tab to focus widget
+
+ * gtk/gtktextbuffer.c (selection_received): fix g_convert usage
+
+ * gtk/gtktextlayout.c (set_para_values): Set tab array
+ for the layout from the GtkTextTag.
+
+ * gtk/gtktexttypes.h: delete tab and search cruft,
+ remove g_convert() in favor of GLib version
+
+ * gtk/gtktexttypes.c: remove tab implementation from here,
+ move to Pango
+
+ * gtk/gtktexttag.h, gtk/gtktexttag.c: Implement
+ tab stuff using new PangoTabArray from Pango
+
+ * gtk/gtktexttag.c (gtk_text_attributes_fill_from_tags): Remove
+ unused border_width stuff
+
Thu Sep 14 12:21:12 2000 Owen Taylor <otaylor@redhat.com>
* gtk/gtktexttypes.[ch]: Remove g_convert (moved to
diff --git a/docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf-unused.sgml b/docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf-unused.sgml
index 366c8c4450..a8f01a9aa0 100644
--- a/docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf-unused.sgml
+++ b/docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf-unused.sgml
@@ -1,3 +1,7 @@
+<!-- ##### SECTION ./tmpl/from-drawables.sgml:Title ##### -->
+Drawables to Pixbufs
+
+
<!-- ##### USER_FUNCTION GdkPixbufLastUnref ##### -->
<para>
A function of this type can be used to override the default
@@ -15,10 +19,6 @@
@pixbuf: The pixbuf that is losing its last reference.
@data: User closure data.
-<!-- ##### SECTION ./tmpl/from-drawables.sgml:Title ##### -->
-Drawables to Pixbufs
-
-
<!-- ##### ARG GnomeCanvasPixbuf:height_pixels ##### -->
<para>
diff --git a/gtk/gtktextbtree.c b/gtk/gtktextbtree.c
index f59fa0c965..ca40609951 100644
--- a/gtk/gtktextbtree.c
+++ b/gtk/gtktextbtree.c
@@ -4724,6 +4724,7 @@ gtk_text_btree_node_remove_data(GtkTextBTreeNode *node, gpointer view_id)
if (nd->view_id == view_id)
break;
+ prev = nd;
nd = nd->next;
}
diff --git a/gtk/gtktextbuffer.c b/gtk/gtktextbuffer.c
index 19549efdf9..1ded48810e 100644
--- a/gtk/gtktextbuffer.c
+++ b/gtk/gtktextbuffer.c
@@ -1412,9 +1412,8 @@ clipboard_received (GtkClipboard *clipboard,
else
; /* FIXME Delete selected chars and give up X selection */
}
-#endif
-
-
+#endif
+
if (request_data->interactive)
gtk_text_buffer_insert_interactive (buffer, &insert_point,
str, -1, request_data->default_editable);
diff --git a/gtk/gtktextlayout.c b/gtk/gtktextlayout.c
index 901aa92666..730b4fde46 100644
--- a/gtk/gtktextlayout.c
+++ b/gtk/gtktextlayout.c
@@ -1039,6 +1039,9 @@ set_para_values (GtkTextLayout *layout,
pango_layout_set_alignment (display->layout, pango_align);
pango_layout_set_spacing (display->layout, style->pixels_inside_wrap * PANGO_SCALE);
+ if (style->tabs)
+ pango_layout_set_tabs (display->layout, style->tabs);
+
display->top_margin = style->pixels_above_lines;
display->height = style->pixels_above_lines + style->pixels_below_lines;
display->bottom_margin = style->pixels_below_lines;
diff --git a/gtk/gtktextlayout.h b/gtk/gtktextlayout.h
index e06ed4fd3f..79b569f61a 100644
--- a/gtk/gtktextlayout.h
+++ b/gtk/gtktextlayout.h
@@ -46,6 +46,14 @@ struct _GtkTextLayout
gint width;
gint height;
+ /* Pixel offsets from the left and from the top to be used when we
+ * draw; these allow us to create left/top margins. We don't need
+ * anything special for bottom/right margins, because those don't
+ * affect drawing.
+ */
+ /* gint left_edge; */
+ /* gint top_edge; */
+
GtkTextBuffer *buffer;
/* Default style used if no tags override it */
diff --git a/gtk/gtktexttag.c b/gtk/gtktexttag.c
index 69edf7b3a0..2c13409c26 100644
--- a/gtk/gtktexttag.c
+++ b/gtk/gtktexttag.c
@@ -55,6 +55,7 @@
#include "gtkmain.h"
#include <stdlib.h>
+#include <string.h>
enum {
EVENT,
@@ -90,6 +91,7 @@ enum {
ARG_OFFSET,
ARG_BG_FULL_HEIGHT,
ARG_LANGUAGE,
+ ARG_TABS,
/* Whether-a-style-arg-is-set args */
ARG_BACKGROUND_SET,
@@ -113,6 +115,7 @@ enum {
ARG_OFFSET_SET,
ARG_BG_FULL_HEIGHT_SET,
ARG_LANGUAGE_SET,
+ ARG_TABS_SET,
LAST_ARG
};
@@ -218,6 +221,8 @@ gtk_text_tag_class_init (GtkTextTagClass *klass)
GTK_ARG_READWRITE, ARG_UNDERLINE);
gtk_object_add_arg_type ("GtkTextTag::wrap_mode", GTK_TYPE_ENUM,
GTK_ARG_READWRITE, ARG_WRAP_MODE);
+ gtk_object_add_arg_type ("GtkTextTag::tabs", GTK_TYPE_POINTER,
+ GTK_ARG_READWRITE, ARG_TABS);
/* Style args are set or not */
gtk_object_add_arg_type ("GtkTextTag::background_set", GTK_TYPE_BOOL,
@@ -262,6 +267,9 @@ gtk_text_tag_class_init (GtkTextTagClass *klass)
GTK_ARG_READWRITE, ARG_UNDERLINE_SET);
gtk_object_add_arg_type ("GtkTextTag::wrap_mode_set", GTK_TYPE_BOOL,
GTK_ARG_READWRITE, ARG_WRAP_MODE_SET);
+ gtk_object_add_arg_type ("GtkTextTag::tabs_set", GTK_TYPE_BOOL,
+ GTK_ARG_READWRITE, ARG_TABS_SET);
+
signals[EVENT] =
gtk_signal_new ("event",
@@ -580,6 +588,18 @@ gtk_text_tag_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
tkxt_tag->language_set = TRUE;
tkxt_tag->values->language = g_strdup (GTK_VALUE_STRING(*arg));
break;
+
+ case ARG_TABS:
+ tkxt_tag->tabs_set = TRUE;
+
+ if (tkxt_tag->values->tabs)
+ pango_tab_array_free (tkxt_tag->values->tabs);
+
+ tkxt_tag->values->tabs =
+ pango_tab_array_copy (GTK_VALUE_POINTER (*arg));
+
+ size_changed = TRUE;
+ break;
/* Whether the value should be used... */
@@ -671,6 +691,11 @@ gtk_text_tag_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
tkxt_tag->language_set = GTK_VALUE_BOOL(*arg);
size_changed = TRUE;
break;
+
+ case ARG_TABS_SET:
+ tkxt_tag->tabs_set = GTK_VALUE_BOOL (*arg);
+ size_changed = TRUE;
+ break;
default:
g_assert_not_reached();
@@ -800,6 +825,11 @@ gtk_text_tag_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
case ARG_LANGUAGE:
GTK_VALUE_STRING(*arg) = g_strdup (tag->values->language);
break;
+
+ case ARG_TABS:
+ GTK_VALUE_POINTER (*arg) = tag->values->tabs ?
+ pango_tab_array_copy (tag->values->tabs) : NULL;
+ break;
case ARG_BACKGROUND_SET:
case ARG_BACKGROUND_GDK_SET:
@@ -878,6 +908,10 @@ gtk_text_tag_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
case ARG_LANGUAGE_SET:
GTK_VALUE_BOOL(*arg) = tag->language_set;
break;
+
+ case ARG_TABS_SET:
+ GTK_VALUE_BOOL (*arg) = tag->tabs_set;
+ break;
case ARG_BACKGROUND:
case ARG_FOREGROUND:
@@ -1050,7 +1084,7 @@ gtk_text_attributes_new(void)
void
gtk_text_attributes_copy(GtkTextAttributes *src,
- GtkTextAttributes *dest)
+ GtkTextAttributes *dest)
{
guint orig_refcount;
@@ -1067,9 +1101,6 @@ gtk_text_attributes_copy(GtkTextAttributes *src,
if (src->appearance.fg_stipple)
gdk_bitmap_ref(src->appearance.fg_stipple);
- if (src->tab_array)
- gtk_text_view_tab_array_ref(src->tab_array);
-
/* Remove refs */
if (dest->appearance.bg_stipple)
@@ -1078,15 +1109,16 @@ gtk_text_attributes_copy(GtkTextAttributes *src,
if (dest->appearance.fg_stipple)
gdk_bitmap_unref(dest->appearance.fg_stipple);
- if (dest->tab_array)
- gtk_text_view_tab_array_unref(dest->tab_array);
-
/* Copy */
orig_refcount = dest->refcount;
*dest = *src;
dest->font_desc = pango_font_description_copy (src->font_desc);
+
+ if (src->tabs)
+ dest->tabs = pango_tab_array_copy (src->tabs);
+
dest->language = g_strdup (src->language);
dest->refcount = orig_refcount;
@@ -1122,8 +1154,8 @@ gtk_text_attributes_unref(GtkTextAttributes *values)
if (values->appearance.fg_stipple)
gdk_bitmap_unref(values->appearance.fg_stipple);
- if (values->tab_array)
- gtk_text_view_tab_array_unref(values->tab_array);
+ if (values->tabs)
+ pango_tab_array_free (values->tabs);
if (values->language)
g_free (values->language);
@@ -1197,10 +1229,7 @@ gtk_text_attributes_fill_from_tags(GtkTextAttributes *dest,
dest->appearance.bg_color = vals->appearance.bg_color;
dest->appearance.draw_bg = TRUE;
- }
-
- if (tag->border_width_set)
- dest->border_width = vals->border_width;
+ }
if (tag->relief_set)
dest->relief = vals->relief;
@@ -1260,12 +1289,11 @@ gtk_text_attributes_fill_from_tags(GtkTextAttributes *dest,
if (tag->pixels_inside_wrap_set)
dest->pixels_inside_wrap = vals->pixels_inside_wrap;
- if (tag->tab_array_set)
+ if (tag->tabs_set)
{
- gtk_text_view_tab_array_ref(vals->tab_array);
- if (dest->tab_array)
- gtk_text_view_tab_array_unref(dest->tab_array);
- dest->tab_array = vals->tab_array;
+ if (dest->tabs)
+ pango_tab_array_free (dest->tabs);
+ dest->tabs = pango_tab_array_copy (vals->tabs);
}
if (tag->wrap_mode_set)
diff --git a/gtk/gtktexttag.h b/gtk/gtktexttag.h
index 4b522c6c66..91a0591f30 100644
--- a/gtk/gtktexttag.h
+++ b/gtk/gtktexttag.h
@@ -11,9 +11,9 @@ extern "C" {
typedef struct _GtkTextIter GtkTextIter;
typedef struct _GtkTextBTreeNode GtkTextBTreeNode;
typedef struct _GtkTextTagTable GtkTextTagTable;
-typedef struct _GtkTextTabArray GtkTextTabArray;
-typedef enum {
+typedef enum
+{
GTK_WRAPMODE_NONE,
GTK_WRAPMODE_CHAR,
GTK_WRAPMODE_WORD
@@ -54,11 +54,10 @@ struct _GtkTextTag {
GtkTextAttributes *values;
- /*
- Flags for whether a given value is set; if a value is unset, then
- this tag does not affect it. */
+ /* Flags for whether a given value is set; if a value is unset, then
+ * this tag does not affect it.
+ */
guint bg_color_set : 1;
- guint border_width_set : 1;
guint relief_set : 1;
guint bg_stipple_set : 1;
guint fg_color_set : 1;
@@ -73,7 +72,7 @@ struct _GtkTextTag {
guint pixels_above_lines_set : 1;
guint pixels_below_lines_set : 1;
guint pixels_inside_wrap_set : 1;
- guint tab_array_set : 1;
+ guint tabs_set : 1;
guint underline_set : 1;
guint wrap_mode_set : 1;
guint bg_full_height_set : 1;
@@ -123,7 +122,8 @@ struct _GtkTextAppearance
/* Whether to use background-related values; this is irrelevant for
* the values struct when in a tag, but is used for the composite
* values struct; it's true if any of the tags being composited
- * had background stuff set. */
+ * had background stuff set.
+ */
guint draw_bg : 1;
/* This is only used when we are actually laying out and rendering
@@ -139,7 +139,6 @@ struct _GtkTextAttributes
GtkTextAppearance appearance;
- gint border_width;
GtkShadowType relief;
GtkJustification justify;
GtkTextDirection direction;
@@ -163,7 +162,7 @@ struct _GtkTextAttributes
gint pixels_inside_wrap;
- GtkTextTabArray *tab_array;
+ PangoTabArray *tabs;
GtkWrapMode wrap_mode; /* How to handle wrap-around for this tag.
* Must be GTK_WRAPMODE_CHAR,
@@ -176,7 +175,8 @@ struct _GtkTextAttributes
guint invisible : 1;
/* Background is fit to full line height rather than
- * baseline +/- ascent/descent (font height) */
+ * baseline +/- ascent/descent (font height)
+ */
guint bg_full_height : 1;
/* can edit this text */
@@ -197,7 +197,6 @@ void gtk_text_attributes_copy (GtkTextAttributes *src,
void gtk_text_attributes_unref (GtkTextAttributes *values);
void gtk_text_attributes_ref (GtkTextAttributes *values);
-
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/gtk/gtktexttypes.c b/gtk/gtktexttypes.c
index 866344ab46..a740fc6b39 100644
--- a/gtk/gtktexttypes.c
+++ b/gtk/gtktexttypes.c
@@ -1,47 +1,5 @@
#include "gtktexttypes.h"
-
-/*
- * Tab array
- */
-
-GtkTextTabArray*
-gtk_text_view_tab_array_new(guint size)
-{
- GtkTextTabArray *array;
-
- array = g_new0(GtkTextTabArray, 1);
-
- array->refcount = 1;
- array->numTabs = size;
- array->tabs = g_new0(GtkTextTab, size);
-
- return array;
-}
-
-void
-gtk_text_view_tab_array_ref(GtkTextTabArray *tab_array)
-{
- g_return_if_fail(tab_array != NULL);
-
- tab_array->refcount += 1;
-}
-
-void
-gtk_text_view_tab_array_unref(GtkTextTabArray *tab_array)
-{
- g_return_if_fail(tab_array != NULL);
- g_return_if_fail(tab_array->refcount > 0);
-
- tab_array->refcount -= 1;
-
- if (tab_array->refcount == 0)
- {
- g_free(tab_array->tabs);
- g_free(tab_array);
- }
-}
-
/* These are used to represent embedded non-character objects
* if you return a string representation of a text buffer
*/
@@ -59,4 +17,3 @@ gtk_text_byte_begins_utf8_char(const gchar *byte)
{
return inline_byte_begins_utf8_char(byte);
}
-
diff --git a/gtk/gtktexttypes.h b/gtk/gtktexttypes.h
index 58de8618ac..85aeb7f850 100644
--- a/gtk/gtktexttypes.h
+++ b/gtk/gtktexttypes.h
@@ -15,84 +15,9 @@ typedef struct _GtkTextCounter GtkTextCounter;
typedef struct _GtkTextLineSegment GtkTextLineSegment;
typedef struct _GtkTextLineSegmentClass GtkTextLineSegmentClass;
typedef struct _GtkTextToggleBody GtkTextToggleBody;
-typedef struct _GtkTextViewSearch GtkTextViewSearch;
-typedef struct _GtkTextTab GtkTextTab;
-typedef struct _GtkTextViewStyle GtkTextViewStyle;
typedef struct _GtkTextMarkBody GtkTextMarkBody;
/*
- * Search
- */
-
-/*
- * The data structure below is used for searching a B-tree for transitions
- * on a single tag (or for all tag transitions). No code outside of
- * tkTextBTree.c should ever modify any of the fields in these structures,
- * but it's OK to use them for read-only information.
- */
-
-struct _GtkTextViewSearch {
- GtkTextBTree *tree;
-
- GtkTextIter curIndex; /* Position of last tag transition
- * returned by gtk_text_btree_next_tag, or
- * index of start of segment
- * containing starting position for
- * search if gtk_text_btree_next_tag hasn't
- * been called yet, or same as
- * stopIndex if search is over. */
-
- GtkTextLineSegment *segPtr; /* Actual tag segment returned
- by last call to
- gtk_text_btree_next_tag,
- or NULL if
- gtk_text_btree_next_tag
- hasn't returned anything
- yet. */
-
- GtkTextLineSegment *lastPtr; /* Stop search before just before
- * considering this segment. */
- GtkTextTag *tag; /* Tag to search for (or tag found, if
- * allTags is non-zero). */
- int linesLeft; /* Lines left to search (including
- * curIndex and stopIndex). When
- * this becomes <= 0 the search is
- * over. */
- int allTags; /* Non-zero means ignore tag check:
- * search for transitions on all
- * tags. */
-};
-
-/*
- * The following data structure describes a single tab stop.
- */
-
-typedef enum {
- GTK_TEXT_TAB_LEFT,
- GTK_TEXT_TAB_RIGHT,
- GTK_TEXT_TAB_CENTER,
- GTK_TEXT_TAB_NUMERIC
-} GtkTextTabAlign;
-
-struct _GtkTextTab {
- int location; /* Offset in pixels of this tab stop
- * from the left margin (lmargin2) of
- * the text. */
- GtkTextTabAlign alignment; /* Where the tab stop appears relative
- * to the text. */
-};
-
-struct _GtkTextTabArray {
- guint refcount;
- int numTabs; /* Number of tab stops. */
- GtkTextTab *tabs;
-};
-
-GtkTextTabArray *gtk_text_view_tab_array_new (guint size);
-void gtk_text_view_tab_array_ref (GtkTextTabArray *tab_array);
-void gtk_text_view_tab_array_unref (GtkTextTabArray *tab_array);
-
-/*
* Declarations for variables shared among the text-related files:
*/
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index 55b378c6e9..19e4cd4248 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -62,6 +62,15 @@
#include "gtktexttypes.h"
#include <string.h>
+#define FOCUS_RECT_WIDTH 10
+#if 0
+#define SCREEN_WIDTH(widget) (MAX (GTK_WIDGET(widget)->allocation.width - FOCUS_RECT_WIDTH*2, 0))
+#define SCREEN_HEIGHT(widget) (MAX (GTK_WIDGET(widget)->allocation.height - FOCUS_RECT_WIDTH*2, 0))
+#else
+#define SCREEN_WIDTH(widget) GTK_WIDGET(widget)->allocation.width
+#define SCREEN_HEIGHT(widget) GTK_WIDGET(widget)->allocation.height
+#endif
+
enum {
MOVE,
SET_ANCHOR,
@@ -127,6 +136,7 @@ static void gtk_text_view_draw (GtkWidget *widget,
GdkRectangle *area);
static gint gtk_text_view_expose_event (GtkWidget *widget,
GdkEventExpose *expose);
+static void gtk_text_view_draw_focus (GtkWidget *widget);
/* Source side drag signals */
@@ -189,9 +199,9 @@ static void gtk_text_view_validate_onscreen (GtkTextView *text_vi
static void gtk_text_view_get_first_para_iter (GtkTextView *text_view,
GtkTextIter *iter);
static void gtk_text_view_scroll_calc_now (GtkTextView *text_view);
-static void gtk_text_view_set_values_from_style (GtkTextView *text_view,
- GtkTextAttributes *values,
- GtkStyle *style);
+static void gtk_text_view_set_attributes_from_style (GtkTextView *text_view,
+ GtkTextAttributes *values,
+ GtkStyle *style);
static void gtk_text_view_ensure_layout (GtkTextView *text_view);
static void gtk_text_view_destroy_layout (GtkTextView *text_view);
static void gtk_text_view_start_selection_drag (GtkTextView *text_view,
@@ -205,8 +215,8 @@ static void gtk_text_view_start_selection_dnd (GtkTextView *text_vi
static void gtk_text_view_start_cursor_blink (GtkTextView *text_view);
static void gtk_text_view_stop_cursor_blink (GtkTextView *text_view);
-static void gtk_text_view_value_changed (GtkAdjustment *adj,
- GtkTextView *view);
+static void gtk_text_view_value_changed (GtkAdjustment *adj,
+ GtkTextView *view);
static void gtk_text_view_commit_handler (GtkIMContext *context,
const gchar *str,
GtkTextView *text_view);
@@ -571,7 +581,8 @@ gtk_text_view_class_init (GtkTextViewClass *klass)
widget_class->motion_notify_event = gtk_text_view_motion_event;
widget_class->expose_event = gtk_text_view_expose_event;
widget_class->draw = gtk_text_view_draw;
-
+ widget_class->draw_focus = gtk_text_view_draw_focus;
+
widget_class->drag_begin = gtk_text_view_drag_begin;
widget_class->drag_end = gtk_text_view_drag_end;
widget_class->drag_data_get = gtk_text_view_drag_data_get;
@@ -783,8 +794,8 @@ gtk_text_view_scroll_to_mark_adjusted (GtkTextView *text_view,
screen.x = current_x_scroll;
screen.y = current_y_scroll;
- screen.width = widget->allocation.width;
- screen.height = widget->allocation.height;
+ screen.width = SCREEN_WIDTH (widget);
+ screen.height = SCREEN_HEIGHT (widget);
{
/* Clamp margin so it's not too large. */
@@ -921,8 +932,8 @@ gtk_text_view_get_visible_rect (GtkTextView *text_view,
{
visible_rect->x = text_view->xoffset;
visible_rect->y = text_view->yoffset;
- visible_rect->width = widget->allocation.width;
- visible_rect->height = widget->allocation.height;
+ visible_rect->width = SCREEN_WIDTH (widget);
+ visible_rect->height = SCREEN_HEIGHT (widget);
}
}
@@ -1174,14 +1185,14 @@ gtk_text_view_size_allocate (GtkWidget *widget,
gtk_text_view_ensure_layout (text_view);
gtk_text_layout_set_screen_width (text_view->layout,
- GTK_WIDGET (text_view)->allocation.width);
+ SCREEN_WIDTH (text_view));
gtk_text_view_validate_onscreen (text_view);
gtk_text_view_scroll_calc_now (text_view);
- /* Now adjust the value of the adjustment to keep the cursor at the same place in
- * the buffer
- */
+ /* Now adjust the value of the adjustment to keep the cursor at the
+ * same place in the buffer
+ */
gtk_text_view_get_first_para_iter (text_view, &first_para);
gtk_text_layout_get_line_yrange (text_view->layout, &first_para, &y, NULL);
@@ -1201,16 +1212,18 @@ gtk_text_view_size_allocate (GtkWidget *widget,
yoffset_changed = TRUE;
}
- text_view->hadjustment->page_size = allocation->width;
- text_view->hadjustment->page_increment = allocation->width / 2;
+ text_view->hadjustment->page_size = SCREEN_WIDTH (text_view);
+ text_view->hadjustment->page_increment = SCREEN_WIDTH (text_view) / 2;
text_view->hadjustment->lower = 0;
- text_view->hadjustment->upper = MAX (allocation->width, text_view->width);
+ text_view->hadjustment->upper = MAX (SCREEN_WIDTH (text_view),
+ text_view->width);
gtk_signal_emit_by_name (GTK_OBJECT (text_view->hadjustment), "changed");
- text_view->vadjustment->page_size = allocation->height;
- text_view->vadjustment->page_increment = allocation->height / 2;
+ text_view->vadjustment->page_size = SCREEN_HEIGHT (text_view);
+ text_view->vadjustment->page_increment = SCREEN_HEIGHT (text_view) / 2;
text_view->vadjustment->lower = 0;
- text_view->vadjustment->upper = MAX (allocation->height, text_view->height);
+ text_view->vadjustment->upper = MAX (SCREEN_HEIGHT (text_view),
+ text_view->height);
gtk_signal_emit_by_name (GTK_OBJECT (text_view->vadjustment), "changed");
if (yoffset_changed)
@@ -1230,13 +1243,15 @@ gtk_text_view_validate_onscreen (GtkTextView *text_view)
{
GtkWidget *widget = GTK_WIDGET (text_view);
- if (widget->allocation.height > 0)
+ if (SCREEN_HEIGHT (widget) > 0)
{
GtkTextIter first_para;
gtk_text_view_get_first_para_iter (text_view, &first_para);
gtk_text_layout_validate_yrange (text_view->layout,
&first_para,
- 0, text_view->first_para_pixels + widget->allocation.height);
+ 0,
+ text_view->first_para_pixels +
+ SCREEN_HEIGHT (widget));
}
}
@@ -1434,7 +1449,7 @@ gtk_text_view_style_set (GtkWidget *widget,
gdk_window_set_background (text_view->bin_window,
&widget->style->base[GTK_WIDGET_STATE (widget)]);
- gtk_text_view_set_values_from_style (text_view, text_view->layout->default_style, widget->style);
+ gtk_text_view_set_attributes_from_style (text_view, text_view->layout->default_style, widget->style);
gtk_text_layout_default_style_changed (text_view->layout);
}
}
@@ -1606,6 +1621,17 @@ gtk_text_view_key_press_event (GtkWidget *widget, GdkEventKey *event)
0);
return TRUE;
}
+ /* Pass through Tab as literal tab, unless Control is held down */
+ else if (event->keyval == GDK_Tab && !(event->state & GDK_CONTROL_MASK))
+ {
+ gtk_text_buffer_insert_interactive_at_cursor (text_view->buffer, "\t", 1,
+ text_view->editable);
+ gtk_text_view_scroll_to_mark (text_view,
+ gtk_text_buffer_get_mark (text_view->buffer,
+ "insert"),
+ 0);
+ return TRUE;
+ }
else
return FALSE;
}
@@ -1702,7 +1728,8 @@ gtk_text_view_focus_in_event (GtkWidget *widget, GdkEventFocus *event)
GtkTextView *text_view = GTK_TEXT_VIEW (widget);
GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
-
+ gtk_widget_draw_focus (widget);
+
if (text_view->cursor_visible && text_view->layout)
{
gtk_text_layout_set_cursor_visible (text_view->layout, TRUE);
@@ -1720,7 +1747,8 @@ gtk_text_view_focus_out_event (GtkWidget *widget, GdkEventFocus *event)
GtkTextView *text_view = GTK_TEXT_VIEW (widget);
GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);
-
+ gtk_widget_draw_focus (widget);
+
if (text_view->cursor_visible && text_view->layout)
{
gtk_text_layout_set_cursor_visible (text_view->layout, FALSE);
@@ -1761,7 +1789,8 @@ gtk_text_view_paint (GtkWidget *widget, GdkRectangle *area)
gtk_text_layout_draw (text_view->layout,
widget,
text_view->bin_window,
- text_view->xoffset, text_view->yoffset,
+ text_view->xoffset,
+ text_view->yoffset,
area->x, area->y,
area->width, area->height);
}
@@ -1781,6 +1810,23 @@ gtk_text_view_expose_event (GtkWidget *widget, GdkEventExpose *event)
return TRUE;
}
+static void
+gtk_text_view_draw_focus (GtkWidget *widget)
+{
+ if (GTK_WIDGET_DRAWABLE (widget))
+ {
+ if (GTK_WIDGET_HAS_FOCUS (widget))
+ {
+
+ gtk_paint_focus (widget->style, widget->window,
+ NULL, widget, "textview",
+ 0, 0,
+ widget->allocation.width - 1,
+ widget->allocation.height - 1);
+ }
+ }
+}
+
/*
* Blink!
*/
@@ -1987,10 +2033,10 @@ gtk_text_view_scroll_pages (GtkTextView *text_view,
gtk_text_layout_validate_yrange (text_view->layout, &anchor, y0, y1);
-
gtk_text_view_get_virtual_cursor_pos (text_view, &cursor_x_pos, &cursor_y_pos);
newval = adj->value;
+
newval += count * adj->page_increment;
cursor_y_pos += newval - adj->value;
@@ -2222,9 +2268,9 @@ move_insert_to_pointer_and_scroll (GtkTextView *text_view, gboolean partial_scro
in case you want to do a continuous slow scroll. */
#define SLOW_SCROLL_TH 7
if (x >= (0 - SLOW_SCROLL_TH) &&
- x < (GTK_WIDGET (text_view)->allocation.width + SLOW_SCROLL_TH) &&
+ x < (SCREEN_WIDTH (text_view) + SLOW_SCROLL_TH) &&
y >= (0 - SLOW_SCROLL_TH) &&
- y < (GTK_WIDGET (text_view)->allocation.height + SLOW_SCROLL_TH))
+ y < (SCREEN_HEIGHT (text_view) + SLOW_SCROLL_TH))
{
adjust = 0;
in_threshold = TRUE;
@@ -2394,13 +2440,12 @@ static void
gtk_text_view_scroll_calc_now (GtkTextView *text_view)
{
gint width = 0, height = 0;
- GtkWidget *widget = GTK_WIDGET (text_view);
gtk_text_view_ensure_layout (text_view);
gtk_text_layout_set_screen_width (text_view->layout,
- widget->allocation.width);
+ SCREEN_WIDTH (text_view));
gtk_text_layout_get_size (text_view->layout, &width, &height);
@@ -2427,9 +2472,9 @@ gtk_text_view_scroll_calc_now (GtkTextView *text_view)
text_view->height = height;
gtk_text_view_set_adjustment_upper (get_hadjustment (text_view),
- MAX (widget->allocation.width, width));
+ MAX (SCREEN_WIDTH (text_view), width));
gtk_text_view_set_adjustment_upper (get_vadjustment (text_view),
- MAX (widget->allocation.height, height));
+ MAX (SCREEN_HEIGHT (text_view), height));
/* hadj/vadj exist since we called get_hadjustment/get_vadjustment above */
@@ -2437,21 +2482,21 @@ gtk_text_view_scroll_calc_now (GtkTextView *text_view)
our allocation minus one step, and a step is
1/10 of our allocation. */
text_view->hadjustment->step_increment =
- GTK_WIDGET (text_view)->allocation.width/10.0;
+ SCREEN_WIDTH (text_view) / 10.0;
text_view->hadjustment->page_increment =
- GTK_WIDGET (text_view)->allocation.width *0.9;
+ SCREEN_WIDTH (text_view) * 0.9;
text_view->vadjustment->step_increment =
- GTK_WIDGET (text_view)->allocation.height/10.0;
+ SCREEN_HEIGHT (text_view) / 10.0;
text_view->vadjustment->page_increment =
- GTK_WIDGET (text_view)->allocation.height *0.9;
+ SCREEN_HEIGHT (text_view) * 0.9;
}
}
static void
-gtk_text_view_set_values_from_style (GtkTextView *text_view,
- GtkTextAttributes *values,
- GtkStyle *style)
+gtk_text_view_set_attributes_from_style (GtkTextView *text_view,
+ GtkTextAttributes *values,
+ GtkStyle *style)
{
values->appearance.bg_color = style->base[GTK_STATE_NORMAL];
values->appearance.fg_color = style->fg[GTK_STATE_NORMAL];
@@ -2507,7 +2552,8 @@ gtk_text_view_ensure_layout (GtkTextView *text_view)
style = gtk_text_attributes_new ();
gtk_widget_ensure_style (widget);
- gtk_text_view_set_values_from_style (text_view, style, widget->style);
+ gtk_text_view_set_attributes_from_style (text_view,
+ style, widget->style);
style->pixels_above_lines = 2;
style->pixels_below_lines = 2;
@@ -2691,7 +2737,7 @@ gtk_text_view_drag_motion (GtkWidget *widget,
the selection. */
gint margin;
- margin = MIN (widget->allocation.width, widget->allocation.height);
+ margin = MIN (SCREEN_WIDTH (widget), SCREEN_HEIGHT (widget));
margin /= 5;
gtk_text_view_scroll_to_mark_adjusted (text_view,
@@ -2752,6 +2798,7 @@ gtk_text_view_drag_data_received (GtkWidget *widget,
drag_target_mark);
str = gtk_selection_data_get_text (selection_data);
+
if (str)
{
gtk_text_buffer_insert_interactive (text_view->buffer,
diff --git a/gtk/gtktextview.h b/gtk/gtktextview.h
index 1b32c0386d..affbd341e9 100644
--- a/gtk/gtktextview.h
+++ b/gtk/gtktextview.h
@@ -88,7 +88,7 @@ struct _GtkTextViewClass {
void (* paste_clipboard) (GtkTextView *text_view);
/* overwrite */
void (* toggle_overwrite) (GtkTextView *text_view);
- void (*set_scroll_adjustments) (GtkTextView *text_view,
+ void (* set_scroll_adjustments) (GtkTextView *text_view,
GtkAdjustment *hadjustment,
GtkAdjustment *vadjustment);
};
diff --git a/gtk/testtext.c b/gtk/testtext.c
index 4b53e46738..8fa5718f75 100644
--- a/gtk/testtext.c
+++ b/gtk/testtext.c
@@ -22,6 +22,7 @@ struct _Buffer
gint untitled_serial;
GtkTextTag *not_editable_tag;
GtkTextTag *found_text_tag;
+ GtkTextTag *custom_tabs_tag;
};
struct _View
@@ -895,6 +896,34 @@ do_apply_editable (gpointer callback_data,
}
}
+
+static void
+do_apply_tabs (gpointer callback_data,
+ guint callback_action,
+ GtkWidget *widget)
+{
+ View *view = view_from_widget (widget);
+ GtkTextIter start;
+ GtkTextIter end;
+
+ if (gtk_text_buffer_get_selection_bounds (view->buffer->buffer,
+ &start, &end))
+ {
+ if (callback_action)
+ {
+ gtk_text_buffer_remove_tag (view->buffer->buffer,
+ view->buffer->custom_tabs_tag,
+ &start, &end);
+ }
+ else
+ {
+ gtk_text_buffer_apply_tag (view->buffer->buffer,
+ view->buffer->custom_tabs_tag,
+ &start, &end);
+ }
+ }
+}
+
static void
dialog_response_callback (GtkWidget *dialog, gint response_id, gpointer data)
{
@@ -1033,6 +1062,8 @@ static GtkItemFactoryEntry menu_items[] =
{ "/_Attributes", NULL, 0, 0, "<Branch>" },
{ "/Attributes/Editable", NULL, do_apply_editable, TRUE, NULL },
{ "/Attributes/Not editable", NULL, do_apply_editable, FALSE, NULL },
+ { "/Attributes/Custom tabs", NULL, do_apply_tabs, FALSE, NULL },
+ { "/Attributes/Default tabs", NULL, do_apply_tabs, TRUE, NULL },
{ "/_Test", NULL, 0, 0, "<Branch>" },
{ "/Test/_Example", NULL, do_example, 0, NULL },
};
@@ -1187,7 +1218,8 @@ static Buffer *
create_buffer (void)
{
Buffer *buffer;
-
+ PangoTabArray *tabs;
+
buffer = g_new (Buffer, 1);
buffer->buffer = gtk_text_buffer_new (NULL);
@@ -1206,6 +1238,20 @@ create_buffer (void)
buffer->found_text_tag = gtk_text_buffer_create_tag (buffer->buffer, NULL);
gtk_object_set (GTK_OBJECT (buffer->found_text_tag),
"foreground", "red", NULL);
+
+ tabs = pango_tab_array_new_with_defaults (4,
+ TRUE,
+ PANGO_TAB_LEFT, 10,
+ PANGO_TAB_LEFT, 30,
+ PANGO_TAB_LEFT, 60,
+ PANGO_TAB_LEFT, 120);
+
+ buffer->custom_tabs_tag = gtk_text_buffer_create_tag (buffer->buffer, NULL);
+ gtk_object_set (GTK_OBJECT (buffer->custom_tabs_tag),
+ "tabs", tabs,
+ "foreground", "green", NULL);
+
+ pango_tab_array_free (tabs);
buffers = g_slist_prepend (buffers, buffer);
diff --git a/tests/testtext.c b/tests/testtext.c
index 4b53e46738..8fa5718f75 100644
--- a/tests/testtext.c
+++ b/tests/testtext.c
@@ -22,6 +22,7 @@ struct _Buffer
gint untitled_serial;
GtkTextTag *not_editable_tag;
GtkTextTag *found_text_tag;
+ GtkTextTag *custom_tabs_tag;
};
struct _View
@@ -895,6 +896,34 @@ do_apply_editable (gpointer callback_data,
}
}
+
+static void
+do_apply_tabs (gpointer callback_data,
+ guint callback_action,
+ GtkWidget *widget)
+{
+ View *view = view_from_widget (widget);
+ GtkTextIter start;
+ GtkTextIter end;
+
+ if (gtk_text_buffer_get_selection_bounds (view->buffer->buffer,
+ &start, &end))
+ {
+ if (callback_action)
+ {
+ gtk_text_buffer_remove_tag (view->buffer->buffer,
+ view->buffer->custom_tabs_tag,
+ &start, &end);
+ }
+ else
+ {
+ gtk_text_buffer_apply_tag (view->buffer->buffer,
+ view->buffer->custom_tabs_tag,
+ &start, &end);
+ }
+ }
+}
+
static void
dialog_response_callback (GtkWidget *dialog, gint response_id, gpointer data)
{
@@ -1033,6 +1062,8 @@ static GtkItemFactoryEntry menu_items[] =
{ "/_Attributes", NULL, 0, 0, "<Branch>" },
{ "/Attributes/Editable", NULL, do_apply_editable, TRUE, NULL },
{ "/Attributes/Not editable", NULL, do_apply_editable, FALSE, NULL },
+ { "/Attributes/Custom tabs", NULL, do_apply_tabs, FALSE, NULL },
+ { "/Attributes/Default tabs", NULL, do_apply_tabs, TRUE, NULL },
{ "/_Test", NULL, 0, 0, "<Branch>" },
{ "/Test/_Example", NULL, do_example, 0, NULL },
};
@@ -1187,7 +1218,8 @@ static Buffer *
create_buffer (void)
{
Buffer *buffer;
-
+ PangoTabArray *tabs;
+
buffer = g_new (Buffer, 1);
buffer->buffer = gtk_text_buffer_new (NULL);
@@ -1206,6 +1238,20 @@ create_buffer (void)
buffer->found_text_tag = gtk_text_buffer_create_tag (buffer->buffer, NULL);
gtk_object_set (GTK_OBJECT (buffer->found_text_tag),
"foreground", "red", NULL);
+
+ tabs = pango_tab_array_new_with_defaults (4,
+ TRUE,
+ PANGO_TAB_LEFT, 10,
+ PANGO_TAB_LEFT, 30,
+ PANGO_TAB_LEFT, 60,
+ PANGO_TAB_LEFT, 120);
+
+ buffer->custom_tabs_tag = gtk_text_buffer_create_tag (buffer->buffer, NULL);
+ gtk_object_set (GTK_OBJECT (buffer->custom_tabs_tag),
+ "tabs", tabs,
+ "foreground", "green", NULL);
+
+ pango_tab_array_free (tabs);
buffers = g_slist_prepend (buffers, buffer);