URI: 
       tChange cursor when image changes - croptool - Image cropping tool
  HTML git clone git://lumidify.org/croptool.git (fast, but not encrypted)
  HTML git clone https://lumidify.org/git/croptool.git (encrypted, but very slow)
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 9abe5617bed41b35fe53c8830708fd6a6eb2ec0e
   DIR parent 60095c0878b2e20accd0412419e3472a00b6ef6a
  HTML Author: lumidify <nobody@lumidify.org>
       Date:   Sat,  6 Mar 2021 15:30:57 +0100
       
       Change cursor when image changes
       
       Diffstat:
         M croptool.c                          |      91 +++++++++++++++++++++----------
       
       1 file changed, 62 insertions(+), 29 deletions(-)
       ---
   DIR diff --git a/croptool.c b/croptool.c
       t@@ -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;
       t@@ -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);
       t@@ -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++) {
       t@@ -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);
       t@@ -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)
       t@@ -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