1#include <gtk/gtk.h>
2
3static void
4start_resize (GtkGestureClick *gesture,
5 int n_press,
6 double x,
7 double y,
8 gpointer data)
9{
10 GtkWidget *widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
11 GdkSurfaceEdge edge = GPOINTER_TO_INT (data);
12 GdkSurface *surface;
13 GdkEvent *event;
14 guint button;
15 guint32 timestamp;
16
17 gtk_gesture_set_state (GTK_GESTURE (gesture), state: GTK_EVENT_SEQUENCE_CLAIMED);
18
19 surface = gtk_native_get_surface (self: gtk_widget_get_native (widget));
20 event = gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (gesture));
21 if (gdk_event_get_event_type (event) == GDK_BUTTON_PRESS)
22 button = gdk_button_event_get_button (event);
23 else
24 button = 0;
25 timestamp = gdk_event_get_time (event);
26
27 gtk_widget_translate_coordinates (src_widget: widget, GTK_WIDGET (gtk_widget_get_root (widget)),
28 src_x: x, src_y: y, dest_x: &x, dest_y: &y);
29 gdk_toplevel_begin_resize (toplevel: GDK_TOPLEVEL (ptr: surface), edge, device: gdk_event_get_device (event), button, x, y, timestamp);
30
31 gtk_event_controller_reset (GTK_EVENT_CONTROLLER (gesture));
32}
33
34static GtkWidget *
35resize_button (GdkSurfaceEdge edge)
36{
37 GtkWidget *button;
38 GtkGesture *gesture;
39
40 button = gtk_image_new_from_icon_name (icon_name: "view-fullscreen-symbolic");
41 gtk_widget_set_hexpand (widget: button, TRUE);
42 gtk_widget_set_vexpand (widget: button, TRUE);
43 gesture = gtk_gesture_click_new ();
44 g_signal_connect (gesture, "pressed", G_CALLBACK (start_resize), GINT_TO_POINTER (edge));
45 gtk_widget_add_controller (widget: button, GTK_EVENT_CONTROLLER (gesture));
46
47 return button;
48}
49
50static void
51start_move (GtkGestureClick *gesture,
52 int n_press,
53 double x,
54 double y,
55 gpointer data)
56{
57 GtkWidget *widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
58 GdkSurface *surface;
59 GdkEvent *event;
60 guint button;
61 guint32 timestamp;
62
63 gtk_gesture_set_state (GTK_GESTURE (gesture), state: GTK_EVENT_SEQUENCE_CLAIMED);
64
65 surface = gtk_native_get_surface (self: gtk_widget_get_native (widget));
66 event = gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (gesture));
67 if (gdk_event_get_event_type (event) == GDK_BUTTON_PRESS)
68 button = gdk_button_event_get_button (event);
69 else
70 button = 0;
71 timestamp = gdk_event_get_time (event);
72
73 gtk_widget_translate_coordinates (src_widget: widget, GTK_WIDGET (gtk_widget_get_root (widget)),
74 src_x: x, src_y: y, dest_x: &x, dest_y: &y);
75 gdk_toplevel_begin_move (toplevel: GDK_TOPLEVEL (ptr: surface), device: gdk_event_get_device (event), button, x, y, timestamp);
76 gtk_event_controller_reset (GTK_EVENT_CONTROLLER (gesture));
77}
78
79static GtkWidget *
80move_button (void)
81{
82 GtkWidget *button;
83 GtkGesture *gesture;
84
85 button = gtk_image_new_from_icon_name (icon_name: "view-grid-symbolic");
86 gtk_widget_set_hexpand (widget: button, TRUE);
87 gtk_widget_set_vexpand (widget: button, TRUE);
88 gesture = gtk_gesture_click_new ();
89 g_signal_connect (gesture, "pressed", G_CALLBACK (start_move), NULL);
90 gtk_widget_add_controller (widget: button, GTK_EVENT_CONTROLLER (gesture));
91
92 return button;
93}
94
95int
96main (int argc, char *argv[])
97{
98 GtkWidget *window;
99 GtkWidget *grid;
100
101 gtk_init ();
102
103 window = gtk_window_new ();
104 gtk_window_set_titlebar (GTK_WINDOW (window), titlebar: gtk_header_bar_new ());
105
106 grid = gtk_grid_new ();
107 gtk_window_set_child (GTK_WINDOW (window), child: grid);
108
109 gtk_grid_attach (GTK_GRID (grid),
110 child: resize_button (edge: GDK_SURFACE_EDGE_NORTH_WEST),
111 column: 0, row: 0, width: 1, height: 1);
112 gtk_grid_attach (GTK_GRID (grid),
113 child: resize_button (edge: GDK_SURFACE_EDGE_NORTH),
114 column: 1, row: 0, width: 1, height: 1);
115 gtk_grid_attach (GTK_GRID (grid),
116 child: resize_button (edge: GDK_SURFACE_EDGE_NORTH_EAST),
117 column: 2, row: 0, width: 1, height: 1);
118 gtk_grid_attach (GTK_GRID (grid),
119 child: resize_button (edge: GDK_SURFACE_EDGE_WEST),
120 column: 0, row: 1, width: 1, height: 1);
121 gtk_grid_attach (GTK_GRID (grid),
122 child: move_button (),
123 column: 1, row: 1, width: 1, height: 1);
124 gtk_grid_attach (GTK_GRID (grid),
125 child: resize_button (edge: GDK_SURFACE_EDGE_EAST),
126 column: 2, row: 1, width: 1, height: 1);
127 gtk_grid_attach (GTK_GRID (grid),
128 child: resize_button (edge: GDK_SURFACE_EDGE_SOUTH_WEST),
129 column: 0, row: 2, width: 1, height: 1);
130 gtk_grid_attach (GTK_GRID (grid),
131 child: resize_button (edge: GDK_SURFACE_EDGE_SOUTH),
132 column: 1, row: 2, width: 1, height: 1);
133 gtk_grid_attach (GTK_GRID (grid),
134 child: resize_button (edge: GDK_SURFACE_EDGE_SOUTH_EAST),
135 column: 2, row: 2, width: 1, height: 1);
136
137 gtk_widget_show (widget: window);
138
139 while (TRUE)
140 g_main_context_iteration (NULL, TRUE);
141
142 return 0;
143}
144

source code of gtk/tests/testwindowdrag.c