1#include <gtk/gtk.h>
2
3static gboolean
4overlay_get_child_position (GtkOverlay *overlay,
5 GtkWidget *child,
6 GdkRectangle *allocation,
7 gpointer user_data)
8{
9 GtkWidget *custom_child = user_data;
10 GtkRequisition req;
11
12 if (child != custom_child)
13 return FALSE;
14
15 gtk_widget_get_preferred_size (widget: child, NULL, natural_size: &req);
16
17 allocation->x = 120;
18 allocation->y = 0;
19 allocation->width = req.width;
20 allocation->height = req.height;
21
22 return TRUE;
23}
24
25int
26main (int argc, char *argv[])
27{
28 GtkWidget *win, *overlay, *grid, *main_child, *child, *label, *sw;
29 GtkCssProvider *provider;
30 char *str;
31
32 gtk_init ();
33
34 provider = gtk_css_provider_new ();
35 gtk_css_provider_load_from_data (css_provider: provider,
36 data: "label { border: 3px solid black; border-radius: 5px; padding: 2px; }"
37 ".top { border-top-style: none; border-top-right-radius: 0px; border-top-left-radius: 0px; }"
38 ".bottom { border-bottom-style: none; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; }"
39 ".left { border-left-style: none; border-top-left-radius: 0px; border-bottom-left-radius: 0px; }"
40 ".right { border-right-style: none; border-top-right-radius: 0px; border-bottom-right-radius: 0px; }",
41 length: -1);
42 gtk_style_context_add_provider_for_display (display: gdk_display_get_default (),
43 GTK_STYLE_PROVIDER (provider),
44 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
45
46 win = gtk_window_new ();
47 gtk_window_set_default_size (GTK_WINDOW (win), width: 600, height: 600);
48
49 grid = gtk_grid_new ();
50 label = gtk_label_new (str: "Out of overlay");
51 gtk_widget_set_hexpand (widget: label, TRUE);
52 gtk_widget_set_vexpand (widget: label, TRUE);
53 gtk_grid_attach (GTK_GRID (grid), child: label, column: 0, row: 0, width: 1, height: 1);
54
55 overlay = gtk_overlay_new ();
56 sw = gtk_scrolled_window_new ();
57 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
58 hscrollbar_policy: GTK_POLICY_ALWAYS,
59 vscrollbar_policy: GTK_POLICY_ALWAYS);
60 gtk_overlay_set_child (GTK_OVERLAY (overlay), child: sw);
61
62 main_child = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, spacing: 0);
63 gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), child: main_child);
64 gtk_widget_set_hexpand (widget: main_child, TRUE);
65 gtk_widget_set_vexpand (widget: main_child, TRUE);
66 label = gtk_label_new (str: "Main child");
67 gtk_widget_set_halign (widget: label, align: GTK_ALIGN_CENTER);
68 gtk_widget_set_valign (widget: label, align: GTK_ALIGN_CENTER);
69 gtk_box_append (GTK_BOX (main_child), child: label);
70
71 child = gtk_label_new (NULL);
72 str = g_strdup_printf (format: "%p", child);
73 gtk_label_set_text (GTK_LABEL (child), str);
74 g_free (mem: str);
75 g_print (format: "Bottom/Right child: %p\n", child);
76 gtk_widget_set_halign (widget: child, align: GTK_ALIGN_END);
77 gtk_widget_set_valign (widget: child, align: GTK_ALIGN_END);
78 gtk_overlay_add_overlay (GTK_OVERLAY (overlay), widget: child);
79
80 child = gtk_label_new (NULL);
81 str = g_strdup_printf (format: "%p", child);
82 gtk_label_set_text (GTK_LABEL (child), str);
83 g_free (mem: str);
84 g_print (format: "Left/Top child: %p\n", child);
85 gtk_widget_set_halign (widget: child, align: GTK_ALIGN_START);
86 gtk_widget_set_valign (widget: child, align: GTK_ALIGN_START);
87 gtk_overlay_add_overlay (GTK_OVERLAY (overlay), widget: child);
88
89 child = gtk_label_new (NULL);
90 str = g_strdup_printf (format: "%p", child);
91 gtk_label_set_text (GTK_LABEL (child), str);
92 g_free (mem: str);
93 g_print (format: "Right/Center child: %p\n", child);
94 gtk_widget_set_halign (widget: child, align: GTK_ALIGN_END);
95 gtk_widget_set_valign (widget: child, align: GTK_ALIGN_CENTER);
96 gtk_overlay_add_overlay (GTK_OVERLAY (overlay), widget: child);
97
98 child = gtk_label_new (NULL);
99 str = g_strdup_printf (format: "%p", child);
100 gtk_label_set_text (GTK_LABEL (child), str);
101 g_free (mem: str);
102 gtk_widget_set_margin_start (widget: child, margin: 55);
103 gtk_widget_set_margin_top (widget: child, margin: 4);
104 g_print (format: "Left/Top margined child: %p\n", child);
105 gtk_widget_set_halign (widget: child, align: GTK_ALIGN_START);
106 gtk_widget_set_valign (widget: child, align: GTK_ALIGN_START);
107 gtk_overlay_add_overlay (GTK_OVERLAY (overlay), widget: child);
108
109 child = gtk_label_new (NULL);
110 str = g_strdup_printf (format: "%p", child);
111 gtk_label_set_text (GTK_LABEL (child), str);
112 g_free (mem: str);
113 g_print (format: "Custom get-child-position child: %p\n", child);
114 gtk_widget_set_halign (widget: child, align: GTK_ALIGN_START);
115 gtk_widget_set_valign (widget: child, align: GTK_ALIGN_START);
116 gtk_overlay_add_overlay (GTK_OVERLAY (overlay), widget: child);
117
118 g_signal_connect (overlay, "get-child-position",
119 G_CALLBACK (overlay_get_child_position), child);
120
121 gtk_grid_attach (GTK_GRID (grid), child: overlay, column: 1, row: 0, width: 1, height: 3);
122 gtk_window_set_child (GTK_WINDOW (win), child: grid);
123
124 g_print (format: "\n");
125
126 gtk_widget_show (widget: win);
127
128 while (TRUE)
129 g_main_context_iteration (NULL, TRUE);
130
131 return 0;
132}
133

source code of gtk/tests/testoverlaystyleclass.c