1 | /* Text View/Markup |
2 | * #Keywords: GtkTextView |
3 | * |
4 | * GtkTextBuffer lets you define your own tags that can influence |
5 | * text formatting in a variety of ways. In this example, we show |
6 | * that GtkTextBuffer can load Pango markup and automatically generate |
7 | * suitable tags. |
8 | */ |
9 | |
10 | #include <gtk/gtk.h> |
11 | |
12 | static GtkWidget *stack; |
13 | static GtkWidget *view; |
14 | static GtkWidget *view2; |
15 | |
16 | static void |
17 | source_toggled (GtkCheckButton *button) |
18 | { |
19 | if (gtk_check_button_get_active (self: button)) |
20 | gtk_stack_set_visible_child_name (GTK_STACK (stack), name: "source" ); |
21 | else |
22 | { |
23 | GtkTextBuffer *buffer; |
24 | GtkTextIter start, end; |
25 | char *markup; |
26 | |
27 | buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view2)); |
28 | gtk_text_buffer_get_bounds (buffer, start: &start, end: &end); |
29 | markup = gtk_text_buffer_get_text (buffer, start: &start, end: &end, FALSE); |
30 | |
31 | buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); |
32 | gtk_text_buffer_get_bounds (buffer, start: &start, end: &end); |
33 | gtk_text_buffer_begin_irreversible_action (buffer); |
34 | gtk_text_buffer_delete (buffer, start: &start, end: &end); |
35 | gtk_text_buffer_insert_markup (buffer, iter: &start, markup, len: -1); |
36 | gtk_text_buffer_end_irreversible_action (buffer); |
37 | g_free (mem: markup); |
38 | |
39 | gtk_stack_set_visible_child_name (GTK_STACK (stack), name: "formatted" ); |
40 | } |
41 | } |
42 | |
43 | GtkWidget * |
44 | do_markup (GtkWidget *do_widget) |
45 | { |
46 | static GtkWidget *window = NULL; |
47 | |
48 | if (!window) |
49 | { |
50 | GtkWidget *sw; |
51 | GtkTextBuffer *buffer; |
52 | GtkTextIter iter; |
53 | GBytes *bytes; |
54 | const char *markup; |
55 | GtkWidget *; |
56 | GtkWidget *show_source; |
57 | |
58 | window = gtk_window_new (); |
59 | gtk_window_set_display (GTK_WINDOW (window), |
60 | display: gtk_widget_get_display (widget: do_widget)); |
61 | gtk_window_set_default_size (GTK_WINDOW (window), width: 600, height: 680); |
62 | g_object_add_weak_pointer (G_OBJECT (window), weak_pointer_location: (gpointer *)&window); |
63 | |
64 | stack = gtk_stack_new (); |
65 | gtk_widget_show (widget: stack); |
66 | gtk_window_set_child (GTK_WINDOW (window), child: stack); |
67 | |
68 | show_source = gtk_check_button_new_with_label (label: "Source" ); |
69 | gtk_widget_set_valign (widget: show_source, align: GTK_ALIGN_CENTER); |
70 | g_signal_connect (show_source, "toggled" , G_CALLBACK (source_toggled), stack); |
71 | |
72 | header = gtk_header_bar_new (); |
73 | gtk_header_bar_pack_start (GTK_HEADER_BAR (header), child: show_source); |
74 | gtk_window_set_titlebar (GTK_WINDOW (window), titlebar: header); |
75 | |
76 | gtk_window_set_title (GTK_WINDOW (window), title: "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), wrap_mode: GTK_WRAP_WORD_CHAR); |
81 | gtk_text_view_set_left_margin (GTK_TEXT_VIEW (view), left_margin: 10); |
82 | gtk_text_view_set_right_margin (GTK_TEXT_VIEW (view), right_margin: 10); |
83 | |
84 | sw = gtk_scrolled_window_new (); |
85 | gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), |
86 | hscrollbar_policy: GTK_POLICY_AUTOMATIC, |
87 | vscrollbar_policy: GTK_POLICY_AUTOMATIC); |
88 | gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), child: view); |
89 | |
90 | gtk_stack_add_named (GTK_STACK (stack), child: sw, name: "formatted" ); |
91 | |
92 | view2 = gtk_text_view_new (); |
93 | gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view2), wrap_mode: GTK_WRAP_WORD); |
94 | gtk_text_view_set_left_margin (GTK_TEXT_VIEW (view2), left_margin: 10); |
95 | gtk_text_view_set_right_margin (GTK_TEXT_VIEW (view2), right_margin: 10); |
96 | |
97 | sw = gtk_scrolled_window_new (); |
98 | gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), |
99 | hscrollbar_policy: GTK_POLICY_AUTOMATIC, |
100 | vscrollbar_policy: GTK_POLICY_AUTOMATIC); |
101 | gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), child: view2); |
102 | |
103 | gtk_stack_add_named (GTK_STACK (stack), child: sw, name: "source" ); |
104 | |
105 | bytes = g_resources_lookup_data (path: "/markup/markup.txt" , lookup_flags: 0, NULL); |
106 | markup = (const char *)g_bytes_get_data (bytes, NULL); |
107 | |
108 | buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); |
109 | gtk_text_buffer_get_start_iter (buffer, iter: &iter); |
110 | gtk_text_buffer_begin_irreversible_action (buffer); |
111 | gtk_text_buffer_insert_markup (buffer, iter: &iter, markup, len: -1); |
112 | gtk_text_buffer_end_irreversible_action (buffer); |
113 | |
114 | buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view2)); |
115 | gtk_text_buffer_get_start_iter (buffer, iter: &iter); |
116 | gtk_text_buffer_begin_irreversible_action (buffer); |
117 | gtk_text_buffer_insert (buffer, iter: &iter, text: markup, len: -1); |
118 | gtk_text_buffer_end_irreversible_action (buffer); |
119 | |
120 | g_bytes_unref (bytes); |
121 | |
122 | gtk_widget_show (widget: stack); |
123 | } |
124 | |
125 | if (!gtk_widget_get_visible (widget: window)) |
126 | gtk_widget_show (widget: window); |
127 | else |
128 | gtk_window_destroy (GTK_WINDOW (window)); |
129 | |
130 | return window; |
131 | } |
132 | |