int ui_browser__run(struct ui_browser *self, struct newtExitStruct *es) { if (ui_browser__refresh(self) < 0) return -1; while (1) { off_t offset; newtFormRun(self->form, es); if (es->reason != NEWT_EXIT_HOTKEY) break; if (is_exit_key(es->u.key)) return es->u.key; switch (es->u.key) { case NEWT_KEY_DOWN: if (self->index == self->nr_entries - 1) break; ++self->index; if (self->index == self->top_idx + self->height) { ++self->top_idx; self->seek(self, +1, SEEK_CUR); } break; case NEWT_KEY_UP: if (self->index == 0) break; --self->index; if (self->index < self->top_idx) { --self->top_idx; self->seek(self, -1, SEEK_CUR); } break; case NEWT_KEY_PGDN: case ' ': if (self->top_idx + self->height > self->nr_entries - 1) break; offset = self->height; if (self->index + offset > self->nr_entries - 1) offset = self->nr_entries - 1 - self->index; self->index += offset; self->top_idx += offset; self->seek(self, +offset, SEEK_CUR); break; case NEWT_KEY_PGUP: if (self->top_idx == 0) break; if (self->top_idx < self->height) offset = self->top_idx; else offset = self->height; self->index -= offset; self->top_idx -= offset; self->seek(self, -offset, SEEK_CUR); break; case NEWT_KEY_HOME: ui_browser__reset_index(self); break; case NEWT_KEY_END: offset = self->height - 1; if (offset >= self->nr_entries) offset = self->nr_entries - 1; self->index = self->nr_entries - 1; self->top_idx = self->index - offset; self->seek(self, -offset, SEEK_END); break; default: return es->u.key; } if (ui_browser__refresh(self) < 0) return -1; } return 0; }
int ui_browser__run(struct ui_browser *browser, int delay_secs) { int err, key; while (1) { off_t offset; pthread_mutex_lock(&ui__lock); err = __ui_browser__refresh(browser); SLsmg_refresh(); pthread_mutex_unlock(&ui__lock); if (err < 0) break; key = ui__getch(delay_secs); if (key == K_RESIZE) { ui__refresh_dimensions(false); browser->refresh_dimensions(browser); __ui_browser__show_title(browser, browser->title); ui_helpline__puts(browser->helpline); continue; } if (browser->use_navkeypressed && !browser->navkeypressed) { if (key == K_DOWN || key == K_UP || key == K_PGDN || key == K_PGUP || key == K_HOME || key == K_END || key == ' ') { browser->navkeypressed = true; continue; } else return key; } switch (key) { case K_DOWN: if (browser->index == browser->nr_entries - 1) break; ++browser->index; if (browser->index == browser->top_idx + browser->rows) { ++browser->top_idx; browser->seek(browser, +1, SEEK_CUR); } break; case K_UP: if (browser->index == 0) break; --browser->index; if (browser->index < browser->top_idx) { --browser->top_idx; browser->seek(browser, -1, SEEK_CUR); } break; case K_PGDN: case ' ': if (browser->top_idx + browser->rows > browser->nr_entries - 1) break; offset = browser->rows; if (browser->index + offset > browser->nr_entries - 1) offset = browser->nr_entries - 1 - browser->index; browser->index += offset; browser->top_idx += offset; browser->seek(browser, +offset, SEEK_CUR); break; case K_PGUP: if (browser->top_idx == 0) break; if (browser->top_idx < browser->rows) offset = browser->top_idx; else offset = browser->rows; browser->index -= offset; browser->top_idx -= offset; browser->seek(browser, -offset, SEEK_CUR); break; case K_HOME: ui_browser__reset_index(browser); break; case K_END: offset = browser->rows - 1; if (offset >= browser->nr_entries) offset = browser->nr_entries - 1; browser->index = browser->nr_entries - 1; browser->top_idx = browser->index - offset; browser->seek(browser, -offset, SEEK_END); break; default: return key; } } return -1; }