1/* GTK - The GIMP Toolkit
2 * gtktextlayout.h
3 *
4 * Copyright (c) 1992-1994 The Regents of the University of California.
5 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
6 * Copyright (c) 2000 Red Hat, Inc.
7 * Tk->Gtk port by Havoc Pennington
8 * Pango support by Owen Taylor
9 *
10 * This file can be used under your choice of two licenses, the LGPL
11 * and the original Tk license.
12 *
13 * LGPL:
14 *
15 * This library is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU Lesser General Public
17 * License as published by the Free Software Foundation; either
18 * version 2 of the License, or (at your option) any later version.
19 *
20 * This library is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 * Lesser General Public License for more details.
24 *
25 * You should have received a copy of the GNU Lesser General Public
26 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
27 *
28 * Original Tk license:
29 *
30 * This software is copyrighted by the Regents of the University of
31 * California, Sun Microsystems, Inc., and other parties. The
32 * following terms apply to all files associated with the software
33 * unless explicitly disclaimed in individual files.
34 *
35 * The authors hereby grant permission to use, copy, modify,
36 * distribute, and license this software and its documentation for any
37 * purpose, provided that existing copyright notices are retained in
38 * all copies and that this notice is included verbatim in any
39 * distributions. No written agreement, license, or royalty fee is
40 * required for any of the authorized uses. Modifications to this
41 * software may be copyrighted by their authors and need not follow
42 * the licensing terms described here, provided that the new terms are
43 * clearly indicated on the first page of each file where they apply.
44 *
45 * IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY
46 * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
47 * DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION,
48 * OR ANY DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED
49 * OF THE POSSIBILITY OF SUCH DAMAGE.
50 *
51 * THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
52 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
53 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
54 * NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS,
55 * AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE
56 * MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
57 *
58 * GOVERNMENT USE: If you are acquiring this software on behalf of the
59 * U.S. government, the Government shall have only "Restricted Rights"
60 * in the software and related documentation as defined in the Federal
61 * Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you
62 * are acquiring the software on behalf of the Department of Defense,
63 * the software shall be classified as "Commercial Computer Software"
64 * and the Government shall have only "Restricted Rights" as defined
65 * in Clause 252.227-7013 (c) (1) of DFARs. Notwithstanding the
66 * foregoing, the authors grant the U.S. Government and others acting
67 * in its behalf permission to use and distribute the software in
68 * accordance with the terms specified in this license.
69 *
70 */
71/*
72 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
73 * file for a list of people on the GTK+ Team. See the ChangeLog
74 * files for a list of changes. These files are distributed with
75 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
76 */
77
78#ifndef __GTK_TEXT_LAYOUT_PRIVATE_H__
79#define __GTK_TEXT_LAYOUT_PRIVATE_H__
80
81#include <gtk/gtk.h>
82#include <gtk/gtktextattributes.h>
83
84G_BEGIN_DECLS
85
86/* forward declarations that have to be here to avoid including
87 * gtktextbtree.h
88 */
89typedef struct _GtkTextLine GtkTextLine;
90typedef struct _GtkTextLineData GtkTextLineData;
91
92#define GTK_TYPE_TEXT_LAYOUT (gtk_text_layout_get_type ())
93#define GTK_TEXT_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_TEXT_LAYOUT, GtkTextLayout))
94#define GTK_TEXT_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_TEXT_LAYOUT, GtkTextLayoutClass))
95#define GTK_IS_TEXT_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_TEXT_LAYOUT))
96#define GTK_IS_TEXT_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_TEXT_LAYOUT))
97#define GTK_TEXT_LAYOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_TEXT_LAYOUT, GtkTextLayoutClass))
98
99typedef struct _GtkTextLayout GtkTextLayout;
100typedef struct _GtkTextLayoutClass GtkTextLayoutClass;
101typedef struct _GtkTextLineDisplay GtkTextLineDisplay;
102typedef struct _GtkTextAttrAppearance GtkTextAttrAppearance;
103
104struct _GtkTextLayout
105{
106 GObject parent_instance;
107
108 /* width of the display area on-screen,
109 * i.e. pixels we should wrap to fit inside. */
110 int screen_width;
111
112 /* width/height of the total logical area being laid out */
113 int width;
114 int height;
115
116 int left_padding;
117 int right_padding;
118
119 GtkTextBuffer *buffer;
120
121 /* Default style used if no tags override it */
122 GtkTextAttributes *default_style;
123
124 /* Pango contexts used for creating layouts */
125 PangoContext *ltr_context;
126 PangoContext *rtl_context;
127
128 /* A cache of one style; this is used to ensure
129 * we don't constantly regenerate the style
130 * over long runs with the same style. */
131 GtkTextAttributes *one_style_cache;
132
133 /* Whether we are allowed to wrap right now */
134 int wrap_loop_count;
135
136 /* Whether to show the insertion cursor */
137 guint cursor_visible : 1;
138
139 /* For what GtkTextDirection to draw cursor GTK_TEXT_DIR_NONE -
140 * means draw both cursors.
141 */
142 guint cursor_direction : 2;
143
144 /* The keyboard direction is used to default the alignment when
145 there are no strong characters.
146 */
147 guint keyboard_direction : 2;
148
149 guint overwrite_mode : 1;
150
151 /* The preedit string and attributes, if any */
152
153 char *preedit_string;
154 PangoAttrList *preedit_attrs;
155 int preedit_len;
156 int preedit_cursor;
157};
158
159struct _GtkTextLayoutClass
160{
161 GObjectClass parent_class;
162};
163
164struct _GtkTextAttrAppearance
165{
166 PangoAttribute attr;
167 GtkTextAppearance appearance;
168};
169
170typedef struct _CursorPosition CursorPosition;
171struct _CursorPosition {
172 int pos;
173 guint is_insert : 1;
174 guint is_selection_bound : 1;
175};
176
177struct _GtkTextLineDisplay
178{
179 PangoLayout *layout;
180
181 GskRenderNode *node;
182
183 GArray *cursors; /* indexes of cursors in the PangoLayout, and mark names */
184
185 /* GSequenceIter backpointer for use within cache */
186 GSequenceIter *cache_iter;
187
188 /* GQueue link for use in MRU to help cull cache */
189 GList mru_link;
190
191 GtkTextDirection direction;
192
193 int width; /* Width of layout */
194 int total_width; /* width - margins, if no width set on layout, if width set on layout, -1 */
195 int height;
196 /* Amount layout is shifted from left edge - this is the left margin
197 * plus any other factors, such as alignment or indentation.
198 */
199 int x_offset;
200 int left_margin;
201 int right_margin;
202 int top_margin;
203 int bottom_margin;
204 int insert_index; /* Byte index of insert cursor within para or -1 */
205
206 GtkTextLine *line;
207
208 GdkRectangle block_cursor;
209
210 guint cursors_invalid : 1;
211 guint has_block_cursor : 1;
212 guint cursor_at_line_end : 1;
213 guint size_only : 1;
214 guint pg_bg_rgba_set : 1;
215 guint has_children : 1;
216
217 GdkRGBA pg_bg_rgba;
218};
219
220#ifdef GTK_COMPILATION
221extern G_GNUC_INTERNAL PangoAttrType gtk_text_attr_appearance_type;
222#endif
223
224GType gtk_text_layout_get_type (void) G_GNUC_CONST;
225
226GtkTextLayout* gtk_text_layout_new (void);
227void gtk_text_layout_set_buffer (GtkTextLayout *layout,
228 GtkTextBuffer *buffer);
229GtkTextBuffer *gtk_text_layout_get_buffer (GtkTextLayout *layout);
230void gtk_text_layout_set_default_style (GtkTextLayout *layout,
231 GtkTextAttributes *values);
232void gtk_text_layout_set_contexts (GtkTextLayout *layout,
233 PangoContext *ltr_context,
234 PangoContext *rtl_context);
235void gtk_text_layout_set_cursor_direction (GtkTextLayout *layout,
236 GtkTextDirection direction);
237void gtk_text_layout_set_overwrite_mode (GtkTextLayout *layout,
238 gboolean overwrite);
239void gtk_text_layout_set_keyboard_direction (GtkTextLayout *layout,
240 GtkTextDirection keyboard_dir);
241void gtk_text_layout_default_style_changed (GtkTextLayout *layout);
242
243void gtk_text_layout_set_screen_width (GtkTextLayout *layout,
244 int width);
245void gtk_text_layout_set_preedit_string (GtkTextLayout *layout,
246 const char *preedit_string,
247 PangoAttrList *preedit_attrs,
248 int cursor_pos);
249
250void gtk_text_layout_set_cursor_visible (GtkTextLayout *layout,
251 gboolean cursor_visible);
252gboolean gtk_text_layout_get_cursor_visible (GtkTextLayout *layout);
253
254void gtk_text_layout_get_size (GtkTextLayout *layout,
255 int *width,
256 int *height);
257
258void gtk_text_layout_wrap_loop_start (GtkTextLayout *layout);
259void gtk_text_layout_wrap_loop_end (GtkTextLayout *layout);
260
261GtkTextLineDisplay* gtk_text_layout_get_line_display (GtkTextLayout *layout,
262 GtkTextLine *line,
263 gboolean size_only);
264
265GtkTextLineDisplay *gtk_text_line_display_ref (GtkTextLineDisplay *display);
266void gtk_text_line_display_unref (GtkTextLineDisplay *display);
267int gtk_text_line_display_compare (const GtkTextLineDisplay *display1,
268 const GtkTextLineDisplay *display2,
269 GtkTextLayout *layout);
270
271void gtk_text_layout_get_line_at_y (GtkTextLayout *layout,
272 GtkTextIter *target_iter,
273 int y,
274 int *line_top);
275gboolean gtk_text_layout_get_iter_at_pixel (GtkTextLayout *layout,
276 GtkTextIter *iter,
277 int x,
278 int y);
279gboolean gtk_text_layout_get_iter_at_position (GtkTextLayout *layout,
280 GtkTextIter *iter,
281 int *trailing,
282 int x,
283 int y);
284void gtk_text_layout_invalidate (GtkTextLayout *layout,
285 const GtkTextIter *start,
286 const GtkTextIter *end);
287void gtk_text_layout_invalidate_cursors(GtkTextLayout *layout,
288 const GtkTextIter *start,
289 const GtkTextIter *end);
290void gtk_text_layout_invalidate_selection (GtkTextLayout *layout);
291void gtk_text_layout_free_line_data (GtkTextLayout *layout,
292 GtkTextLine *line,
293 GtkTextLineData *line_data);
294
295gboolean gtk_text_layout_is_valid (GtkTextLayout *layout);
296void gtk_text_layout_validate_yrange (GtkTextLayout *layout,
297 GtkTextIter *anchor_line,
298 int y0_,
299 int y1_);
300void gtk_text_layout_validate (GtkTextLayout *layout,
301 int max_pixels);
302
303GtkTextLineData* gtk_text_layout_wrap (GtkTextLayout *layout,
304 GtkTextLine *line,
305 GtkTextLineData *line_data);
306void gtk_text_layout_changed (GtkTextLayout *layout,
307 int y,
308 int old_height,
309 int new_height);
310void gtk_text_layout_cursors_changed (GtkTextLayout *layout,
311 int y,
312 int old_height,
313 int new_height);
314void gtk_text_layout_get_iter_location (GtkTextLayout *layout,
315 const GtkTextIter *iter,
316 GdkRectangle *rect);
317void gtk_text_layout_get_line_yrange (GtkTextLayout *layout,
318 const GtkTextIter *iter,
319 int *y,
320 int *height);
321void gtk_text_layout_get_cursor_locations (GtkTextLayout *layout,
322 GtkTextIter *iter,
323 GdkRectangle *strong_pos,
324 GdkRectangle *weak_pos);
325GtkTextLineDisplay *gtk_text_layout_create_display (GtkTextLayout *layout,
326 GtkTextLine *line,
327 gboolean size_only);
328void gtk_text_layout_update_display_cursors (GtkTextLayout *layout,
329 GtkTextLine *line,
330 GtkTextLineDisplay *display);
331void gtk_text_layout_update_children (GtkTextLayout *layout,
332 GtkTextLineDisplay *display);
333gboolean _gtk_text_layout_get_block_cursor (GtkTextLayout *layout,
334 GdkRectangle *pos);
335gboolean gtk_text_layout_clamp_iter_to_vrange (GtkTextLayout *layout,
336 GtkTextIter *iter,
337 int top,
338 int bottom);
339
340gboolean gtk_text_layout_move_iter_to_line_end (GtkTextLayout *layout,
341 GtkTextIter *iter,
342 int direction);
343gboolean gtk_text_layout_move_iter_to_previous_line (GtkTextLayout *layout,
344 GtkTextIter *iter);
345gboolean gtk_text_layout_move_iter_to_next_line (GtkTextLayout *layout,
346 GtkTextIter *iter);
347void gtk_text_layout_move_iter_to_x (GtkTextLayout *layout,
348 GtkTextIter *iter,
349 int x);
350gboolean gtk_text_layout_move_iter_visually (GtkTextLayout *layout,
351 GtkTextIter *iter,
352 int count);
353
354gboolean gtk_text_layout_iter_starts_line (GtkTextLayout *layout,
355 const GtkTextIter *iter);
356
357void gtk_text_layout_get_iter_at_line (GtkTextLayout *layout,
358 GtkTextIter *iter,
359 GtkTextLine *line,
360 int byte_offset);
361
362void gtk_text_child_anchor_register_child (GtkTextChildAnchor *anchor,
363 GtkWidget *child,
364 GtkTextLayout *layout);
365void gtk_text_child_anchor_unregister_child (GtkTextChildAnchor *anchor,
366 GtkWidget *child);
367
368void gtk_text_child_anchor_queue_resize (GtkTextChildAnchor *anchor,
369 GtkTextLayout *layout);
370
371void gtk_text_anchored_child_set_layout (GtkWidget *child,
372 GtkTextLayout *layout);
373
374void gtk_text_layout_spew (GtkTextLayout *layout);
375
376void gtk_text_layout_snapshot (GtkTextLayout *layout,
377 GtkWidget *widget,
378 GtkSnapshot *snapshot,
379 const GdkRectangle *clip,
380 float cursor_alpha);
381
382void gtk_text_layout_set_mru_size (GtkTextLayout *layout,
383 guint mru_size);
384
385G_END_DECLS
386
387#endif /* __GTK_TEXT_LAYOUT_PRIVATE_H__ */
388

source code of gtk/gtk/gtktextlayoutprivate.h