1 /* gtktexttag.c - text tag object
3 * Copyright (c) 1992-1994 The Regents of the University of California.
4 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
5 * Copyright (c) 2000 Red Hat, Inc.
6 * Tk -> Gtk port by Havoc Pennington <hp@redhat.com>
8 * This software is copyrighted by the Regents of the University of
9 * California, Sun Microsystems, Inc., and other parties. The
10 * following terms apply to all files associated with the software
11 * unless explicitly disclaimed in individual files.
13 * The authors hereby grant permission to use, copy, modify,
14 * distribute, and license this software and its documentation for any
15 * purpose, provided that existing copyright notices are retained in
16 * all copies and that this notice is included verbatim in any
17 * distributions. No written agreement, license, or royalty fee is
18 * required for any of the authorized uses. Modifications to this
19 * software may be copyrighted by their authors and need not follow
20 * the licensing terms described here, provided that the new terms are
21 * clearly indicated on the first page of each file where they apply.
23 * IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY
24 * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
25 * DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION,
26 * OR ANY DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED
27 * OF THE POSSIBILITY OF SUCH DAMAGE.
29 * THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
30 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
31 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
32 * NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS,
33 * AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE
34 * MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
36 * GOVERNMENT USE: If you are acquiring this software on behalf of the
37 * U.S. government, the Government shall have only "Restricted Rights"
38 * in the software and related documentation as defined in the Federal
39 * Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you
40 * are acquiring the software on behalf of the Department of Defense,
41 * the software shall be classified as "Commercial Computer Software"
42 * and the Government shall have only "Restricted Rights" as defined
43 * in Clause 252.227-7013 (c) (1) of DFARs. Notwithstanding the
44 * foregoing, the authors grant the U.S. Government and others acting
45 * in its behalf permission to use and distribute the software in
46 * accordance with the terms specified in this license.
51 #include "gtktexttag.h"
52 #include "gtktexttypes.h"
53 #include "gtktexttagtable.h"
54 #include "gtksignal.h"
75 ARG_BACKGROUND_STIPPLE,
76 ARG_FOREGROUND_STIPPLE,
79 ARG_PIXELS_ABOVE_LINES,
80 ARG_PIXELS_BELOW_LINES,
81 ARG_PIXELS_INSIDE_WRAP,
87 ARG_LEFT_WRAPPED_LINE_MARGIN,
97 /* Whether-a-style-arg-is-set args */
100 ARG_BACKGROUND_GDK_SET,
101 ARG_FOREGROUND_GDK_SET,
102 ARG_BACKGROUND_STIPPLE_SET,
103 ARG_FOREGROUND_STIPPLE_SET,
105 ARG_PIXELS_ABOVE_LINES_SET,
106 ARG_PIXELS_BELOW_LINES_SET,
107 ARG_PIXELS_INSIDE_WRAP_SET,
112 ARG_LEFT_WRAPPED_LINE_MARGIN_SET,
113 ARG_STRIKETHROUGH_SET,
114 ARG_RIGHT_MARGIN_SET,
117 ARG_BG_FULL_HEIGHT_SET,
125 static void gtk_text_tag_init (GtkTextTag *text_tag);
126 static void gtk_text_tag_class_init (GtkTextTagClass *klass);
127 static void gtk_text_tag_destroy (GtkObject *object);
128 static void gtk_text_tag_finalize (GObject *object);
129 static void gtk_text_tag_set_arg (GtkObject *object,
132 static void gtk_text_tag_get_arg (GtkObject *object,
136 static GtkObjectClass *parent_class = NULL;
137 static guint signals[LAST_SIGNAL] = { 0 };
140 gtk_text_tag_get_type (void)
142 static GtkType our_type = 0;
146 static const GtkTypeInfo our_info =
150 sizeof (GtkTextTagClass),
151 (GtkClassInitFunc) gtk_text_tag_class_init,
152 (GtkObjectInitFunc) gtk_text_tag_init,
153 /* reserved_1 */ NULL,
154 /* reserved_2 */ NULL,
155 (GtkClassInitFunc) NULL
158 our_type = gtk_type_unique (GTK_TYPE_OBJECT, &our_info);
165 gtk_text_tag_class_init (GtkTextTagClass *klass)
167 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
168 GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
170 parent_class = gtk_type_class (GTK_TYPE_OBJECT);
173 gtk_object_add_arg_type ("GtkTextTag::name", GTK_TYPE_STRING,
174 GTK_ARG_READWRITE | GTK_ARG_CONSTRUCT_ONLY,
178 gtk_object_add_arg_type ("GtkTextTag::background", GTK_TYPE_STRING,
179 GTK_ARG_WRITABLE, ARG_BACKGROUND);
180 gtk_object_add_arg_type ("GtkTextTag::background_gdk", GTK_TYPE_GDK_COLOR,
181 GTK_ARG_READWRITE, ARG_BACKGROUND_GDK);
182 gtk_object_add_arg_type ("GtkTextTag::background_full_height", GTK_TYPE_BOOL,
183 GTK_ARG_READWRITE, ARG_BG_FULL_HEIGHT);
184 gtk_object_add_arg_type ("GtkTextTag::background_stipple",
186 GTK_ARG_READWRITE, ARG_BACKGROUND_STIPPLE);
187 gtk_object_add_arg_type ("GtkTextTag::direction", GTK_TYPE_ENUM,
188 GTK_ARG_READWRITE, ARG_DIRECTION);
189 gtk_object_add_arg_type ("GtkTextTag::editable", GTK_TYPE_BOOL,
190 GTK_ARG_READWRITE, ARG_EDITABLE);
191 gtk_object_add_arg_type ("GtkTextTag::font", GTK_TYPE_STRING,
192 GTK_ARG_READWRITE, ARG_FONT);
193 gtk_object_add_arg_type ("GtkTextTag::font_desc", GTK_TYPE_BOXED,
194 GTK_ARG_READWRITE, ARG_FONT_DESC);
195 gtk_object_add_arg_type ("GtkTextTag::foreground", GTK_TYPE_STRING,
196 GTK_ARG_WRITABLE, ARG_FOREGROUND);
197 gtk_object_add_arg_type ("GtkTextTag::foreground_gdk", GTK_TYPE_GDK_COLOR,
198 GTK_ARG_READWRITE, ARG_FOREGROUND_GDK);
199 gtk_object_add_arg_type ("GtkTextTag::foreground_stipple",
201 GTK_ARG_READWRITE, ARG_FOREGROUND_STIPPLE);
202 gtk_object_add_arg_type ("GtkTextTag::justify", GTK_TYPE_ENUM,
203 GTK_ARG_READWRITE, ARG_JUSTIFY);
204 gtk_object_add_arg_type ("GtkTextTag::language", GTK_TYPE_STRING,
205 GTK_ARG_READWRITE, ARG_LANGUAGE);
206 gtk_object_add_arg_type ("GtkTextTag::left_margin", GTK_TYPE_INT,
207 GTK_ARG_READWRITE, ARG_LEFT_MARGIN);
208 gtk_object_add_arg_type ("GtkTextTag::left_wrapped_line_margin", GTK_TYPE_INT,
209 GTK_ARG_READWRITE, ARG_LEFT_WRAPPED_LINE_MARGIN);
210 gtk_object_add_arg_type ("GtkTextTag::offset", GTK_TYPE_INT,
211 GTK_ARG_READWRITE, ARG_OFFSET);
212 gtk_object_add_arg_type ("GtkTextTag::pixels_above_lines", GTK_TYPE_INT,
213 GTK_ARG_READWRITE, ARG_PIXELS_ABOVE_LINES);
214 gtk_object_add_arg_type ("GtkTextTag::pixels_below_lines", GTK_TYPE_INT,
215 GTK_ARG_READWRITE, ARG_PIXELS_BELOW_LINES);
216 gtk_object_add_arg_type ("GtkTextTag::pixels_inside_wrap", GTK_TYPE_INT,
217 GTK_ARG_READWRITE, ARG_PIXELS_INSIDE_WRAP);
218 gtk_object_add_arg_type ("GtkTextTag::right_margin", GTK_TYPE_INT,
219 GTK_ARG_READWRITE, ARG_RIGHT_MARGIN);
220 gtk_object_add_arg_type ("GtkTextTag::strikethrough", GTK_TYPE_BOOL,
221 GTK_ARG_READWRITE, ARG_STRIKETHROUGH);
222 gtk_object_add_arg_type ("GtkTextTag::underline", GTK_TYPE_ENUM,
223 GTK_ARG_READWRITE, ARG_UNDERLINE);
224 gtk_object_add_arg_type ("GtkTextTag::wrap_mode", GTK_TYPE_ENUM,
225 GTK_ARG_READWRITE, ARG_WRAP_MODE);
226 gtk_object_add_arg_type ("GtkTextTag::tabs", GTK_TYPE_POINTER,
227 GTK_ARG_READWRITE, ARG_TABS);
228 gtk_object_add_arg_type ("GtkTextTag::invisible", GTK_TYPE_BOOL,
229 GTK_ARG_READWRITE, ARG_INVISIBLE);
231 /* Style args are set or not */
232 gtk_object_add_arg_type ("GtkTextTag::background_set", GTK_TYPE_BOOL,
233 GTK_ARG_READWRITE, ARG_BACKGROUND_SET);
234 gtk_object_add_arg_type ("GtkTextTag::background_full_height_set", GTK_TYPE_BOOL,
235 GTK_ARG_READWRITE, ARG_BG_FULL_HEIGHT_SET);
236 gtk_object_add_arg_type ("GtkTextTag::background_gdk_set", GTK_TYPE_BOOL,
237 GTK_ARG_READWRITE, ARG_BACKGROUND_GDK_SET);
238 gtk_object_add_arg_type ("GtkTextTag::background_stipple_set", GTK_TYPE_BOOL,
239 GTK_ARG_READWRITE, ARG_BACKGROUND_STIPPLE_SET);
240 gtk_object_add_arg_type ("GtkTextTag::editable_set", GTK_TYPE_BOOL,
241 GTK_ARG_READWRITE, ARG_EDITABLE_SET);
242 gtk_object_add_arg_type ("GtkTextTag::font_set", GTK_TYPE_BOOL,
243 GTK_ARG_READWRITE, ARG_FONT_SET);
244 gtk_object_add_arg_type ("GtkTextTag::foreground_set", GTK_TYPE_BOOL,
245 GTK_ARG_READWRITE, ARG_FOREGROUND_SET);
246 gtk_object_add_arg_type ("GtkTextTag::foreground_gdk_set", GTK_TYPE_BOOL,
247 GTK_ARG_READWRITE, ARG_FOREGROUND_GDK_SET);
248 gtk_object_add_arg_type ("GtkTextTag::foreground_stipple_set", GTK_TYPE_BOOL,
249 GTK_ARG_READWRITE, ARG_FOREGROUND_STIPPLE_SET);
250 gtk_object_add_arg_type ("GtkTextTag::justify_set", GTK_TYPE_BOOL,
251 GTK_ARG_READWRITE, ARG_JUSTIFY_SET);
252 gtk_object_add_arg_type ("GtkTextTag::language_set", GTK_TYPE_BOOL,
253 GTK_ARG_READWRITE, ARG_LANGUAGE_SET);
254 gtk_object_add_arg_type ("GtkTextTag::left_margin_set", GTK_TYPE_BOOL,
255 GTK_ARG_READWRITE, ARG_LEFT_MARGIN_SET);
256 gtk_object_add_arg_type ("GtkTextTag::left_wrapped_line_margin_set", GTK_TYPE_BOOL,
257 GTK_ARG_READWRITE, ARG_LEFT_WRAPPED_LINE_MARGIN_SET);
258 gtk_object_add_arg_type ("GtkTextTag::offset_set", GTK_TYPE_BOOL,
259 GTK_ARG_READWRITE, ARG_OFFSET_SET);
260 gtk_object_add_arg_type ("GtkTextTag::pixels_above_lines_set", GTK_TYPE_BOOL,
261 GTK_ARG_READWRITE, ARG_PIXELS_ABOVE_LINES_SET);
262 gtk_object_add_arg_type ("GtkTextTag::pixels_below_lines_set", GTK_TYPE_BOOL,
263 GTK_ARG_READWRITE, ARG_PIXELS_BELOW_LINES_SET);
264 gtk_object_add_arg_type ("GtkTextTag::pixels_inside_wrap_set", GTK_TYPE_BOOL,
265 GTK_ARG_READWRITE, ARG_PIXELS_INSIDE_WRAP_SET);
266 gtk_object_add_arg_type ("GtkTextTag::strikethrough_set", GTK_TYPE_BOOL,
267 GTK_ARG_READWRITE, ARG_STRIKETHROUGH_SET);
268 gtk_object_add_arg_type ("GtkTextTag::right_margin_set", GTK_TYPE_BOOL,
269 GTK_ARG_READWRITE, ARG_RIGHT_MARGIN_SET);
270 gtk_object_add_arg_type ("GtkTextTag::underline_set", GTK_TYPE_ENUM,
271 GTK_ARG_READWRITE, ARG_UNDERLINE_SET);
272 gtk_object_add_arg_type ("GtkTextTag::wrap_mode_set", GTK_TYPE_BOOL,
273 GTK_ARG_READWRITE, ARG_WRAP_MODE_SET);
274 gtk_object_add_arg_type ("GtkTextTag::tabs_set", GTK_TYPE_BOOL,
275 GTK_ARG_READWRITE, ARG_TABS_SET);
276 gtk_object_add_arg_type ("GtkTextTag::invisible_set", GTK_TYPE_BOOL,
277 GTK_ARG_READWRITE, ARG_INVISIBLE_SET);
281 gtk_signal_new ("event",
283 GTK_CLASS_TYPE (object_class),
284 GTK_SIGNAL_OFFSET (GtkTextTagClass, event),
285 gtk_marshal_INT__OBJECT_BOXED_BOXED,
292 gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
294 object_class->set_arg = gtk_text_tag_set_arg;
295 object_class->get_arg = gtk_text_tag_get_arg;
297 object_class->destroy = gtk_text_tag_destroy;
298 gobject_class->finalize = gtk_text_tag_finalize;
302 gtk_text_tag_init (GtkTextTag *text_tag)
304 /* 0 is basically a fine way to initialize everything in the
311 * @name: tag name, or %NULL
313 * Creates a #GtkTextTag. Configure the tag using object arguments,
314 * i.e. using g_object_set().
316 * Return value: a new #GtkTextTag
319 gtk_text_tag_new (const gchar *name)
323 tag = GTK_TEXT_TAG (gtk_type_new (gtk_text_tag_get_type ()));
325 tag->name = g_strdup (name);
327 tag->values = gtk_text_attributes_new ();
333 gtk_text_tag_destroy (GtkObject *object)
335 GtkTextTag *text_tag;
337 text_tag = GTK_TEXT_TAG (object);
339 g_assert (!text_tag->values->realized);
342 gtk_text_tag_table_remove (text_tag->table, text_tag);
344 g_assert (text_tag->table == NULL);
346 gtk_text_attributes_unref (text_tag->values);
347 text_tag->values = NULL;
349 (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
353 gtk_text_tag_finalize (GObject *object)
355 GtkTextTag *text_tag;
357 text_tag = GTK_TEXT_TAG (object);
359 g_free (text_tag->name);
360 text_tag->name = NULL;
362 (* G_OBJECT_CLASS (parent_class)->finalize) (object);
366 set_bg_color (GtkTextTag *tag, GdkColor *color)
370 tag->bg_color_set = TRUE;
371 tag->values->appearance.bg_color = *color;
375 tag->bg_color_set = FALSE;
380 set_fg_color (GtkTextTag *tag, GdkColor *color)
384 tag->fg_color_set = TRUE;
385 tag->values->appearance.fg_color = *color;
389 tag->fg_color_set = FALSE;
394 gtk_text_tag_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
396 GtkTextTag *text_tag;
397 gboolean size_changed = FALSE;
399 text_tag = GTK_TEXT_TAG (object);
401 g_return_if_fail (!text_tag->values->realized);
406 g_return_if_fail (text_tag->name == NULL);
407 text_tag->name = g_strdup (GTK_VALUE_STRING (*arg));
414 if (gdk_color_parse (GTK_VALUE_STRING (*arg), &color))
415 set_bg_color (text_tag, &color);
417 g_warning ("Don't know color `%s'", GTK_VALUE_STRING (*arg));
425 if (gdk_color_parse (GTK_VALUE_STRING (*arg), &color))
426 set_fg_color (text_tag, &color);
428 g_warning ("Don't know color `%s'", GTK_VALUE_STRING (*arg));
432 case ARG_BACKGROUND_GDK:
434 GdkColor *color = GTK_VALUE_POINTER (*arg);
435 set_bg_color (text_tag, color);
439 case ARG_FOREGROUND_GDK:
441 GdkColor *color = GTK_VALUE_POINTER (*arg);
442 set_fg_color (text_tag, color);
446 case ARG_BACKGROUND_STIPPLE:
448 GdkBitmap *bitmap = GTK_VALUE_POINTER (*arg);
450 text_tag->bg_stipple_set = TRUE;
452 if (text_tag->values->appearance.bg_stipple != bitmap)
455 gdk_bitmap_ref (bitmap);
457 if (text_tag->values->appearance.bg_stipple)
458 gdk_bitmap_unref (text_tag->values->appearance.bg_stipple);
460 text_tag->values->appearance.bg_stipple = bitmap;
465 case ARG_FOREGROUND_STIPPLE:
467 GdkBitmap *bitmap = GTK_VALUE_POINTER (*arg);
469 text_tag->fg_stipple_set = TRUE;
471 if (text_tag->values->appearance.fg_stipple != bitmap)
474 gdk_bitmap_ref (bitmap);
476 if (text_tag->values->appearance.fg_stipple)
477 gdk_bitmap_unref (text_tag->values->appearance.fg_stipple);
479 text_tag->values->appearance.fg_stipple = bitmap;
486 PangoFontDescription *font_desc = NULL;
489 name = GTK_VALUE_STRING (*arg);
492 font_desc = pango_font_description_from_string (name);
494 if (text_tag->values->font_desc)
495 pango_font_description_free (text_tag->values->font_desc);
497 text_tag->font_set = (font_desc != NULL);
498 text_tag->values->font_desc = font_desc;
506 PangoFontDescription *font_desc;
508 font_desc = GTK_VALUE_BOXED (*arg);
510 if (text_tag->values->font_desc)
511 pango_font_description_free (text_tag->values->font_desc);
514 text_tag->values->font_desc = pango_font_description_copy (font_desc);
516 text_tag->values->font_desc = NULL;
518 text_tag->font_set = (font_desc != NULL);
524 case ARG_PIXELS_ABOVE_LINES:
525 text_tag->pixels_above_lines_set = TRUE;
526 text_tag->values->pixels_above_lines = GTK_VALUE_INT (*arg);
530 case ARG_PIXELS_BELOW_LINES:
531 text_tag->pixels_below_lines_set = TRUE;
532 text_tag->values->pixels_below_lines = GTK_VALUE_INT (*arg);
536 case ARG_PIXELS_INSIDE_WRAP:
537 text_tag->pixels_inside_wrap_set = TRUE;
538 text_tag->values->pixels_inside_wrap = GTK_VALUE_INT (*arg);
543 text_tag->editable_set = TRUE;
544 text_tag->values->editable = GTK_VALUE_BOOL (*arg);
548 text_tag->wrap_mode_set = TRUE;
549 text_tag->values->wrap_mode = GTK_VALUE_ENUM (*arg);
554 text_tag->justify_set = TRUE;
555 text_tag->values->justify = GTK_VALUE_ENUM (*arg);
560 text_tag->values->direction = GTK_VALUE_ENUM (*arg);
563 case ARG_LEFT_MARGIN:
564 text_tag->left_margin_set = TRUE;
565 text_tag->values->left_margin = GTK_VALUE_INT (*arg);
569 case ARG_LEFT_WRAPPED_LINE_MARGIN:
570 text_tag->left_wrapped_line_margin_set = TRUE;
571 text_tag->values->left_wrapped_line_margin = GTK_VALUE_INT (*arg);
575 case ARG_STRIKETHROUGH:
576 text_tag->strikethrough_set = TRUE;
577 text_tag->values->appearance.strikethrough = GTK_VALUE_BOOL (*arg);
580 case ARG_RIGHT_MARGIN:
581 text_tag->right_margin_set = TRUE;
582 text_tag->values->right_margin = GTK_VALUE_INT (*arg);
587 text_tag->underline_set = TRUE;
588 text_tag->values->appearance.underline = GTK_VALUE_ENUM (*arg);
592 text_tag->offset_set = TRUE;
593 text_tag->values->offset = GTK_VALUE_INT (*arg);
597 case ARG_BG_FULL_HEIGHT:
598 text_tag->bg_full_height_set = TRUE;
599 text_tag->values->bg_full_height = GTK_VALUE_BOOL (*arg);
603 text_tag->language_set = TRUE;
604 text_tag->values->language = g_strdup (GTK_VALUE_STRING (*arg));
608 text_tag->tabs_set = TRUE;
610 if (text_tag->values->tabs)
611 pango_tab_array_free (text_tag->values->tabs);
613 text_tag->values->tabs =
614 pango_tab_array_copy (GTK_VALUE_POINTER (*arg));
620 text_tag->invisible_set = TRUE;
621 text_tag->values->invisible = GTK_VALUE_BOOL (*arg);
625 /* Whether the value should be used... */
627 case ARG_BACKGROUND_SET:
628 case ARG_BACKGROUND_GDK_SET:
629 text_tag->bg_color_set = GTK_VALUE_BOOL (*arg);
632 case ARG_FOREGROUND_SET:
633 case ARG_FOREGROUND_GDK_SET:
634 text_tag->fg_color_set = GTK_VALUE_BOOL (*arg);
637 case ARG_BACKGROUND_STIPPLE_SET:
638 text_tag->bg_stipple_set = GTK_VALUE_BOOL (*arg);
641 case ARG_FOREGROUND_STIPPLE_SET:
642 text_tag->fg_stipple_set = GTK_VALUE_BOOL (*arg);
646 text_tag->font_set = GTK_VALUE_BOOL (*arg);
650 case ARG_PIXELS_ABOVE_LINES_SET:
651 text_tag->pixels_above_lines_set = GTK_VALUE_BOOL (*arg);
655 case ARG_PIXELS_BELOW_LINES_SET:
656 text_tag->pixels_below_lines_set = GTK_VALUE_BOOL (*arg);
660 case ARG_PIXELS_INSIDE_WRAP_SET:
661 text_tag->pixels_inside_wrap_set = GTK_VALUE_BOOL (*arg);
665 case ARG_EDITABLE_SET:
666 text_tag->editable_set = GTK_VALUE_BOOL (*arg);
669 case ARG_WRAP_MODE_SET:
670 text_tag->wrap_mode_set = GTK_VALUE_BOOL (*arg);
674 case ARG_JUSTIFY_SET:
675 text_tag->justify_set = GTK_VALUE_BOOL (*arg);
679 case ARG_LEFT_MARGIN_SET:
680 text_tag->left_margin_set = GTK_VALUE_BOOL (*arg);
684 case ARG_LEFT_WRAPPED_LINE_MARGIN_SET:
685 text_tag->left_wrapped_line_margin_set = GTK_VALUE_BOOL (*arg);
689 case ARG_STRIKETHROUGH_SET:
690 text_tag->strikethrough_set = GTK_VALUE_BOOL (*arg);
693 case ARG_RIGHT_MARGIN_SET:
694 text_tag->right_margin_set = GTK_VALUE_BOOL (*arg);
698 case ARG_UNDERLINE_SET:
699 text_tag->underline_set = GTK_VALUE_BOOL (*arg);
703 text_tag->offset_set = GTK_VALUE_BOOL (*arg);
707 case ARG_BG_FULL_HEIGHT_SET:
708 text_tag->bg_full_height_set = GTK_VALUE_BOOL (*arg);
711 case ARG_LANGUAGE_SET:
712 text_tag->language_set = GTK_VALUE_BOOL (*arg);
717 text_tag->tabs_set = GTK_VALUE_BOOL (*arg);
721 case ARG_INVISIBLE_SET:
722 text_tag->invisible_set = GTK_VALUE_BOOL (*arg);
727 g_assert_not_reached ();
731 /* FIXME I would like to do this after all set_arg in a single
732 gtk_object_set () have been called. But an idle function
733 won't work; we need to emit when the tag is changed, not
734 when we get around to the event loop. So blah, we eat some
737 /* This is also somewhat weird since we emit another object's
738 signal here, but the two objects are already tightly bound. */
741 gtk_signal_emit_by_name (GTK_OBJECT (text_tag->table),
743 text_tag, size_changed);
747 get_color_arg (GtkArg *arg, GdkColor *orig)
751 color = g_new (GdkColor, 1);
753 GTK_VALUE_BOXED (*arg) = color;
757 gtk_text_tag_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
761 tag = GTK_TEXT_TAG (object);
766 GTK_VALUE_STRING (*arg) = g_strdup (tag->name);
769 case ARG_BACKGROUND_GDK:
770 get_color_arg (arg, &tag->values->appearance.bg_color);
773 case ARG_FOREGROUND_GDK:
774 get_color_arg (arg, &tag->values->appearance.fg_color);
777 case ARG_BACKGROUND_STIPPLE:
778 GTK_VALUE_BOXED (*arg) = tag->values->appearance.bg_stipple;
781 case ARG_FOREGROUND_STIPPLE:
782 GTK_VALUE_BOXED (*arg) = tag->values->appearance.fg_stipple;
786 if (tag->values->font_desc)
787 GTK_VALUE_STRING (*arg) = pango_font_description_to_string (tag->values->font_desc);
789 GTK_VALUE_STRING (*arg) = NULL;
793 if (tag->values->font_desc)
794 GTK_VALUE_BOXED (*arg) = pango_font_description_copy (tag->values->font_desc);
796 GTK_VALUE_BOXED (*arg) = NULL;
799 case ARG_PIXELS_ABOVE_LINES:
800 GTK_VALUE_INT (*arg) = tag->values->pixels_above_lines;
803 case ARG_PIXELS_BELOW_LINES:
804 GTK_VALUE_INT (*arg) = tag->values->pixels_below_lines;
807 case ARG_PIXELS_INSIDE_WRAP:
808 GTK_VALUE_INT (*arg) = tag->values->pixels_inside_wrap;
812 GTK_VALUE_BOOL (*arg) = tag->values->editable;
816 GTK_VALUE_ENUM (*arg) = tag->values->wrap_mode;
820 GTK_VALUE_ENUM (*arg) = tag->values->justify;
823 case ARG_LEFT_MARGIN:
824 GTK_VALUE_INT (*arg) = tag->values->left_margin;
827 case ARG_LEFT_WRAPPED_LINE_MARGIN:
828 GTK_VALUE_INT (*arg) = tag->values->left_wrapped_line_margin;
831 case ARG_STRIKETHROUGH:
832 GTK_VALUE_BOOL (*arg) = tag->values->appearance.strikethrough;
835 case ARG_RIGHT_MARGIN:
836 GTK_VALUE_INT (*arg) = tag->values->right_margin;
840 GTK_VALUE_ENUM (*arg) = tag->values->appearance.underline;
844 GTK_VALUE_INT (*arg) = tag->values->offset;
847 case ARG_BG_FULL_HEIGHT:
848 GTK_VALUE_BOOL (*arg) = tag->values->bg_full_height;
852 GTK_VALUE_STRING (*arg) = g_strdup (tag->values->language);
856 GTK_VALUE_POINTER (*arg) = tag->values->tabs ?
857 pango_tab_array_copy (tag->values->tabs) : NULL;
860 case ARG_BACKGROUND_SET:
861 case ARG_BACKGROUND_GDK_SET:
862 GTK_VALUE_BOOL (*arg) = tag->bg_color_set;
865 case ARG_FOREGROUND_SET:
866 case ARG_FOREGROUND_GDK_SET:
867 GTK_VALUE_BOOL (*arg) = tag->fg_color_set;
870 case ARG_BACKGROUND_STIPPLE_SET:
871 GTK_VALUE_BOOL (*arg) = tag->bg_stipple_set;
874 case ARG_FOREGROUND_STIPPLE_SET:
875 GTK_VALUE_BOOL (*arg) = tag->fg_stipple_set;
879 GTK_VALUE_BOOL (*arg) = tag->font_set;
882 case ARG_PIXELS_ABOVE_LINES_SET:
883 GTK_VALUE_BOOL (*arg) = tag->pixels_above_lines_set;
886 case ARG_PIXELS_BELOW_LINES_SET:
887 GTK_VALUE_BOOL (*arg) = tag->pixels_below_lines_set;
890 case ARG_PIXELS_INSIDE_WRAP_SET:
891 GTK_VALUE_BOOL (*arg) = tag->pixels_inside_wrap_set;
894 case ARG_EDITABLE_SET:
895 GTK_VALUE_BOOL (*arg) = tag->editable_set;
898 case ARG_WRAP_MODE_SET:
899 GTK_VALUE_BOOL (*arg) = tag->wrap_mode_set;
902 case ARG_JUSTIFY_SET:
903 GTK_VALUE_BOOL (*arg) = tag->justify_set;
906 case ARG_LEFT_MARGIN_SET:
907 GTK_VALUE_BOOL (*arg) = tag->left_margin_set;
910 case ARG_LEFT_WRAPPED_LINE_MARGIN_SET:
911 GTK_VALUE_BOOL (*arg) = tag->left_wrapped_line_margin_set;
914 case ARG_STRIKETHROUGH_SET:
915 GTK_VALUE_BOOL (*arg) = tag->strikethrough_set;
918 case ARG_RIGHT_MARGIN_SET:
919 GTK_VALUE_BOOL (*arg) = tag->right_margin_set;
922 case ARG_UNDERLINE_SET:
923 GTK_VALUE_BOOL (*arg) = tag->underline_set;
927 GTK_VALUE_BOOL (*arg) = tag->offset_set;
930 case ARG_BG_FULL_HEIGHT_SET:
931 GTK_VALUE_BOOL (*arg) = tag->bg_full_height_set;
934 case ARG_LANGUAGE_SET:
935 GTK_VALUE_BOOL (*arg) = tag->language_set;
939 GTK_VALUE_BOOL (*arg) = tag->tabs_set;
945 arg->type = GTK_TYPE_INVALID;
949 arg->type = GTK_TYPE_INVALID;
963 delta_priority_foreach (GtkTextTag *tag, gpointer user_data)
965 DeltaData *dd = user_data;
967 if (tag->priority >= dd->low && tag->priority <= dd->high)
968 tag->priority += dd->delta;
972 * gtk_text_tag_get_priority:
973 * @tag: a #GtkTextTag
975 * Get the tag priority.
977 * Return value: The tag's priority.
980 gtk_text_tag_get_priority (GtkTextTag *tag)
982 g_return_val_if_fail (GTK_IS_TEXT_TAG (tag), 0);
984 return tag->priority;
988 * gtk_text_tag_set_priority:
989 * @tag: a #GtkTextTag
990 * @priority: the new priority
992 * Sets the priority of a #GtkTextTag. Valid priorities are
993 * start at 0 and go to one less than gtk_text_tag_table_size().
994 * Each tag in a table has a unique priority; setting the priority
995 * of one tag shifts the priorities of all the other tags in the
996 * table to maintain a unique priority for each tag. Higher priority
997 * tags "win" if two tags both set the same text attribute. When adding
998 * a tag to a tag table, it will be assigned the highest priority in
999 * the table by default; so normally the precedence of a set of tags
1000 * is the order in which they were added to the table, or created with
1001 * gtk_text_buffer_create_tag(), which adds the tag to the buffer's table
1005 gtk_text_tag_set_priority (GtkTextTag *tag,
1010 g_return_if_fail (GTK_IS_TEXT_TAG (tag));
1011 g_return_if_fail (tag->table != NULL);
1012 g_return_if_fail (priority >= 0);
1013 g_return_if_fail (priority < gtk_text_tag_table_size (tag->table));
1015 if (priority == tag->priority)
1018 if (priority < tag->priority)
1021 dd.high = tag->priority - 1;
1026 dd.low = tag->priority + 1;
1031 gtk_text_tag_table_foreach (tag->table,
1032 delta_priority_foreach,
1035 tag->priority = priority;
1039 * gtk_text_tag_event:
1040 * @tag: a #GtkTextTag
1041 * @event_object: object that received the event, such as a widget
1043 * @iter: location where the event was received
1045 * Emits the "event" signal on the #GtkTextTag.
1047 * Return value: result of signal emission (whether the event was handled)
1050 gtk_text_tag_event (GtkTextTag *tag,
1051 GObject *event_object,
1053 const GtkTextIter *iter)
1055 gint retval = FALSE;
1057 g_return_val_if_fail (GTK_IS_TEXT_TAG (tag), FALSE);
1058 g_return_val_if_fail (GTK_IS_OBJECT (event_object), FALSE);
1059 g_return_val_if_fail (event != NULL, FALSE);
1061 gtk_signal_emit (GTK_OBJECT (tag),
1072 tag_sort_func (gconstpointer first, gconstpointer second)
1074 GtkTextTag *tag1, *tag2;
1076 tag1 = * (GtkTextTag **) first;
1077 tag2 = * (GtkTextTag **) second;
1078 return tag1->priority - tag2->priority;
1082 gtk_text_tag_array_sort (GtkTextTag** tag_array_p,
1087 GtkTextTag **maxPtrPtr, *tmp;
1089 g_return_if_fail (tag_array_p != NULL);
1090 g_return_if_fail (len > 0);
1096 GtkTextTag **iter = tag_array_p;
1098 for (i = len-1; i > 0; i--, iter++) {
1099 maxPtrPtr = tag = iter;
1100 prio = tag[0]->priority;
1101 for (j = i, tag++; j > 0; j--, tag++) {
1102 if (tag[0]->priority < prio) {
1103 prio = tag[0]->priority;
1112 qsort ((void *) tag_array_p, (unsigned) len, sizeof (GtkTextTag *),
1118 printf ("Sorted tag array: \n");
1122 GtkTextTag *t = tag_array_p[i];
1123 printf (" %s priority %d\n", t->name, t->priority);
1136 * gtk_text_attributes_new:
1138 * Creates a #GtkTextAttributes, which describes
1139 * a set of properties on some text.
1141 * Return value: a new #GtkTextAttributes
1144 gtk_text_attributes_new (void)
1146 GtkTextAttributes *values;
1148 values = g_new0(GtkTextAttributes, 1);
1150 /* 0 is a valid value for most of the struct */
1152 values->refcount = 1;
1154 values->language = gtk_get_default_language ();
1159 /* FIXME change the signature of this to be correct */
1161 gtk_text_attributes_copy (GtkTextAttributes *src,
1162 GtkTextAttributes *dest)
1164 guint orig_refcount;
1166 g_return_if_fail (!dest->realized);
1173 if (src->appearance.bg_stipple)
1174 gdk_bitmap_ref (src->appearance.bg_stipple);
1176 if (src->appearance.fg_stipple)
1177 gdk_bitmap_ref (src->appearance.fg_stipple);
1181 if (dest->appearance.bg_stipple)
1182 gdk_bitmap_unref (dest->appearance.bg_stipple);
1184 if (dest->appearance.fg_stipple)
1185 gdk_bitmap_unref (dest->appearance.fg_stipple);
1188 orig_refcount = dest->refcount;
1192 dest->font_desc = pango_font_description_copy (src->font_desc);
1195 dest->tabs = pango_tab_array_copy (src->tabs);
1197 dest->language = g_strdup (src->language);
1199 dest->refcount = orig_refcount;
1200 dest->realized = FALSE;
1204 gtk_text_attributes_ref (GtkTextAttributes *values)
1206 g_return_if_fail (values != NULL);
1208 values->refcount += 1;
1212 gtk_text_attributes_unref (GtkTextAttributes *values)
1214 g_return_if_fail (values != NULL);
1215 g_return_if_fail (values->refcount > 0);
1217 values->refcount -= 1;
1219 if (values->refcount == 0)
1221 g_assert (!values->realized);
1223 if (values->appearance.bg_stipple)
1224 gdk_bitmap_unref (values->appearance.bg_stipple);
1226 if (values->font_desc)
1227 pango_font_description_free (values->font_desc);
1229 if (values->appearance.fg_stipple)
1230 gdk_bitmap_unref (values->appearance.fg_stipple);
1233 pango_tab_array_free (values->tabs);
1235 if (values->language)
1236 g_free (values->language);
1243 gtk_text_attributes_realize (GtkTextAttributes *values,
1247 g_return_if_fail (values != NULL);
1248 g_return_if_fail (values->refcount > 0);
1249 g_return_if_fail (!values->realized);
1251 /* It is wrong to use this colormap, FIXME */
1252 gdk_colormap_alloc_color (cmap,
1253 &values->appearance.fg_color,
1256 gdk_colormap_alloc_color (cmap,
1257 &values->appearance.bg_color,
1260 values->realized = TRUE;
1264 gtk_text_attributes_unrealize (GtkTextAttributes *values,
1268 g_return_if_fail (values != NULL);
1269 g_return_if_fail (values->refcount > 0);
1270 g_return_if_fail (values->realized);
1272 gdk_colormap_free_colors (cmap,
1273 &values->appearance.fg_color, 1);
1276 gdk_colormap_free_colors (cmap,
1277 &values->appearance.bg_color, 1);
1279 values->appearance.fg_color.pixel = 0;
1280 values->appearance.bg_color.pixel = 0;
1282 values->realized = FALSE;
1286 gtk_text_attributes_fill_from_tags (GtkTextAttributes *dest,
1292 g_return_if_fail (!dest->realized);
1296 GtkTextTag *tag = tags[n];
1297 GtkTextAttributes *vals = tag->values;
1300 g_assert (tags[n]->priority > tags[n-1]->priority);
1302 if (tag->bg_color_set)
1304 dest->appearance.bg_color = vals->appearance.bg_color;
1306 dest->appearance.draw_bg = TRUE;
1309 if (tag->bg_stipple_set)
1311 gdk_bitmap_ref (vals->appearance.bg_stipple);
1312 if (dest->appearance.bg_stipple)
1313 gdk_bitmap_unref (dest->appearance.bg_stipple);
1314 dest->appearance.bg_stipple = vals->appearance.bg_stipple;
1316 dest->appearance.draw_bg = TRUE;
1319 if (tag->fg_color_set)
1320 dest->appearance.fg_color = vals->appearance.fg_color;
1324 if (dest->font_desc)
1325 pango_font_description_free (dest->font_desc);
1326 dest->font_desc = pango_font_description_copy (vals->font_desc);
1329 if (tag->fg_stipple_set)
1331 gdk_bitmap_ref (vals->appearance.fg_stipple);
1332 if (dest->appearance.fg_stipple)
1333 gdk_bitmap_unref (dest->appearance.fg_stipple);
1334 dest->appearance.fg_stipple = vals->appearance.fg_stipple;
1337 if (tag->justify_set)
1338 dest->justify = vals->justify;
1340 if (vals->direction != GTK_TEXT_DIR_NONE)
1341 dest->direction = vals->direction;
1343 if (tag->left_margin_set)
1344 dest->left_margin = vals->left_margin;
1346 if (tag->left_wrapped_line_margin_set)
1347 dest->left_wrapped_line_margin = vals->left_wrapped_line_margin;
1349 if (tag->offset_set)
1350 dest->offset = vals->offset;
1352 if (tag->right_margin_set)
1353 dest->right_margin = vals->right_margin;
1355 if (tag->pixels_above_lines_set)
1356 dest->pixels_above_lines = vals->pixels_above_lines;
1358 if (tag->pixels_below_lines_set)
1359 dest->pixels_below_lines = vals->pixels_below_lines;
1361 if (tag->pixels_inside_wrap_set)
1362 dest->pixels_inside_wrap = vals->pixels_inside_wrap;
1367 pango_tab_array_free (dest->tabs);
1368 dest->tabs = pango_tab_array_copy (vals->tabs);
1371 if (tag->wrap_mode_set)
1372 dest->wrap_mode = vals->wrap_mode;
1374 if (tag->underline_set)
1375 dest->appearance.underline = vals->appearance.underline;
1377 if (tag->strikethrough_set)
1378 dest->appearance.strikethrough = vals->appearance.strikethrough;
1380 if (tag->invisible_set)
1381 dest->invisible = vals->invisible;
1383 if (tag->editable_set)
1384 dest->editable = vals->editable;
1386 if (tag->bg_full_height_set)
1387 dest->bg_full_height = vals->bg_full_height;
1389 if (tag->language_set)
1391 g_free (dest->language);
1392 dest->language = g_strdup (vals->language);
1400 gtk_text_tag_affects_size (GtkTextTag *tag)
1402 g_return_val_if_fail (GTK_IS_TEXT_TAG (tag), FALSE);
1407 tag->left_margin_set ||
1408 tag->left_wrapped_line_margin_set ||
1410 tag->right_margin_set ||
1411 tag->pixels_above_lines_set ||
1412 tag->pixels_below_lines_set ||
1413 tag->pixels_inside_wrap_set ||
1415 tag->underline_set ||
1416 tag->wrap_mode_set ||
1421 gtk_text_tag_affects_nonsize_appearance (GtkTextTag *tag)
1423 g_return_val_if_fail (GTK_IS_TEXT_TAG (tag), FALSE);
1426 tag->bg_color_set ||
1427 tag->bg_stipple_set ||
1428 tag->fg_color_set ||
1429 tag->fg_stipple_set ||
1430 tag->strikethrough_set ||
1431 tag->bg_full_height_set;