void ui_browser__list_head_seek(struct ui_browser *self, off_t offset, int whence) { struct list_head *head = self->entries; struct list_head *pos; if (self->nr_entries == 0) return; switch (whence) { case SEEK_SET: pos = ui_browser__list_head_filter_entries(self, head->next); break; case SEEK_CUR: pos = self->top; break; case SEEK_END: pos = ui_browser__list_head_filter_prev_entries(self, head->prev); break; default: return; } assert(pos != NULL); if (offset > 0) { while (offset-- != 0) pos = ui_browser__list_head_filter_entries(self, pos->next); } else { while (offset++ != 0) pos = ui_browser__list_head_filter_prev_entries(self, pos->prev); } self->top = pos; }
unsigned int ui_browser__list_head_refresh(struct ui_browser *browser) { struct list_head *pos; struct list_head *head = browser->entries; int row = 0; if (browser->top == NULL || browser->top == browser->entries) browser->top = ui_browser__list_head_filter_entries(browser, head->next); pos = browser->top; list_for_each_from(pos, head) { if (!browser->filter || !browser->filter(browser, pos)) { ui_browser__gotorc(browser, row, 0); browser->write(browser, pos, row); if (++row == browser->rows) break; } } return row; }