URI:
       tAllow to resize the image with space bar - croptool - Image cropping tool
  HTML git clone git://lumidify.org/croptool.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
       ---
   DIR commit 0eccd55570f34853180ebda08d28dc18f5ddbdaa
   DIR parent 3c5129b4e685e8e098026434ea5e5807050dc18e
  HTML Author: lumidify <nobody@lumidify.org>
       Date:   Tue,  5 May 2020 18:06:09 +0200
       
       Allow to resize the image with space bar
       
       Diffstat:
         M README                              |      29 ++++++++++++++++-------------
         M croptool.c                          |      27 ++++++++++++++++++++++-----
       
       2 files changed, 38 insertions(+), 18 deletions(-)
       ---
   DIR diff --git a/README b/README
       t@@ -20,21 +20,24 @@ in the middle, you can move it. Clicking outside creates a new box.
        I don't know if all of the collision logic is entirely correct, so
        tell me if you notice any problems.
        
       -Four keys are recognized: enter/return, delete, right arrow, and left arrow.
       -Enter and right arrow both go to the next image, but enter copies the
       -selection box from the current image and uses it for the next picture,
       -while right arrow just goes to the next image and only displays a
       -selection box if it already had one. This is so that lots of pages
       -of a digitized book can be cropped quickly since the selection box
       -needs to be tweaked occasionally (since my digitizing equipment, if it
       -can be called that, isn't exactly very professional). Left arrow
       -just goes to the last picture. Delete removes the selection for the
       -current image (this is then also not printed out at the end).
       +Several keys are recognized:
       +* Enter and right arrow both go to the next image, but enter copies the
       +  selection box from the current image and uses it for the next picture,
       +  while right arrow just goes to the next image and only displays a
       +  selection box if it already had one. This is so that lots of pages
       +  of a digitized book can be cropped quickly since the selection box
       +  needs to be tweaked occasionally (my digitizing equipment, if it
       +  can be called that, isn't exactly very professional).
       +* Left arrow just goes to the previous picture.
       +* Delete removes the selection for the current image (this is then
       +  also not printed out at the end).
       +* Space bar resizes the image if the window was resized.
        
        Note that resizing the window currently does not resize the images.
       -It will only take effect if you move to another image. There may be
       -bugs lurking here as well since the actual cropping box needs to be
       -scaled according to how much the image was scaled for display.
       +It will only take effect if you move to another image or press
       +space bar. There may be bugs lurking here as well since the actual
       +cropping box needs to be rescaled according to how much the image
       +was scaled for display.
        
        When the window is closed, the ImageMagick command (mogrify -crop...)
        for cropping each of the pictures that had a selection box defined
   DIR diff --git a/croptool.c b/croptool.c
       t@@ -91,6 +91,7 @@ static void last_picture(GtkWidget *area, struct State *state);
        static GdkPixbuf *load_pixbuf(char *filename, int w, int h, int *actual_w, int *actual_h);
        static void print_selection(struct Selection *sel, const char *filename);
        static void clear_selection(GtkWidget *area, struct State *state);
       +static void resize_manual(GtkWidget *area, struct State *state);
        
        int main(int argc, char *argv[]) {
                GtkWidget *window;
       t@@ -456,18 +457,18 @@ change_picture(
                } else if (!sel) {
                        /* Just fill it with -200 so we can check later if it has been used yet */
                        sel = create_selection(-200, -200, -200, -200, orig_w, orig_h, actual_w, actual_h);
       -        } else if (sel->rect.x0 != -200) {
       +        } else if (sel->rect.x0 != -200 && actual_w != sel->scaled_w) {
                        /* If there is a selection, we need to convert it to the new scale.
       -                 * This only takes width into account because the
       -                 * aspect ratio should have been preserved anyways */
       +                 * This only takes width into account because the aspect ratio
       +                 * should have been preserved anyways */
                        double scale = (double)actual_w / sel->scaled_w;
                        sel->rect.x0 = round(sel->rect.x0 * scale);
                        sel->rect.y0 = round(sel->rect.y0 * scale);
                        sel->rect.x1 = round(sel->rect.x1 * scale);
                        sel->rect.y1 = round(sel->rect.y1 * scale);
       -                sel->scaled_w = actual_w;
       -                sel->scaled_h = actual_h;
                }
       +        sel->scaled_w = actual_w;
       +        sel->scaled_h = actual_h;
                state->selections[state->cur_selection] = sel;
                gtk_widget_queue_draw(area);
        }
       t@@ -520,6 +521,19 @@ clear_selection(GtkWidget *area, struct State *state) {
                gtk_widget_queue_draw(area);
        }
        
       +static void
       +resize_manual(GtkWidget *area, struct State *state) {
       +        if (state->cur_selection < 0 || !state->selections[state->cur_selection])
       +                return;
       +        int orig_w, orig_h;
       +        GdkPixbuf *tmp_pixbuf = load_pixbuf(
       +            state->filenames[state->cur_selection],
       +            state->window_w, state->window_h, &orig_w, &orig_h);
       +        if (!tmp_pixbuf)
       +                return;
       +        change_picture(area, tmp_pixbuf, state->cur_selection, orig_w, orig_h, state, FALSE);
       +}
       +
        static gboolean
        key_press(GtkWidget *area, GdkEventKey *event, gpointer data) {
                struct State *state = (struct State *)data;
       t@@ -536,6 +550,9 @@ key_press(GtkWidget *area, GdkEventKey *event, gpointer data) {
                case GDK_KEY_Delete:
                        clear_selection(area, state);
                        break;
       +        case GDK_KEY_space:
       +                resize_manual(area, state);
       +                break;
                }
                return FALSE;
        }