From 98cb1e62e766872157d965829922039df9275a12 Mon Sep 17 00:00:00 2001 From: Bill Kendrick Date: Tue, 21 Mar 2023 22:57:59 -0700 Subject: [PATCH] Prevent pipette dismissal upon release over 'Back' On touch devices, the color pipette tool could easilly be immediately dismissed due to the 'button up' event happening right where the "Back" dismissal/cancel button appeared. Now only pays attention to 'release' if the button was down. (h/t Pere for reporting this) --- docs/CHANGES.txt | 9 +++++- src/tuxpaint.c | 77 +++++++++++++++++++++++++++--------------------- 2 files changed, 51 insertions(+), 35 deletions(-) diff --git a/docs/CHANGES.txt b/docs/CHANGES.txt index dc91465b8..f9e2a984a 100644 --- a/docs/CHANGES.txt +++ b/docs/CHANGES.txt @@ -7,7 +7,7 @@ Various contributors (see below, and AUTHORS.txt) https://tuxpaint.org/ -2023.March.19 (0.9.29) ### RC2 +2023.March.21 (0.9.29) ### RC2 * Improvements to "Stamp" tool: ----------------------------- * Stamps may now be rotated. @@ -199,6 +199,13 @@ https://tuxpaint.org/ Blocks, Chalk, and Drip (hence this being listed as a bug fix). h/t Pere for discovering this. + * On touch devices, the color pipette tool could easilly be + immediately dismissed due to the 'button up' event happening + right where the "Back" dismissal/cancel button appeared. + Now only pays attention to 'release' if the button was down. + Bill Kendrick + h/t Pere for reporting this. + * SDL1.2 supported "SDL_VIDEO_WINDOW_POS" environment variable, but SDL2 does not; so reimplemented it ourselves. (See ENVARS docs.) Bill Kendrick diff --git a/src/tuxpaint.c b/src/tuxpaint.c index 589e26d87..674856d54 100644 --- a/src/tuxpaint.c +++ b/src/tuxpaint.c @@ -22,7 +22,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA (See COPYING.txt) - June 14, 2002 - March 19, 2023 + June 14, 2002 - March 21, 2023 */ #include "platform.h" @@ -24390,7 +24390,7 @@ static int do_color_sel(int temp_mode) int stepx, stepy; int number_of_steps = 20; int i, dx, dy; - int done, chose; + int done, chose, mouse_was_down; int back_left, back_top; int color_sel_x = 0, color_sel_y = 0; int want_animated_popups; @@ -24593,6 +24593,8 @@ static int do_color_sel(int temp_mode) r_color_sel.y + r_color_sel.h / 2); #endif + mouse_was_down = temp_mode; + do { while (SDL_PollEvent(&event)) @@ -24625,47 +24627,54 @@ static int do_color_sel(int temp_mode) done = 1; } } - else if (event.type == SDL_MOUSEBUTTONUP - && valid_click(event.button.button)) + else if (event.type == SDL_MOUSEBUTTONDOWN) { - if (event.button.x >= r_canvas.x && - event.button.x < r_canvas.x + r_canvas.w && - event.button.y >= r_canvas.y - && event.button.y < r_canvas.y + r_canvas.h) + mouse_was_down = 1; + } + else if (event.type == SDL_MOUSEBUTTONUP) + { + if (valid_click(event.button.button && mouse_was_down)) { - /* Picked a color in the canvas, and released! */ - - chose = 1; - done = 1; - - x = event.button.x - r_canvas.x; - y = event.button.y - r_canvas.y; - - color_sel_x = x; - color_sel_y = y; - } - else - { - if (!temp_mode) + if (event.button.x >= r_canvas.x && + event.button.x < r_canvas.x + r_canvas.w && + event.button.y >= r_canvas.y + && event.button.y < r_canvas.y + r_canvas.h) { - if (event.button.x >= back_left && - event.button.x < back_left + img_back->w && - event.button.y >= back_top - && event.button.y < back_top + img_back->h) + /* Picked a color in the canvas, and released! */ + + chose = 1; + done = 1; + + x = event.button.x - r_canvas.x; + y = event.button.y - r_canvas.y; + + color_sel_x = x; + color_sel_y = y; + } + else + { + if (!temp_mode) { - /* Full UI mode: Decided to go Back; abort */ - + if (event.button.x >= back_left && + event.button.x < back_left + img_back->w && + event.button.y >= back_top + && event.button.y < back_top + img_back->h) + { + /* Full UI mode: Decided to go Back; abort */ + + chose = 0; + done = 1; + } + } + else + { + /* Temp mode: Released outside of canvas; abort */ chose = 0; done = 1; } } - else - { - /* Temp mode: Released outside of canvas; abort */ - chose = 0; - done = 1; - } } + mouse_was_down = 0; } else if (event.type == SDL_MOUSEMOTION) {