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 | |
84 | G_BEGIN_DECLS |
85 | |
86 | /* forward declarations that have to be here to avoid including |
87 | * gtktextbtree.h |
88 | */ |
89 | typedef struct _GtkTextLine GtkTextLine; |
90 | typedef 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 | |
99 | typedef struct _GtkTextLayout GtkTextLayout; |
100 | typedef struct _GtkTextLayoutClass GtkTextLayoutClass; |
101 | typedef struct _GtkTextLineDisplay GtkTextLineDisplay; |
102 | typedef struct _GtkTextAttrAppearance GtkTextAttrAppearance; |
103 | |
104 | struct _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 | |
159 | struct _GtkTextLayoutClass |
160 | { |
161 | GObjectClass parent_class; |
162 | }; |
163 | |
164 | struct _GtkTextAttrAppearance |
165 | { |
166 | PangoAttribute attr; |
167 | GtkTextAppearance appearance; |
168 | }; |
169 | |
170 | typedef struct _CursorPosition CursorPosition; |
171 | struct _CursorPosition { |
172 | int pos; |
173 | guint is_insert : 1; |
174 | guint is_selection_bound : 1; |
175 | }; |
176 | |
177 | struct _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 |
221 | extern G_GNUC_INTERNAL PangoAttrType gtk_text_attr_appearance_type; |
222 | #endif |
223 | |
224 | GType gtk_text_layout_get_type (void) G_GNUC_CONST; |
225 | |
226 | GtkTextLayout* gtk_text_layout_new (void); |
227 | void gtk_text_layout_set_buffer (GtkTextLayout *layout, |
228 | GtkTextBuffer *buffer); |
229 | GtkTextBuffer *gtk_text_layout_get_buffer (GtkTextLayout *layout); |
230 | void gtk_text_layout_set_default_style (GtkTextLayout *layout, |
231 | GtkTextAttributes *values); |
232 | void gtk_text_layout_set_contexts (GtkTextLayout *layout, |
233 | PangoContext *ltr_context, |
234 | PangoContext *rtl_context); |
235 | void gtk_text_layout_set_cursor_direction (GtkTextLayout *layout, |
236 | GtkTextDirection direction); |
237 | void gtk_text_layout_set_overwrite_mode (GtkTextLayout *layout, |
238 | gboolean overwrite); |
239 | void gtk_text_layout_set_keyboard_direction (GtkTextLayout *layout, |
240 | GtkTextDirection keyboard_dir); |
241 | void gtk_text_layout_default_style_changed (GtkTextLayout *layout); |
242 | |
243 | void gtk_text_layout_set_screen_width (GtkTextLayout *layout, |
244 | int width); |
245 | void gtk_text_layout_set_preedit_string (GtkTextLayout *layout, |
246 | const char *preedit_string, |
247 | PangoAttrList *preedit_attrs, |
248 | int cursor_pos); |
249 | |
250 | void gtk_text_layout_set_cursor_visible (GtkTextLayout *layout, |
251 | gboolean cursor_visible); |
252 | gboolean gtk_text_layout_get_cursor_visible (GtkTextLayout *layout); |
253 | |
254 | void gtk_text_layout_get_size (GtkTextLayout *layout, |
255 | int *width, |
256 | int *height); |
257 | |
258 | void gtk_text_layout_wrap_loop_start (GtkTextLayout *layout); |
259 | void gtk_text_layout_wrap_loop_end (GtkTextLayout *layout); |
260 | |
261 | GtkTextLineDisplay* gtk_text_layout_get_line_display (GtkTextLayout *layout, |
262 | GtkTextLine *line, |
263 | gboolean size_only); |
264 | |
265 | GtkTextLineDisplay *gtk_text_line_display_ref (GtkTextLineDisplay *display); |
266 | void gtk_text_line_display_unref (GtkTextLineDisplay *display); |
267 | int gtk_text_line_display_compare (const GtkTextLineDisplay *display1, |
268 | const GtkTextLineDisplay *display2, |
269 | GtkTextLayout *layout); |
270 | |
271 | void gtk_text_layout_get_line_at_y (GtkTextLayout *layout, |
272 | GtkTextIter *target_iter, |
273 | int y, |
274 | int *line_top); |
275 | gboolean gtk_text_layout_get_iter_at_pixel (GtkTextLayout *layout, |
276 | GtkTextIter *iter, |
277 | int x, |
278 | int y); |
279 | gboolean gtk_text_layout_get_iter_at_position (GtkTextLayout *layout, |
280 | GtkTextIter *iter, |
281 | int *trailing, |
282 | int x, |
283 | int y); |
284 | void gtk_text_layout_invalidate (GtkTextLayout *layout, |
285 | const GtkTextIter *start, |
286 | const GtkTextIter *end); |
287 | void gtk_text_layout_invalidate_cursors(GtkTextLayout *layout, |
288 | const GtkTextIter *start, |
289 | const GtkTextIter *end); |
290 | void gtk_text_layout_invalidate_selection (GtkTextLayout *layout); |
291 | void gtk_text_layout_free_line_data (GtkTextLayout *layout, |
292 | GtkTextLine *line, |
293 | GtkTextLineData *line_data); |
294 | |
295 | gboolean gtk_text_layout_is_valid (GtkTextLayout *layout); |
296 | void gtk_text_layout_validate_yrange (GtkTextLayout *layout, |
297 | GtkTextIter *anchor_line, |
298 | int y0_, |
299 | int y1_); |
300 | void gtk_text_layout_validate (GtkTextLayout *layout, |
301 | int max_pixels); |
302 | |
303 | GtkTextLineData* gtk_text_layout_wrap (GtkTextLayout *layout, |
304 | GtkTextLine *line, |
305 | GtkTextLineData *line_data); |
306 | void gtk_text_layout_changed (GtkTextLayout *layout, |
307 | int y, |
308 | int old_height, |
309 | int new_height); |
310 | void gtk_text_layout_cursors_changed (GtkTextLayout *layout, |
311 | int y, |
312 | int old_height, |
313 | int new_height); |
314 | void gtk_text_layout_get_iter_location (GtkTextLayout *layout, |
315 | const GtkTextIter *iter, |
316 | GdkRectangle *rect); |
317 | void gtk_text_layout_get_line_yrange (GtkTextLayout *layout, |
318 | const GtkTextIter *iter, |
319 | int *y, |
320 | int *height); |
321 | void gtk_text_layout_get_cursor_locations (GtkTextLayout *layout, |
322 | GtkTextIter *iter, |
323 | GdkRectangle *strong_pos, |
324 | GdkRectangle *weak_pos); |
325 | GtkTextLineDisplay *gtk_text_layout_create_display (GtkTextLayout *layout, |
326 | GtkTextLine *line, |
327 | gboolean size_only); |
328 | void gtk_text_layout_update_display_cursors (GtkTextLayout *layout, |
329 | GtkTextLine *line, |
330 | GtkTextLineDisplay *display); |
331 | void gtk_text_layout_update_children (GtkTextLayout *layout, |
332 | GtkTextLineDisplay *display); |
333 | gboolean _gtk_text_layout_get_block_cursor (GtkTextLayout *layout, |
334 | GdkRectangle *pos); |
335 | gboolean gtk_text_layout_clamp_iter_to_vrange (GtkTextLayout *layout, |
336 | GtkTextIter *iter, |
337 | int top, |
338 | int bottom); |
339 | |
340 | gboolean gtk_text_layout_move_iter_to_line_end (GtkTextLayout *layout, |
341 | GtkTextIter *iter, |
342 | int direction); |
343 | gboolean gtk_text_layout_move_iter_to_previous_line (GtkTextLayout *layout, |
344 | GtkTextIter *iter); |
345 | gboolean gtk_text_layout_move_iter_to_next_line (GtkTextLayout *layout, |
346 | GtkTextIter *iter); |
347 | void gtk_text_layout_move_iter_to_x (GtkTextLayout *layout, |
348 | GtkTextIter *iter, |
349 | int x); |
350 | gboolean gtk_text_layout_move_iter_visually (GtkTextLayout *layout, |
351 | GtkTextIter *iter, |
352 | int count); |
353 | |
354 | gboolean gtk_text_layout_iter_starts_line (GtkTextLayout *layout, |
355 | const GtkTextIter *iter); |
356 | |
357 | void gtk_text_layout_get_iter_at_line (GtkTextLayout *layout, |
358 | GtkTextIter *iter, |
359 | GtkTextLine *line, |
360 | int byte_offset); |
361 | |
362 | void gtk_text_child_anchor_register_child (GtkTextChildAnchor *anchor, |
363 | GtkWidget *child, |
364 | GtkTextLayout *layout); |
365 | void gtk_text_child_anchor_unregister_child (GtkTextChildAnchor *anchor, |
366 | GtkWidget *child); |
367 | |
368 | void gtk_text_child_anchor_queue_resize (GtkTextChildAnchor *anchor, |
369 | GtkTextLayout *layout); |
370 | |
371 | void gtk_text_anchored_child_set_layout (GtkWidget *child, |
372 | GtkTextLayout *layout); |
373 | |
374 | void gtk_text_layout_spew (GtkTextLayout *layout); |
375 | |
376 | void gtk_text_layout_snapshot (GtkTextLayout *layout, |
377 | GtkWidget *widget, |
378 | GtkSnapshot *snapshot, |
379 | const GdkRectangle *clip, |
380 | float cursor_alpha); |
381 | |
382 | void gtk_text_layout_set_mru_size (GtkTextLayout *layout, |
383 | guint mru_size); |
384 | |
385 | G_END_DECLS |
386 | |
387 | #endif /* __GTK_TEXT_LAYOUT_PRIVATE_H__ */ |
388 | |