void tabs_only(view_t *view) { if(cfg.pane_tabs) { pane_tabs_t *const ptabs = get_pane_tabs(curr_view); while(DA_SIZE(ptabs->tabs) != 1U) { pane_tab_t *const ptab = &ptabs->tabs[ptabs->current == 0 ? 1 : 0]; ptabs->current -= (ptabs->current == 0 ? 0 : 1); free_pane_tab(ptab); DA_REMOVE(ptabs->tabs, ptab); } } else { while(DA_SIZE(gtabs) != 1U) { global_tab_t *const gtab = >abs[current_tab == 0 ? 1 : 0]; current_tab -= (current_tab == 0 ? 0 : 1); free_global_tab(gtab); DA_REMOVE(gtabs, gtab); } } }
/* Creates new global tab with the specified name, which might be NULL. Returns * zero on success, otherwise non-zero is returned. */ static int tabs_new_global(const char name[]) { global_tab_t new_tab = {}; if(DA_EXTEND(gtabs) == NULL) { return 1; } if(tabs_new_pane(&new_tab.left, &lwin, NULL) == NULL || tabs_new_pane(&new_tab.right, &rwin, NULL) == NULL) { free_global_tab(&new_tab); return 1; } update_string(&new_tab.name, name); capture_global_state(&new_tab); new_tab.preview.on = curr_stats.preview.on; DA_COMMIT(gtabs); /* We're called from tabs_init(). */ if(DA_SIZE(gtabs) == 1U) { gtabs[0U] = new_tab; return 0; } memmove(gtabs + current_tab + 2, gtabs + current_tab + 1, sizeof(*gtabs)*(DA_SIZE(gtabs) - (current_tab + 2))); gtabs[current_tab + 1] = new_tab; tabs_goto(current_tab + 1); return 0; }
void tabs_close(void) { // XXX: FUSE filesystems aren't exited this way, but this might be OK because // usually we exit from them on explicit ".." by a user. if(cfg.pane_tabs) { pane_tabs_t *const ptabs = get_pane_tabs(curr_view); pane_tab_t *const ptab = &ptabs->tabs[ptabs->current]; const int n = (int)DA_SIZE(ptabs->tabs); if(n != 1) { tabs_goto(ptabs->current + (ptabs->current == n - 1 ? -1 : +1)); if(ptabs->current > ptab - ptabs->tabs) { --ptabs->current; } free_pane_tab(ptab); DA_REMOVE(ptabs->tabs, ptab); } //add by sim1 for test //ui_sb_msgf("tabs_close: curr=%d, last=%d, tabs=%d", ptabs->current, ptabs->last, (int)DA_SIZE(ptabs->tabs)); } else { global_tab_t *const gtab = >abs[current_tab]; const int n = (int)DA_SIZE(gtabs); if(n != 1) { tabs_goto(current_tab == n - 1 ? current_tab - 1 : current_tab + 1); if(current_tab > gtab - gtabs) { --current_tab; } free_global_tab(gtab); DA_REMOVE(gtabs, gtab); } } }