[gtk/wip/otte/for-master: 1/10] tests: Add a test for changing the hovered widget
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/otte/for-master: 1/10] tests: Add a test for changing the hovered widget
- Date: Thu, 5 Mar 2020 06:07:13 +0000 (UTC)
commit 18b011a717df27b13ab7d9153e1474a4410e4d14
Author: Benjamin Otte <otte redhat com>
Date: Wed Mar 4 01:24:32 2020 +0100
tests: Add a test for changing the hovered widget
The add/remove one crashes after a few enter/leave events.
tests/meson.build | 1 +
tests/testhover.c | 291 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 292 insertions(+)
---
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 <gtk/gtk.h>
+
+#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;
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]