URI: 
       tAllow two different selection box colors - croptool - Image cropping tool
  HTML git clone git://lumidify.org/croptool.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
       ---
   DIR commit a02921f770f7fe0de7ea4dc184851a2cd0b8cf1b
   DIR parent 65d16f82af9f93ad26d93b94feb963e64dfa0b60
  HTML Author: lumidify <nobody@lumidify.org>
       Date:   Mon, 25 May 2020 20:38:54 +0200
       
       Allow two different selection box colors
       
       Diffstat:
         M README                              |       5 ++++-
         M croptool.c                          |      30 +++++++++++++++++++++++++-----
       
       2 files changed, 29 insertions(+), 6 deletions(-)
       ---
   DIR diff --git a/README b/README
       t@@ -32,6 +32,8 @@ Several keys are recognized:
        * 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.
       +* Tab switches the color of the selection box between the two colors
       +  defined at the top of `croptool.c` (SELECTION_COLOR1, SELECTION_COLOR2).
        
        Note that resizing the window currently does not resize the images.
        It will only take effect if you move to another image or press
       t@@ -56,7 +58,8 @@ Configuration:
        If you want to, you can edit a few things at the top of `bookcrop.c`.
        COLLISION_PADDING is the number of pixels to check for collision if
        an edge or corner is clicked.
       -SELECTION_COLOR is the color the selection box is drawn in.
       +SELECTION_COLOR1 and SELECTION_COLOR2 are the two colors for the
       +selection box that can be switched with tab.
        If you want to change the command that is output, you can change
        the function `print_cmd`. It just receives the filename, the coordinates
        of the top left corner of the cropping box, and the width and height
   DIR diff --git a/croptool.c b/croptool.c
       t@@ -27,7 +27,9 @@
         * (in order to change the size of the box) */
        static const int COLLISION_PADDING = 10;
        /* The color of the selection box */
       -static const char *SELECTION_COLOR = "#000";
       +static const char *SELECTION_COLOR1 = "#000";
       +/* The second selection color - when tab is pressed */
       +static const char *SELECTION_COLOR2 = "#fff";
        
        /* Change this if you want a different output format. */
        static void
       t@@ -68,7 +70,9 @@ struct State {
                gboolean resizing;
                gboolean lock_x;
                gboolean lock_y;
       -        GdkColor gdk_color;
       +        GdkColor col1;
       +        GdkColor col2;
       +        int cur_col;
        };
        
        static void swap(int *a, int *b);
       t@@ -92,6 +96,7 @@ static GdkPixbuf *load_pixbuf(char *filename, int w, int h, int *actual_w, int *
        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);
       +static void switch_color(GtkWidget *area, struct State *state);
        
        int main(int argc, char *argv[]) {
                GtkWidget *window;
       t@@ -116,6 +121,7 @@ int main(int argc, char *argv[]) {
                state->lock_y = FALSE;
                state->window_w = 0;
                state->window_h = 0;
       +        state->cur_col = 1;
                for (int i = 0; i < argc; i++) {
                        state->selections[i] = NULL;
                }
       t@@ -143,8 +149,10 @@ int main(int argc, char *argv[]) {
                gtk_widget_show_all(window);
        
                GdkColormap *cmap = gdk_drawable_get_colormap(area->window);
       -        gdk_colormap_alloc_color(cmap, &state->gdk_color, FALSE, TRUE);
       -        gdk_color_parse(SELECTION_COLOR, &state->gdk_color);
       +        gdk_colormap_alloc_color(cmap, &state->col1, FALSE, TRUE);
       +        gdk_color_parse(SELECTION_COLOR1, &state->col1);
       +        gdk_colormap_alloc_color(cmap, &state->col2, FALSE, TRUE);
       +        gdk_color_parse(SELECTION_COLOR2, &state->col2);
                g_object_unref(cmap);
        
                gtk_main();
       t@@ -326,9 +334,10 @@ redraw(GtkWidget *area, struct State *state) {
                gdk_cairo_set_source_pixbuf(cr, state->cur_pixbuf, 0, 0);
                cairo_paint(cr);
        
       +        GdkColor col = state->cur_col == 1 ? state->col1 : state->col2;
                if (state->selections[state->cur_selection]) {
                        struct Rect rect = state->selections[state->cur_selection]->rect;
       -                gdk_cairo_set_source_color(cr, &state->gdk_color);
       +                gdk_cairo_set_source_color(cr, &col);
                        cairo_move_to(cr, rect.x0, rect.y0);
                        cairo_line_to(cr, rect.x1, rect.y0);
                        cairo_line_to(cr, rect.x1, rect.y1);
       t@@ -537,6 +546,14 @@ resize_manual(GtkWidget *area, struct State *state) {
                change_picture(area, tmp_pixbuf, state->cur_selection, orig_w, orig_h, state, FALSE);
        }
        
       +static void
       +switch_color(GtkWidget *area, struct State *state) {
       +        if (state->cur_selection < 0 || !state->selections[state->cur_selection])
       +                return;
       +        state->cur_col = state->cur_col == 1 ? 2 : 1;
       +        gtk_widget_queue_draw(area);
       +}
       +
        static gboolean
        key_press(GtkWidget *area, GdkEventKey *event, gpointer data) {
                struct State *state = (struct State *)data;
       t@@ -556,6 +573,9 @@ key_press(GtkWidget *area, GdkEventKey *event, gpointer data) {
                case GDK_KEY_space:
                        resize_manual(area, state);
                        break;
       +        case GDK_KEY_Tab:
       +                switch_color(area, state);
       +                break;
                }
                return FALSE;
        }