]> Pileus Git - ~andy/gtk/blob - tests/testoverlaystyleclass.c
stylecontext: Do invalidation on first resize container
[~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_container_add (GTK_CONTAINER (sw), main_child);
72   gdk_rgba_parse (&color, "green");
73   gtk_widget_override_background_color (main_child, 0, &color);
74   gtk_widget_set_hexpand (main_child, TRUE);
75   gtk_widget_set_vexpand (main_child, TRUE);
76   label = gtk_label_new ("Main child");
77   gtk_container_add (GTK_CONTAINER (main_child), label);
78
79   child = gtk_label_new (NULL);
80   str = g_strdup_printf ("%p", child);
81   gtk_label_set_text (GTK_LABEL (child), str);
82   g_free (str);
83   g_print ("Bottom/Right child: %p\n", child);
84   gtk_widget_set_halign (child, GTK_ALIGN_END);
85   gtk_widget_set_valign (child, GTK_ALIGN_END);
86   gtk_overlay_add_overlay (GTK_OVERLAY (overlay), child);
87
88   g_signal_connect (child, "size-allocate",
89                     G_CALLBACK (child_size_allocate), overlay);
90
91   child = gtk_label_new (NULL);
92   str = g_strdup_printf ("%p", child);
93   gtk_label_set_text (GTK_LABEL (child), str);
94   g_free (str);
95   g_print ("Left/Top child: %p\n", child);
96   gtk_widget_set_halign (child, GTK_ALIGN_START);
97   gtk_widget_set_valign (child, GTK_ALIGN_START);
98   gtk_overlay_add_overlay (GTK_OVERLAY (overlay), child);
99
100   g_signal_connect (child, "size-allocate",
101                     G_CALLBACK (child_size_allocate), overlay);
102
103   child = gtk_label_new (NULL);
104   str = g_strdup_printf ("%p", child);
105   gtk_label_set_text (GTK_LABEL (child), str);
106   g_free (str);
107   g_print ("Right/Center child: %p\n", child);
108   gtk_widget_set_halign (child, GTK_ALIGN_END);
109   gtk_widget_set_valign (child, GTK_ALIGN_CENTER);
110   gtk_overlay_add_overlay (GTK_OVERLAY (overlay), child);
111
112   g_signal_connect (child, "size-allocate",
113                     G_CALLBACK (child_size_allocate), overlay);
114
115   child = gtk_label_new (NULL);
116   str = g_strdup_printf ("%p", child);
117   gtk_label_set_text (GTK_LABEL (child), str);
118   g_free (str);
119   gtk_widget_set_margin_left (child, 55);
120   gtk_widget_set_margin_top (child, 4);
121   g_print ("Left/Top margined child: %p\n", child);
122   gtk_widget_set_halign (child, GTK_ALIGN_START);
123   gtk_widget_set_valign (child, GTK_ALIGN_START);
124   gtk_overlay_add_overlay (GTK_OVERLAY (overlay), child);
125
126   g_signal_connect (child, "size-allocate",
127                     G_CALLBACK (child_size_allocate), overlay);
128
129   child = gtk_label_new (NULL);
130   str = g_strdup_printf ("%p", child);
131   gtk_label_set_text (GTK_LABEL (child), str);
132   g_free (str);
133   g_print ("Custom get-child-position child: %p\n", child);
134   gtk_widget_set_halign (child, GTK_ALIGN_START);
135   gtk_widget_set_valign (child, GTK_ALIGN_START);
136   gtk_overlay_add_overlay (GTK_OVERLAY (overlay), child);
137
138   g_signal_connect (child, "size-allocate",
139                     G_CALLBACK (child_size_allocate), overlay);
140   g_signal_connect (overlay, "get-child-position",
141                     G_CALLBACK (overlay_get_child_position), child);
142
143   gtk_grid_attach (GTK_GRID (grid), overlay, 1, 0, 1, 3);
144   gtk_container_add (GTK_CONTAINER (win), grid);
145
146   g_print ("\n");
147
148   gtk_widget_show_all (win);
149
150   gtk_main ();
151
152   return 0;
153 }