croptool

Image cropping tool
git clone git://lumidify.org/croptool.git
Log | Files | Refs | README | LICENSE

commit 7bd0d9adca219f37e471c3e2c6a80c88532557b8
parent 271f6a187472506ddf73f686f4cdeb927c5292e8
Author: lumidify <nobody@lumidify.org>
Date:   Sat,  2 Jan 2021 20:25:29 +0100

Fix redrawing of cropping rectangle

Diffstat:
M.gitignore | 1+
MMakefile | 1-
MREADME | 3+++
Mcroptool.1 | 2+-
Mcroptool.c | 46++++++++++++++++++++++++++++------------------
5 files changed, 33 insertions(+), 20 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -1 +1,2 @@ croptool +croptool_crop diff --git a/Makefile b/Makefile @@ -7,7 +7,6 @@ PREFIX = /usr/local MANPREFIX = ${PREFIX}/man BIN = ${NAME} croptool_crop -SRC = ${BIN:=.c} MAN1 = ${BIN:=.1} CFLAGS += -D_POSIX_C_SOURCE=200809L `pkg-config --cflags x11` `imlib2-config --cflags` diff --git a/README b/README @@ -2,4 +2,7 @@ croptool - mass image cropping tool REQUIREMENTS: xlib, imlib2 +croptool is a simple tool to select cropping rectangles +on images and print out a command to crop each image. + See croptool.1 for more information. diff --git a/croptool.1 b/croptool.1 @@ -1,4 +1,4 @@ -.Dd January 1, 2021 +.Dd January 2, 2021 .Dt CROPTOOL 1 .Os .Sh NAME diff --git a/croptool.c b/croptool.c @@ -136,6 +136,7 @@ static void get_scaled_size(int orig_w, int orig_h, int *scaled_w, int *scaled_h 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 drag_motion(XEvent event); static void resize_window(int w, int h); static void button_release(XEvent event); @@ -531,6 +532,8 @@ button_press(XEvent event) { int y = event.xbutton.y; int x0 = rect->x0, x1 = rect->x1; int y0 = rect->y0, y1 = rect->y1; + /* erase old rectangle */ + queue_rectangle_redraw(x0, y0, x1, y1); if (collide_point(x, y, x0, y0)) { rect->x0 = x1; rect->y0 = y1; @@ -615,6 +618,27 @@ resize_window(int w, int h) { } static void +queue_rectangle_redraw(int x0, int y0, int x1, int y1) { + sort_coordinates(&x0, &y0, &x1, &y1); + queue_update( + x0 - LINE_WIDTH > 0 ? x0 - LINE_WIDTH : 0, + y0 - LINE_WIDTH > 0 ? y0 - LINE_WIDTH : 0, + x1 - x0 + LINE_WIDTH * 2, LINE_WIDTH * 2); + queue_update( + x0 - LINE_WIDTH > 0 ? x0 - LINE_WIDTH : 0, + y1 - LINE_WIDTH > 0 ? y1 - LINE_WIDTH : 0, + x1 - x0 + LINE_WIDTH * 2, LINE_WIDTH * 2); + queue_update( + x0 - LINE_WIDTH > 0 ? x0 - LINE_WIDTH : 0, + y0 - LINE_WIDTH > 0 ? y0 - LINE_WIDTH : 0, + LINE_WIDTH * 2, y1 - y0 + LINE_WIDTH * 2); + queue_update( + x1 - LINE_WIDTH > 0 ? x1 - LINE_WIDTH : 0, + y0 - LINE_WIDTH > 0 ? y0 - LINE_WIDTH : 0, + LINE_WIDTH * 2, y1 - y0 + LINE_WIDTH * 2); +} + +static void drag_motion(XEvent event) { if (state.cur_selection < 0 || !state.selections[state.cur_selection].valid) return; @@ -624,6 +648,8 @@ drag_motion(XEvent event) { int x0 = rect->x0, x1 = rect->x1; int y0 = rect->y0, y1 = rect->y1; sort_coordinates(&x0, &y0, &x1, &y1); + 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; @@ -663,24 +689,8 @@ drag_motion(XEvent event) { return; } - if (SELECTION_REDRAW) { - queue_update( - x0 - LINE_WIDTH > 0 ? x0 - LINE_WIDTH : 0, - y0 - LINE_WIDTH > 0 ? y0 - LINE_WIDTH : 0, - x1 - x0 + LINE_WIDTH * 2, LINE_WIDTH * 2); - queue_update( - x0 - LINE_WIDTH > 0 ? x0 - LINE_WIDTH : 0, - y1 - LINE_WIDTH > 0 ? y1 - LINE_WIDTH : 0, - x1 - x0 + LINE_WIDTH * 2, LINE_WIDTH * 2); - queue_update( - x0 - LINE_WIDTH > 0 ? x0 - LINE_WIDTH : 0, - y0 - LINE_WIDTH > 0 ? y0 - LINE_WIDTH : 0, - LINE_WIDTH * 2, y1 - y0 + LINE_WIDTH * 2); - queue_update( - x1 - LINE_WIDTH > 0 ? x1 - LINE_WIDTH : 0, - y0 - LINE_WIDTH > 0 ? y0 - LINE_WIDTH : 0, - LINE_WIDTH * 2, y1 - y0 + LINE_WIDTH * 2); - } + if (SELECTION_REDRAW) + queue_rectangle_redraw(rect->x0, rect->y0, rect->x1, rect->y1); } static void