1#include <gtk/gtk.h>
2
3#if 0
4#define gtk_event_controller_motion_new gtk_drop_controller_motion_new
5#define gtk_event_controller_motion_contains_pointer gtk_drop_controller_motion_contains_pointer
6#define gtk_event_controller_motion_is_pointer gtk_drop_controller_motion_is_pointer
7#undef GTK_EVENT_CONTROLLER_MOTION
8#define GTK_EVENT_CONTROLLER_MOTION GTK_DROP_CONTROLLER_MOTION
9#endif
10
11static void
12quit_cb (GtkWidget *widget,
13 gpointer unused)
14{
15 g_main_context_wakeup (NULL);
16}
17
18static void
19enter_annoy_cb (GtkEventController *controller,
20 double x,
21 double y)
22{
23 GtkWidget *widget = gtk_event_controller_get_widget (controller);
24 GtkWindow *window = GTK_WINDOW (gtk_widget_get_root (widget));
25
26 g_print (format: "%15s ENTER %s %g, %g\n",
27 gtk_window_get_title (window),
28 gtk_event_controller_motion_contains_pointer (GTK_EVENT_CONTROLLER_MOTION (controller))
29 ? gtk_event_controller_motion_is_pointer (GTK_EVENT_CONTROLLER_MOTION (controller))
30 ? "IS "
31 : "CONTAIN"
32 : " ",
33 x, y);
34}
35
36static void
37motion_annoy_cb (GtkEventController *controller,
38 double x,
39 double y)
40{
41 GtkWidget *widget = gtk_event_controller_get_widget (controller);
42 GtkWindow *window = GTK_WINDOW (gtk_widget_get_root (widget));
43
44 g_print (format: "%15s MOVE %s %g, %g\n",
45 gtk_window_get_title (window),
46 gtk_event_controller_motion_contains_pointer (GTK_EVENT_CONTROLLER_MOTION (controller))
47 ? gtk_event_controller_motion_is_pointer (GTK_EVENT_CONTROLLER_MOTION (controller))
48 ? "IS "
49 : "CONTAIN"
50 : " ",
51 x, y);
52}
53
54static void
55leave_annoy_cb (GtkEventController *controller)
56{
57 GtkWidget *widget = gtk_event_controller_get_widget (controller);
58 GtkWindow *window = GTK_WINDOW (gtk_widget_get_root (widget));
59
60 g_print (format: "%15s LEAVE %s\n",
61 gtk_window_get_title (window),
62 gtk_event_controller_motion_contains_pointer (GTK_EVENT_CONTROLLER_MOTION (controller))
63 ? gtk_event_controller_motion_is_pointer (GTK_EVENT_CONTROLLER_MOTION (controller))
64 ? "IS "
65 : "CONTAIN"
66 : " ");
67}
68
69static GtkEventController *
70annoying_event_controller_motion_new (void)
71{
72 GtkEventController *controller = gtk_event_controller_motion_new ();
73
74 g_signal_connect (controller, "enter", G_CALLBACK (enter_annoy_cb), NULL);
75 g_signal_connect (controller, "motion", G_CALLBACK (motion_annoy_cb), NULL);
76 g_signal_connect (controller, "leave", G_CALLBACK (leave_annoy_cb), NULL);
77
78 return controller;
79}
80
81/*** TEST 1: remove()/add() ***/
82
83static void
84enter1_cb (GtkEventController *controller)
85{
86 GtkWidget *box = gtk_event_controller_get_widget (controller);
87
88 gtk_box_remove (GTK_BOX (box), child: gtk_widget_get_first_child (widget: box));
89 gtk_box_append (GTK_BOX (box), child: gtk_label_new (str: "HOVER!"));
90}
91
92static void
93leave1_cb (GtkEventController *controller)
94{
95 GtkWidget *box = gtk_event_controller_get_widget (controller);
96
97 gtk_box_remove (GTK_BOX (box), child: gtk_widget_get_first_child (widget: box));
98 gtk_box_append (GTK_BOX (box), child: gtk_image_new_from_icon_name (icon_name: "start-here"));
99}
100
101static void
102test1 (void)
103{
104 GtkWidget *win;
105 GtkWidget *box;
106 GtkEventController *controller;
107 win = gtk_window_new ();
108 gtk_window_set_default_size (GTK_WINDOW (win), width: 400, height: 300);
109 gtk_window_set_title (GTK_WINDOW (win), title: "add/remove");
110
111 box = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, FALSE);
112 gtk_window_set_child (GTK_WINDOW (win), child: box);
113 controller = annoying_event_controller_motion_new ();
114 g_signal_connect (controller, "enter", G_CALLBACK (enter1_cb), NULL);
115 g_signal_connect (controller, "leave", G_CALLBACK (leave1_cb), NULL);
116 gtk_widget_add_controller (widget: box, controller);
117
118 gtk_box_append (GTK_BOX (box), child: gtk_image_new_from_icon_name (icon_name: "start-here"));
119
120 gtk_widget_show (widget: win);
121
122 g_signal_connect (win, "destroy", G_CALLBACK (quit_cb), NULL);
123}
124
125/*** TEST 2: hide()/show() ***/
126
127static void
128enter2_cb (GtkEventController *controller)
129{
130 GtkWidget *box = gtk_event_controller_get_widget (controller);
131
132 gtk_widget_hide (widget: gtk_widget_get_first_child (widget: box));
133 gtk_widget_show (widget: gtk_widget_get_last_child (widget: box));
134}
135
136static void
137leave2_cb (GtkEventController *controller)
138{
139 GtkWidget *box = gtk_event_controller_get_widget (controller);
140
141 gtk_widget_show (widget: gtk_widget_get_first_child (widget: box));
142 gtk_widget_hide (widget: gtk_widget_get_last_child (widget: box));
143}
144
145static void
146test2 (void)
147{
148 GtkWidget *win;
149 GtkWidget *box;
150 GtkEventController *controller;
151 win = gtk_window_new ();
152 gtk_window_set_default_size (GTK_WINDOW (win), width: 400, height: 300);
153 gtk_window_set_title (GTK_WINDOW (win), title: "show/hide");
154
155 box = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, FALSE);
156 gtk_window_set_child (GTK_WINDOW (win), child: box);
157 controller = annoying_event_controller_motion_new ();
158 g_signal_connect (controller, "enter", G_CALLBACK (enter2_cb), NULL);
159 g_signal_connect (controller, "leave", G_CALLBACK (leave2_cb), NULL);
160 gtk_widget_add_controller (widget: box, controller);
161
162 gtk_box_append (GTK_BOX (box), child: gtk_image_new_from_icon_name (icon_name: "start-here"));
163 gtk_box_append (GTK_BOX (box), child: gtk_label_new (str: "HOVER!"));
164 gtk_widget_hide (widget: gtk_widget_get_last_child (widget: box));
165
166 gtk_widget_show (widget: win);
167
168 g_signal_connect (win, "destroy", G_CALLBACK (quit_cb), NULL);
169}
170
171/*** TEST 3: set_child_visible() ***/
172
173static void
174enter3_cb (GtkEventController *controller)
175{
176 GtkWidget *stack = gtk_event_controller_get_widget (controller);
177
178 gtk_stack_set_visible_child_name (GTK_STACK (stack), name: "enter");
179}
180
181static void
182leave3_cb (GtkEventController *controller)
183{
184 GtkWidget *stack = gtk_event_controller_get_widget (controller);
185
186 gtk_stack_set_visible_child_name (GTK_STACK (stack), name: "leave");
187}
188
189static void
190test3 (void)
191{
192 GtkWidget *win;
193 GtkWidget *stack;
194 GtkEventController *controller;
195 win = gtk_window_new ();
196 gtk_window_set_default_size (GTK_WINDOW (win), width: 400, height: 300);
197 gtk_window_set_title (GTK_WINDOW (win), title: "child-visible");
198
199 stack = gtk_stack_new ();
200 gtk_window_set_child (GTK_WINDOW (win), child: stack);
201 controller = annoying_event_controller_motion_new ();
202 g_signal_connect (controller, "enter", G_CALLBACK (enter3_cb), NULL);
203 g_signal_connect (controller, "leave", G_CALLBACK (leave3_cb), NULL);
204 gtk_widget_add_controller (widget: stack, controller);
205
206 gtk_stack_add_named (GTK_STACK (stack), child: gtk_image_new_from_icon_name (icon_name: "start-here"), name: "leave");
207 gtk_stack_add_named (GTK_STACK (stack), child: gtk_label_new (str: "HOVER!"), name: "enter");
208 gtk_stack_set_visible_child_name (GTK_STACK (stack), name: "leave");
209
210 gtk_widget_show (widget: win);
211
212 g_signal_connect (win, "destroy", G_CALLBACK (quit_cb), NULL);
213}
214
215/*** TEST 4: move ***/
216
217static void
218enter4_cb (GtkEventController *controller)
219{
220 GtkWidget *fixed = gtk_event_controller_get_widget (controller);
221
222 gtk_fixed_move (GTK_FIXED (fixed), widget: gtk_widget_get_first_child (widget: fixed), x: -1000, y: -1000);
223 gtk_fixed_move (GTK_FIXED (fixed), widget: gtk_widget_get_last_child (widget: fixed), x: 0, y: 0);
224}
225
226static void
227leave4_cb (GtkEventController *controller)
228{
229 GtkWidget *fixed = gtk_event_controller_get_widget (controller);
230
231 gtk_fixed_move (GTK_FIXED (fixed), widget: gtk_widget_get_first_child (widget: fixed), x: 0, y: 0);
232 gtk_fixed_move (GTK_FIXED (fixed), widget: gtk_widget_get_last_child (widget: fixed), x: -1000, y: -1000);
233}
234
235static void
236test4 (void)
237{
238 GtkWidget *win;
239 GtkWidget *fixed;
240 GtkEventController *controller;
241 win = gtk_window_new ();
242 gtk_window_set_default_size (GTK_WINDOW (win), width: 400, height: 300);
243 gtk_window_set_title (GTK_WINDOW (win), title: "move");
244
245 fixed = gtk_fixed_new ();
246 gtk_window_set_child (GTK_WINDOW (win), child: fixed);
247 controller = annoying_event_controller_motion_new ();
248 g_signal_connect (controller, "enter", G_CALLBACK (enter4_cb), NULL);
249 g_signal_connect (controller, "leave", G_CALLBACK (leave4_cb), NULL);
250 gtk_widget_add_controller (widget: fixed, controller);
251
252 gtk_fixed_put (GTK_FIXED (fixed), widget: gtk_image_new_from_icon_name (icon_name: "start-here"), x: 0, y: 0);
253 gtk_fixed_put (GTK_FIXED (fixed), widget: gtk_label_new (str: "HOVER!"), x: -1000, y: -1000);
254
255 gtk_widget_show (widget: win);
256
257 g_signal_connect (win, "destroy", G_CALLBACK (quit_cb), NULL);
258}
259
260int
261main (int argc, char *argv[])
262{
263 GtkCssProvider *provider;
264
265 gtk_init ();
266
267 provider = gtk_css_provider_new ();
268 gtk_css_provider_load_from_data (css_provider: provider,
269 data: ":hover {"
270 " box-shadow: inset 0px 0px 0px 1px red;"
271 " }"
272 " window :not(.title):hover {"
273 " background: yellow;"
274 " }"
275 " window :not(.title):hover * {"
276 " background: goldenrod;"
277 " }",
278 length: -1);
279 gtk_style_context_add_provider_for_display (display: gdk_display_get_default (), GTK_STYLE_PROVIDER (provider), priority: 800);
280 g_object_unref (object: provider);
281
282 test1();
283 test2();
284 test3();
285 test4();
286
287 while (gtk_window_list_toplevels ())
288 g_main_context_iteration (NULL, TRUE);
289
290 return 0;
291}
292

source code of gtk/tests/testhover.c