diff --git a/tests/meson.build b/tests/meson.build index 58198895da..e13cbe4179 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -50,6 +50,7 @@ gtk_tests = [ ['testgtk'], ['testheaderbar'], ['testheightforwidth'], + ['testhover'], ['testiconview'], ['testiconview-keynav'], ['testicontheme'], diff --git a/tests/testhover.c b/tests/testhover.c new file mode 100644 index 0000000000..7b846b6b29 --- /dev/null +++ b/tests/testhover.c @@ -0,0 +1,291 @@ +#include + +#if 0 +#define gtk_event_controller_motion_new gtk_drop_controller_motion_new +#define gtk_event_controller_motion_contains_pointer gtk_drop_controller_motion_contains_pointer +#define gtk_event_controller_motion_is_pointer gtk_drop_controller_motion_is_pointer +#undef GTK_EVENT_CONTROLLER_MOTION +#define GTK_EVENT_CONTROLLER_MOTION GTK_DROP_CONTROLLER_MOTION +#endif + +static void +quit_cb (GtkWidget *widget, + gpointer unused) +{ + g_main_context_wakeup (NULL); +} + +static void +enter_annoy_cb (GtkEventController *controller, + double x, + double y) +{ + GtkWidget *widget = gtk_event_controller_get_widget (controller); + GtkWindow *window = GTK_WINDOW (gtk_widget_get_root (widget)); + + g_print ("%15s ENTER %s %g, %g\n", + gtk_window_get_title (window), + gtk_event_controller_motion_contains_pointer (GTK_EVENT_CONTROLLER_MOTION (controller)) + ? gtk_event_controller_motion_is_pointer (GTK_EVENT_CONTROLLER_MOTION (controller)) + ? "IS " + : "CONTAIN" + : " ", + x, y); +} + +static void +motion_annoy_cb (GtkEventController *controller, + double x, + double y) +{ + GtkWidget *widget = gtk_event_controller_get_widget (controller); + GtkWindow *window = GTK_WINDOW (gtk_widget_get_root (widget)); + + g_print ("%15s MOVE %s %g, %g\n", + gtk_window_get_title (window), + gtk_event_controller_motion_contains_pointer (GTK_EVENT_CONTROLLER_MOTION (controller)) + ? gtk_event_controller_motion_is_pointer (GTK_EVENT_CONTROLLER_MOTION (controller)) + ? "IS " + : "CONTAIN" + : " ", + x, y); +} + +static void +leave_annoy_cb (GtkEventController *controller) +{ + GtkWidget *widget = gtk_event_controller_get_widget (controller); + GtkWindow *window = GTK_WINDOW (gtk_widget_get_root (widget)); + + g_print ("%15s LEAVE %s\n", + gtk_window_get_title (window), + gtk_event_controller_motion_contains_pointer (GTK_EVENT_CONTROLLER_MOTION (controller)) + ? gtk_event_controller_motion_is_pointer (GTK_EVENT_CONTROLLER_MOTION (controller)) + ? "IS " + : "CONTAIN" + : " "); +} + +static GtkEventController * +annoying_event_controller_motion_new (void) +{ + GtkEventController *controller = gtk_event_controller_motion_new (); + + g_signal_connect (controller, "enter", G_CALLBACK (enter_annoy_cb), NULL); + g_signal_connect (controller, "motion", G_CALLBACK (motion_annoy_cb), NULL); + g_signal_connect (controller, "leave", G_CALLBACK (leave_annoy_cb), NULL); + + return controller; +} + +/*** TEST 1: remove()/add() ***/ + +static void +enter1_cb (GtkEventController *controller) +{ + GtkWidget *box = gtk_event_controller_get_widget (controller); + + gtk_container_remove (GTK_CONTAINER (box), gtk_widget_get_first_child (box)); + gtk_container_add (GTK_CONTAINER (box), gtk_label_new ("HOVER!")); +} + +static void +leave1_cb (GtkEventController *controller) +{ + GtkWidget *box = gtk_event_controller_get_widget (controller); + + gtk_container_remove (GTK_CONTAINER (box), gtk_widget_get_first_child (box)); + gtk_container_add (GTK_CONTAINER (box), gtk_image_new_from_icon_name ("start-here")); +} + +static void +test1 (void) +{ + GtkWidget *win; + GtkWidget *box; + GtkEventController *controller; + win = gtk_window_new (); + gtk_window_set_default_size (GTK_WINDOW (win), 400, 300); + gtk_window_set_title (GTK_WINDOW (win), "add/remove"); + + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE); + gtk_container_add (GTK_CONTAINER (win), box); + controller = annoying_event_controller_motion_new (); + g_signal_connect (controller, "enter", G_CALLBACK (enter1_cb), NULL); + g_signal_connect (controller, "leave", G_CALLBACK (leave1_cb), NULL); + gtk_widget_add_controller (box, controller); + + gtk_container_add (GTK_CONTAINER (box), gtk_image_new_from_icon_name ("start-here")); + + gtk_widget_show (win); + + g_signal_connect (win, "destroy", G_CALLBACK (quit_cb), NULL); +} + +/*** TEST 2: hide()/show() ***/ + +static void +enter2_cb (GtkEventController *controller) +{ + GtkWidget *box = gtk_event_controller_get_widget (controller); + + gtk_widget_hide (gtk_widget_get_first_child (box)); + gtk_widget_show (gtk_widget_get_last_child (box)); +} + +static void +leave2_cb (GtkEventController *controller) +{ + GtkWidget *box = gtk_event_controller_get_widget (controller); + + gtk_widget_show (gtk_widget_get_first_child (box)); + gtk_widget_hide (gtk_widget_get_last_child (box)); +} + +static void +test2 (void) +{ + GtkWidget *win; + GtkWidget *box; + GtkEventController *controller; + win = gtk_window_new (); + gtk_window_set_default_size (GTK_WINDOW (win), 400, 300); + gtk_window_set_title (GTK_WINDOW (win), "show/hide"); + + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE); + gtk_container_add (GTK_CONTAINER (win), box); + controller = annoying_event_controller_motion_new (); + g_signal_connect (controller, "enter", G_CALLBACK (enter2_cb), NULL); + g_signal_connect (controller, "leave", G_CALLBACK (leave2_cb), NULL); + gtk_widget_add_controller (box, controller); + + gtk_container_add (GTK_CONTAINER (box), gtk_image_new_from_icon_name ("start-here")); + gtk_container_add (GTK_CONTAINER (box), gtk_label_new ("HOVER!")); + gtk_widget_hide (gtk_widget_get_last_child (box)); + + gtk_widget_show (win); + + g_signal_connect (win, "destroy", G_CALLBACK (quit_cb), NULL); +} + +/*** TEST 3: set_child_visible() ***/ + +static void +enter3_cb (GtkEventController *controller) +{ + GtkWidget *stack = gtk_event_controller_get_widget (controller); + + gtk_stack_set_visible_child_name (GTK_STACK (stack), "enter"); +} + +static void +leave3_cb (GtkEventController *controller) +{ + GtkWidget *stack = gtk_event_controller_get_widget (controller); + + gtk_stack_set_visible_child_name (GTK_STACK (stack), "leave"); +} + +static void +test3 (void) +{ + GtkWidget *win; + GtkWidget *stack; + GtkEventController *controller; + win = gtk_window_new (); + gtk_window_set_default_size (GTK_WINDOW (win), 400, 300); + gtk_window_set_title (GTK_WINDOW (win), "child-visible"); + + stack = gtk_stack_new (); + gtk_container_add (GTK_CONTAINER (win), stack); + controller = annoying_event_controller_motion_new (); + g_signal_connect (controller, "enter", G_CALLBACK (enter3_cb), NULL); + g_signal_connect (controller, "leave", G_CALLBACK (leave3_cb), NULL); + gtk_widget_add_controller (stack, controller); + + gtk_stack_add_named (GTK_STACK (stack), gtk_image_new_from_icon_name ("start-here"), "leave"); + gtk_stack_add_named (GTK_STACK (stack), gtk_label_new ("HOVER!"), "enter"); + gtk_stack_set_visible_child_name (GTK_STACK (stack), "leave"); + + gtk_widget_show (win); + + g_signal_connect (win, "destroy", G_CALLBACK (quit_cb), NULL); +} + +/*** TEST 4: move ***/ + +static void +enter4_cb (GtkEventController *controller) +{ + GtkWidget *fixed = gtk_event_controller_get_widget (controller); + + gtk_fixed_move (GTK_FIXED (fixed), gtk_widget_get_first_child (fixed), -1000, -1000); + gtk_fixed_move (GTK_FIXED (fixed), gtk_widget_get_last_child (fixed), 0, 0); +} + +static void +leave4_cb (GtkEventController *controller) +{ + GtkWidget *fixed = gtk_event_controller_get_widget (controller); + + gtk_fixed_move (GTK_FIXED (fixed), gtk_widget_get_first_child (fixed), 0, 0); + gtk_fixed_move (GTK_FIXED (fixed), gtk_widget_get_last_child (fixed), -1000, -1000); +} + +static void +test4 (void) +{ + GtkWidget *win; + GtkWidget *fixed; + GtkEventController *controller; + win = gtk_window_new (); + gtk_window_set_default_size (GTK_WINDOW (win), 400, 300); + gtk_window_set_title (GTK_WINDOW (win), "move"); + + fixed = gtk_fixed_new (); + gtk_container_add (GTK_CONTAINER (win), fixed); + controller = annoying_event_controller_motion_new (); + g_signal_connect (controller, "enter", G_CALLBACK (enter4_cb), NULL); + g_signal_connect (controller, "leave", G_CALLBACK (leave4_cb), NULL); + gtk_widget_add_controller (fixed, controller); + + gtk_fixed_put (GTK_FIXED (fixed), gtk_image_new_from_icon_name ("start-here"), 0, 0); + gtk_fixed_put (GTK_FIXED (fixed), gtk_label_new ("HOVER!"), -1000, -1000); + + gtk_widget_show (win); + + g_signal_connect (win, "destroy", G_CALLBACK (quit_cb), NULL); +} + +int +main (int argc, char *argv[]) +{ + GtkCssProvider *provider; + + gtk_init (); + + provider = gtk_css_provider_new (); + gtk_css_provider_load_from_data (provider, + ":hover {" + " box-shadow: inset 0px 0px 0px 1px red;" + " }" + " window :not(.title):hover {" + " background: yellow;" + " }" + " window :not(.title):hover * {" + " background: goldenrod;" + " }", + -1); + gtk_style_context_add_provider_for_display (gdk_display_get_default (), GTK_STYLE_PROVIDER (provider), 800); + g_object_unref (provider); + + test1(); + test2(); + test3(); + test4(); + + while (gtk_window_list_toplevels ()) + g_main_context_iteration (NULL, TRUE); + + return 0; +}