1/* Text View/Undo and Redo
2 *
3 * The GtkTextView supports undo and redo through the use of a
4 * GtkTextBuffer. You can enable or disable undo support using
5 * gtk_text_buffer_set_enable_undo().
6 *
7 * Use Control+z to undo and Control+Shift+z or Control+y to
8 * redo previously undone operations.
9 */
10
11#include <gtk/gtk.h>
12#include <stdlib.h> /* for exit() */
13
14GtkWidget *
15do_textundo (GtkWidget *do_widget)
16{
17 static GtkWidget *window = NULL;
18
19 if (!window)
20 {
21 GtkWidget *view;
22 GtkWidget *sw;
23 GtkTextBuffer *buffer;
24 GtkTextIter iter;
25
26 window = gtk_window_new ();
27 gtk_window_set_display (GTK_WINDOW (window),
28 display: gtk_widget_get_display (widget: do_widget));
29 gtk_window_set_default_size (GTK_WINDOW (window), width: 330, height: 330);
30 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
31 g_object_add_weak_pointer (G_OBJECT (window), weak_pointer_location: (gpointer *)&window);
32
33 gtk_window_set_title (GTK_WINDOW (window), title: "Undo and Redo");
34
35 view = gtk_text_view_new ();
36 gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), wrap_mode: GTK_WRAP_WORD);
37 gtk_text_view_set_pixels_below_lines (GTK_TEXT_VIEW (view), pixels_below_lines: 10);
38 gtk_text_view_set_left_margin (GTK_TEXT_VIEW (view), left_margin: 20);
39 gtk_text_view_set_right_margin (GTK_TEXT_VIEW (view), right_margin: 20);
40 gtk_text_view_set_top_margin (GTK_TEXT_VIEW (view), top_margin: 20);
41 gtk_text_view_set_bottom_margin (GTK_TEXT_VIEW (view), bottom_margin: 20);
42
43 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
44 gtk_text_buffer_set_enable_undo (buffer, TRUE);
45
46 /* this text cannot be undone */
47 gtk_text_buffer_begin_irreversible_action (buffer);
48 gtk_text_buffer_get_start_iter (buffer, iter: &iter);
49 gtk_text_buffer_insert (buffer, iter: &iter,
50 text: "The GtkTextView supports undo and redo through the use of a "
51 "GtkTextBuffer. You can enable or disable undo support using "
52 "gtk_text_buffer_set_enable_undo().\n"
53 "Type to add more text.\n"
54 "Use Control+z to undo and Control+Shift+z or Control+y to "
55 "redo previously undone operations.",
56 len: -1);
57 gtk_text_buffer_end_irreversible_action (buffer);
58
59 sw = gtk_scrolled_window_new ();
60 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
61 hscrollbar_policy: GTK_POLICY_AUTOMATIC,
62 vscrollbar_policy: GTK_POLICY_AUTOMATIC);
63 gtk_window_set_child (GTK_WINDOW (window), child: sw);
64 gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), child: view);
65 }
66
67 if (!gtk_widget_get_visible (widget: window))
68 {
69 gtk_widget_show (widget: window);
70 }
71 else
72 {
73 gtk_window_destroy (GTK_WINDOW (window));
74 window = NULL;
75 }
76
77 return window;
78}
79

source code of gtk/demos/gtk-demo/textundo.c