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"
74 ARG_BACKGROUND_STIPPLE,
75 ARG_FOREGROUND_STIPPLE,
78 ARG_PIXELS_ABOVE_LINES,
79 ARG_PIXELS_BELOW_LINES,
80 ARG_PIXELS_INSIDE_WRAP,
86 ARG_LEFT_WRAPPED_LINE_MARGIN,
94 /* Whether-a-style-arg-is-set args */
97 ARG_BACKGROUND_GDK_SET,
98 ARG_FOREGROUND_GDK_SET,
99 ARG_BACKGROUND_STIPPLE_SET,
100 ARG_FOREGROUND_STIPPLE_SET,
102 ARG_PIXELS_ABOVE_LINES_SET,
103 ARG_PIXELS_BELOW_LINES_SET,
104 ARG_PIXELS_INSIDE_WRAP_SET,
109 ARG_LEFT_WRAPPED_LINE_MARGIN_SET,
111 ARG_RIGHT_MARGIN_SET,
114 ARG_BG_FULL_HEIGHT_SET,
120 static void gtk_text_tag_init (GtkTextTag *tkxt_tag);
121 static void gtk_text_tag_class_init (GtkTextTagClass *klass);
122 static void gtk_text_tag_destroy (GtkObject *object);
123 static void gtk_text_tag_finalize (GObject *object);
124 static void gtk_text_tag_set_arg (GtkObject *object,
127 static void gtk_text_tag_get_arg (GtkObject *object,
131 static GtkObjectClass *parent_class = NULL;
132 static guint signals[LAST_SIGNAL] = { 0 };
135 gtk_text_tag_get_type (void)
137 static GtkType our_type = 0;
141 static const GtkTypeInfo our_info =
145 sizeof (GtkTextTagClass),
146 (GtkClassInitFunc) gtk_text_tag_class_init,
147 (GtkObjectInitFunc) gtk_text_tag_init,
148 /* reserved_1 */ NULL,
149 /* reserved_2 */ NULL,
150 (GtkClassInitFunc) NULL
153 our_type = gtk_type_unique (GTK_TYPE_OBJECT, &our_info);
160 gtk_text_tag_class_init (GtkTextTagClass *klass)
162 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
163 GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
165 parent_class = gtk_type_class (GTK_TYPE_OBJECT);
168 gtk_object_add_arg_type ("GtkTextTag::name", GTK_TYPE_STRING,
169 GTK_ARG_READWRITE | GTK_ARG_CONSTRUCT_ONLY,
173 gtk_object_add_arg_type ("GtkTextTag::background", GTK_TYPE_STRING,
174 GTK_ARG_WRITABLE, ARG_BACKGROUND);
175 gtk_object_add_arg_type ("GtkTextTag::foreground", GTK_TYPE_STRING,
176 GTK_ARG_WRITABLE, ARG_FOREGROUND);
177 gtk_object_add_arg_type ("GtkTextTag::background_gdk", GTK_TYPE_GDK_COLOR,
178 GTK_ARG_READWRITE, ARG_BACKGROUND_GDK);
179 gtk_object_add_arg_type ("GtkTextTag::foreground_gdk", GTK_TYPE_GDK_COLOR,
180 GTK_ARG_READWRITE, ARG_FOREGROUND_GDK);
181 gtk_object_add_arg_type ("GtkTextTag::background_stipple",
183 GTK_ARG_READWRITE, ARG_BACKGROUND_STIPPLE);
184 gtk_object_add_arg_type ("GtkTextTag::foreground_stipple",
186 GTK_ARG_READWRITE, ARG_FOREGROUND_STIPPLE);
187 gtk_object_add_arg_type ("GtkTextTag::font", GTK_TYPE_STRING,
188 GTK_ARG_READWRITE, ARG_FONT);
189 gtk_object_add_arg_type ("GtkTextTag::font_desc", GTK_TYPE_BOXED,
190 GTK_ARG_READWRITE, ARG_FONT_DESC);
191 gtk_object_add_arg_type ("GtkTextTag::pixels_above_lines", GTK_TYPE_INT,
192 GTK_ARG_READWRITE, ARG_PIXELS_ABOVE_LINES);
193 gtk_object_add_arg_type ("GtkTextTag::pixels_below_lines", GTK_TYPE_INT,
194 GTK_ARG_READWRITE, ARG_PIXELS_BELOW_LINES);
195 gtk_object_add_arg_type ("GtkTextTag::pixels_inside_wrap", GTK_TYPE_INT,
196 GTK_ARG_READWRITE, ARG_PIXELS_INSIDE_WRAP);
197 gtk_object_add_arg_type ("GtkTextTag::editable", GTK_TYPE_BOOL,
198 GTK_ARG_READWRITE, ARG_EDITABLE);
199 gtk_object_add_arg_type ("GtkTextTag::wrap_mode", GTK_TYPE_ENUM,
200 GTK_ARG_READWRITE, ARG_WRAP_MODE);
201 gtk_object_add_arg_type ("GtkTextTag::justify", GTK_TYPE_ENUM,
202 GTK_ARG_READWRITE, ARG_JUSTIFY);
203 gtk_object_add_arg_type ("GtkTextTag::direction", GTK_TYPE_ENUM,
204 GTK_ARG_READWRITE, ARG_DIRECTION);
205 gtk_object_add_arg_type ("GtkTextTag::left_margin", GTK_TYPE_INT,
206 GTK_ARG_READWRITE, ARG_LEFT_MARGIN);
207 gtk_object_add_arg_type ("GtkTextTag::left_wrapped_line_margin", GTK_TYPE_INT,
208 GTK_ARG_READWRITE, ARG_LEFT_WRAPPED_LINE_MARGIN);
209 gtk_object_add_arg_type ("GtkTextTag::overstrike", GTK_TYPE_BOOL,
210 GTK_ARG_READWRITE, ARG_OVERSTRIKE);
211 gtk_object_add_arg_type ("GtkTextTag::right_margin", GTK_TYPE_INT,
212 GTK_ARG_READWRITE, ARG_RIGHT_MARGIN);
213 gtk_object_add_arg_type ("GtkTextTag::pixels_above_lines", GTK_TYPE_INT,
214 GTK_ARG_READWRITE, ARG_PIXELS_ABOVE_LINES);
215 gtk_object_add_arg_type ("GtkTextTag::pixels_below_lines", GTK_TYPE_INT,
216 GTK_ARG_READWRITE, ARG_PIXELS_BELOW_LINES);
217 gtk_object_add_arg_type ("GtkTextTag::pixels_inside_wrap", GTK_TYPE_INT,
218 GTK_ARG_READWRITE, ARG_PIXELS_INSIDE_WRAP);
219 gtk_object_add_arg_type ("GtkTextTag::underline", GTK_TYPE_ENUM,
220 GTK_ARG_READWRITE, ARG_UNDERLINE);
221 gtk_object_add_arg_type ("GtkTextTag::wrap_mode", GTK_TYPE_ENUM,
222 GTK_ARG_READWRITE, ARG_WRAP_MODE);
223 gtk_object_add_arg_type ("GtkTextTag::offset", GTK_TYPE_INT,
224 GTK_ARG_READWRITE, ARG_OFFSET);
225 gtk_object_add_arg_type ("GtkTextTag::background_full_height", GTK_TYPE_BOOL,
226 GTK_ARG_READWRITE, ARG_BG_FULL_HEIGHT);
227 gtk_object_add_arg_type ("GtkTextTag::language", GTK_TYPE_STRING,
228 GTK_ARG_READWRITE, ARG_LANGUAGE);
230 /* Style args are set or not */
231 gtk_object_add_arg_type ("GtkTextTag::background_set", GTK_TYPE_BOOL,
232 GTK_ARG_READWRITE, ARG_BACKGROUND_SET);
233 gtk_object_add_arg_type ("GtkTextTag::foreground_set", GTK_TYPE_BOOL,
234 GTK_ARG_READWRITE, ARG_FOREGROUND_SET);
235 gtk_object_add_arg_type ("GtkTextTag::background_gdk_set", GTK_TYPE_BOOL,
236 GTK_ARG_READWRITE, ARG_BACKGROUND_GDK_SET);
237 gtk_object_add_arg_type ("GtkTextTag::foreground_gdk_set", GTK_TYPE_BOOL,
238 GTK_ARG_READWRITE, ARG_FOREGROUND_GDK_SET);
239 gtk_object_add_arg_type ("GtkTextTag::background_stipple_set", GTK_TYPE_BOOL,
240 GTK_ARG_READWRITE, ARG_BACKGROUND_STIPPLE_SET);
241 gtk_object_add_arg_type ("GtkTextTag::foreground_stipple_set", GTK_TYPE_BOOL,
242 GTK_ARG_READWRITE, ARG_FOREGROUND_STIPPLE_SET);
243 gtk_object_add_arg_type ("GtkTextTag::font_set", GTK_TYPE_BOOL,
244 GTK_ARG_READWRITE, ARG_FONT_SET);
245 gtk_object_add_arg_type ("GtkTextTag::pixels_above_lines_set", GTK_TYPE_BOOL,
246 GTK_ARG_READWRITE, ARG_PIXELS_ABOVE_LINES_SET);
247 gtk_object_add_arg_type ("GtkTextTag::pixels_below_lines_set", GTK_TYPE_BOOL,
248 GTK_ARG_READWRITE, ARG_PIXELS_BELOW_LINES_SET);
249 gtk_object_add_arg_type ("GtkTextTag::pixels_inside_wrap_set", GTK_TYPE_BOOL,
250 GTK_ARG_READWRITE, ARG_PIXELS_INSIDE_WRAP_SET);
251 gtk_object_add_arg_type ("GtkTextTag::editable_set", GTK_TYPE_BOOL,
252 GTK_ARG_READWRITE, ARG_EDITABLE_SET);
253 gtk_object_add_arg_type ("GtkTextTag::wrap_mode_set", GTK_TYPE_BOOL,
254 GTK_ARG_READWRITE, ARG_WRAP_MODE_SET);
255 gtk_object_add_arg_type ("GtkTextTag::justify_set", GTK_TYPE_BOOL,
256 GTK_ARG_READWRITE, ARG_JUSTIFY_SET);
257 gtk_object_add_arg_type ("GtkTextTag::left_margin_set", GTK_TYPE_BOOL,
258 GTK_ARG_READWRITE, ARG_LEFT_MARGIN_SET);
259 gtk_object_add_arg_type ("GtkTextTag::left_wrapped_line_margin_set", GTK_TYPE_BOOL,
260 GTK_ARG_READWRITE, ARG_LEFT_WRAPPED_LINE_MARGIN_SET);
261 gtk_object_add_arg_type ("GtkTextTag::overstrike_set", GTK_TYPE_BOOL,
262 GTK_ARG_READWRITE, ARG_OVERSTRIKE_SET);
263 gtk_object_add_arg_type ("GtkTextTag::right_margin_set", GTK_TYPE_BOOL,
264 GTK_ARG_READWRITE, ARG_RIGHT_MARGIN_SET);
265 gtk_object_add_arg_type ("GtkTextTag::pixels_above_lines_set", GTK_TYPE_BOOL,
266 GTK_ARG_READWRITE, ARG_PIXELS_ABOVE_LINES_SET);
267 gtk_object_add_arg_type ("GtkTextTag::pixels_below_lines_set", GTK_TYPE_BOOL,
268 GTK_ARG_READWRITE, ARG_PIXELS_BELOW_LINES_SET);
269 gtk_object_add_arg_type ("GtkTextTag::pixels_inside_wrap_set", GTK_TYPE_BOOL,
270 GTK_ARG_READWRITE, ARG_PIXELS_INSIDE_WRAP_SET);
271 gtk_object_add_arg_type ("GtkTextTag::underline_set", GTK_TYPE_ENUM,
272 GTK_ARG_READWRITE, ARG_UNDERLINE_SET);
273 gtk_object_add_arg_type ("GtkTextTag::wrap_mode_set", GTK_TYPE_BOOL,
274 GTK_ARG_READWRITE, ARG_WRAP_MODE_SET);
275 gtk_object_add_arg_type ("GtkTextTag::offset_set", GTK_TYPE_BOOL,
276 GTK_ARG_READWRITE, ARG_OFFSET_SET);
277 gtk_object_add_arg_type ("GtkTextTag::background_full_height_set", GTK_TYPE_BOOL,
278 GTK_ARG_READWRITE, ARG_BG_FULL_HEIGHT_SET);
279 gtk_object_add_arg_type ("GtkTextTag::language_set", GTK_TYPE_BOOL,
280 GTK_ARG_READWRITE, ARG_LANGUAGE_SET);
283 gtk_signal_new ("event",
285 GTK_CLASS_TYPE (object_class),
286 GTK_SIGNAL_OFFSET (GtkTextTagClass, event),
287 gtk_marshal_INT__OBJECT_BOXED_POINTER,
294 gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
296 object_class->set_arg = gtk_text_tag_set_arg;
297 object_class->get_arg = gtk_text_tag_get_arg;
299 object_class->destroy = gtk_text_tag_destroy;
300 gobject_class->finalize = gtk_text_tag_finalize;
304 gtk_text_tag_init (GtkTextTag *tkxt_tag)
306 /* 0 is basically a fine way to initialize everything in the
312 gtk_text_tag_new (const gchar *name)
316 tag = GTK_TEXT_TAG (gtk_type_new (gtk_text_tag_get_type ()));
318 tag->name = g_strdup(name);
320 tag->values = gtk_text_attributes_new();
326 gtk_text_tag_destroy (GtkObject *object)
328 GtkTextTag *tkxt_tag;
330 tkxt_tag = GTK_TEXT_TAG (object);
332 g_assert(!tkxt_tag->values->realized);
335 gtk_text_tag_table_remove(tkxt_tag->table, tkxt_tag);
337 g_assert(tkxt_tag->table == NULL);
339 gtk_text_attributes_unref(tkxt_tag->values);
340 tkxt_tag->values = NULL;
342 (* GTK_OBJECT_CLASS(parent_class)->destroy) (object);
346 gtk_text_tag_finalize (GObject *object)
348 GtkTextTag *tkxt_tag;
350 tkxt_tag = GTK_TEXT_TAG (object);
352 g_free(tkxt_tag->name);
353 tkxt_tag->name = NULL;
355 (* G_OBJECT_CLASS(parent_class)->finalize) (object);
359 set_bg_color(GtkTextTag *tag, GdkColor *color)
363 tag->bg_color_set = TRUE;
364 tag->values->appearance.bg_color = *color;
368 tag->bg_color_set = FALSE;
373 set_fg_color(GtkTextTag *tag, GdkColor *color)
377 tag->fg_color_set = TRUE;
378 tag->values->appearance.fg_color = *color;
382 tag->fg_color_set = FALSE;
387 gtk_text_tag_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
389 GtkTextTag *tkxt_tag;
390 gboolean size_changed = FALSE;
392 tkxt_tag = GTK_TEXT_TAG (object);
394 g_return_if_fail(!tkxt_tag->values->realized);
399 g_return_if_fail(tkxt_tag->name == NULL);
400 tkxt_tag->name = g_strdup(GTK_VALUE_STRING(*arg));
407 if (gdk_color_parse(GTK_VALUE_STRING(*arg), &color))
408 set_bg_color(tkxt_tag, &color);
410 g_warning("Don't know color `%s'", GTK_VALUE_STRING(*arg));
418 if (gdk_color_parse(GTK_VALUE_STRING(*arg), &color))
419 set_fg_color(tkxt_tag, &color);
421 g_warning("Don't know color `%s'", GTK_VALUE_STRING(*arg));
425 case ARG_BACKGROUND_GDK:
427 GdkColor *color = GTK_VALUE_POINTER(*arg);
428 set_bg_color(tkxt_tag, color);
432 case ARG_FOREGROUND_GDK:
434 GdkColor *color = GTK_VALUE_POINTER(*arg);
435 set_fg_color(tkxt_tag, color);
439 case ARG_BACKGROUND_STIPPLE:
441 GdkBitmap *bitmap = GTK_VALUE_POINTER(*arg);
443 tkxt_tag->bg_stipple_set = TRUE;
445 if (tkxt_tag->values->appearance.bg_stipple != bitmap)
448 gdk_bitmap_ref(bitmap);
450 if (tkxt_tag->values->appearance.bg_stipple)
451 gdk_bitmap_unref(tkxt_tag->values->appearance.bg_stipple);
453 tkxt_tag->values->appearance.bg_stipple = bitmap;
458 case ARG_FOREGROUND_STIPPLE:
460 GdkBitmap *bitmap = GTK_VALUE_POINTER(*arg);
462 tkxt_tag->fg_stipple_set = TRUE;
464 if (tkxt_tag->values->appearance.fg_stipple != bitmap)
467 gdk_bitmap_ref(bitmap);
469 if (tkxt_tag->values->appearance.fg_stipple)
470 gdk_bitmap_unref(tkxt_tag->values->appearance.fg_stipple);
472 tkxt_tag->values->appearance.fg_stipple = bitmap;
479 PangoFontDescription *font_desc = NULL;
482 name = GTK_VALUE_STRING(*arg);
485 font_desc = pango_font_description_from_string (name);
487 if (tkxt_tag->values->font_desc)
488 pango_font_description_free (tkxt_tag->values->font_desc);
490 tkxt_tag->font_set = (font_desc != NULL);
491 tkxt_tag->values->font_desc = font_desc;
499 PangoFontDescription *font_desc;
501 font_desc = GTK_VALUE_BOXED(*arg);
503 if (tkxt_tag->values->font_desc)
504 pango_font_description_free (tkxt_tag->values->font_desc);
507 tkxt_tag->values->font_desc = pango_font_description_copy (font_desc);
509 tkxt_tag->values->font_desc = NULL;
511 tkxt_tag->font_set = (font_desc != NULL);
517 case ARG_PIXELS_ABOVE_LINES:
518 tkxt_tag->pixels_above_lines_set = TRUE;
519 tkxt_tag->values->pixels_above_lines = GTK_VALUE_INT(*arg);
523 case ARG_PIXELS_BELOW_LINES:
524 tkxt_tag->pixels_below_lines_set = TRUE;
525 tkxt_tag->values->pixels_below_lines = GTK_VALUE_INT(*arg);
529 case ARG_PIXELS_INSIDE_WRAP:
530 tkxt_tag->pixels_inside_wrap_set = TRUE;
531 tkxt_tag->values->pixels_inside_wrap = GTK_VALUE_INT(*arg);
536 tkxt_tag->editable_set = TRUE;
537 tkxt_tag->values->editable = GTK_VALUE_BOOL(*arg);
541 tkxt_tag->wrap_mode_set = TRUE;
542 tkxt_tag->values->wrap_mode = GTK_VALUE_ENUM(*arg);
547 tkxt_tag->justify_set = TRUE;
548 tkxt_tag->values->justify = GTK_VALUE_ENUM(*arg);
553 tkxt_tag->values->direction = GTK_VALUE_ENUM(*arg);
556 case ARG_LEFT_MARGIN:
557 tkxt_tag->left_margin_set = TRUE;
558 tkxt_tag->values->left_margin = GTK_VALUE_INT(*arg);
562 case ARG_LEFT_WRAPPED_LINE_MARGIN:
563 tkxt_tag->left_wrapped_line_margin_set = TRUE;
564 tkxt_tag->values->left_wrapped_line_margin = GTK_VALUE_INT(*arg);
569 tkxt_tag->overstrike_set = TRUE;
570 tkxt_tag->values->appearance.overstrike = GTK_VALUE_BOOL(*arg);
573 case ARG_RIGHT_MARGIN:
574 tkxt_tag->right_margin_set = TRUE;
575 tkxt_tag->values->right_margin = GTK_VALUE_INT(*arg);
580 tkxt_tag->underline_set = TRUE;
581 tkxt_tag->values->appearance.underline = GTK_VALUE_ENUM(*arg);
585 tkxt_tag->offset_set = TRUE;
586 tkxt_tag->values->offset = GTK_VALUE_INT(*arg);
590 case ARG_BG_FULL_HEIGHT:
591 tkxt_tag->bg_full_height_set = TRUE;
592 tkxt_tag->values->bg_full_height = GTK_VALUE_BOOL(*arg);
596 tkxt_tag->language_set = TRUE;
597 tkxt_tag->values->language = g_strdup (GTK_VALUE_STRING(*arg));
600 /* Whether the value should be used... */
602 case ARG_BACKGROUND_SET:
603 case ARG_BACKGROUND_GDK_SET:
604 tkxt_tag->bg_color_set = GTK_VALUE_BOOL(*arg);
607 case ARG_FOREGROUND_SET:
608 case ARG_FOREGROUND_GDK_SET:
609 tkxt_tag->fg_color_set = GTK_VALUE_BOOL(*arg);
612 case ARG_BACKGROUND_STIPPLE_SET:
613 tkxt_tag->bg_stipple_set = GTK_VALUE_BOOL(*arg);
616 case ARG_FOREGROUND_STIPPLE_SET:
617 tkxt_tag->fg_stipple_set = GTK_VALUE_BOOL(*arg);
621 tkxt_tag->font_set = GTK_VALUE_BOOL(*arg);
625 case ARG_PIXELS_ABOVE_LINES_SET:
626 tkxt_tag->pixels_above_lines_set = GTK_VALUE_BOOL(*arg);
630 case ARG_PIXELS_BELOW_LINES_SET:
631 tkxt_tag->pixels_below_lines_set = GTK_VALUE_BOOL(*arg);
635 case ARG_PIXELS_INSIDE_WRAP_SET:
636 tkxt_tag->pixels_inside_wrap_set = GTK_VALUE_BOOL(*arg);
640 case ARG_EDITABLE_SET:
641 tkxt_tag->editable_set = GTK_VALUE_BOOL(*arg);
644 case ARG_WRAP_MODE_SET:
645 tkxt_tag->wrap_mode_set = GTK_VALUE_BOOL(*arg);
649 case ARG_JUSTIFY_SET:
650 tkxt_tag->justify_set = GTK_VALUE_BOOL(*arg);
654 case ARG_LEFT_MARGIN_SET:
655 tkxt_tag->left_margin_set = GTK_VALUE_BOOL(*arg);
659 case ARG_LEFT_WRAPPED_LINE_MARGIN_SET:
660 tkxt_tag->left_wrapped_line_margin_set = GTK_VALUE_BOOL(*arg);
664 case ARG_OVERSTRIKE_SET:
665 tkxt_tag->overstrike_set = GTK_VALUE_BOOL(*arg);
668 case ARG_RIGHT_MARGIN_SET:
669 tkxt_tag->right_margin_set = GTK_VALUE_BOOL(*arg);
673 case ARG_UNDERLINE_SET:
674 tkxt_tag->underline_set = GTK_VALUE_BOOL(*arg);
678 tkxt_tag->offset_set = GTK_VALUE_BOOL(*arg);
682 case ARG_BG_FULL_HEIGHT_SET:
683 tkxt_tag->bg_full_height_set = GTK_VALUE_BOOL(*arg);
686 case ARG_LANGUAGE_SET:
687 tkxt_tag->language_set = GTK_VALUE_BOOL(*arg);
692 g_assert_not_reached();
696 /* FIXME I would like to do this after all set_arg in a single
697 gtk_object_set() have been called. But an idle function
698 won't work; we need to emit when the tag is changed, not
699 when we get around to the event loop. So blah, we eat some
702 /* This is also somewhat weird since we emit another object's
703 signal here, but the two objects are already tightly bound. */
706 gtk_signal_emit_by_name(GTK_OBJECT(tkxt_tag->table),
708 tkxt_tag, size_changed);
712 get_color_arg (GtkArg *arg, GdkColor *orig)
716 color = g_new (GdkColor, 1);
718 GTK_VALUE_BOXED (*arg) = color;
722 gtk_text_tag_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
726 tag = GTK_TEXT_TAG (object);
731 GTK_VALUE_STRING(*arg) = g_strdup(tag->name);
734 case ARG_BACKGROUND_GDK:
735 get_color_arg(arg, &tag->values->appearance.bg_color);
738 case ARG_FOREGROUND_GDK:
739 get_color_arg(arg, &tag->values->appearance.fg_color);
742 case ARG_BACKGROUND_STIPPLE:
743 GTK_VALUE_BOXED(*arg) = tag->values->appearance.bg_stipple;
746 case ARG_FOREGROUND_STIPPLE:
747 GTK_VALUE_BOXED(*arg) = tag->values->appearance.fg_stipple;
751 if (tag->values->font_desc)
752 GTK_VALUE_STRING(*arg) = pango_font_description_to_string (tag->values->font_desc);
754 GTK_VALUE_STRING(*arg) = NULL;
758 if (tag->values->font_desc)
759 GTK_VALUE_BOXED(*arg) = pango_font_description_copy (tag->values->font_desc);
761 GTK_VALUE_BOXED(*arg) = NULL;
764 case ARG_PIXELS_ABOVE_LINES:
765 GTK_VALUE_INT(*arg) = tag->values->pixels_above_lines;
768 case ARG_PIXELS_BELOW_LINES:
769 GTK_VALUE_INT(*arg) = tag->values->pixels_below_lines;
772 case ARG_PIXELS_INSIDE_WRAP:
773 GTK_VALUE_INT(*arg) = tag->values->pixels_inside_wrap;
777 GTK_VALUE_BOOL(*arg) = tag->values->editable;
781 GTK_VALUE_ENUM(*arg) = tag->values->wrap_mode;
785 GTK_VALUE_ENUM(*arg) = tag->values->justify;
788 case ARG_LEFT_MARGIN:
789 GTK_VALUE_INT(*arg) = tag->values->left_margin;
792 case ARG_LEFT_WRAPPED_LINE_MARGIN:
793 GTK_VALUE_INT(*arg) = tag->values->left_wrapped_line_margin;
797 GTK_VALUE_BOOL(*arg) = tag->values->appearance.overstrike;
800 case ARG_RIGHT_MARGIN:
801 GTK_VALUE_INT(*arg) = tag->values->right_margin;
805 GTK_VALUE_ENUM(*arg) = tag->values->appearance.underline;
809 GTK_VALUE_INT(*arg) = tag->values->offset;
812 case ARG_BG_FULL_HEIGHT:
813 GTK_VALUE_BOOL(*arg) = tag->values->bg_full_height;
817 GTK_VALUE_STRING(*arg) = g_strdup (tag->values->language);
820 case ARG_BACKGROUND_SET:
821 case ARG_BACKGROUND_GDK_SET:
822 GTK_VALUE_BOOL(*arg) = tag->bg_color_set;
825 case ARG_FOREGROUND_SET:
826 case ARG_FOREGROUND_GDK_SET:
827 GTK_VALUE_BOOL(*arg) = tag->fg_color_set;
830 case ARG_BACKGROUND_STIPPLE_SET:
831 GTK_VALUE_BOOL(*arg) = tag->bg_stipple_set;
834 case ARG_FOREGROUND_STIPPLE_SET:
835 GTK_VALUE_BOOL(*arg) = tag->fg_stipple_set;
839 GTK_VALUE_BOOL(*arg) = tag->font_set;
842 case ARG_PIXELS_ABOVE_LINES_SET:
843 GTK_VALUE_BOOL(*arg) = tag->pixels_above_lines_set;
846 case ARG_PIXELS_BELOW_LINES_SET:
847 GTK_VALUE_BOOL(*arg) = tag->pixels_below_lines_set;
850 case ARG_PIXELS_INSIDE_WRAP_SET:
851 GTK_VALUE_BOOL(*arg) = tag->pixels_inside_wrap_set;
854 case ARG_EDITABLE_SET:
855 GTK_VALUE_BOOL(*arg) = tag->editable_set;
858 case ARG_WRAP_MODE_SET:
859 GTK_VALUE_BOOL(*arg) = tag->wrap_mode_set;
862 case ARG_JUSTIFY_SET:
863 GTK_VALUE_BOOL(*arg) = tag->justify_set;
866 case ARG_LEFT_MARGIN_SET:
867 GTK_VALUE_BOOL(*arg) = tag->left_margin_set;
870 case ARG_LEFT_WRAPPED_LINE_MARGIN_SET:
871 GTK_VALUE_BOOL(*arg) = tag->left_wrapped_line_margin_set;
874 case ARG_OVERSTRIKE_SET:
875 GTK_VALUE_BOOL(*arg) = tag->overstrike_set;
878 case ARG_RIGHT_MARGIN_SET:
879 GTK_VALUE_BOOL(*arg) = tag->right_margin_set;
882 case ARG_UNDERLINE_SET:
883 GTK_VALUE_BOOL(*arg) = tag->underline_set;
887 GTK_VALUE_BOOL(*arg) = tag->offset_set;
890 case ARG_BG_FULL_HEIGHT_SET:
891 GTK_VALUE_BOOL(*arg) = tag->bg_full_height_set;
894 case ARG_LANGUAGE_SET:
895 GTK_VALUE_BOOL(*arg) = tag->language_set;
901 arg->type = GTK_TYPE_INVALID;
905 arg->type = GTK_TYPE_INVALID;
919 delta_priority_foreach(GtkTextTag *tag, gpointer user_data)
921 DeltaData *dd = user_data;
923 if (tag->priority >= dd->low && tag->priority <= dd->high)
924 tag->priority += dd->delta;
928 gtk_text_tag_get_priority (GtkTextTag *tag)
930 g_return_val_if_fail(GTK_IS_TEXT_TAG(tag), 0);
932 return tag->priority;
936 gtk_text_tag_set_priority(GtkTextTag *tag,
941 g_return_if_fail(GTK_IS_TEXT_TAG(tag));
942 g_return_if_fail(tag->table != NULL);
943 g_return_if_fail(priority >= 0);
944 g_return_if_fail(priority < gtk_text_tag_table_size(tag->table));
946 if (priority == tag->priority)
949 if (priority < tag->priority) {
951 dd.high = tag->priority - 1;
954 dd.low = tag->priority + 1;
959 gtk_text_tag_table_foreach(tag->table, delta_priority_foreach,
962 tag->priority = priority;
966 gtk_text_tag_event(GtkTextTag *tag,
967 GtkObject *event_object,
969 const GtkTextIter *iter)
973 g_return_val_if_fail(GTK_IS_TEXT_TAG(tag), FALSE);
974 g_return_val_if_fail(GTK_IS_OBJECT(event_object), FALSE);
975 g_return_val_if_fail(event != NULL, FALSE);
977 gtk_signal_emit(GTK_OBJECT(tag),
988 tag_sort_func(gconstpointer first, gconstpointer second)
990 GtkTextTag *tag1, *tag2;
992 tag1 = * (GtkTextTag **) first;
993 tag2 = * (GtkTextTag **) second;
994 return tag1->priority - tag2->priority;
998 gtk_text_tag_array_sort(GtkTextTag** tag_array_p,
1003 GtkTextTag **maxPtrPtr, *tmp;
1005 g_return_if_fail(tag_array_p != NULL);
1006 g_return_if_fail(len > 0);
1012 GtkTextTag **iter = tag_array_p;
1014 for (i = len-1; i > 0; i--, iter++) {
1015 maxPtrPtr = tag = iter;
1016 prio = tag[0]->priority;
1017 for (j = i, tag++; j > 0; j--, tag++) {
1018 if (tag[0]->priority < prio) {
1019 prio = tag[0]->priority;
1028 qsort((void *) tag_array_p, (unsigned) len, sizeof (GtkTextTag *),
1034 printf("Sorted tag array: \n");
1038 GtkTextTag *t = tag_array_p[i];
1039 printf(" %s priority %d\n", t->name, t->priority);
1052 gtk_text_attributes_new(void)
1054 GtkTextAttributes *values;
1056 values = g_new0(GtkTextAttributes, 1);
1058 /* 0 is a valid value for most of the struct */
1060 values->refcount = 1;
1062 values->language = gtk_get_default_language ();
1068 gtk_text_attributes_copy(GtkTextAttributes *src,
1069 GtkTextAttributes *dest)
1071 guint orig_refcount;
1073 g_return_if_fail(!dest->realized);
1080 if (src->appearance.bg_stipple)
1081 gdk_bitmap_ref(src->appearance.bg_stipple);
1083 if (src->appearance.fg_stipple)
1084 gdk_bitmap_ref(src->appearance.fg_stipple);
1087 gtk_text_view_tab_array_ref(src->tab_array);
1091 if (dest->appearance.bg_stipple)
1092 gdk_bitmap_unref(dest->appearance.bg_stipple);
1094 if (dest->appearance.fg_stipple)
1095 gdk_bitmap_unref(dest->appearance.fg_stipple);
1097 if (dest->tab_array)
1098 gtk_text_view_tab_array_unref(dest->tab_array);
1101 orig_refcount = dest->refcount;
1105 dest->font_desc = pango_font_description_copy (src->font_desc);
1106 dest->language = g_strdup (src->language);
1108 dest->refcount = orig_refcount;
1109 dest->realized = FALSE;
1113 gtk_text_attributes_ref(GtkTextAttributes *values)
1115 g_return_if_fail(values != NULL);
1117 values->refcount += 1;
1121 gtk_text_attributes_unref(GtkTextAttributes *values)
1123 g_return_if_fail(values != NULL);
1124 g_return_if_fail(values->refcount > 0);
1126 values->refcount -= 1;
1128 if (values->refcount == 0)
1130 g_assert(!values->realized);
1132 if (values->appearance.bg_stipple)
1133 gdk_bitmap_unref(values->appearance.bg_stipple);
1135 if (values->font_desc)
1136 pango_font_description_free (values->font_desc);
1138 if (values->appearance.fg_stipple)
1139 gdk_bitmap_unref(values->appearance.fg_stipple);
1141 if (values->tab_array)
1142 gtk_text_view_tab_array_unref(values->tab_array);
1144 if (values->language)
1145 g_free (values->language);
1152 gtk_text_attributes_realize(GtkTextAttributes *values,
1156 g_return_if_fail(values != NULL);
1157 g_return_if_fail(values->refcount > 0);
1158 g_return_if_fail(!values->realized);
1160 /* It is wrong to use this colormap, FIXME */
1161 gdk_colormap_alloc_color(cmap,
1162 &values->appearance.fg_color,
1165 gdk_colormap_alloc_color(cmap,
1166 &values->appearance.bg_color,
1169 values->realized = TRUE;
1173 gtk_text_attributes_unrealize(GtkTextAttributes *values,
1177 g_return_if_fail(values != NULL);
1178 g_return_if_fail(values->refcount > 0);
1179 g_return_if_fail(values->realized);
1181 gdk_colormap_free_colors(cmap,
1182 &values->appearance.fg_color, 1);
1185 gdk_colormap_free_colors(cmap,
1186 &values->appearance.bg_color, 1);
1188 values->appearance.fg_color.pixel = 0;
1189 values->appearance.bg_color.pixel = 0;
1191 values->realized = FALSE;
1195 gtk_text_attributes_fill_from_tags(GtkTextAttributes *dest,
1201 g_return_if_fail(!dest->realized);
1205 GtkTextTag *tag = tags[n];
1206 GtkTextAttributes *vals = tag->values;
1209 g_assert(tags[n]->priority > tags[n-1]->priority);
1211 if (tag->bg_color_set)
1213 dest->appearance.bg_color = vals->appearance.bg_color;
1215 dest->appearance.draw_bg = TRUE;
1218 if (tag->border_width_set)
1219 dest->border_width = vals->border_width;
1221 if (tag->relief_set)
1222 dest->relief = vals->relief;
1224 if (tag->bg_stipple_set)
1226 gdk_bitmap_ref(vals->appearance.bg_stipple);
1227 if (dest->appearance.bg_stipple)
1228 gdk_bitmap_unref(dest->appearance.bg_stipple);
1229 dest->appearance.bg_stipple = vals->appearance.bg_stipple;
1231 dest->appearance.draw_bg = TRUE;
1234 if (tag->fg_color_set)
1235 dest->appearance.fg_color = vals->appearance.fg_color;
1239 if (dest->font_desc)
1240 pango_font_description_free (dest->font_desc);
1241 dest->font_desc = pango_font_description_copy (vals->font_desc);
1244 if (tag->fg_stipple_set)
1246 gdk_bitmap_ref(vals->appearance.fg_stipple);
1247 if (dest->appearance.fg_stipple)
1248 gdk_bitmap_unref(dest->appearance.fg_stipple);
1249 dest->appearance.fg_stipple = vals->appearance.fg_stipple;
1252 if (tag->justify_set)
1253 dest->justify = vals->justify;
1255 if (vals->direction != GTK_TEXT_DIR_NONE)
1256 dest->direction = vals->direction;
1258 if (tag->left_margin_set)
1259 dest->left_margin = vals->left_margin;
1261 if (tag->left_wrapped_line_margin_set)
1262 dest->left_wrapped_line_margin = vals->left_wrapped_line_margin;
1264 if (tag->offset_set)
1265 dest->offset = vals->offset;
1267 if (tag->right_margin_set)
1268 dest->right_margin = vals->right_margin;
1270 if (tag->pixels_above_lines_set)
1271 dest->pixels_above_lines = vals->pixels_above_lines;
1273 if (tag->pixels_below_lines_set)
1274 dest->pixels_below_lines = vals->pixels_below_lines;
1276 if (tag->pixels_inside_wrap_set)
1277 dest->pixels_inside_wrap = vals->pixels_inside_wrap;
1279 if (tag->tab_array_set)
1281 gtk_text_view_tab_array_ref(vals->tab_array);
1282 if (dest->tab_array)
1283 gtk_text_view_tab_array_unref(dest->tab_array);
1284 dest->tab_array = vals->tab_array;
1287 if (tag->wrap_mode_set)
1288 dest->wrap_mode = vals->wrap_mode;
1290 if (tag->underline_set)
1291 dest->appearance.underline = vals->appearance.underline;
1293 if (tag->overstrike_set)
1294 dest->appearance.overstrike = vals->appearance.overstrike;
1296 if (tag->invisible_set)
1297 dest->invisible = vals->invisible;
1299 if (tag->editable_set)
1300 dest->editable = vals->editable;
1302 if (tag->bg_full_height_set)
1303 dest->bg_full_height = vals->bg_full_height;
1305 if (tag->language_set)
1307 g_free (dest->language);
1308 dest->language = g_strdup (vals->language);