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 | |
11 | static void |
12 | quit_cb (GtkWidget *widget, |
13 | gpointer unused) |
14 | { |
15 | g_main_context_wakeup (NULL); |
16 | } |
17 | |
18 | static void |
19 | enter_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 | |
36 | static void |
37 | motion_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 | |
54 | static void |
55 | leave_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 | |
69 | static GtkEventController * |
70 | annoying_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 | |
83 | static void |
84 | enter1_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 | |
92 | static void |
93 | leave1_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 | |
101 | static void |
102 | test1 (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 | |
127 | static void |
128 | enter2_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 | |
136 | static void |
137 | leave2_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 | |
145 | static void |
146 | test2 (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 | |
173 | static void |
174 | enter3_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 | |
181 | static void |
182 | leave3_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 | |
189 | static void |
190 | test3 (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 | |
217 | static void |
218 | enter4_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 | |
226 | static void |
227 | leave4_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 | |
235 | static void |
236 | test4 (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 | |
260 | int |
261 | main (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 | |