]> Pileus Git - ~andy/gtk/blob - tests/testoverlaystyleclass.c
reftests: Add reftest for fractional border sizes
[~andy/gtk] / tests / testoverlaystyleclass.c
1 #include <gtk/gtk.h>
2
3 static void
4 child_size_allocate (GtkWidget *child,
5                      GdkRectangle *allocation,
6                      gpointer user_data)
7 {
8   GtkStyleContext *context;
9   context = gtk_widget_get_style_context (child);
10
11   g_print ("Child %p\nHas left? %d\nHas right? %d\nHas top? %d\nHas bottom? %d\n",
12            child,
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"));
17 }
18
19 static gboolean
20 overlay_get_child_position (GtkOverlay *overlay,
21                             GtkWidget *child,
22                             GdkRectangle *allocation,
23                             gpointer user_data)
24 {
25   GtkWidget *custom_child = user_data;
26   GtkRequisition req;
27
28   if (child != custom_child)
29     return FALSE;
30
31   gtk_widget_get_preferred_size (child, NULL, &req);
32
33   allocation->x = 120;
34   allocation->y = 0;
35   allocation->width = req.width;
36   allocation->height = req.height;
37
38   return TRUE;
39 }
40
41 int 
42 main (int argc, char *argv[])
43 {
44   GtkWidget *win, *overlay, *grid, *main_child, *child, *label, *sw;
45   GdkRGBA color;
46   gchar *str;
47
48   gtk_init (&argc, &argv);
49
50   win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
51   gtk_window_set_default_size (GTK_WINDOW (win), 600, 600);
52
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);
62
63   overlay = gtk_overlay_new ();
64   sw = gtk_scrolled_window_new (NULL, NULL);
65   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
66                                   GTK_POLICY_ALWAYS,
67                                   GTK_POLICY_ALWAYS);
68   gtk_container_add (GTK_CONTAINER (overlay), sw);
69
70   main_child = gtk_event_box_new ();
71   gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
72                                          main_child);
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);
79
80   child = gtk_label_new (NULL);
81   str = g_strdup_printf ("%p", child);
82   gtk_label_set_text (GTK_LABEL (child), str);
83   g_free (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);
88
89   g_signal_connect (child, "size-allocate",
90                     G_CALLBACK (child_size_allocate), overlay);
91
92   child = gtk_label_new (NULL);
93   str = g_strdup_printf ("%p", child);
94   gtk_label_set_text (GTK_LABEL (child), str);
95   g_free (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);
100
101   g_signal_connect (child, "size-allocate",
102                     G_CALLBACK (child_size_allocate), overlay);
103
104   child = gtk_label_new (NULL);
105   str = g_strdup_printf ("%p", child);
106   gtk_label_set_text (GTK_LABEL (child), str);
107   g_free (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);
112
113   g_signal_connect (child, "size-allocate",
114                     G_CALLBACK (child_size_allocate), overlay);
115
116   child = gtk_label_new (NULL);
117   str = g_strdup_printf ("%p", child);
118   gtk_label_set_text (GTK_LABEL (child), str);
119   g_free (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);
126
127   g_signal_connect (child, "size-allocate",
128                     G_CALLBACK (child_size_allocate), overlay);
129
130   child = gtk_label_new (NULL);
131   str = g_strdup_printf ("%p", child);
132   gtk_label_set_text (GTK_LABEL (child), str);
133   g_free (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);
138
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);
143
144   gtk_grid_attach (GTK_GRID (grid), overlay, 1, 0, 1, 3);
145   gtk_container_add (GTK_CONTAINER (win), grid);
146
147   g_print ("\n");
148
149   gtk_widget_show_all (win);
150
151   gtk_main ();
152
153   return 0;
154 }