1 /* Text View/Markup
2  *
3  * GtkTextBuffer lets you define your own tags that can influence
4  * text formatting in a variety of ways. In this example, we show
5  * that GtkTextBuffer can load Pango markup and automatically generate
6  * suitable tags.
7  */
8 
9 #include <gtk/gtk.h>
10 
11 static GtkWidget *stack;
12 static GtkWidget *view;
13 static GtkWidget *view2;
14 
15 static void
source_toggled(GtkToggleButton * button)16 source_toggled (GtkToggleButton *button)
17 {
18   if (gtk_toggle_button_get_active (button))
19     gtk_stack_set_visible_child_name (GTK_STACK (stack), "source");
20   else
21     {
22       GtkTextBuffer *buffer;
23       GtkTextIter start, end;
24       gchar *markup;
25 
26       buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view2));
27       gtk_text_buffer_get_bounds (buffer, &start, &end);
28       markup = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
29 
30       buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
31       gtk_text_buffer_get_bounds (buffer, &start, &end);
32       gtk_text_buffer_delete (buffer, &start, &end);
33       gtk_text_buffer_insert_markup (buffer, &start, markup, -1);
34       g_free (markup);
35 
36       gtk_stack_set_visible_child_name (GTK_STACK (stack), "formatted");
37     }
38 }
39 
40 GtkWidget *
do_markup(GtkWidget * do_widget)41 do_markup (GtkWidget *do_widget)
42 {
43   static GtkWidget *window = NULL;
44 
45   if (!window)
46     {
47       GtkWidget *sw;
48       GtkTextBuffer *buffer;
49       GtkTextIter iter;
50       GBytes *bytes;
51       const gchar *markup;
52       GtkWidget *header;
53       GtkWidget *show_source;
54 
55       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
56       gtk_window_set_screen (GTK_WINDOW (window),
57                              gtk_widget_get_screen (do_widget));
58       gtk_window_set_default_size (GTK_WINDOW (window), 450, 450);
59       g_signal_connect (window, "destroy",
60                         G_CALLBACK (gtk_widget_destroyed), &window);
61 
62       stack = gtk_stack_new ();
63       gtk_widget_show (stack);
64       gtk_container_add (GTK_CONTAINER (window), stack);
65 
66       show_source = gtk_check_button_new_with_label ("Source");
67       gtk_widget_set_valign (show_source, GTK_ALIGN_CENTER);
68       g_signal_connect (show_source, "toggled", G_CALLBACK (source_toggled), stack);
69 
70       header = gtk_header_bar_new ();
71       gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (header), TRUE);
72       gtk_header_bar_pack_start (GTK_HEADER_BAR (header), show_source);
73       gtk_widget_show_all (header);
74       gtk_window_set_titlebar (GTK_WINDOW (window), header);
75 
76       gtk_window_set_title (GTK_WINDOW (window), "Markup");
77 
78       view = gtk_text_view_new ();
79       gtk_text_view_set_editable (GTK_TEXT_VIEW (view), FALSE);
80       gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), GTK_WRAP_WORD);
81       gtk_text_view_set_left_margin (GTK_TEXT_VIEW (view), 10);
82       gtk_text_view_set_right_margin (GTK_TEXT_VIEW (view), 10);
83 
84       sw = gtk_scrolled_window_new (NULL, NULL);
85       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
86                                       GTK_POLICY_AUTOMATIC,
87                                       GTK_POLICY_AUTOMATIC);
88       gtk_container_add (GTK_CONTAINER (sw), view);
89       gtk_widget_show_all (sw);
90 
91       gtk_stack_add_named (GTK_STACK (stack), sw, "formatted");
92 
93       view2 = gtk_text_view_new ();
94       gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view2), GTK_WRAP_WORD);
95       gtk_text_view_set_left_margin (GTK_TEXT_VIEW (view2), 10);
96       gtk_text_view_set_right_margin (GTK_TEXT_VIEW (view2), 10);
97 
98       sw = gtk_scrolled_window_new (NULL, NULL);
99       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
100                                       GTK_POLICY_AUTOMATIC,
101                                       GTK_POLICY_AUTOMATIC);
102       gtk_container_add (GTK_CONTAINER (sw), view2);
103       gtk_widget_show_all (sw);
104 
105       gtk_stack_add_named (GTK_STACK (stack), sw, "source");
106 
107       bytes = g_resources_lookup_data ("/markup/markup.txt", 0, NULL);
108       markup = (const gchar *)g_bytes_get_data (bytes, NULL);
109 
110       buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
111       gtk_text_buffer_get_start_iter (buffer, &iter);
112       gtk_text_buffer_insert_markup (buffer, &iter, markup, -1);
113 
114       buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view2));
115       gtk_text_buffer_get_start_iter (buffer, &iter);
116       gtk_text_buffer_insert (buffer, &iter, markup, -1);
117 
118       g_bytes_unref (bytes);
119 
120       gtk_widget_show (stack);
121     }
122 
123   if (!gtk_widget_get_visible (window))
124     gtk_widget_show (window);
125   else
126     gtk_widget_destroy (window);
127 
128   return window;
129 }
130