1 | /* Overlay/Interactive Overlay |
2 | * #Keywords: GtkOverlay |
3 | * |
4 | * Shows widgets in static positions over a main widget. |
5 | * |
6 | * The overlaid widgets can be interactive controls such |
7 | * as the entry in this example, or just decorative, like |
8 | * the big blue label. |
9 | */ |
10 | |
11 | #include <gtk/gtk.h> |
12 | |
13 | static void |
14 | do_number (GtkButton *button, GtkEntry *entry) |
15 | { |
16 | gtk_editable_set_text (GTK_EDITABLE (entry), text: gtk_button_get_label (button)); |
17 | } |
18 | |
19 | GtkWidget * |
20 | do_overlay (GtkWidget *do_widget) |
21 | { |
22 | static GtkWidget *window = NULL; |
23 | |
24 | if (!window) |
25 | { |
26 | GtkWidget *overlay; |
27 | GtkWidget *grid; |
28 | GtkWidget *button; |
29 | GtkWidget *vbox; |
30 | GtkWidget *label; |
31 | GtkWidget *entry; |
32 | int i, j; |
33 | char *text; |
34 | |
35 | window = gtk_window_new (); |
36 | gtk_window_set_default_size (GTK_WINDOW (window), width: 500, height: 510); |
37 | gtk_window_set_title (GTK_WINDOW (window), title: "Interactive Overlay" ); |
38 | |
39 | overlay = gtk_overlay_new (); |
40 | grid = gtk_grid_new (); |
41 | gtk_overlay_set_child (GTK_OVERLAY (overlay), child: grid); |
42 | |
43 | entry = gtk_entry_new (); |
44 | |
45 | for (j = 0; j < 5; j++) |
46 | { |
47 | for (i = 0; i < 5; i++) |
48 | { |
49 | text = g_strdup_printf (format: "%d" , 5*j + i); |
50 | button = gtk_button_new_with_label (label: text); |
51 | g_free (mem: text); |
52 | gtk_widget_set_hexpand (widget: button, TRUE); |
53 | gtk_widget_set_vexpand (widget: button, TRUE); |
54 | g_signal_connect (button, "clicked" , G_CALLBACK (do_number), entry); |
55 | gtk_grid_attach (GTK_GRID (grid), child: button, column: i, row: j, width: 1, height: 1); |
56 | } |
57 | } |
58 | |
59 | vbox = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 10); |
60 | gtk_widget_set_can_target (widget: vbox, FALSE); |
61 | gtk_overlay_add_overlay (GTK_OVERLAY (overlay), widget: vbox); |
62 | gtk_widget_set_halign (widget: vbox, align: GTK_ALIGN_CENTER); |
63 | gtk_widget_set_valign (widget: vbox, align: GTK_ALIGN_START); |
64 | |
65 | label = gtk_label_new (str: "<span foreground='blue' weight='ultrabold' font='40'>Numbers</span>" ); |
66 | gtk_label_set_use_markup (GTK_LABEL (label), TRUE); |
67 | gtk_widget_set_can_target (widget: label, FALSE); |
68 | gtk_widget_set_margin_top (widget: label, margin: 8); |
69 | gtk_widget_set_margin_bottom (widget: label, margin: 8); |
70 | gtk_box_append (GTK_BOX (vbox), child: label); |
71 | |
72 | vbox = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 10); |
73 | gtk_overlay_add_overlay (GTK_OVERLAY (overlay), widget: vbox); |
74 | gtk_widget_set_halign (widget: vbox, align: GTK_ALIGN_CENTER); |
75 | gtk_widget_set_valign (widget: vbox, align: GTK_ALIGN_CENTER); |
76 | |
77 | gtk_entry_set_placeholder_text (GTK_ENTRY (entry), text: "Your Lucky Number" ); |
78 | gtk_widget_set_margin_top (widget: entry, margin: 8); |
79 | gtk_widget_set_margin_bottom (widget: entry, margin: 8); |
80 | gtk_box_append (GTK_BOX (vbox), child: entry); |
81 | |
82 | gtk_window_set_child (GTK_WINDOW (window), child: overlay); |
83 | g_object_add_weak_pointer (G_OBJECT (window), weak_pointer_location: (gpointer *)&window); |
84 | } |
85 | |
86 | if (!gtk_widget_get_visible (widget: window)) |
87 | gtk_widget_show (widget: window); |
88 | else |
89 | gtk_window_destroy (GTK_WINDOW (window)); |
90 | |
91 | return window; |
92 | } |
93 | |