4 child_size_allocate (GtkWidget *child,
5 GdkRectangle *allocation,
8 GtkStyleContext *context;
9 context = gtk_widget_get_style_context (child);
11 g_print ("Child %p\nHas left? %d\nHas right? %d\nHas top? %d\nHas bottom? %d\n",
13 gtk_style_context_has_class (context, "left"),
14 gtk_style_context_has_class (context, "right"),
15 gtk_style_context_has_class (context, "top"),
16 gtk_style_context_has_class (context, "bottom"));
20 overlay_get_child_position (GtkOverlay *overlay,
22 GdkRectangle *allocation,
25 GtkWidget *custom_child = user_data;
28 if (child != custom_child)
31 gtk_widget_get_preferred_size (child, NULL, &req);
35 allocation->width = req.width;
36 allocation->height = req.height;
42 main (int argc, char *argv[])
44 GtkWidget *win, *overlay, *grid, *main_child, *child, *label, *sw;
48 gtk_init (&argc, &argv);
50 win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
51 gtk_window_set_default_size (GTK_WINDOW (win), 600, 600);
53 grid = gtk_grid_new ();
54 child = gtk_event_box_new ();
55 gdk_rgba_parse (&color, "red");
56 gtk_widget_override_background_color (child, 0, &color);
57 gtk_widget_set_hexpand (child, TRUE);
58 gtk_widget_set_vexpand (child, TRUE);
59 gtk_container_add (GTK_CONTAINER (grid), child);
60 label = gtk_label_new ("Out of overlay");
61 gtk_container_add (GTK_CONTAINER (child), label);
63 overlay = gtk_overlay_new ();
64 sw = gtk_scrolled_window_new (NULL, NULL);
65 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
68 gtk_container_add (GTK_CONTAINER (overlay), sw);
70 main_child = gtk_event_box_new ();
71 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
73 gdk_rgba_parse (&color, "green");
74 gtk_widget_override_background_color (main_child, 0, &color);
75 gtk_widget_set_hexpand (main_child, TRUE);
76 gtk_widget_set_vexpand (main_child, TRUE);
77 label = gtk_label_new ("Main child");
78 gtk_container_add (GTK_CONTAINER (main_child), label);
80 child = gtk_label_new (NULL);
81 str = g_strdup_printf ("%p", child);
82 gtk_label_set_text (GTK_LABEL (child), str);
84 g_print ("Bottom/Right child: %p\n", child);
85 gtk_widget_set_halign (child, GTK_ALIGN_END);
86 gtk_widget_set_valign (child, GTK_ALIGN_END);
87 gtk_overlay_add_overlay (GTK_OVERLAY (overlay), child);
89 g_signal_connect (child, "size-allocate",
90 G_CALLBACK (child_size_allocate), overlay);
92 child = gtk_label_new (NULL);
93 str = g_strdup_printf ("%p", child);
94 gtk_label_set_text (GTK_LABEL (child), str);
96 g_print ("Left/Top child: %p\n", child);
97 gtk_widget_set_halign (child, GTK_ALIGN_START);
98 gtk_widget_set_valign (child, GTK_ALIGN_START);
99 gtk_overlay_add_overlay (GTK_OVERLAY (overlay), child);
101 g_signal_connect (child, "size-allocate",
102 G_CALLBACK (child_size_allocate), overlay);
104 child = gtk_label_new (NULL);
105 str = g_strdup_printf ("%p", child);
106 gtk_label_set_text (GTK_LABEL (child), str);
108 g_print ("Right/Center child: %p\n", child);
109 gtk_widget_set_halign (child, GTK_ALIGN_END);
110 gtk_widget_set_valign (child, GTK_ALIGN_CENTER);
111 gtk_overlay_add_overlay (GTK_OVERLAY (overlay), child);
113 g_signal_connect (child, "size-allocate",
114 G_CALLBACK (child_size_allocate), overlay);
116 child = gtk_label_new (NULL);
117 str = g_strdup_printf ("%p", child);
118 gtk_label_set_text (GTK_LABEL (child), str);
120 gtk_widget_set_margin_left (child, 55);
121 gtk_widget_set_margin_top (child, 4);
122 g_print ("Left/Top margined child: %p\n", child);
123 gtk_widget_set_halign (child, GTK_ALIGN_START);
124 gtk_widget_set_valign (child, GTK_ALIGN_START);
125 gtk_overlay_add_overlay (GTK_OVERLAY (overlay), child);
127 g_signal_connect (child, "size-allocate",
128 G_CALLBACK (child_size_allocate), overlay);
130 child = gtk_label_new (NULL);
131 str = g_strdup_printf ("%p", child);
132 gtk_label_set_text (GTK_LABEL (child), str);
134 g_print ("Custom get-child-position child: %p\n", child);
135 gtk_widget_set_halign (child, GTK_ALIGN_START);
136 gtk_widget_set_valign (child, GTK_ALIGN_START);
137 gtk_overlay_add_overlay (GTK_OVERLAY (overlay), child);
139 g_signal_connect (child, "size-allocate",
140 G_CALLBACK (child_size_allocate), overlay);
141 g_signal_connect (overlay, "get-child-position",
142 G_CALLBACK (overlay_get_child_position), child);
144 gtk_grid_attach (GTK_GRID (grid), overlay, 1, 0, 1, 3);
145 gtk_container_add (GTK_CONTAINER (win), grid);
149 gtk_widget_show_all (win);