diff --git a/docs/releases.txt b/docs/releases.txt index bd0b3e5c..0e520252 100644 --- a/docs/releases.txt +++ b/docs/releases.txt @@ -16,6 +16,7 @@ FIX: Fixed an issue with color formats in Linux-Framebuffer board files FIX: Fixing and improving arc rendering functions FIX: Preventing possible crash when no valid GWIN default font has been set FIX: Updating Windows binaries of the font encoder to improve compatibility +FIX: Fix Progressbar bounds checking and decrementing *** Release 2.6 *** diff --git a/src/gwin/gwin_progressbar.c b/src/gwin/gwin_progressbar.c index d06f8058..ce11934f 100644 --- a/src/gwin/gwin_progressbar.c +++ b/src/gwin/gwin_progressbar.c @@ -102,9 +102,17 @@ void gwinProgressbarSetRange(GHandle gh, int min, int max) { if (min == max) // prevent divide by 0 errors. max++; - gsw->min = min; - gsw->max = max; - gsw->pos = min; + if (min <= max) { + gsw->min = min; + gsw->max = max; + gsw->pos = min; + gsw->res = 1; + } else { + gsw->min = max; + gsw->max = min; + gsw->pos = min; + gsw->res = -1; + } PBResetDisplayPos(gsw); @@ -117,15 +125,9 @@ void gwinProgressbarSetPosition(GHandle gh, int pos) { if (gh->vmt != (gwinVMT *)&progressbarVMT) return; - if (gsw->min <= gsw->max) { - if (pos < gsw->min) gsw->pos = gsw->min; - else if (pos > gsw->max) gsw->pos = gsw->max; - else gsw->pos = pos; - } else { - if (pos > gsw->min) gsw->pos = gsw->min; - else if (pos < gsw->max) gsw->pos = gsw->max; - else gsw->pos = pos; - } + if (pos < gsw->min) gsw->pos = gsw->min; + else if (pos > gsw->max) gsw->pos = gsw->max; + else gsw->pos = pos; PBResetDisplayPos(gsw); _gwinUpdate(gh); @@ -139,9 +141,6 @@ void gwinProgressbarSetResolution(GHandle gh, int resolution) { if (gh->vmt != (gwinVMT *)&progressbarVMT) return; - if (resolution <= 0) - resolution = 1; - gsw->res = resolution; #undef gsw @@ -153,10 +152,9 @@ void gwinProgressbarIncrement(GHandle gh) { if (gh->vmt != (gwinVMT *)&progressbarVMT) return; - if (gsw->max - gsw->pos > gsw->res) - gsw->pos += gsw->res; - else - gsw->pos = gsw->max; + gsw->pos += gsw->res; + if (gsw->pos < gsw->min) gsw->pos = gsw->min; + else if (gsw->pos > gsw->max) gsw->pos = gsw->max; PBResetDisplayPos(gsw); _gwinUpdate(gh); @@ -170,12 +168,9 @@ void gwinProgressbarDecrement(GHandle gh) { if (gh->vmt != (gwinVMT *)&progressbarVMT) return; - if (gsw->pos > gsw->res) - gsw->pos -= gsw->min; - else - gsw->pos = gsw->min; - gsw->pos -= gsw->res; + if (gsw->pos < gsw->min) gsw->pos = gsw->min; + else if (gsw->pos > gsw->max) gsw->pos = gsw->max; PBResetDisplayPos(gsw); _gwinUpdate(gh);