croptool

Image cropping tool
git clone git://lumidify.org/croptool.git (fast, but not encrypted)
git clone https://lumidify.org/git/croptool.git (encrypted, but very slow)
Log | Files | Refs | README | LICENSE

commit 9abe5617bed41b35fe53c8830708fd6a6eb2ec0e
parent 60095c0878b2e20accd0412419e3472a00b6ef6a
Author: lumidify <nobody@lumidify.org>
Date:   Sat,  6 Mar 2021 15:30:57 +0100

Change cursor when image changes

Diffstat:
Mcroptool.c | 91++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
1 file changed, 62 insertions(+), 29 deletions(-)

diff --git a/croptool.c b/croptool.c @@ -102,6 +102,8 @@ static struct { int num_files; int window_w; int window_h; + int cursor_x; + int cursor_y; struct Point move_handle; short moving; short resizing; @@ -148,6 +150,7 @@ static void set_selection( struct Selection *sel, int rect_x0, int rect_y0, int rect_x1, int rect_y1, int orig_w, int orig_h, int scaled_w, int scaled_h); static void queue_rectangle_redraw(int x0, int y0, int x1, int y1); +static void set_cursor(struct Rect rect); static void drag_motion(XEvent event); static void resize_window(int w, int h); static void button_release(void); @@ -283,6 +286,8 @@ setup(int argc, char *argv[]) { state.lock_y = 0; state.window_w = 500; state.window_h = 500; + state.cursor_x = 0; + state.cursor_y = 0; state.cur_col = 1; for (int i = 0; i < argc; i++) { @@ -781,13 +786,57 @@ queue_rectangle_redraw(int x0, int y0, int x1, int y1) { LINE_WIDTH * 2, y1 - y0 + LINE_WIDTH * 2); } +/* set the appropriate cursor based on the + * current mouse position and a cropping rectangle */ +static void +set_cursor(struct Rect rect) { + Cursor c = None; + sort_coordinates(&rect.x0, &rect.y0, &rect.x1, &rect.y1); + if (collide_point( + state.cursor_x, state.cursor_y, + rect.x0, rect.y0)) { + c = cursors.topleft; + } else if (collide_point( + state.cursor_x, state.cursor_y, + rect.x1, rect.y0)) { + c = cursors.topright; + } else if (collide_point( + state.cursor_x, state.cursor_y, + rect.x0, rect.y1)) { + c = cursors.bottomleft; + } else if (collide_point( + state.cursor_x, state.cursor_y, + rect.x1, rect.y1)) { + c = cursors.bottomright; + } else if (collide_line( + state.cursor_x, state.cursor_y, + rect.x0, rect.y0, rect.x1, rect.y0)) { + c = cursors.top; + } else if (collide_line( + state.cursor_x, state.cursor_y, + rect.x1, rect.y1, rect.x0, rect.y1)) { + c = cursors.bottom; + } else if (collide_line( + state.cursor_x, state.cursor_y, + rect.x1, rect.y1, rect.x1, rect.y0)) { + c = cursors.right; + } else if (collide_line( + state.cursor_x, state.cursor_y, + rect.x0, rect.y0, rect.x0, rect.y1)) { + c = cursors.left; + } else if (collide_rect(state.cursor_x, state.cursor_y, rect)) { + c = cursors.grab; + } + XDefineCursor(state.dpy, state.win, c); +} + static void drag_motion(XEvent event) { if (state.cur_selection < 0 || !state.selections[state.cur_selection].valid) return; struct Rect *rect = &state.selections[state.cur_selection].rect; - int x = event.xbutton.x; - int y = event.xbutton.y; + state.cursor_x = event.xbutton.x; + state.cursor_y = event.xbutton.y; int x0 = rect->x0, x1 = rect->x1; int y0 = rect->y0, y1 = rect->y1; sort_coordinates(&x0, &y0, &x1, &y1); @@ -795,43 +844,24 @@ drag_motion(XEvent event) { if (SELECTION_REDRAW && (state.moving || state.resizing)) queue_rectangle_redraw(x0, y0, x1, y1); if (state.moving) { - int x_delta = x - state.move_handle.x; - int y_delta = y - state.move_handle.y; + int x_delta = state.cursor_x - state.move_handle.x; + int y_delta = state.cursor_y - state.move_handle.y; rect->x0 += x_delta; rect->y0 += y_delta; rect->x1 += x_delta; rect->y1 += y_delta; - state.move_handle.x = x; - state.move_handle.y = y; + state.move_handle.x = state.cursor_x; + state.move_handle.y = state.cursor_y; } else if (state.resizing) { if (!state.lock_y) - rect->x1 = x; + rect->x1 = state.cursor_x; if (!state.lock_x) - rect->y1 = y; + rect->y1 = state.cursor_y; } else { - Cursor c = None; - if (collide_point(x, y, x0, y0)) { - c = cursors.topleft; - } else if (collide_point(x, y, x1, y0)) { - c = cursors.topright; - } else if (collide_point(x, y, x0, y1)) { - c = cursors.bottomleft; - } else if (collide_point(x, y, x1, y1)) { - c = cursors.bottomright; - } else if (collide_line(x, y, x0, y0, x1, y0)) { - c = cursors.top; - } else if (collide_line(x, y, x1, y1, x0, y1)) { - c = cursors.bottom; - } else if (collide_line(x, y, x1, y1, x1, y0)) { - c = cursors.right; - } else if (collide_line(x, y, x0, y0, x0, y1)) { - c = cursors.left; - } else if (collide_rect(x, y, *rect)) { - c = cursors.grab; - } - XDefineCursor(state.dpy, state.win, c); + set_cursor(*rect); return; } + set_cursor(*rect); /* redraw the new rectangle */ if (SELECTION_REDRAW) @@ -928,6 +958,9 @@ change_picture(Imlib_Image new_image, int new_selection, int copy_box) { sel->scaled_h = actual_h; sel->valid = 1; queue_update(0, 0, sel->scaled_w, sel->scaled_h); + + /* set the cursor since the cropping rectangle may have changed */ + set_cursor(sel->rect); } /* show the next image in the argument list - unloadable files are skipped