| #include <gtk/gtk.h> |
| |
| static void |
| start_resize (GtkGestureClick *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; |
| |
| gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED); |
| |
| surface = gtk_native_get_surface (gtk_widget_get_native (widget)); |
| event = gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (gesture)); |
| if (gdk_event_get_event_type (event) == GDK_BUTTON_PRESS) |
| button = gdk_button_event_get_button (event); |
| else |
| button = 0; |
| timestamp = gdk_event_get_time (event); |
| |
| gtk_widget_translate_coordinates (widget, GTK_WIDGET (gtk_widget_get_root (widget)), |
| x, y, &x, &y); |
| gdk_toplevel_begin_resize (GDK_TOPLEVEL (surface), edge, gdk_event_get_device (event), button, x, y, 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_click_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 (GtkGestureClick *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; |
| |
| gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED); |
| |
| surface = gtk_native_get_surface (gtk_widget_get_native (widget)); |
| event = gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (gesture)); |
| if (gdk_event_get_event_type (event) == GDK_BUTTON_PRESS) |
| button = gdk_button_event_get_button (event); |
| else |
| button = 0; |
| timestamp = gdk_event_get_time (event); |
| |
| gtk_widget_translate_coordinates (widget, GTK_WIDGET (gtk_widget_get_root (widget)), |
| x, y, &x, &y); |
| gdk_toplevel_begin_move (GDK_TOPLEVEL (surface), gdk_event_get_device (event), button, x, y, 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_click_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_set_titlebar (GTK_WINDOW (window), gtk_header_bar_new ()); |
| |
| grid = gtk_grid_new (); |
| gtk_window_set_child (GTK_WINDOW (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); |
| |
| while (TRUE) |
| g_main_context_iteration (NULL, TRUE); |
| |
| return 0; |
| } |