1 | #include <gtk/gtk.h> |
2 | |
3 | static gboolean |
4 | overlay_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 | |
25 | int |
26 | main (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 | |