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,
110 ARG_STRIKETHROUGH_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::background_gdk", GTK_TYPE_GDK_COLOR,
176 GTK_ARG_READWRITE, ARG_BACKGROUND_GDK);
177 gtk_object_add_arg_type ("GtkTextTag::background_full_height", GTK_TYPE_BOOL,
178 GTK_ARG_READWRITE, ARG_BG_FULL_HEIGHT);
179 gtk_object_add_arg_type ("GtkTextTag::background_stipple",
181 GTK_ARG_READWRITE, ARG_BACKGROUND_STIPPLE);
182 gtk_object_add_arg_type ("GtkTextTag::direction", GTK_TYPE_ENUM,
183 GTK_ARG_READWRITE, ARG_DIRECTION);
184 gtk_object_add_arg_type ("GtkTextTag::editable", GTK_TYPE_BOOL,
185 GTK_ARG_READWRITE, ARG_EDITABLE);
186 gtk_object_add_arg_type ("GtkTextTag::font", GTK_TYPE_STRING,
187 GTK_ARG_READWRITE, ARG_FONT);
188 gtk_object_add_arg_type ("GtkTextTag::font_desc", GTK_TYPE_BOXED,
189 GTK_ARG_READWRITE, ARG_FONT_DESC);
190 gtk_object_add_arg_type ("GtkTextTag::foreground", GTK_TYPE_STRING,
191 GTK_ARG_WRITABLE, ARG_FOREGROUND);
192 gtk_object_add_arg_type ("GtkTextTag::foreground_gdk", GTK_TYPE_GDK_COLOR,
193 GTK_ARG_READWRITE, ARG_FOREGROUND_GDK);
194 gtk_object_add_arg_type ("GtkTextTag::foreground_stipple",
196 GTK_ARG_READWRITE, ARG_FOREGROUND_STIPPLE);
197 gtk_object_add_arg_type ("GtkTextTag::justify", GTK_TYPE_ENUM,
198 GTK_ARG_READWRITE, ARG_JUSTIFY);
199 gtk_object_add_arg_type ("GtkTextTag::language", GTK_TYPE_STRING,
200 GTK_ARG_READWRITE, ARG_LANGUAGE);
201 gtk_object_add_arg_type ("GtkTextTag::left_margin", GTK_TYPE_INT,
202 GTK_ARG_READWRITE, ARG_LEFT_MARGIN);
203 gtk_object_add_arg_type ("GtkTextTag::left_wrapped_line_margin", GTK_TYPE_INT,
204 GTK_ARG_READWRITE, ARG_LEFT_WRAPPED_LINE_MARGIN);
205 gtk_object_add_arg_type ("GtkTextTag::offset", GTK_TYPE_INT,
206 GTK_ARG_READWRITE, ARG_OFFSET);
207 gtk_object_add_arg_type ("GtkTextTag::pixels_above_lines", GTK_TYPE_INT,
208 GTK_ARG_READWRITE, ARG_PIXELS_ABOVE_LINES);
209 gtk_object_add_arg_type ("GtkTextTag::pixels_below_lines", GTK_TYPE_INT,
210 GTK_ARG_READWRITE, ARG_PIXELS_BELOW_LINES);
211 gtk_object_add_arg_type ("GtkTextTag::pixels_inside_wrap", GTK_TYPE_INT,
212 GTK_ARG_READWRITE, ARG_PIXELS_INSIDE_WRAP);
213 gtk_object_add_arg_type ("GtkTextTag::right_margin", GTK_TYPE_INT,
214 GTK_ARG_READWRITE, ARG_RIGHT_MARGIN);
215 gtk_object_add_arg_type ("GtkTextTag::strikethrough", GTK_TYPE_BOOL,
216 GTK_ARG_READWRITE, ARG_STRIKETHROUGH);
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);
222 /* Style args are set or not */
223 gtk_object_add_arg_type ("GtkTextTag::background_set", GTK_TYPE_BOOL,
224 GTK_ARG_READWRITE, ARG_BACKGROUND_SET);
225 gtk_object_add_arg_type ("GtkTextTag::background_full_height_set", GTK_TYPE_BOOL,
226 GTK_ARG_READWRITE, ARG_BG_FULL_HEIGHT_SET);
227 gtk_object_add_arg_type ("GtkTextTag::background_gdk_set", GTK_TYPE_BOOL,
228 GTK_ARG_READWRITE, ARG_BACKGROUND_GDK_SET);
229 gtk_object_add_arg_type ("GtkTextTag::background_stipple_set", GTK_TYPE_BOOL,
230 GTK_ARG_READWRITE, ARG_BACKGROUND_STIPPLE_SET);
231 gtk_object_add_arg_type ("GtkTextTag::editable_set", GTK_TYPE_BOOL,
232 GTK_ARG_READWRITE, ARG_EDITABLE_SET);
233 gtk_object_add_arg_type ("GtkTextTag::font_set", GTK_TYPE_BOOL,
234 GTK_ARG_READWRITE, ARG_FONT_SET);
235 gtk_object_add_arg_type ("GtkTextTag::foreground_set", GTK_TYPE_BOOL,
236 GTK_ARG_READWRITE, ARG_FOREGROUND_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::foreground_stipple_set", GTK_TYPE_BOOL,
240 GTK_ARG_READWRITE, ARG_FOREGROUND_STIPPLE_SET);
241 gtk_object_add_arg_type ("GtkTextTag::justify_set", GTK_TYPE_BOOL,
242 GTK_ARG_READWRITE, ARG_JUSTIFY_SET);
243 gtk_object_add_arg_type ("GtkTextTag::language_set", GTK_TYPE_BOOL,
244 GTK_ARG_READWRITE, ARG_LANGUAGE_SET);
245 gtk_object_add_arg_type ("GtkTextTag::left_margin_set", GTK_TYPE_BOOL,
246 GTK_ARG_READWRITE, ARG_LEFT_MARGIN_SET);
247 gtk_object_add_arg_type ("GtkTextTag::left_wrapped_line_margin_set", GTK_TYPE_BOOL,
248 GTK_ARG_READWRITE, ARG_LEFT_WRAPPED_LINE_MARGIN_SET);
249 gtk_object_add_arg_type ("GtkTextTag::offset_set", GTK_TYPE_BOOL,
250 GTK_ARG_READWRITE, ARG_OFFSET_SET);
251 gtk_object_add_arg_type ("GtkTextTag::pixels_above_lines_set", GTK_TYPE_BOOL,
252 GTK_ARG_READWRITE, ARG_PIXELS_ABOVE_LINES_SET);
253 gtk_object_add_arg_type ("GtkTextTag::pixels_below_lines_set", GTK_TYPE_BOOL,
254 GTK_ARG_READWRITE, ARG_PIXELS_BELOW_LINES_SET);
255 gtk_object_add_arg_type ("GtkTextTag::pixels_inside_wrap_set", GTK_TYPE_BOOL,
256 GTK_ARG_READWRITE, ARG_PIXELS_INSIDE_WRAP_SET);
257 gtk_object_add_arg_type ("GtkTextTag::strikethrough_set", GTK_TYPE_BOOL,
258 GTK_ARG_READWRITE, ARG_STRIKETHROUGH_SET);
259 gtk_object_add_arg_type ("GtkTextTag::right_margin_set", GTK_TYPE_BOOL,
260 GTK_ARG_READWRITE, ARG_RIGHT_MARGIN_SET);
261 gtk_object_add_arg_type ("GtkTextTag::underline_set", GTK_TYPE_ENUM,
262 GTK_ARG_READWRITE, ARG_UNDERLINE_SET);
263 gtk_object_add_arg_type ("GtkTextTag::wrap_mode_set", GTK_TYPE_BOOL,
264 GTK_ARG_READWRITE, ARG_WRAP_MODE_SET);
267 gtk_signal_new ("event",
269 GTK_CLASS_TYPE (object_class),
270 GTK_SIGNAL_OFFSET (GtkTextTagClass, event),
271 gtk_marshal_INT__OBJECT_BOXED_POINTER,
278 gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
280 object_class->set_arg = gtk_text_tag_set_arg;
281 object_class->get_arg = gtk_text_tag_get_arg;
283 object_class->destroy = gtk_text_tag_destroy;
284 gobject_class->finalize = gtk_text_tag_finalize;
288 gtk_text_tag_init (GtkTextTag *tkxt_tag)
290 /* 0 is basically a fine way to initialize everything in the
296 gtk_text_tag_new (const gchar *name)
300 tag = GTK_TEXT_TAG (gtk_type_new (gtk_text_tag_get_type ()));
302 tag->name = g_strdup(name);
304 tag->values = gtk_text_attributes_new();
310 gtk_text_tag_destroy (GtkObject *object)
312 GtkTextTag *tkxt_tag;
314 tkxt_tag = GTK_TEXT_TAG (object);
316 g_assert(!tkxt_tag->values->realized);
319 gtk_text_tag_table_remove(tkxt_tag->table, tkxt_tag);
321 g_assert(tkxt_tag->table == NULL);
323 gtk_text_attributes_unref(tkxt_tag->values);
324 tkxt_tag->values = NULL;
326 (* GTK_OBJECT_CLASS(parent_class)->destroy) (object);
330 gtk_text_tag_finalize (GObject *object)
332 GtkTextTag *tkxt_tag;
334 tkxt_tag = GTK_TEXT_TAG (object);
336 g_free(tkxt_tag->name);
337 tkxt_tag->name = NULL;
339 (* G_OBJECT_CLASS(parent_class)->finalize) (object);
343 set_bg_color(GtkTextTag *tag, GdkColor *color)
347 tag->bg_color_set = TRUE;
348 tag->values->appearance.bg_color = *color;
352 tag->bg_color_set = FALSE;
357 set_fg_color(GtkTextTag *tag, GdkColor *color)
361 tag->fg_color_set = TRUE;
362 tag->values->appearance.fg_color = *color;
366 tag->fg_color_set = FALSE;
371 gtk_text_tag_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
373 GtkTextTag *tkxt_tag;
374 gboolean size_changed = FALSE;
376 tkxt_tag = GTK_TEXT_TAG (object);
378 g_return_if_fail(!tkxt_tag->values->realized);
383 g_return_if_fail(tkxt_tag->name == NULL);
384 tkxt_tag->name = g_strdup(GTK_VALUE_STRING(*arg));
391 if (gdk_color_parse(GTK_VALUE_STRING(*arg), &color))
392 set_bg_color(tkxt_tag, &color);
394 g_warning("Don't know color `%s'", GTK_VALUE_STRING(*arg));
402 if (gdk_color_parse(GTK_VALUE_STRING(*arg), &color))
403 set_fg_color(tkxt_tag, &color);
405 g_warning("Don't know color `%s'", GTK_VALUE_STRING(*arg));
409 case ARG_BACKGROUND_GDK:
411 GdkColor *color = GTK_VALUE_POINTER(*arg);
412 set_bg_color(tkxt_tag, color);
416 case ARG_FOREGROUND_GDK:
418 GdkColor *color = GTK_VALUE_POINTER(*arg);
419 set_fg_color(tkxt_tag, color);
423 case ARG_BACKGROUND_STIPPLE:
425 GdkBitmap *bitmap = GTK_VALUE_POINTER(*arg);
427 tkxt_tag->bg_stipple_set = TRUE;
429 if (tkxt_tag->values->appearance.bg_stipple != bitmap)
432 gdk_bitmap_ref(bitmap);
434 if (tkxt_tag->values->appearance.bg_stipple)
435 gdk_bitmap_unref(tkxt_tag->values->appearance.bg_stipple);
437 tkxt_tag->values->appearance.bg_stipple = bitmap;
442 case ARG_FOREGROUND_STIPPLE:
444 GdkBitmap *bitmap = GTK_VALUE_POINTER(*arg);
446 tkxt_tag->fg_stipple_set = TRUE;
448 if (tkxt_tag->values->appearance.fg_stipple != bitmap)
451 gdk_bitmap_ref(bitmap);
453 if (tkxt_tag->values->appearance.fg_stipple)
454 gdk_bitmap_unref(tkxt_tag->values->appearance.fg_stipple);
456 tkxt_tag->values->appearance.fg_stipple = bitmap;
463 PangoFontDescription *font_desc = NULL;
466 name = GTK_VALUE_STRING(*arg);
469 font_desc = pango_font_description_from_string (name);
471 if (tkxt_tag->values->font_desc)
472 pango_font_description_free (tkxt_tag->values->font_desc);
474 tkxt_tag->font_set = (font_desc != NULL);
475 tkxt_tag->values->font_desc = font_desc;
483 PangoFontDescription *font_desc;
485 font_desc = GTK_VALUE_BOXED(*arg);
487 if (tkxt_tag->values->font_desc)
488 pango_font_description_free (tkxt_tag->values->font_desc);
491 tkxt_tag->values->font_desc = pango_font_description_copy (font_desc);
493 tkxt_tag->values->font_desc = NULL;
495 tkxt_tag->font_set = (font_desc != NULL);
501 case ARG_PIXELS_ABOVE_LINES:
502 tkxt_tag->pixels_above_lines_set = TRUE;
503 tkxt_tag->values->pixels_above_lines = GTK_VALUE_INT(*arg);
507 case ARG_PIXELS_BELOW_LINES:
508 tkxt_tag->pixels_below_lines_set = TRUE;
509 tkxt_tag->values->pixels_below_lines = GTK_VALUE_INT(*arg);
513 case ARG_PIXELS_INSIDE_WRAP:
514 tkxt_tag->pixels_inside_wrap_set = TRUE;
515 tkxt_tag->values->pixels_inside_wrap = GTK_VALUE_INT(*arg);
520 tkxt_tag->editable_set = TRUE;
521 tkxt_tag->values->editable = GTK_VALUE_BOOL(*arg);
525 tkxt_tag->wrap_mode_set = TRUE;
526 tkxt_tag->values->wrap_mode = GTK_VALUE_ENUM(*arg);
531 tkxt_tag->justify_set = TRUE;
532 tkxt_tag->values->justify = GTK_VALUE_ENUM(*arg);
537 tkxt_tag->values->direction = GTK_VALUE_ENUM(*arg);
540 case ARG_LEFT_MARGIN:
541 tkxt_tag->left_margin_set = TRUE;
542 tkxt_tag->values->left_margin = GTK_VALUE_INT(*arg);
546 case ARG_LEFT_WRAPPED_LINE_MARGIN:
547 tkxt_tag->left_wrapped_line_margin_set = TRUE;
548 tkxt_tag->values->left_wrapped_line_margin = GTK_VALUE_INT(*arg);
552 case ARG_STRIKETHROUGH:
553 tkxt_tag->strikethrough_set = TRUE;
554 tkxt_tag->values->appearance.strikethrough = GTK_VALUE_BOOL(*arg);
557 case ARG_RIGHT_MARGIN:
558 tkxt_tag->right_margin_set = TRUE;
559 tkxt_tag->values->right_margin = GTK_VALUE_INT(*arg);
564 tkxt_tag->underline_set = TRUE;
565 tkxt_tag->values->appearance.underline = GTK_VALUE_ENUM(*arg);
569 tkxt_tag->offset_set = TRUE;
570 tkxt_tag->values->offset = GTK_VALUE_INT(*arg);
574 case ARG_BG_FULL_HEIGHT:
575 tkxt_tag->bg_full_height_set = TRUE;
576 tkxt_tag->values->bg_full_height = GTK_VALUE_BOOL(*arg);
580 tkxt_tag->language_set = TRUE;
581 tkxt_tag->values->language = g_strdup (GTK_VALUE_STRING(*arg));
584 /* Whether the value should be used... */
586 case ARG_BACKGROUND_SET:
587 case ARG_BACKGROUND_GDK_SET:
588 tkxt_tag->bg_color_set = GTK_VALUE_BOOL(*arg);
591 case ARG_FOREGROUND_SET:
592 case ARG_FOREGROUND_GDK_SET:
593 tkxt_tag->fg_color_set = GTK_VALUE_BOOL(*arg);
596 case ARG_BACKGROUND_STIPPLE_SET:
597 tkxt_tag->bg_stipple_set = GTK_VALUE_BOOL(*arg);
600 case ARG_FOREGROUND_STIPPLE_SET:
601 tkxt_tag->fg_stipple_set = GTK_VALUE_BOOL(*arg);
605 tkxt_tag->font_set = GTK_VALUE_BOOL(*arg);
609 case ARG_PIXELS_ABOVE_LINES_SET:
610 tkxt_tag->pixels_above_lines_set = GTK_VALUE_BOOL(*arg);
614 case ARG_PIXELS_BELOW_LINES_SET:
615 tkxt_tag->pixels_below_lines_set = GTK_VALUE_BOOL(*arg);
619 case ARG_PIXELS_INSIDE_WRAP_SET:
620 tkxt_tag->pixels_inside_wrap_set = GTK_VALUE_BOOL(*arg);
624 case ARG_EDITABLE_SET:
625 tkxt_tag->editable_set = GTK_VALUE_BOOL(*arg);
628 case ARG_WRAP_MODE_SET:
629 tkxt_tag->wrap_mode_set = GTK_VALUE_BOOL(*arg);
633 case ARG_JUSTIFY_SET:
634 tkxt_tag->justify_set = GTK_VALUE_BOOL(*arg);
638 case ARG_LEFT_MARGIN_SET:
639 tkxt_tag->left_margin_set = GTK_VALUE_BOOL(*arg);
643 case ARG_LEFT_WRAPPED_LINE_MARGIN_SET:
644 tkxt_tag->left_wrapped_line_margin_set = GTK_VALUE_BOOL(*arg);
648 case ARG_STRIKETHROUGH_SET:
649 tkxt_tag->strikethrough_set = GTK_VALUE_BOOL(*arg);
652 case ARG_RIGHT_MARGIN_SET:
653 tkxt_tag->right_margin_set = GTK_VALUE_BOOL(*arg);
657 case ARG_UNDERLINE_SET:
658 tkxt_tag->underline_set = GTK_VALUE_BOOL(*arg);
662 tkxt_tag->offset_set = GTK_VALUE_BOOL(*arg);
666 case ARG_BG_FULL_HEIGHT_SET:
667 tkxt_tag->bg_full_height_set = GTK_VALUE_BOOL(*arg);
670 case ARG_LANGUAGE_SET:
671 tkxt_tag->language_set = GTK_VALUE_BOOL(*arg);
676 g_assert_not_reached();
680 /* FIXME I would like to do this after all set_arg in a single
681 gtk_object_set() have been called. But an idle function
682 won't work; we need to emit when the tag is changed, not
683 when we get around to the event loop. So blah, we eat some
686 /* This is also somewhat weird since we emit another object's
687 signal here, but the two objects are already tightly bound. */
690 gtk_signal_emit_by_name(GTK_OBJECT(tkxt_tag->table),
692 tkxt_tag, size_changed);
696 get_color_arg (GtkArg *arg, GdkColor *orig)
700 color = g_new (GdkColor, 1);
702 GTK_VALUE_BOXED (*arg) = color;
706 gtk_text_tag_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
710 tag = GTK_TEXT_TAG (object);
715 GTK_VALUE_STRING(*arg) = g_strdup(tag->name);
718 case ARG_BACKGROUND_GDK:
719 get_color_arg(arg, &tag->values->appearance.bg_color);
722 case ARG_FOREGROUND_GDK:
723 get_color_arg(arg, &tag->values->appearance.fg_color);
726 case ARG_BACKGROUND_STIPPLE:
727 GTK_VALUE_BOXED(*arg) = tag->values->appearance.bg_stipple;
730 case ARG_FOREGROUND_STIPPLE:
731 GTK_VALUE_BOXED(*arg) = tag->values->appearance.fg_stipple;
735 if (tag->values->font_desc)
736 GTK_VALUE_STRING(*arg) = pango_font_description_to_string (tag->values->font_desc);
738 GTK_VALUE_STRING(*arg) = NULL;
742 if (tag->values->font_desc)
743 GTK_VALUE_BOXED(*arg) = pango_font_description_copy (tag->values->font_desc);
745 GTK_VALUE_BOXED(*arg) = NULL;
748 case ARG_PIXELS_ABOVE_LINES:
749 GTK_VALUE_INT(*arg) = tag->values->pixels_above_lines;
752 case ARG_PIXELS_BELOW_LINES:
753 GTK_VALUE_INT(*arg) = tag->values->pixels_below_lines;
756 case ARG_PIXELS_INSIDE_WRAP:
757 GTK_VALUE_INT(*arg) = tag->values->pixels_inside_wrap;
761 GTK_VALUE_BOOL(*arg) = tag->values->editable;
765 GTK_VALUE_ENUM(*arg) = tag->values->wrap_mode;
769 GTK_VALUE_ENUM(*arg) = tag->values->justify;
772 case ARG_LEFT_MARGIN:
773 GTK_VALUE_INT(*arg) = tag->values->left_margin;
776 case ARG_LEFT_WRAPPED_LINE_MARGIN:
777 GTK_VALUE_INT(*arg) = tag->values->left_wrapped_line_margin;
780 case ARG_STRIKETHROUGH:
781 GTK_VALUE_BOOL(*arg) = tag->values->appearance.strikethrough;
784 case ARG_RIGHT_MARGIN:
785 GTK_VALUE_INT(*arg) = tag->values->right_margin;
789 GTK_VALUE_ENUM(*arg) = tag->values->appearance.underline;
793 GTK_VALUE_INT(*arg) = tag->values->offset;
796 case ARG_BG_FULL_HEIGHT:
797 GTK_VALUE_BOOL(*arg) = tag->values->bg_full_height;
801 GTK_VALUE_STRING(*arg) = g_strdup (tag->values->language);
804 case ARG_BACKGROUND_SET:
805 case ARG_BACKGROUND_GDK_SET:
806 GTK_VALUE_BOOL(*arg) = tag->bg_color_set;
809 case ARG_FOREGROUND_SET:
810 case ARG_FOREGROUND_GDK_SET:
811 GTK_VALUE_BOOL(*arg) = tag->fg_color_set;
814 case ARG_BACKGROUND_STIPPLE_SET:
815 GTK_VALUE_BOOL(*arg) = tag->bg_stipple_set;
818 case ARG_FOREGROUND_STIPPLE_SET:
819 GTK_VALUE_BOOL(*arg) = tag->fg_stipple_set;
823 GTK_VALUE_BOOL(*arg) = tag->font_set;
826 case ARG_PIXELS_ABOVE_LINES_SET:
827 GTK_VALUE_BOOL(*arg) = tag->pixels_above_lines_set;
830 case ARG_PIXELS_BELOW_LINES_SET:
831 GTK_VALUE_BOOL(*arg) = tag->pixels_below_lines_set;
834 case ARG_PIXELS_INSIDE_WRAP_SET:
835 GTK_VALUE_BOOL(*arg) = tag->pixels_inside_wrap_set;
838 case ARG_EDITABLE_SET:
839 GTK_VALUE_BOOL(*arg) = tag->editable_set;
842 case ARG_WRAP_MODE_SET:
843 GTK_VALUE_BOOL(*arg) = tag->wrap_mode_set;
846 case ARG_JUSTIFY_SET:
847 GTK_VALUE_BOOL(*arg) = tag->justify_set;
850 case ARG_LEFT_MARGIN_SET:
851 GTK_VALUE_BOOL(*arg) = tag->left_margin_set;
854 case ARG_LEFT_WRAPPED_LINE_MARGIN_SET:
855 GTK_VALUE_BOOL(*arg) = tag->left_wrapped_line_margin_set;
858 case ARG_STRIKETHROUGH_SET:
859 GTK_VALUE_BOOL(*arg) = tag->strikethrough_set;
862 case ARG_RIGHT_MARGIN_SET:
863 GTK_VALUE_BOOL(*arg) = tag->right_margin_set;
866 case ARG_UNDERLINE_SET:
867 GTK_VALUE_BOOL(*arg) = tag->underline_set;
871 GTK_VALUE_BOOL(*arg) = tag->offset_set;
874 case ARG_BG_FULL_HEIGHT_SET:
875 GTK_VALUE_BOOL(*arg) = tag->bg_full_height_set;
878 case ARG_LANGUAGE_SET:
879 GTK_VALUE_BOOL(*arg) = tag->language_set;
885 arg->type = GTK_TYPE_INVALID;
889 arg->type = GTK_TYPE_INVALID;
903 delta_priority_foreach(GtkTextTag *tag, gpointer user_data)
905 DeltaData *dd = user_data;
907 if (tag->priority >= dd->low && tag->priority <= dd->high)
908 tag->priority += dd->delta;
912 gtk_text_tag_get_priority (GtkTextTag *tag)
914 g_return_val_if_fail(GTK_IS_TEXT_TAG(tag), 0);
916 return tag->priority;
920 gtk_text_tag_set_priority(GtkTextTag *tag,
925 g_return_if_fail(GTK_IS_TEXT_TAG(tag));
926 g_return_if_fail(tag->table != NULL);
927 g_return_if_fail(priority >= 0);
928 g_return_if_fail(priority < gtk_text_tag_table_size(tag->table));
930 if (priority == tag->priority)
933 if (priority < tag->priority) {
935 dd.high = tag->priority - 1;
938 dd.low = tag->priority + 1;
943 gtk_text_tag_table_foreach(tag->table, delta_priority_foreach,
946 tag->priority = priority;
950 gtk_text_tag_event(GtkTextTag *tag,
951 GtkObject *event_object,
953 const GtkTextIter *iter)
957 g_return_val_if_fail(GTK_IS_TEXT_TAG(tag), FALSE);
958 g_return_val_if_fail(GTK_IS_OBJECT(event_object), FALSE);
959 g_return_val_if_fail(event != NULL, FALSE);
961 gtk_signal_emit(GTK_OBJECT(tag),
972 tag_sort_func(gconstpointer first, gconstpointer second)
974 GtkTextTag *tag1, *tag2;
976 tag1 = * (GtkTextTag **) first;
977 tag2 = * (GtkTextTag **) second;
978 return tag1->priority - tag2->priority;
982 gtk_text_tag_array_sort(GtkTextTag** tag_array_p,
987 GtkTextTag **maxPtrPtr, *tmp;
989 g_return_if_fail(tag_array_p != NULL);
990 g_return_if_fail(len > 0);
996 GtkTextTag **iter = tag_array_p;
998 for (i = len-1; i > 0; i--, iter++) {
999 maxPtrPtr = tag = iter;
1000 prio = tag[0]->priority;
1001 for (j = i, tag++; j > 0; j--, tag++) {
1002 if (tag[0]->priority < prio) {
1003 prio = tag[0]->priority;
1012 qsort((void *) tag_array_p, (unsigned) len, sizeof (GtkTextTag *),
1018 printf("Sorted tag array: \n");
1022 GtkTextTag *t = tag_array_p[i];
1023 printf(" %s priority %d\n", t->name, t->priority);
1036 gtk_text_attributes_new(void)
1038 GtkTextAttributes *values;
1040 values = g_new0(GtkTextAttributes, 1);
1042 /* 0 is a valid value for most of the struct */
1044 values->refcount = 1;
1046 values->language = gtk_get_default_language ();
1052 gtk_text_attributes_copy(GtkTextAttributes *src,
1053 GtkTextAttributes *dest)
1055 guint orig_refcount;
1057 g_return_if_fail(!dest->realized);
1064 if (src->appearance.bg_stipple)
1065 gdk_bitmap_ref(src->appearance.bg_stipple);
1067 if (src->appearance.fg_stipple)
1068 gdk_bitmap_ref(src->appearance.fg_stipple);
1071 gtk_text_view_tab_array_ref(src->tab_array);
1075 if (dest->appearance.bg_stipple)
1076 gdk_bitmap_unref(dest->appearance.bg_stipple);
1078 if (dest->appearance.fg_stipple)
1079 gdk_bitmap_unref(dest->appearance.fg_stipple);
1081 if (dest->tab_array)
1082 gtk_text_view_tab_array_unref(dest->tab_array);
1085 orig_refcount = dest->refcount;
1089 dest->font_desc = pango_font_description_copy (src->font_desc);
1090 dest->language = g_strdup (src->language);
1092 dest->refcount = orig_refcount;
1093 dest->realized = FALSE;
1097 gtk_text_attributes_ref(GtkTextAttributes *values)
1099 g_return_if_fail(values != NULL);
1101 values->refcount += 1;
1105 gtk_text_attributes_unref(GtkTextAttributes *values)
1107 g_return_if_fail(values != NULL);
1108 g_return_if_fail(values->refcount > 0);
1110 values->refcount -= 1;
1112 if (values->refcount == 0)
1114 g_assert(!values->realized);
1116 if (values->appearance.bg_stipple)
1117 gdk_bitmap_unref(values->appearance.bg_stipple);
1119 if (values->font_desc)
1120 pango_font_description_free (values->font_desc);
1122 if (values->appearance.fg_stipple)
1123 gdk_bitmap_unref(values->appearance.fg_stipple);
1125 if (values->tab_array)
1126 gtk_text_view_tab_array_unref(values->tab_array);
1128 if (values->language)
1129 g_free (values->language);
1136 gtk_text_attributes_realize(GtkTextAttributes *values,
1140 g_return_if_fail(values != NULL);
1141 g_return_if_fail(values->refcount > 0);
1142 g_return_if_fail(!values->realized);
1144 /* It is wrong to use this colormap, FIXME */
1145 gdk_colormap_alloc_color(cmap,
1146 &values->appearance.fg_color,
1149 gdk_colormap_alloc_color(cmap,
1150 &values->appearance.bg_color,
1153 values->realized = TRUE;
1157 gtk_text_attributes_unrealize(GtkTextAttributes *values,
1161 g_return_if_fail(values != NULL);
1162 g_return_if_fail(values->refcount > 0);
1163 g_return_if_fail(values->realized);
1165 gdk_colormap_free_colors(cmap,
1166 &values->appearance.fg_color, 1);
1169 gdk_colormap_free_colors(cmap,
1170 &values->appearance.bg_color, 1);
1172 values->appearance.fg_color.pixel = 0;
1173 values->appearance.bg_color.pixel = 0;
1175 values->realized = FALSE;
1179 gtk_text_attributes_fill_from_tags(GtkTextAttributes *dest,
1185 g_return_if_fail(!dest->realized);
1189 GtkTextTag *tag = tags[n];
1190 GtkTextAttributes *vals = tag->values;
1193 g_assert(tags[n]->priority > tags[n-1]->priority);
1195 if (tag->bg_color_set)
1197 dest->appearance.bg_color = vals->appearance.bg_color;
1199 dest->appearance.draw_bg = TRUE;
1202 if (tag->border_width_set)
1203 dest->border_width = vals->border_width;
1205 if (tag->relief_set)
1206 dest->relief = vals->relief;
1208 if (tag->bg_stipple_set)
1210 gdk_bitmap_ref(vals->appearance.bg_stipple);
1211 if (dest->appearance.bg_stipple)
1212 gdk_bitmap_unref(dest->appearance.bg_stipple);
1213 dest->appearance.bg_stipple = vals->appearance.bg_stipple;
1215 dest->appearance.draw_bg = TRUE;
1218 if (tag->fg_color_set)
1219 dest->appearance.fg_color = vals->appearance.fg_color;
1223 if (dest->font_desc)
1224 pango_font_description_free (dest->font_desc);
1225 dest->font_desc = pango_font_description_copy (vals->font_desc);
1228 if (tag->fg_stipple_set)
1230 gdk_bitmap_ref(vals->appearance.fg_stipple);
1231 if (dest->appearance.fg_stipple)
1232 gdk_bitmap_unref(dest->appearance.fg_stipple);
1233 dest->appearance.fg_stipple = vals->appearance.fg_stipple;
1236 if (tag->justify_set)
1237 dest->justify = vals->justify;
1239 if (vals->direction != GTK_TEXT_DIR_NONE)
1240 dest->direction = vals->direction;
1242 if (tag->left_margin_set)
1243 dest->left_margin = vals->left_margin;
1245 if (tag->left_wrapped_line_margin_set)
1246 dest->left_wrapped_line_margin = vals->left_wrapped_line_margin;
1248 if (tag->offset_set)
1249 dest->offset = vals->offset;
1251 if (tag->right_margin_set)
1252 dest->right_margin = vals->right_margin;
1254 if (tag->pixels_above_lines_set)
1255 dest->pixels_above_lines = vals->pixels_above_lines;
1257 if (tag->pixels_below_lines_set)
1258 dest->pixels_below_lines = vals->pixels_below_lines;
1260 if (tag->pixels_inside_wrap_set)
1261 dest->pixels_inside_wrap = vals->pixels_inside_wrap;
1263 if (tag->tab_array_set)
1265 gtk_text_view_tab_array_ref(vals->tab_array);
1266 if (dest->tab_array)
1267 gtk_text_view_tab_array_unref(dest->tab_array);
1268 dest->tab_array = vals->tab_array;
1271 if (tag->wrap_mode_set)
1272 dest->wrap_mode = vals->wrap_mode;
1274 if (tag->underline_set)
1275 dest->appearance.underline = vals->appearance.underline;
1277 if (tag->strikethrough_set)
1278 dest->appearance.strikethrough = vals->appearance.strikethrough;
1280 if (tag->invisible_set)
1281 dest->invisible = vals->invisible;
1283 if (tag->editable_set)
1284 dest->editable = vals->editable;
1286 if (tag->bg_full_height_set)
1287 dest->bg_full_height = vals->bg_full_height;
1289 if (tag->language_set)
1291 g_free (dest->language);
1292 dest->language = g_strdup (vals->language);