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
13static void
14do_number (GtkButton *button, GtkEntry *entry)
15{
16 gtk_editable_set_text (GTK_EDITABLE (entry), text: gtk_button_get_label (button));
17}
18
19GtkWidget *
20do_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

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