forked from AuroraMiddleware/gtk
tests: Add a test for changing the hovered widget
The add/remove one crashes after a few enter/leave events.
This commit is contained in:
parent
8fc360dac5
commit
18b011a717
@ -50,6 +50,7 @@ gtk_tests = [
|
||||
['testgtk'],
|
||||
['testheaderbar'],
|
||||
['testheightforwidth'],
|
||||
['testhover'],
|
||||
['testiconview'],
|
||||
['testiconview-keynav'],
|
||||
['testicontheme'],
|
||||
|
291
tests/testhover.c
Normal file
291
tests/testhover.c
Normal file
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user