1 | #include <gtk/gtk.h> |
2 | |
3 | static void |
4 | start_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 | |
34 | static GtkWidget * |
35 | resize_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 | |
50 | static void |
51 | start_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 | |
79 | static GtkWidget * |
80 | move_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 | |
95 | int |
96 | main (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 | |