From 6b6f26ed45fb231e142f2c39aa455bdaafbc5b4d Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 24 Mar 2019 10:52:42 -0400 Subject: [PATCH] Add a window move/resize test --- tests/meson.build | 1 + tests/testwindowdrag.c | 140 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 tests/testwindowdrag.c diff --git a/tests/meson.build b/tests/meson.build index fe9e09d86b..23570f6306 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -130,6 +130,7 @@ gtk_tests = [ ['testoutsetshadowdrawing'], ['testblur'], ['testtexture'], + ['testwindowdrag'], ] if os_unix diff --git a/tests/testwindowdrag.c b/tests/testwindowdrag.c new file mode 100644 index 0000000000..6b15731811 --- /dev/null +++ b/tests/testwindowdrag.c @@ -0,0 +1,140 @@ +#include + +static void +start_resize (GtkGestureMultiPress *gesture, + int n_press, + double x, + double y, + gpointer data) +{ + GtkWidget *widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)); + GdkSurfaceEdge edge = GPOINTER_TO_INT (data); + GdkSurface *surface; + GdkEvent *event; + guint button; + guint32 timestamp; + int xx = x; + int yy = y; + + gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED); + + surface = gtk_widget_get_surface (widget); + event = gtk_get_current_event (); + gdk_event_get_button (event, &button); + timestamp = gdk_event_get_time (event); + + gtk_widget_translate_coordinates (widget, GTK_WIDGET (gtk_widget_get_root (widget)), + xx, yy, &xx, &yy); + gdk_surface_begin_resize_drag (surface, edge, button, xx, yy, timestamp); + + gtk_event_controller_reset (GTK_EVENT_CONTROLLER (gesture)); +} + +static GtkWidget * +resize_button (GdkSurfaceEdge edge) +{ + GtkWidget *button; + GtkGesture *gesture; + + button = gtk_image_new_from_icon_name ("view-fullscreen-symbolic"); + gtk_widget_set_hexpand (button, TRUE); + gtk_widget_set_vexpand (button, TRUE); + gesture = gtk_gesture_multi_press_new (); + g_signal_connect (gesture, "pressed", G_CALLBACK (start_resize), GINT_TO_POINTER (edge)); + gtk_widget_add_controller (button, GTK_EVENT_CONTROLLER (gesture)); + + return button; +} + +static void +start_move (GtkGestureMultiPress *gesture, + int n_press, + double x, + double y, + gpointer data) +{ + GtkWidget *widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)); + GdkSurface *surface; + GdkEvent *event; + guint button; + guint32 timestamp; + int xx = x; + int yy = y; + + gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED); + + surface = gtk_widget_get_surface (widget); + event = gtk_get_current_event (); + gdk_event_get_button (event, &button); + timestamp = gdk_event_get_time (event); + + gtk_widget_translate_coordinates (widget, GTK_WIDGET (gtk_widget_get_root (widget)), + xx, yy, &xx, &yy); + gdk_surface_begin_move_drag (surface, button, xx, yy, timestamp); + gtk_event_controller_reset (GTK_EVENT_CONTROLLER (gesture)); +} + +static GtkWidget * +move_button (void) +{ + GtkWidget *button; + GtkGesture *gesture; + + button = gtk_image_new_from_icon_name ("view-grid-symbolic"); + gtk_widget_set_hexpand (button, TRUE); + gtk_widget_set_vexpand (button, TRUE); + gesture = gtk_gesture_multi_press_new (); + g_signal_connect (gesture, "pressed", G_CALLBACK (start_move), NULL); + gtk_widget_add_controller (button, GTK_EVENT_CONTROLLER (gesture)); + + return button; +} + +int +main (int argc, char *argv[]) +{ + GtkWidget *window; + GtkWidget *grid; + + gtk_init (); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_titlebar (GTK_WINDOW (window), gtk_header_bar_new ()); + + grid = gtk_grid_new (); + gtk_container_add (GTK_CONTAINER (window), grid); + + gtk_grid_attach (GTK_GRID (grid), + resize_button (GDK_SURFACE_EDGE_NORTH_WEST), + 0, 0, 1, 1); + gtk_grid_attach (GTK_GRID (grid), + resize_button (GDK_SURFACE_EDGE_NORTH), + 1, 0, 1, 1); + gtk_grid_attach (GTK_GRID (grid), + resize_button (GDK_SURFACE_EDGE_NORTH_EAST), + 2, 0, 1, 1); + gtk_grid_attach (GTK_GRID (grid), + resize_button (GDK_SURFACE_EDGE_WEST), + 0, 1, 1, 1); + gtk_grid_attach (GTK_GRID (grid), + move_button (), + 1, 1, 1, 1); + gtk_grid_attach (GTK_GRID (grid), + resize_button (GDK_SURFACE_EDGE_EAST), + 2, 1, 1, 1); + gtk_grid_attach (GTK_GRID (grid), + resize_button (GDK_SURFACE_EDGE_SOUTH_WEST), + 0, 2, 1, 1); + gtk_grid_attach (GTK_GRID (grid), + resize_button (GDK_SURFACE_EDGE_SOUTH), + 1, 2, 1, 1); + gtk_grid_attach (GTK_GRID (grid), + resize_button (GDK_SURFACE_EDGE_SOUTH_EAST), + 2, 2, 1, 1); + + gtk_widget_show (window); + + gtk_main (); + + return 0; +}