summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Davenport <qball@blame.services>2022-09-10 17:42:49 +0200
committerDave Davenport <qball@blame.services>2022-09-10 17:42:49 +0200
commit858d6c030c69dde568f0708dded8083385c17144 (patch)
tree397fdd9edcb26fc45b5daa0ebedfdb2a49b83699
parentfce721a1053ad6d861834e9f3a9c96c20bf1eb6d (diff)
[listview] Add extra checks before resolving pointer.
Issue: #1703
-rw-r--r--source/widgets/listview.c53
1 files changed, 40 insertions, 13 deletions
diff --git a/source/widgets/listview.c b/source/widgets/listview.c
index 2b8f5d81..52146702 100644
--- a/source/widgets/listview.c
+++ b/source/widgets/listview.c
@@ -583,13 +583,20 @@ unsigned int listview_get_selected(listview *lv) {
}
void listview_set_selected(listview *lv, unsigned int selected) {
- if (lv && lv->req_elements > 0) {
+ if (lv == NULL) {
+ return;
+ }
+ if (lv->req_elements > 0) {
lv->selected = MIN(selected, lv->req_elements - 1);
lv->barview.direction = LEFT_TO_RIGHT;
widget_queue_redraw(WIDGET(lv));
- lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ if (lv->sc_callback) {
+ lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ }
} else if (lv->req_elements == 0) {
- lv->sc_callback(lv, UINT32_MAX, lv->sc_udata);
+ if (lv->sc_callback) {
+ lv->sc_callback(lv, UINT32_MAX, lv->sc_udata);
+ }
}
}
@@ -790,7 +797,9 @@ static void listview_nav_up_int(listview *lv) {
lv->selected--;
lv->barview.direction = RIGHT_TO_LEFT;
- lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ if (lv->sc_callback) {
+ lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ }
widget_queue_redraw(WIDGET(lv));
}
static void listview_nav_down_int(listview *lv) {
@@ -805,7 +814,9 @@ static void listview_nav_down_int(listview *lv) {
? MIN(lv->req_elements - 1, lv->selected + 1)
: 0;
lv->barview.direction = LEFT_TO_RIGHT;
- lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ if (lv->sc_callback) {
+ lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ }
widget_queue_redraw(WIDGET(lv));
}
void listview_nav_next(listview *lv) {
@@ -824,14 +835,18 @@ void listview_nav_prev(listview *lv) {
static void listview_nav_column_left_int(listview *lv) {
if (lv->selected >= lv->cur_columns) {
lv->selected -= lv->cur_columns;
- lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ if (lv->sc_callback) {
+ lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ }
widget_queue_redraw(WIDGET(lv));
}
}
static void listview_nav_column_right_int(listview *lv) {
if ((lv->selected + lv->cur_columns) < lv->req_elements) {
lv->selected += lv->cur_columns;
- lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ if (lv->sc_callback) {
+ lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ }
widget_queue_redraw(WIDGET(lv));
}
}
@@ -890,7 +905,9 @@ void listview_nav_left(listview *lv) {
}
if (lv->selected >= lv->max_rows) {
lv->selected -= lv->max_rows;
- lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ if (lv->sc_callback) {
+ lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ }
widget_queue_redraw(WIDGET(lv));
}
}
@@ -911,7 +928,9 @@ void listview_nav_right(listview *lv) {
}
if ((lv->selected + lv->max_rows) < lv->req_elements) {
lv->selected += lv->max_rows;
- lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ if (lv->sc_callback) {
+ lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ }
widget_queue_redraw(WIDGET(lv));
} else if (lv->selected < (lv->req_elements - 1)) {
// We do not want to move to last item, UNLESS the last column is only
@@ -923,7 +942,9 @@ void listview_nav_right(listview *lv) {
// If there is an extra column, move.
if (col != ncol) {
lv->selected = lv->req_elements - 1;
- lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ if (lv->sc_callback) {
+ lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ }
widget_queue_redraw(WIDGET(lv));
}
}
@@ -949,7 +970,9 @@ static void listview_nav_page_prev_int(listview *lv) {
} else {
lv->selected -= (lv->max_elements);
}
- lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ if (lv->sc_callback) {
+ lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ }
widget_queue_redraw(WIDGET(lv));
}
static void listview_nav_page_next_int(listview *lv) {
@@ -964,7 +987,9 @@ static void listview_nav_page_next_int(listview *lv) {
lv->selected = MIN(new, lv->req_elements - 1);
lv->barview.direction = LEFT_TO_RIGHT;
- lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ if (lv->sc_callback) {
+ lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ }
widget_queue_redraw(WIDGET(lv));
return;
}
@@ -972,7 +997,9 @@ static void listview_nav_page_next_int(listview *lv) {
if (lv->selected >= lv->req_elements) {
lv->selected = lv->req_elements - 1;
}
- lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ if (lv->sc_callback) {
+ lv->sc_callback(lv, lv->selected, lv->sc_udata);
+ }
widget_queue_redraw(WIDGET(lv));
}