commit 3c5129b4e685e8e098026434ea5e5807050dc18e
parent 8ea1b32c8ee63a66d2b6c4328e060ff004a5c1a3
Author: lumidify <nobody@lumidify.org>
Date: Fri, 1 May 2020 11:26:45 +0200
Add cursors
Diffstat:
M | croptool.c | | | 37 | +++++++++++++++++++++++++++++++++++-- |
1 file changed, 35 insertions(+), 2 deletions(-)
diff --git a/croptool.c b/croptool.c
@@ -65,6 +65,7 @@ struct State {
GdkPixbuf *cur_pixbuf;
struct Point move_handle;
gboolean moving;
+ gboolean resizing;
gboolean lock_x;
gboolean lock_y;
GdkColor gdk_color;
@@ -109,6 +110,7 @@ int main(int argc, char *argv[]) {
state->filenames = argv;
state->cur_selection = -1;
state->moving = FALSE;
+ state->resizing = FALSE;
state->lock_x = FALSE;
state->lock_y = FALSE;
state->window_w = 0;
@@ -127,7 +129,7 @@ int main(int argc, char *argv[]) {
gtk_widget_add_events(area,
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
GDK_BUTTON_MOTION_MASK | GDK_KEY_PRESS_MASK |
- GDK_POINTER_MOTION_HINT_MASK);
+ GDK_POINTER_MOTION_HINT_MASK | GDK_POINTER_MOTION_MASK);
gtk_container_add(GTK_CONTAINER(window), area);
g_signal_connect(area, "expose-event", G_CALLBACK(draw_expose), state);
@@ -299,6 +301,7 @@ button_press(GtkWidget *area, GdkEventButton *event, gpointer data) {
rect->x1 = x;
rect->y1 = y;
}
+ state->resizing = TRUE;
return FALSE;
}
@@ -306,6 +309,7 @@ static gboolean
button_release(GtkWidget *area, GdkEventButton *event, gpointer data) {
struct State *state = (struct State *)data;
state->moving = FALSE;
+ state->resizing = FALSE;
state->lock_x = FALSE;
state->lock_y = FALSE;
return FALSE;
@@ -369,11 +373,40 @@ drag_motion(GtkWidget *area, GdkEventMotion *event, gpointer data) {
rect->y1 += y_delta;
state->move_handle.x = x;
state->move_handle.y = y;
- } else {
+ } else if (state->resizing == TRUE) {
if (state->lock_y != TRUE)
rect->x1 = x;
if (state->lock_x != TRUE)
rect->y1 = y;
+ } else {
+ int x0 = rect->x0, x1 = rect->x1;
+ int y0 = rect->y0, y1 = rect->y1;
+ sort_coordinates(&x0, &y0, &x1, &y1);
+ GdkCursor *c = NULL;
+ GdkCursor *old = gdk_window_get_cursor(area->window);
+ if (old)
+ gdk_cursor_unref(old);
+ if (collide_point(x, y, x0, y0)) {
+ c = gdk_cursor_new(GDK_TOP_LEFT_CORNER);
+ } else if (collide_point(x, y, x1, y0)) {
+ c = gdk_cursor_new(GDK_TOP_RIGHT_CORNER);
+ } else if (collide_point(x, y, x0, y1)) {
+ c = gdk_cursor_new(GDK_BOTTOM_LEFT_CORNER);
+ } else if (collide_point(x, y, x1, y1)) {
+ c = gdk_cursor_new(GDK_BOTTOM_RIGHT_CORNER);
+ } else if (collide_line(x, y, x0, y0, x1, y0)) {
+ c = gdk_cursor_new(GDK_TOP_SIDE);
+ } else if (collide_line(x, y, x1, y1, x0, y1)) {
+ c = gdk_cursor_new(GDK_BOTTOM_SIDE);
+ } else if (collide_line(x, y, x1, y1, x1, y0)) {
+ c = gdk_cursor_new(GDK_RIGHT_SIDE);
+ } else if (collide_line(x, y, x0, y0, x0, y1)) {
+ c = gdk_cursor_new(GDK_LEFT_SIDE);
+ } else if (collide_rect(x, y, *rect)) {
+ c = gdk_cursor_new(GDK_FLEUR);
+ }
+ gdk_window_set_cursor(area->window, c);
+ return FALSE;
}
gtk_widget_queue_draw(area);