[gtk/wip/otte/for-master: 1/10] tests: Add a test for changing the hovered widget



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]