1
0
Fork 0
mirror of https://github.com/davatorium/rofi.git synced 2025-02-17 15:45:56 -05:00

[listview] Add extra checks before resolving pointer.

Issue: #1703
This commit is contained in:
Dave Davenport 2022-09-10 17:42:49 +02:00
parent fce721a105
commit 858d6c030c

View file

@ -583,13 +583,20 @@ unsigned int listview_get_selected(listview *lv) {
} }
void listview_set_selected(listview *lv, unsigned int selected) { 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->selected = MIN(selected, lv->req_elements - 1);
lv->barview.direction = LEFT_TO_RIGHT; lv->barview.direction = LEFT_TO_RIGHT;
widget_queue_redraw(WIDGET(lv)); 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) { } 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->selected--;
lv->barview.direction = RIGHT_TO_LEFT; 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)); widget_queue_redraw(WIDGET(lv));
} }
static void listview_nav_down_int(listview *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) ? MIN(lv->req_elements - 1, lv->selected + 1)
: 0; : 0;
lv->barview.direction = LEFT_TO_RIGHT; 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)); widget_queue_redraw(WIDGET(lv));
} }
void listview_nav_next(listview *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) { static void listview_nav_column_left_int(listview *lv) {
if (lv->selected >= lv->cur_columns) { if (lv->selected >= lv->cur_columns) {
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)); widget_queue_redraw(WIDGET(lv));
} }
} }
static void listview_nav_column_right_int(listview *lv) { static void listview_nav_column_right_int(listview *lv) {
if ((lv->selected + lv->cur_columns) < lv->req_elements) { if ((lv->selected + lv->cur_columns) < lv->req_elements) {
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)); widget_queue_redraw(WIDGET(lv));
} }
} }
@ -890,7 +905,9 @@ void listview_nav_left(listview *lv) {
} }
if (lv->selected >= lv->max_rows) { if (lv->selected >= lv->max_rows) {
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)); widget_queue_redraw(WIDGET(lv));
} }
} }
@ -911,7 +928,9 @@ void listview_nav_right(listview *lv) {
} }
if ((lv->selected + lv->max_rows) < lv->req_elements) { if ((lv->selected + lv->max_rows) < lv->req_elements) {
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)); widget_queue_redraw(WIDGET(lv));
} else if (lv->selected < (lv->req_elements - 1)) { } else if (lv->selected < (lv->req_elements - 1)) {
// We do not want to move to last item, UNLESS the last column is only // 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 there is an extra column, move.
if (col != ncol) { if (col != ncol) {
lv->selected = lv->req_elements - 1; 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)); widget_queue_redraw(WIDGET(lv));
} }
} }
@ -949,7 +970,9 @@ static void listview_nav_page_prev_int(listview *lv) {
} else { } else {
lv->selected -= (lv->max_elements); 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)); widget_queue_redraw(WIDGET(lv));
} }
static void listview_nav_page_next_int(listview *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->selected = MIN(new, lv->req_elements - 1);
lv->barview.direction = LEFT_TO_RIGHT; 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)); widget_queue_redraw(WIDGET(lv));
return; return;
} }
@ -972,7 +997,9 @@ static void listview_nav_page_next_int(listview *lv) {
if (lv->selected >= lv->req_elements) { if (lv->selected >= lv->req_elements) {
lv->selected = lv->req_elements - 1; 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)); widget_queue_redraw(WIDGET(lv));
} }