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