]> Pileus Git - ~andy/gtk/blob - tests/testtextview.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / tests / testtextview.c
1
2
3 #include "config.h"
4 #include <gtk/gtk.h>
5
6
7 static void
8 create_tags (GtkTextBuffer *buffer)
9 {
10
11   gtk_text_buffer_create_tag (buffer, "italic",
12                               "style", PANGO_STYLE_ITALIC, NULL);
13
14   gtk_text_buffer_create_tag (buffer, "bold",
15                               "weight", PANGO_WEIGHT_BOLD, NULL);
16
17   gtk_text_buffer_create_tag (buffer, "x-large",
18                               "scale", PANGO_SCALE_X_LARGE, NULL);
19
20   gtk_text_buffer_create_tag (buffer, "semi_blue_foreground",
21                               "foreground", "rgba(0,0,255,0.7)", NULL);
22
23   gtk_text_buffer_create_tag (buffer, "semi_red_background",
24                               "background", "rgba(255,0,0,0.5)", NULL);
25
26   gtk_text_buffer_create_tag (buffer, "semi_orange_paragraph_background",
27                               "paragraph-background", "rgba(255,165,0,0.5)", NULL);
28
29   gtk_text_buffer_create_tag (buffer, "word_wrap",
30                               "wrap_mode", GTK_WRAP_WORD, NULL);
31 }
32
33
34 static void
35 insert_text (GtkTextBuffer *buffer)
36 {
37   GtkTextIter  iter;
38   GtkTextIter  start, end;
39   GtkTextMark *para_start;
40
41   /* get start of buffer; each insertion will revalidate the
42    * iterator to point to just after the inserted text.
43    */
44   gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
45
46   gtk_text_buffer_insert (buffer, &iter,
47       "This test shows text view rendering some text with rgba colors.\n\n", -1);
48
49   gtk_text_buffer_insert (buffer, &iter, "For example, you can have ", -1);
50   gtk_text_buffer_insert_with_tags_by_name (buffer, &iter,
51                                             "italic translucent blue text", -1,
52                                             "italic", 
53                                             "semi_blue_foreground",
54                                             "x-large",
55                                             NULL);
56
57   gtk_text_buffer_insert (buffer, &iter, ", or ", -1);
58
59   gtk_text_buffer_insert (buffer, &iter, ", ", -1);
60   gtk_text_buffer_insert_with_tags_by_name (buffer, &iter,
61                                             "bold text with translucent red background", -1,
62                                             "bold", 
63                                             "semi_red_background",
64                                             "x-large",
65                                             NULL);
66   gtk_text_buffer_insert (buffer, &iter, ".\n\n", -1);
67
68   /* Store the beginning of the other paragraph */
69   para_start = gtk_text_buffer_create_mark (buffer, "para_start", &iter, TRUE);
70
71   gtk_text_buffer_insert (buffer, &iter,
72       "Paragraph background colors can also be set with rgba color values .\n", -1);
73
74   gtk_text_buffer_insert (buffer, &iter, "For instance, you can have ", -1);
75   gtk_text_buffer_insert_with_tags_by_name (buffer, &iter,
76                                             "bold translucent blue text", -1,
77                                             "bold", 
78                                             "semi_blue_foreground",
79                                             "x-large",
80                                             NULL);
81
82   gtk_text_buffer_insert (buffer, &iter, ", or ", -1);
83
84   gtk_text_buffer_insert (buffer, &iter, ", ", -1);
85   gtk_text_buffer_insert_with_tags_by_name (buffer, &iter,
86                                             "italic text with translucent red background", -1,
87                                             "italic", 
88                                             "semi_red_background",
89                                             "x-large",
90                                             NULL);
91
92   gtk_text_buffer_insert (buffer, &iter, " all rendered onto a translucent orange paragraph background.\n", -1);
93
94   gtk_text_buffer_get_bounds (buffer, &start, &end);
95
96   gtk_text_buffer_get_iter_at_mark (buffer, &iter, para_start);
97   gtk_text_buffer_apply_tag_by_name (buffer, "semi_orange_paragraph_background", &iter, &end);
98
99   /* Apply word_wrap tag to whole buffer */
100   gtk_text_buffer_get_bounds (buffer, &start, &end);
101   gtk_text_buffer_apply_tag_by_name (buffer, "word_wrap", &start, &end);
102 }
103
104
105 /* Size of checks and gray levels for alpha compositing checkerboard */
106 #define CHECK_SIZE  10
107 #define CHECK_DARK  (1.0 / 3.0)
108 #define CHECK_LIGHT (2.0 / 3.0)
109
110 static cairo_pattern_t *
111 get_checkered (void)
112 {
113   /* need to respect pixman's stride being a multiple of 4 */
114   static unsigned char data[8] = { 0xFF, 0x00, 0x00, 0x00,
115                                    0x00, 0xFF, 0x00, 0x00 };
116   static cairo_surface_t *checkered = NULL;
117   cairo_pattern_t *pattern;
118
119   if (checkered == NULL)
120     {
121       checkered = cairo_image_surface_create_for_data (data,
122                                                        CAIRO_FORMAT_A8,
123                                                        2, 2, 4);
124     }
125
126   pattern = cairo_pattern_create_for_surface (checkered);
127   cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT);
128   cairo_pattern_set_filter (pattern, CAIRO_FILTER_NEAREST);
129
130   return pattern;
131 }
132
133 static void
134 draw_background (GtkWidget *widget, cairo_t *cr)
135 {
136   cairo_pattern_t *pat;
137
138   cairo_save (cr);
139
140   cairo_set_source_rgb (cr, CHECK_DARK, CHECK_DARK, CHECK_DARK);
141   cairo_paint (cr);
142
143   cairo_set_source_rgb (cr, CHECK_LIGHT, CHECK_LIGHT, CHECK_LIGHT);
144   cairo_scale (cr, CHECK_SIZE, CHECK_SIZE);
145
146   pat = get_checkered ();
147   cairo_mask (cr, pat);
148   cairo_pattern_destroy (pat);
149
150   cairo_restore (cr);
151 }
152
153 int
154 main (int argc, char **argv)
155 {
156   GtkWidget *window, *textview;
157   GtkTextBuffer *buffer;
158
159   gtk_init (&argc, &argv);
160
161   window   = gtk_window_new (GTK_WINDOW_TOPLEVEL);
162   textview = gtk_text_view_new ();
163   buffer   = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
164
165   gtk_window_set_default_size (GTK_WINDOW (window), 400, -1);
166
167   create_tags (buffer);
168   insert_text (buffer);
169   
170   gtk_widget_show (textview);
171   gtk_container_add (GTK_CONTAINER (window), textview);
172
173   g_signal_connect (textview, "draw",
174                     G_CALLBACK (draw_background), NULL);
175
176
177   gtk_widget_show (window);
178
179   gtk_main ();
180
181   return 0;
182 }