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.
50 #include "gtktexttag.h"
51 #include "gtktexttypes.h"
52 #include "gtktexttagtable.h"
53 #include "gtksignal.h"
72 ARG_BACKGROUND_STIPPLE,
73 ARG_FOREGROUND_STIPPLE,
76 ARG_PIXELS_ABOVE_LINES,
77 ARG_PIXELS_BELOW_LINES,
78 ARG_PIXELS_INSIDE_WRAP,
84 ARG_LEFT_WRAPPED_LINE_MARGIN,
92 /* Whether-a-style-arg-is-set args */
95 ARG_BACKGROUND_GDK_SET,
96 ARG_FOREGROUND_GDK_SET,
97 ARG_BACKGROUND_STIPPLE_SET,
98 ARG_FOREGROUND_STIPPLE_SET,
100 ARG_PIXELS_ABOVE_LINES_SET,
101 ARG_PIXELS_BELOW_LINES_SET,
102 ARG_PIXELS_INSIDE_WRAP_SET,
107 ARG_LEFT_WRAPPED_LINE_MARGIN_SET,
109 ARG_RIGHT_MARGIN_SET,
112 ARG_BG_FULL_HEIGHT_SET,
118 static void gtk_text_tag_init (GtkTextTag *tkxt_tag);
119 static void gtk_text_tag_class_init (GtkTextTagClass *klass);
120 static void gtk_text_tag_destroy (GtkObject *object);
121 static void gtk_text_tag_finalize (GObject *object);
122 static void gtk_text_tag_set_arg (GtkObject *object,
125 static void gtk_text_tag_get_arg (GtkObject *object,
129 static GtkObjectClass *parent_class = NULL;
130 static guint signals[LAST_SIGNAL] = { 0 };
133 gtk_text_tag_get_type (void)
135 static GtkType our_type = 0;
139 static const GtkTypeInfo our_info =
143 sizeof (GtkTextTagClass),
144 (GtkClassInitFunc) gtk_text_tag_class_init,
145 (GtkObjectInitFunc) gtk_text_tag_init,
146 /* reserved_1 */ NULL,
147 /* reserved_2 */ NULL,
148 (GtkClassInitFunc) NULL
151 our_type = gtk_type_unique (GTK_TYPE_OBJECT, &our_info);
158 gtk_text_tag_class_init (GtkTextTagClass *klass)
160 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
161 GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
163 parent_class = gtk_type_class (GTK_TYPE_OBJECT);
166 gtk_object_add_arg_type ("GtkTextTag::name", GTK_TYPE_STRING,
167 GTK_ARG_READWRITE | GTK_ARG_CONSTRUCT_ONLY,
171 gtk_object_add_arg_type ("GtkTextTag::background", GTK_TYPE_STRING,
172 GTK_ARG_WRITABLE, ARG_BACKGROUND);
173 gtk_object_add_arg_type ("GtkTextTag::foreground", GTK_TYPE_STRING,
174 GTK_ARG_WRITABLE, ARG_FOREGROUND);
175 gtk_object_add_arg_type ("GtkTextTag::background_gdk", GTK_TYPE_GDK_COLOR,
176 GTK_ARG_READWRITE, ARG_BACKGROUND_GDK);
177 gtk_object_add_arg_type ("GtkTextTag::foreground_gdk", GTK_TYPE_GDK_COLOR,
178 GTK_ARG_READWRITE, ARG_FOREGROUND_GDK);
179 gtk_object_add_arg_type ("GtkTextTag::background_stipple",
181 GTK_ARG_READWRITE, ARG_BACKGROUND_STIPPLE);
182 gtk_object_add_arg_type ("GtkTextTag::foreground_stipple",
184 GTK_ARG_READWRITE, ARG_FOREGROUND_STIPPLE);
185 gtk_object_add_arg_type ("GtkTextTag::font", GTK_TYPE_STRING,
186 GTK_ARG_READWRITE, ARG_FONT);
187 gtk_object_add_arg_type ("GtkTextTag::font_desc", GTK_TYPE_BOXED,
188 GTK_ARG_READWRITE, ARG_FONT_DESC);
189 gtk_object_add_arg_type ("GtkTextTag::pixels_above_lines", GTK_TYPE_INT,
190 GTK_ARG_READWRITE, ARG_PIXELS_ABOVE_LINES);
191 gtk_object_add_arg_type ("GtkTextTag::pixels_below_lines", GTK_TYPE_INT,
192 GTK_ARG_READWRITE, ARG_PIXELS_BELOW_LINES);
193 gtk_object_add_arg_type ("GtkTextTag::pixels_inside_wrap", GTK_TYPE_INT,
194 GTK_ARG_READWRITE, ARG_PIXELS_INSIDE_WRAP);
195 gtk_object_add_arg_type ("GtkTextTag::editable", GTK_TYPE_BOOL,
196 GTK_ARG_READWRITE, ARG_EDITABLE);
197 gtk_object_add_arg_type ("GtkTextTag::wrap_mode", GTK_TYPE_ENUM,
198 GTK_ARG_READWRITE, ARG_WRAP_MODE);
199 gtk_object_add_arg_type ("GtkTextTag::justify", GTK_TYPE_ENUM,
200 GTK_ARG_READWRITE, ARG_JUSTIFY);
201 gtk_object_add_arg_type ("GtkTextTag::direction", GTK_TYPE_ENUM,
202 GTK_ARG_READWRITE, ARG_DIRECTION);
203 gtk_object_add_arg_type ("GtkTextTag::left_margin", GTK_TYPE_INT,
204 GTK_ARG_READWRITE, ARG_LEFT_MARGIN);
205 gtk_object_add_arg_type ("GtkTextTag::left_wrapped_line_margin", GTK_TYPE_INT,
206 GTK_ARG_READWRITE, ARG_LEFT_WRAPPED_LINE_MARGIN);
207 gtk_object_add_arg_type ("GtkTextTag::overstrike", GTK_TYPE_BOOL,
208 GTK_ARG_READWRITE, ARG_OVERSTRIKE);
209 gtk_object_add_arg_type ("GtkTextTag::right_margin", GTK_TYPE_INT,
210 GTK_ARG_READWRITE, ARG_RIGHT_MARGIN);
211 gtk_object_add_arg_type ("GtkTextTag::pixels_above_lines", GTK_TYPE_INT,
212 GTK_ARG_READWRITE, ARG_PIXELS_ABOVE_LINES);
213 gtk_object_add_arg_type ("GtkTextTag::pixels_below_lines", GTK_TYPE_INT,
214 GTK_ARG_READWRITE, ARG_PIXELS_BELOW_LINES);
215 gtk_object_add_arg_type ("GtkTextTag::pixels_inside_wrap", GTK_TYPE_INT,
216 GTK_ARG_READWRITE, ARG_PIXELS_INSIDE_WRAP);
217 gtk_object_add_arg_type ("GtkTextTag::underline", GTK_TYPE_ENUM,
218 GTK_ARG_READWRITE, ARG_UNDERLINE);
219 gtk_object_add_arg_type ("GtkTextTag::wrap_mode", GTK_TYPE_ENUM,
220 GTK_ARG_READWRITE, ARG_WRAP_MODE);
221 gtk_object_add_arg_type ("GtkTextTag::offset", GTK_TYPE_INT,
222 GTK_ARG_READWRITE, ARG_OFFSET);
223 gtk_object_add_arg_type ("GtkTextTag::background_full_height", GTK_TYPE_BOOL,
224 GTK_ARG_READWRITE, ARG_BG_FULL_HEIGHT);
225 gtk_object_add_arg_type ("GtkTextTag::language", GTK_TYPE_STRING,
226 GTK_ARG_READWRITE, ARG_LANGUAGE);
228 /* Style args are set or not */
229 gtk_object_add_arg_type ("GtkTextTag::background_set", GTK_TYPE_BOOL,
230 GTK_ARG_READWRITE, ARG_BACKGROUND_SET);
231 gtk_object_add_arg_type ("GtkTextTag::foreground_set", GTK_TYPE_BOOL,
232 GTK_ARG_READWRITE, ARG_FOREGROUND_SET);
233 gtk_object_add_arg_type ("GtkTextTag::background_gdk_set", GTK_TYPE_BOOL,
234 GTK_ARG_READWRITE, ARG_BACKGROUND_GDK_SET);
235 gtk_object_add_arg_type ("GtkTextTag::foreground_gdk_set", GTK_TYPE_BOOL,
236 GTK_ARG_READWRITE, ARG_FOREGROUND_GDK_SET);
237 gtk_object_add_arg_type ("GtkTextTag::background_stipple_set", GTK_TYPE_BOOL,
238 GTK_ARG_READWRITE, ARG_BACKGROUND_STIPPLE_SET);
239 gtk_object_add_arg_type ("GtkTextTag::foreground_stipple_set", GTK_TYPE_BOOL,
240 GTK_ARG_READWRITE, ARG_FOREGROUND_STIPPLE_SET);
241 gtk_object_add_arg_type ("GtkTextTag::font_set", GTK_TYPE_BOOL,
242 GTK_ARG_READWRITE, ARG_FONT_SET);
243 gtk_object_add_arg_type ("GtkTextTag::pixels_above_lines_set", GTK_TYPE_BOOL,
244 GTK_ARG_READWRITE, ARG_PIXELS_ABOVE_LINES_SET);
245 gtk_object_add_arg_type ("GtkTextTag::pixels_below_lines_set", GTK_TYPE_BOOL,
246 GTK_ARG_READWRITE, ARG_PIXELS_BELOW_LINES_SET);
247 gtk_object_add_arg_type ("GtkTextTag::pixels_inside_wrap_set", GTK_TYPE_BOOL,
248 GTK_ARG_READWRITE, ARG_PIXELS_INSIDE_WRAP_SET);
249 gtk_object_add_arg_type ("GtkTextTag::editable_set", GTK_TYPE_BOOL,
250 GTK_ARG_READWRITE, ARG_EDITABLE_SET);
251 gtk_object_add_arg_type ("GtkTextTag::wrap_mode_set", GTK_TYPE_BOOL,
252 GTK_ARG_READWRITE, ARG_WRAP_MODE_SET);
253 gtk_object_add_arg_type ("GtkTextTag::justify_set", GTK_TYPE_BOOL,
254 GTK_ARG_READWRITE, ARG_JUSTIFY_SET);
255 gtk_object_add_arg_type ("GtkTextTag::left_margin_set", GTK_TYPE_BOOL,
256 GTK_ARG_READWRITE, ARG_LEFT_MARGIN_SET);
257 gtk_object_add_arg_type ("GtkTextTag::left_wrapped_line_margin_set", GTK_TYPE_BOOL,
258 GTK_ARG_READWRITE, ARG_LEFT_WRAPPED_LINE_MARGIN_SET);
259 gtk_object_add_arg_type ("GtkTextTag::overstrike_set", GTK_TYPE_BOOL,
260 GTK_ARG_READWRITE, ARG_OVERSTRIKE_SET);
261 gtk_object_add_arg_type ("GtkTextTag::right_margin_set", GTK_TYPE_BOOL,
262 GTK_ARG_READWRITE, ARG_RIGHT_MARGIN_SET);
263 gtk_object_add_arg_type ("GtkTextTag::pixels_above_lines_set", GTK_TYPE_BOOL,
264 GTK_ARG_READWRITE, ARG_PIXELS_ABOVE_LINES_SET);
265 gtk_object_add_arg_type ("GtkTextTag::pixels_below_lines_set", GTK_TYPE_BOOL,
266 GTK_ARG_READWRITE, ARG_PIXELS_BELOW_LINES_SET);
267 gtk_object_add_arg_type ("GtkTextTag::pixels_inside_wrap_set", GTK_TYPE_BOOL,
268 GTK_ARG_READWRITE, ARG_PIXELS_INSIDE_WRAP_SET);
269 gtk_object_add_arg_type ("GtkTextTag::underline_set", GTK_TYPE_ENUM,
270 GTK_ARG_READWRITE, ARG_UNDERLINE_SET);
271 gtk_object_add_arg_type ("GtkTextTag::wrap_mode_set", GTK_TYPE_BOOL,
272 GTK_ARG_READWRITE, ARG_WRAP_MODE_SET);
273 gtk_object_add_arg_type ("GtkTextTag::offset_set", GTK_TYPE_BOOL,
274 GTK_ARG_READWRITE, ARG_OFFSET_SET);
275 gtk_object_add_arg_type ("GtkTextTag::background_full_height_set", GTK_TYPE_BOOL,
276 GTK_ARG_READWRITE, ARG_BG_FULL_HEIGHT_SET);
277 gtk_object_add_arg_type ("GtkTextTag::language_set", GTK_TYPE_BOOL,
278 GTK_ARG_READWRITE, ARG_LANGUAGE_SET);
281 gtk_signal_new ("event",
283 GTK_CLASS_TYPE (object_class),
284 GTK_SIGNAL_OFFSET (GtkTextTagClass, event),
285 gtk_marshal_INT__OBJECT_BOXED_POINTER,
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 *tkxt_tag)
304 /* 0 is basically a fine way to initialize everything in the
310 gtk_text_tag_new (const gchar *name)
314 tag = GTK_TEXT_TAG (gtk_type_new (gtk_text_tag_get_type ()));
316 tag->name = g_strdup(name);
318 tag->values = gtk_text_style_values_new();
324 gtk_text_tag_destroy (GtkObject *object)
326 GtkTextTag *tkxt_tag;
328 tkxt_tag = GTK_TEXT_TAG (object);
330 g_assert(!tkxt_tag->values->realized);
333 gtk_text_tag_table_remove(tkxt_tag->table, tkxt_tag->name);
335 g_assert(tkxt_tag->table == NULL);
337 gtk_text_style_values_unref(tkxt_tag->values);
338 tkxt_tag->values = NULL;
340 (* GTK_OBJECT_CLASS(parent_class)->destroy) (object);
344 gtk_text_tag_finalize (GObject *object)
346 GtkTextTag *tkxt_tag;
348 tkxt_tag = GTK_TEXT_TAG (object);
350 g_free(tkxt_tag->name);
351 tkxt_tag->name = NULL;
353 (* G_OBJECT_CLASS(parent_class)->finalize) (object);
357 set_bg_color(GtkTextTag *tag, GdkColor *color)
361 tag->bg_color_set = TRUE;
362 tag->values->appearance.bg_color = *color;
366 tag->bg_color_set = FALSE;
371 set_fg_color(GtkTextTag *tag, GdkColor *color)
375 tag->fg_color_set = TRUE;
376 tag->values->appearance.fg_color = *color;
380 tag->fg_color_set = FALSE;
385 gtk_text_tag_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
387 GtkTextTag *tkxt_tag;
388 gboolean size_changed = FALSE;
390 tkxt_tag = GTK_TEXT_TAG (object);
392 g_return_if_fail(!tkxt_tag->values->realized);
397 g_return_if_fail(tkxt_tag->name == NULL);
398 tkxt_tag->name = g_strdup(GTK_VALUE_STRING(*arg));
405 if (gdk_color_parse(GTK_VALUE_STRING(*arg), &color))
406 set_bg_color(tkxt_tag, &color);
408 g_warning("Don't know color `%s'", GTK_VALUE_STRING(*arg));
416 if (gdk_color_parse(GTK_VALUE_STRING(*arg), &color))
417 set_fg_color(tkxt_tag, &color);
419 g_warning("Don't know color `%s'", GTK_VALUE_STRING(*arg));
423 case ARG_BACKGROUND_GDK:
425 GdkColor *color = GTK_VALUE_POINTER(*arg);
426 set_bg_color(tkxt_tag, color);
430 case ARG_FOREGROUND_GDK:
432 GdkColor *color = GTK_VALUE_POINTER(*arg);
433 set_fg_color(tkxt_tag, color);
437 case ARG_BACKGROUND_STIPPLE:
439 GdkBitmap *bitmap = GTK_VALUE_POINTER(*arg);
441 tkxt_tag->bg_stipple_set = TRUE;
443 if (tkxt_tag->values->appearance.bg_stipple != bitmap)
446 gdk_bitmap_ref(bitmap);
448 if (tkxt_tag->values->appearance.bg_stipple)
449 gdk_bitmap_unref(tkxt_tag->values->appearance.bg_stipple);
451 tkxt_tag->values->appearance.bg_stipple = bitmap;
456 case ARG_FOREGROUND_STIPPLE:
458 GdkBitmap *bitmap = GTK_VALUE_POINTER(*arg);
460 tkxt_tag->fg_stipple_set = TRUE;
462 if (tkxt_tag->values->appearance.fg_stipple != bitmap)
465 gdk_bitmap_ref(bitmap);
467 if (tkxt_tag->values->appearance.fg_stipple)
468 gdk_bitmap_unref(tkxt_tag->values->appearance.fg_stipple);
470 tkxt_tag->values->appearance.fg_stipple = bitmap;
477 PangoFontDescription *font_desc = NULL;
480 name = GTK_VALUE_STRING(*arg);
483 font_desc = pango_font_description_from_string (name);
485 if (tkxt_tag->values->font_desc)
486 pango_font_description_free (tkxt_tag->values->font_desc);
488 tkxt_tag->font_set = (font_desc != NULL);
489 tkxt_tag->values->font_desc = font_desc;
497 PangoFontDescription *font_desc;
499 font_desc = GTK_VALUE_BOXED(*arg);
501 if (tkxt_tag->values->font_desc)
502 pango_font_description_free (tkxt_tag->values->font_desc);
505 tkxt_tag->values->font_desc = pango_font_description_copy (font_desc);
507 tkxt_tag->values->font_desc = NULL;
509 tkxt_tag->font_set = (font_desc != NULL);
515 case ARG_PIXELS_ABOVE_LINES:
516 tkxt_tag->pixels_above_lines_set = TRUE;
517 tkxt_tag->values->pixels_above_lines = GTK_VALUE_INT(*arg);
521 case ARG_PIXELS_BELOW_LINES:
522 tkxt_tag->pixels_below_lines_set = TRUE;
523 tkxt_tag->values->pixels_below_lines = GTK_VALUE_INT(*arg);
527 case ARG_PIXELS_INSIDE_WRAP:
528 tkxt_tag->pixels_inside_wrap_set = TRUE;
529 tkxt_tag->values->pixels_inside_wrap = GTK_VALUE_INT(*arg);
534 tkxt_tag->editable_set = TRUE;
535 tkxt_tag->values->editable = GTK_VALUE_BOOL(*arg);
539 tkxt_tag->wrap_mode_set = TRUE;
540 tkxt_tag->values->wrap_mode = GTK_VALUE_ENUM(*arg);
545 tkxt_tag->justify_set = TRUE;
546 tkxt_tag->values->justify = GTK_VALUE_ENUM(*arg);
551 tkxt_tag->values->direction = GTK_VALUE_ENUM(*arg);
554 case ARG_LEFT_MARGIN:
555 tkxt_tag->left_margin_set = TRUE;
556 tkxt_tag->values->left_margin = GTK_VALUE_INT(*arg);
560 case ARG_LEFT_WRAPPED_LINE_MARGIN:
561 tkxt_tag->left_wrapped_line_margin_set = TRUE;
562 tkxt_tag->values->left_wrapped_line_margin = GTK_VALUE_INT(*arg);
567 tkxt_tag->overstrike_set = TRUE;
568 tkxt_tag->values->appearance.overstrike = GTK_VALUE_BOOL(*arg);
571 case ARG_RIGHT_MARGIN:
572 tkxt_tag->right_margin_set = TRUE;
573 tkxt_tag->values->right_margin = GTK_VALUE_INT(*arg);
578 tkxt_tag->underline_set = TRUE;
579 tkxt_tag->values->appearance.underline = GTK_VALUE_ENUM(*arg);
583 tkxt_tag->offset_set = TRUE;
584 tkxt_tag->values->offset = GTK_VALUE_INT(*arg);
588 case ARG_BG_FULL_HEIGHT:
589 tkxt_tag->bg_full_height_set = TRUE;
590 tkxt_tag->values->bg_full_height = GTK_VALUE_BOOL(*arg);
594 tkxt_tag->language_set = TRUE;
595 tkxt_tag->values->language = g_strdup (GTK_VALUE_STRING(*arg));
598 /* Whether the value should be used... */
600 case ARG_BACKGROUND_SET:
601 case ARG_BACKGROUND_GDK_SET:
602 tkxt_tag->bg_color_set = GTK_VALUE_BOOL(*arg);
605 case ARG_FOREGROUND_SET:
606 case ARG_FOREGROUND_GDK_SET:
607 tkxt_tag->fg_color_set = GTK_VALUE_BOOL(*arg);
610 case ARG_BACKGROUND_STIPPLE_SET:
611 tkxt_tag->bg_stipple_set = GTK_VALUE_BOOL(*arg);
614 case ARG_FOREGROUND_STIPPLE_SET:
615 tkxt_tag->fg_stipple_set = GTK_VALUE_BOOL(*arg);
619 tkxt_tag->font_set = GTK_VALUE_BOOL(*arg);
623 case ARG_PIXELS_ABOVE_LINES_SET:
624 tkxt_tag->pixels_above_lines_set = GTK_VALUE_BOOL(*arg);
628 case ARG_PIXELS_BELOW_LINES_SET:
629 tkxt_tag->pixels_below_lines_set = GTK_VALUE_BOOL(*arg);
633 case ARG_PIXELS_INSIDE_WRAP_SET:
634 tkxt_tag->pixels_inside_wrap_set = GTK_VALUE_BOOL(*arg);
638 case ARG_EDITABLE_SET:
639 tkxt_tag->editable_set = GTK_VALUE_BOOL(*arg);
642 case ARG_WRAP_MODE_SET:
643 tkxt_tag->wrap_mode_set = GTK_VALUE_BOOL(*arg);
647 case ARG_JUSTIFY_SET:
648 tkxt_tag->justify_set = GTK_VALUE_BOOL(*arg);
652 case ARG_LEFT_MARGIN_SET:
653 tkxt_tag->left_margin_set = GTK_VALUE_BOOL(*arg);
657 case ARG_LEFT_WRAPPED_LINE_MARGIN_SET:
658 tkxt_tag->left_wrapped_line_margin_set = GTK_VALUE_BOOL(*arg);
662 case ARG_OVERSTRIKE_SET:
663 tkxt_tag->overstrike_set = GTK_VALUE_BOOL(*arg);
666 case ARG_RIGHT_MARGIN_SET:
667 tkxt_tag->right_margin_set = GTK_VALUE_BOOL(*arg);
671 case ARG_UNDERLINE_SET:
672 tkxt_tag->underline_set = GTK_VALUE_BOOL(*arg);
676 tkxt_tag->offset_set = GTK_VALUE_BOOL(*arg);
680 case ARG_BG_FULL_HEIGHT_SET:
681 tkxt_tag->bg_full_height_set = GTK_VALUE_BOOL(*arg);
684 case ARG_LANGUAGE_SET:
685 tkxt_tag->language_set = GTK_VALUE_BOOL(*arg);
690 g_assert_not_reached();
694 /* FIXME I would like to do this after all set_arg in a single
695 gtk_object_set() have been called. But an idle function
696 won't work; we need to emit when the tag is changed, not
697 when we get around to the event loop. So blah, we eat some
700 /* This is also somewhat weird since we emit another object's
701 signal here, but the two objects are already tightly bound. */
704 gtk_signal_emit_by_name(GTK_OBJECT(tkxt_tag->table),
706 tkxt_tag, size_changed);
710 get_color_arg (GtkArg *arg, GdkColor *orig)
714 color = g_new (GdkColor, 1);
716 GTK_VALUE_BOXED (*arg) = color;
720 gtk_text_tag_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
724 tag = GTK_TEXT_TAG (object);
729 GTK_VALUE_STRING(*arg) = g_strdup(tag->name);
732 case ARG_BACKGROUND_GDK:
733 get_color_arg(arg, &tag->values->appearance.bg_color);
736 case ARG_FOREGROUND_GDK:
737 get_color_arg(arg, &tag->values->appearance.fg_color);
740 case ARG_BACKGROUND_STIPPLE:
741 GTK_VALUE_BOXED(*arg) = tag->values->appearance.bg_stipple;
744 case ARG_FOREGROUND_STIPPLE:
745 GTK_VALUE_BOXED(*arg) = tag->values->appearance.fg_stipple;
749 if (tag->values->font_desc)
750 GTK_VALUE_STRING(*arg) = pango_font_description_to_string (tag->values->font_desc);
752 GTK_VALUE_STRING(*arg) = NULL;
756 if (tag->values->font_desc)
757 GTK_VALUE_BOXED(*arg) = pango_font_description_copy (tag->values->font_desc);
759 GTK_VALUE_BOXED(*arg) = NULL;
762 case ARG_PIXELS_ABOVE_LINES:
763 GTK_VALUE_INT(*arg) = tag->values->pixels_above_lines;
766 case ARG_PIXELS_BELOW_LINES:
767 GTK_VALUE_INT(*arg) = tag->values->pixels_below_lines;
770 case ARG_PIXELS_INSIDE_WRAP:
771 GTK_VALUE_INT(*arg) = tag->values->pixels_inside_wrap;
775 GTK_VALUE_BOOL(*arg) = tag->values->editable;
779 GTK_VALUE_ENUM(*arg) = tag->values->wrap_mode;
783 GTK_VALUE_ENUM(*arg) = tag->values->justify;
786 case ARG_LEFT_MARGIN:
787 GTK_VALUE_INT(*arg) = tag->values->left_margin;
790 case ARG_LEFT_WRAPPED_LINE_MARGIN:
791 GTK_VALUE_INT(*arg) = tag->values->left_wrapped_line_margin;
795 GTK_VALUE_BOOL(*arg) = tag->values->appearance.overstrike;
798 case ARG_RIGHT_MARGIN:
799 GTK_VALUE_INT(*arg) = tag->values->right_margin;
803 GTK_VALUE_ENUM(*arg) = tag->values->appearance.underline;
807 GTK_VALUE_INT(*arg) = tag->values->offset;
810 case ARG_BG_FULL_HEIGHT:
811 GTK_VALUE_BOOL(*arg) = tag->values->bg_full_height;
815 GTK_VALUE_STRING(*arg) = g_strdup (tag->values->language);
818 case ARG_BACKGROUND_SET:
819 case ARG_BACKGROUND_GDK_SET:
820 GTK_VALUE_BOOL(*arg) = tag->bg_color_set;
823 case ARG_FOREGROUND_SET:
824 case ARG_FOREGROUND_GDK_SET:
825 GTK_VALUE_BOOL(*arg) = tag->fg_color_set;
828 case ARG_BACKGROUND_STIPPLE_SET:
829 GTK_VALUE_BOOL(*arg) = tag->bg_stipple_set;
832 case ARG_FOREGROUND_STIPPLE_SET:
833 GTK_VALUE_BOOL(*arg) = tag->fg_stipple_set;
837 GTK_VALUE_BOOL(*arg) = tag->font_set;
840 case ARG_PIXELS_ABOVE_LINES_SET:
841 GTK_VALUE_BOOL(*arg) = tag->pixels_above_lines_set;
844 case ARG_PIXELS_BELOW_LINES_SET:
845 GTK_VALUE_BOOL(*arg) = tag->pixels_below_lines_set;
848 case ARG_PIXELS_INSIDE_WRAP_SET:
849 GTK_VALUE_BOOL(*arg) = tag->pixels_inside_wrap_set;
852 case ARG_EDITABLE_SET:
853 GTK_VALUE_BOOL(*arg) = tag->editable_set;
856 case ARG_WRAP_MODE_SET:
857 GTK_VALUE_BOOL(*arg) = tag->wrap_mode_set;
860 case ARG_JUSTIFY_SET:
861 GTK_VALUE_BOOL(*arg) = tag->justify_set;
864 case ARG_LEFT_MARGIN_SET:
865 GTK_VALUE_BOOL(*arg) = tag->left_margin_set;
868 case ARG_LEFT_WRAPPED_LINE_MARGIN_SET:
869 GTK_VALUE_BOOL(*arg) = tag->left_wrapped_line_margin_set;
872 case ARG_OVERSTRIKE_SET:
873 GTK_VALUE_BOOL(*arg) = tag->overstrike_set;
876 case ARG_RIGHT_MARGIN_SET:
877 GTK_VALUE_BOOL(*arg) = tag->right_margin_set;
880 case ARG_UNDERLINE_SET:
881 GTK_VALUE_BOOL(*arg) = tag->underline_set;
885 GTK_VALUE_BOOL(*arg) = tag->offset_set;
888 case ARG_BG_FULL_HEIGHT_SET:
889 GTK_VALUE_BOOL(*arg) = tag->bg_full_height_set;
892 case ARG_LANGUAGE_SET:
893 GTK_VALUE_BOOL(*arg) = tag->language_set;
899 arg->type = GTK_TYPE_INVALID;
903 arg->type = GTK_TYPE_INVALID;
917 delta_priority_foreach(gpointer key, gpointer value, gpointer user_data)
920 DeltaData *dd = user_data;
922 tag = GTK_TEXT_TAG(value);
924 if (tag->priority >= dd->low && tag->priority <= dd->high)
925 tag->priority += dd->delta;
929 gtk_text_tag_set_priority(GtkTextTag *tag,
934 g_return_if_fail(GTK_IS_TEXT_TAG(tag));
935 g_return_if_fail(tag->table != NULL);
936 g_return_if_fail(priority >= 0);
937 g_return_if_fail(priority < gtk_text_tag_table_size(tag->table));
939 if (priority == tag->priority)
942 if (priority < tag->priority) {
944 dd.high = tag->priority - 1;
947 dd.low = tag->priority + 1;
952 gtk_text_tag_table_foreach(tag->table, delta_priority_foreach,
955 tag->priority = priority;
959 gtk_text_tag_event(GtkTextTag *tag,
960 GtkObject *event_object,
962 const GtkTextIter *iter)
966 g_return_val_if_fail(GTK_IS_TEXT_TAG(tag), FALSE);
967 g_return_val_if_fail(GTK_IS_OBJECT(event_object), FALSE);
968 g_return_val_if_fail(event != NULL, FALSE);
970 gtk_signal_emit(GTK_OBJECT(tag),
981 tag_sort_func(gconstpointer first, gconstpointer second)
983 GtkTextTag *tag1, *tag2;
985 tag1 = * (GtkTextTag **) first;
986 tag2 = * (GtkTextTag **) second;
987 return tag1->priority - tag2->priority;
991 gtk_text_tag_array_sort(GtkTextTag** tag_array_p,
996 GtkTextTag **maxPtrPtr, *tmp;
998 g_return_if_fail(tag_array_p != NULL);
999 g_return_if_fail(len > 0);
1005 GtkTextTag **iter = tag_array_p;
1007 for (i = len-1; i > 0; i--, iter++) {
1008 maxPtrPtr = tag = iter;
1009 prio = tag[0]->priority;
1010 for (j = i, tag++; j > 0; j--, tag++) {
1011 if (tag[0]->priority < prio) {
1012 prio = tag[0]->priority;
1021 qsort((void *) tag_array_p, (unsigned) len, sizeof (GtkTextTag *),
1027 printf("Sorted tag array: \n");
1031 GtkTextTag *t = tag_array_p[i];
1032 printf(" %s priority %d\n", t->name, t->priority);
1045 gtk_text_style_values_new(void)
1047 GtkTextStyleValues *values;
1049 values = g_new0(GtkTextStyleValues, 1);
1051 /* 0 is a valid value for most of the struct */
1053 values->refcount = 1;
1055 values->language = gtk_get_default_language ();
1061 gtk_text_style_values_copy(GtkTextStyleValues *src,
1062 GtkTextStyleValues *dest)
1064 guint orig_refcount;
1066 g_return_if_fail(!dest->realized);
1073 if (src->appearance.bg_stipple)
1074 gdk_bitmap_ref(src->appearance.bg_stipple);
1076 if (src->appearance.fg_stipple)
1077 gdk_bitmap_ref(src->appearance.fg_stipple);
1080 gtk_text_view_tab_array_ref(src->tab_array);
1084 if (dest->appearance.bg_stipple)
1085 gdk_bitmap_unref(dest->appearance.bg_stipple);
1087 if (dest->appearance.fg_stipple)
1088 gdk_bitmap_unref(dest->appearance.fg_stipple);
1090 if (dest->tab_array)
1091 gtk_text_view_tab_array_unref(dest->tab_array);
1094 orig_refcount = dest->refcount;
1098 dest->font_desc = pango_font_description_copy (src->font_desc);
1099 dest->language = g_strdup (src->language);
1101 dest->refcount = orig_refcount;
1102 dest->realized = FALSE;
1106 gtk_text_style_values_ref(GtkTextStyleValues *values)
1108 g_return_if_fail(values != NULL);
1110 values->refcount += 1;
1114 gtk_text_style_values_unref(GtkTextStyleValues *values)
1116 g_return_if_fail(values != NULL);
1117 g_return_if_fail(values->refcount > 0);
1119 values->refcount -= 1;
1121 if (values->refcount == 0)
1123 g_assert(!values->realized);
1125 if (values->appearance.bg_stipple)
1126 gdk_bitmap_unref(values->appearance.bg_stipple);
1128 if (values->font_desc)
1129 pango_font_description_free (values->font_desc);
1131 if (values->appearance.fg_stipple)
1132 gdk_bitmap_unref(values->appearance.fg_stipple);
1134 if (values->tab_array)
1135 gtk_text_view_tab_array_unref(values->tab_array);
1137 if (values->language)
1138 g_free (values->language);
1145 gtk_text_style_values_realize(GtkTextStyleValues *values,
1149 g_return_if_fail(values != NULL);
1150 g_return_if_fail(values->refcount > 0);
1151 g_return_if_fail(!values->realized);
1153 /* It is wrong to use this colormap, FIXME */
1154 gdk_colormap_alloc_color(cmap,
1155 &values->appearance.fg_color,
1158 gdk_colormap_alloc_color(cmap,
1159 &values->appearance.bg_color,
1162 values->realized = TRUE;
1166 gtk_text_style_values_unrealize(GtkTextStyleValues *values,
1170 g_return_if_fail(values != NULL);
1171 g_return_if_fail(values->refcount > 0);
1172 g_return_if_fail(values->realized);
1174 gdk_colormap_free_colors(cmap,
1175 &values->appearance.fg_color, 1);
1178 gdk_colormap_free_colors(cmap,
1179 &values->appearance.bg_color, 1);
1181 values->appearance.fg_color.pixel = 0;
1182 values->appearance.bg_color.pixel = 0;
1184 values->realized = FALSE;
1188 gtk_text_style_values_fill_from_tags(GtkTextStyleValues *dest,
1194 g_return_if_fail(!dest->realized);
1198 GtkTextTag *tag = tags[n];
1199 GtkTextStyleValues *vals = tag->values;
1202 g_assert(tags[n]->priority > tags[n-1]->priority);
1204 if (tag->bg_color_set)
1206 dest->appearance.bg_color = vals->appearance.bg_color;
1208 dest->appearance.draw_bg = TRUE;
1211 if (tag->border_width_set)
1212 dest->border_width = vals->border_width;
1214 if (tag->relief_set)
1215 dest->relief = vals->relief;
1217 if (tag->bg_stipple_set)
1219 gdk_bitmap_ref(vals->appearance.bg_stipple);
1220 if (dest->appearance.bg_stipple)
1221 gdk_bitmap_unref(dest->appearance.bg_stipple);
1222 dest->appearance.bg_stipple = vals->appearance.bg_stipple;
1224 dest->appearance.draw_bg = TRUE;
1227 if (tag->fg_color_set)
1228 dest->appearance.fg_color = vals->appearance.fg_color;
1232 if (dest->font_desc)
1233 pango_font_description_free (dest->font_desc);
1234 dest->font_desc = pango_font_description_copy (vals->font_desc);
1237 if (tag->fg_stipple_set)
1239 gdk_bitmap_ref(vals->appearance.fg_stipple);
1240 if (dest->appearance.fg_stipple)
1241 gdk_bitmap_unref(dest->appearance.fg_stipple);
1242 dest->appearance.fg_stipple = vals->appearance.fg_stipple;
1245 if (tag->justify_set)
1246 dest->justify = vals->justify;
1248 if (vals->direction != GTK_TEXT_DIR_NONE)
1249 dest->direction = vals->direction;
1251 if (tag->left_margin_set)
1252 dest->left_margin = vals->left_margin;
1254 if (tag->left_wrapped_line_margin_set)
1255 dest->left_wrapped_line_margin = vals->left_wrapped_line_margin;
1257 if (tag->offset_set)
1258 dest->offset = vals->offset;
1260 if (tag->right_margin_set)
1261 dest->right_margin = vals->right_margin;
1263 if (tag->pixels_above_lines_set)
1264 dest->pixels_above_lines = vals->pixels_above_lines;
1266 if (tag->pixels_below_lines_set)
1267 dest->pixels_below_lines = vals->pixels_below_lines;
1269 if (tag->pixels_inside_wrap_set)
1270 dest->pixels_inside_wrap = vals->pixels_inside_wrap;
1272 if (tag->tab_array_set)
1274 gtk_text_view_tab_array_ref(vals->tab_array);
1275 if (dest->tab_array)
1276 gtk_text_view_tab_array_unref(dest->tab_array);
1277 dest->tab_array = vals->tab_array;
1280 if (tag->wrap_mode_set)
1281 dest->wrap_mode = vals->wrap_mode;
1283 if (tag->underline_set)
1284 dest->appearance.underline = vals->appearance.underline;
1286 if (tag->overstrike_set)
1287 dest->appearance.overstrike = vals->appearance.overstrike;
1290 dest->elide = vals->elide;
1292 if (tag->editable_set)
1293 dest->editable = vals->editable;
1295 if (tag->bg_full_height_set)
1296 dest->bg_full_height = vals->bg_full_height;
1298 if (tag->language_set)
1300 g_free (dest->language);
1301 dest->language = g_strdup (vals->language);