| 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 | |