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 | |
14 | GtkWidget * |
15 | do_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 | |