commit 89b192cbe0b959ae29cbdf20e955452d39e235a2
parent a67eb3e9010ebafadb4553d430cd91a8a42ae8e7
Author: lumidify <nobody@lumidify.org>
Date: Sun, 7 Mar 2021 11:55:03 +0100
Improve documentation; misc. other fixes
Diffstat:
7 files changed, 60 insertions(+), 37 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
@@ -1,4 +1,4 @@
-1.1 -> 1.2-dev
+1.1 -> 1.2.0-dev
* Rewrite using Xlib and Imlib2
* Add command-line options and man pages
* Add automatic resizing of image when resizing window
diff --git a/LICENSE b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2021 lumidify <nobody[at]lumidify.org>
+Copyright (c) 2021 lumidify <nobody@lumidify.org>
Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
diff --git a/Makefile b/Makefile
@@ -1,7 +1,7 @@
.POSIX:
NAME = croptool
-VERSION = 1.2-dev
+VERSION = 1.2.0-dev
PREFIX = /usr/local
MANPREFIX = ${PREFIX}/man
@@ -9,6 +9,7 @@ MANPREFIX = ${PREFIX}/man
BIN = ${NAME} croptool_crop
SRC = ${BIN:=.c}
MAN1 = ${BIN:=.1}
+MISCFILES = Makefile README CHANGELOG LICENSE TODO
CFLAGS += -D_POSIX_C_SOURCE=200809L `pkg-config --cflags x11` `imlib2-config --cflags`
LDFLAGS += `pkg-config --libs x11` `imlib2-config --libs` -lm
@@ -45,7 +46,7 @@ clean:
dist:
rm -rf "${NAME}-${VERSION}"
mkdir -p "${NAME}-${VERSION}"
- cp -f ${MAN1} ${SRC} Makefile "${NAME}-${VERSION}"
+ cp -f ${MAN1} ${SRC} ${MISCFILES} "${NAME}-${VERSION}"
tar cf - "${NAME}-${VERSION}" | gzip -c > "${NAME}-${VERSION}.tar.gz"
rm -rf "${NAME}-${VERSION}"
diff --git a/croptool.1 b/croptool.1
@@ -1,4 +1,4 @@
-.Dd March 6, 2021
+.Dd March 7, 2021
.Dt CROPTOOL 1
.Os
.Sh NAME
@@ -16,8 +16,8 @@
.Sh DESCRIPTION
.Nm
shows each of the given images and allows a cropping rectangle to be drawn.
-On exit, the cropping command is printed out for each of the files.
-If a file was skipped, nothing is printed out for it.
+On exit, the cropping command is printed for each of the files.
+If a file was skipped, nothing is printed for it.
.Sh OPTIONS
.Bl -tag -width Ds
.It Fl m
@@ -75,11 +75,10 @@ Print the location of the bottom side of the cropping rectangle in pixels.
.It %f
Print the filename of the image.
Warning: This is printed out as is, without any escaping.
-Yes, this should be fixed.
.El
.Pp
If an unknown substitution is encountered, a warning is printed to
-stderr and the characters are printed out verbatim.
+standard error and the characters are printed out verbatim.
.Sh KEYBINDS
.Bl -tag -width Ds
.It ARROW LEFT
@@ -88,6 +87,11 @@ Go to the last image.
Go to the next image.
.It RETURN
Go to the next image, copying the current cropping rectangle.
+Note that this copies the visual rectangle, not the scaled rectangle
+that is printed for the cropping command.
+In other words, when switching to an image that is a different size and
+thus scaled differently, the displayed rectangle will stay the same even
+though the pixels covered in the original image are different.
.It TAB
Switch the color of the cropping rectangle between the primary and secondary colors.
.It DELETE
@@ -101,9 +105,10 @@ This is useful when automatic redrawing is disabled with
.Bl -tag -width Ds
.It LEFT-CLICK
When inside an existing cropping rectangle, drag it around.
-When on one of the edges, resize the rectangle, locking it to that dimension.
-When on one of the corners, resize the rectangle regardless of dimension.
-When outside an existing cropping rectangle, start a new cropping rectangle.
+When on one of the edges, resize the rectangle, locking it to that axis.
+When on one of the corners, resize the rectangle regardless of axis.
+When outside an existing cropping rectangle, replace the current rectangle
+with a new one.
.El
.Sh EXIT STATUS
.Ex -std
@@ -120,7 +125,7 @@ $ croptool *.jpg | sh
.Ed
.Pp
It is also possible to do more advanced things.
-For instance, to put cropped images into a separate directory instead of
+For instance, to save cropped images into a separate directory instead of
overwriting the original images, something like this can be done:
.Bd -literal
$ croptool -f "croptool_crop %wx%h+%l+%t '%f' '/path/to/cropped/%f'" *.jpg | sh
diff --git a/croptool.c b/croptool.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021 lumidify <nobody[at]lumidify.org>
+ * Copyright (c) 2021 lumidify <nobody@lumidify.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -137,7 +137,7 @@ static void cleanup(void);
static void sort_coordinates(int *x0, int *y0, int *x1, int *y1);
static void swap(int *a, int *b);
static void redraw(void);
-static void print_cmd(const char *filename, int x, int y, int w, int h);
+static void print_cmd(const char *filename, int x, int y, int w, int h, int dry_run);
static void print_selection(struct Selection *sel, const char *filename);
static int collide_point(int x, int y, int x_point, int y_point);
static int collide_line(int x, int y, int x0, int y0, int x1, int y1);
@@ -207,6 +207,8 @@ main(int argc, char *argv[]) {
break;
}
}
+ /* print warning if command format is invalid */
+ print_cmd("", 0, 0, 0, 0, 1);
argc -= optind;
argv += optind;
@@ -436,10 +438,11 @@ cleanup(void) {
XCloseDisplay(state.dpy);
}
-/* TODO: Allow printing filename without ending */
-/* TODO: Escape filename properly */
+/* TODO: Escape filename properly
+ * -> But how? Since the format can be set by the user,
+ * it isn't really clear *what* needs to be escaped. */
static void
-print_cmd(const char *filename, int x, int y, int w, int h) {
+print_cmd(const char *filename, int x, int y, int w, int h, int dry_run) {
short percent = 0;
const char *c;
int length = 0;
@@ -449,49 +452,63 @@ print_cmd(const char *filename, int x, int y, int w, int h) {
start_index++;
if (*c == '%') {
if (length) {
- printf("%.*s", length, CMD_FORMAT + start_index);
+ if (!dry_run)
+ printf("%.*s", length, CMD_FORMAT + start_index);
start_index += length;
length = 0;
}
- if (percent)
+ if (percent && !dry_run)
printf("%%");
percent++;
percent %= 2;
start_index++;
} else if (percent && *c == 'w') {
- printf("%d", w);
+ if (!dry_run)
+ printf("%d", w);
percent = 0;
} else if (percent && *c == 'h') {
- printf("%d", h);
+ if (!dry_run)
+ printf("%d", h);
percent = 0;
} else if (percent && *c == 'l') {
- printf("%d", x);
+ if (!dry_run)
+ printf("%d", x);
percent = 0;
} else if (percent && *c == 't') {
- printf("%d", y);
+ if (!dry_run)
+ printf("%d", y);
percent = 0;
} else if (percent && *c == 'r') {
- printf("%d", x + w);
+ if (!dry_run)
+ printf("%d", x + w);
percent = 0;
} else if (percent && *c == 'b') {
- printf("%d", y + h);
+ if (!dry_run)
+ printf("%d", y + h);
percent = 0;
} else if (percent && *c == 'f') {
- printf("%s", filename);
+ if (!dry_run)
+ printf("%s", filename);
percent = 0;
} else if (percent) {
- fprintf(stderr,
- "Warning: Unknown substitution '%c' in format string.\n", *c
- );
- printf("%%%c", *c);
+ if (dry_run) {
+ fprintf(stderr,
+ "Warning: Unknown substitution '%c' "
+ "in format string.\n", *c
+ );
+ } else {
+ printf("%%%c", *c);
+ }
percent = 0;
} else {
length++;
}
}
- if (length)
- printf("%.*s", length, CMD_FORMAT + start_index);
- printf("\n");
+ if (!dry_run) {
+ if (length)
+ printf("%.*s", length, CMD_FORMAT + start_index);
+ printf("\n");
+ }
}
/* Parses integer between 0 and 100 (non-inclusive).
@@ -643,7 +660,7 @@ print_selection(struct Selection *sel, const char *filename) {
y0 = y0 < 0 ? 0 : y0;
x1 = x1 > sel->orig_w ? sel->orig_w : x1;
y1 = y1 > sel->orig_h ? sel->orig_h : y1;
- print_cmd(filename, x0, y0, x1 - x0, y1 - y0);
+ print_cmd(filename, x0, y0, x1 - x0, y1 - y0, 0);
}
static int
diff --git a/croptool_crop.1 b/croptool_crop.1
@@ -17,7 +17,7 @@ to the dimensions specified, where
.Ar width
and
.Ar height
-are the width and height of the cropping rectangle, and
+are the width and height of the cropping rectangle and
.Ar x
and
.Ar y
diff --git a/croptool_crop.c b/croptool_crop.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021 lumidify <nobody[at]lumidify.org>
+ * Copyright (c) 2021 lumidify <nobody@lumidify.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above