1 #ifndef GTK_TEXT_LAYOUT_H
2 #define GTK_TEXT_LAYOUT_H
6 #endif /* __cplusplus */
8 /* This is a "semi-private" header; it is intended for
9 * use by the text widget, and the text canvas item,
10 * but that's all. We may have to install it so the
11 * canvas item can use it, but users are not supposed
15 #include <gtk/gtktextbuffer.h>
16 #include <gtk/gtktextiter.h>
18 /* forward declarations that have to be here to avoid including
21 typedef struct _GtkTextLine GtkTextLine;
22 typedef struct _GtkTextLineData GtkTextLineData;
24 #define GTK_TYPE_TEXT_LAYOUT (gtk_text_layout_get_type())
25 #define GTK_TEXT_LAYOUT(obj) (GTK_CHECK_CAST ((obj), GTK_TYPE_TEXT_LAYOUT, GtkTextLayout))
26 #define GTK_TEXT_LAYOUT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_TEXT_LAYOUT, GtkTextLayoutClass))
27 #define GTK_IS_TEXT_LAYOUT(obj) (GTK_CHECK_TYPE ((obj), GTK_TYPE_TEXT_LAYOUT))
28 #define GTK_IS_TEXT_LAYOUT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_TEXT_LAYOUT))
29 #define GTK_TEXT_LAYOUT_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), GTK_TYPE_TEXT_LAYOUT, GtkTextLayoutClass))
31 typedef struct _GtkTextLayout GtkTextLayout;
32 typedef struct _GtkTextLayoutClass GtkTextLayoutClass;
33 typedef struct _GtkTextLineDisplay GtkTextLineDisplay;
34 typedef struct _GtkTextCursorDisplay GtkTextCursorDisplay;
35 typedef struct _GtkTextAttrAppearance GtkTextAttrAppearance;
39 GtkObject parent_instance;
41 /* width of the display area on-screen,
42 * i.e. pixels we should wrap to fit inside. */
45 /* width/height of the total logical area being layed out */
49 /* Pixel offsets from the left and from the top to be used when we
50 * draw; these allow us to create left/top margins. We don't need
51 * anything special for bottom/right margins, because those don't
57 GtkTextBuffer *buffer;
59 /* Default style used if no tags override it */
60 GtkTextAttributes *default_style;
62 /* Pango contexts used for creating layouts */
63 PangoContext *ltr_context;
64 PangoContext *rtl_context;
66 /* A cache of one style; this is used to ensure
67 * we don't constantly regenerate the style
68 * over long runs with the same style. */
69 GtkTextAttributes *one_style_cache;
71 /* A cache of one line display. Getting the same line
72 * many times in a row is the most common case.
74 GtkTextLineDisplay *one_display_cache;
76 /* Whether we are allowed to wrap right now */
79 /* Whether to show the insertion cursor */
80 guint cursor_visible : 1;
83 struct _GtkTextLayoutClass
85 GtkObjectClass parent_class;
87 /* Some portion of the layout was invalidated
89 void (* invalidated) (GtkTextLayout *layout);
91 /* A range of the layout changed appearance and possibly height
93 void (* changed) (GtkTextLayout *layout,
99 GtkTextLineData *(* wrap) (GtkTextLayout *layout,
102 GtkTextLineData *line_data);
104 void (* get_log_attrs) (GtkTextLayout *layout,
106 PangoLogAttr **attrs,
108 void (* invalidate) (GtkTextLayout *layout,
109 const GtkTextIter *start,
110 const GtkTextIter *end);
111 void (* free_line_data) (GtkTextLayout *layout,
113 GtkTextLineData *line_data);
116 struct _GtkTextAttrAppearance
119 GtkTextAppearance appearance;
122 struct _GtkTextCursorDisplay
131 struct _GtkTextLineDisplay
137 GtkTextDirection direction;
139 gint width; /* Width of layout */
140 gint total_width; /* width - margins, if no width set on layout, if width set on layout, -1 */
142 gint x_offset; /* Amount layout is shifted from left edge */
152 extern PangoAttrType gtk_text_attr_appearance_type;
154 GtkType gtk_text_layout_get_type (void) G_GNUC_CONST;
155 GtkTextLayout *gtk_text_layout_new (void);
157 void gtk_text_layout_set_buffer (GtkTextLayout *layout,
158 GtkTextBuffer *buffer);
159 void gtk_text_layout_set_default_style (GtkTextLayout *layout,
160 GtkTextAttributes *values);
161 void gtk_text_layout_set_contexts (GtkTextLayout *layout,
162 PangoContext *ltr_context,
163 PangoContext *rtl_context);
164 void gtk_text_layout_default_style_changed (GtkTextLayout *layout);
165 void gtk_text_layout_set_screen_width (GtkTextLayout *layout,
168 void gtk_text_layout_set_cursor_visible (GtkTextLayout *layout,
169 gboolean cursor_visible);
170 gboolean gtk_text_layout_get_cursor_visible (GtkTextLayout *layout);
172 /* Getting the size or the lines potentially results in a call to
173 * recompute, which is pretty massively expensive. Thus it should
174 * basically only be done in an idle handler.
176 * Long-term, we would really like to be able to do these without
177 * a full recompute so they may get cheaper over time.
179 void gtk_text_layout_get_size (GtkTextLayout *layout,
184 GSList *gtk_text_layout_get_lines (GtkTextLayout *layout,
185 /* [top_y, bottom_y) */
190 void gtk_text_layout_wrap_loop_start (GtkTextLayout *layout);
191 void gtk_text_layout_wrap_loop_end (GtkTextLayout *layout);
193 GtkTextLineDisplay *gtk_text_layout_get_line_display (GtkTextLayout *layout,
196 void gtk_text_layout_free_line_display (GtkTextLayout *layout,
197 GtkTextLineDisplay *display);
199 void gtk_text_layout_get_line_at_y (GtkTextLayout *layout,
200 GtkTextIter *target_iter,
203 void gtk_text_layout_get_iter_at_pixel (GtkTextLayout *layout,
207 void gtk_text_layout_invalidate (GtkTextLayout *layout,
208 const GtkTextIter *start,
209 const GtkTextIter *end);
210 void gtk_text_layout_free_line_data (GtkTextLayout *layout,
212 GtkTextLineData *line_data);
214 gboolean gtk_text_layout_is_valid (GtkTextLayout *layout);
215 void gtk_text_layout_validate_yrange (GtkTextLayout *layout,
216 GtkTextIter *anchor_line,
219 void gtk_text_layout_validate (GtkTextLayout *layout,
222 /* This function should return the passed-in line data,
223 OR remove the existing line data from the line, and
224 return a NEW line data after adding it to the line.
225 That is, invariant after calling the callback is that
226 there should be exactly one line data for this view
227 stored on the btree line. */
228 GtkTextLineData *gtk_text_layout_wrap (GtkTextLayout *layout,
231 GtkTextLineData *line_data);
232 void gtk_text_layout_get_log_attrs (GtkTextLayout *layout,
234 PangoLogAttr **attrs,
236 void gtk_text_layout_changed (GtkTextLayout *layout,
240 void gtk_text_layout_get_iter_location (GtkTextLayout *layout,
241 const GtkTextIter *iter,
243 void gtk_text_layout_get_line_yrange (GtkTextLayout *layout,
244 const GtkTextIter *iter,
247 void gtk_text_layout_get_cursor_locations (GtkTextLayout *layout,
249 GdkRectangle *strong_pos,
250 GdkRectangle *weak_pos);
251 gboolean gtk_text_layout_clamp_iter_to_vrange (GtkTextLayout *layout,
256 void gtk_text_layout_move_iter_to_line_end (GtkTextLayout *layout,
259 void gtk_text_layout_move_iter_to_previous_line (GtkTextLayout *layout,
261 void gtk_text_layout_move_iter_to_next_line (GtkTextLayout *layout,
263 void gtk_text_layout_move_iter_to_x (GtkTextLayout *layout,
266 void gtk_text_layout_move_iter_visually (GtkTextLayout *layout,
270 void gtk_text_layout_spew (GtkTextLayout *layout);
274 #endif /* __cplusplus */