aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/releases.txt1
-rw-r--r--src/gwin/gwin_progressbar.c43
2 files changed, 20 insertions, 24 deletions
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);