=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/mode-tree.c,v retrieving revision 1.45 retrieving revision 1.46 diff -c -r1.45 -r1.46 *** src/usr.bin/tmux/mode-tree.c 2020/05/16 15:54:20 1.45 --- src/usr.bin/tmux/mode-tree.c 2020/05/16 16:02:24 1.46 *************** *** 1,4 **** ! /* $OpenBSD: mode-tree.c,v 1.45 2020/05/16 15:54:20 nicm Exp $ */ /* * Copyright (c) 2017 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: mode-tree.c,v 1.46 2020/05/16 16:02:24 nicm Exp $ */ /* * Copyright (c) 2017 Nicholas Marriott *************** *** 45,50 **** --- 45,51 ---- mode_tree_draw_cb drawcb; mode_tree_search_cb searchcb; mode_tree_menu_cb menucb; + mode_tree_height_cb heightcb; struct mode_tree_list children; struct mode_tree_list saved; *************** *** 79,84 **** --- 80,86 ---- int expanded; int tagged; + int draw_as_parent; struct mode_tree_list children; TAILQ_ENTRY(mode_tree_item) entry; *************** *** 210,216 **** } } ! static void mode_tree_up(struct mode_tree_data *mtd, int wrap) { if (mtd->current == 0) { --- 212,218 ---- } } ! void mode_tree_up(struct mode_tree_data *mtd, int wrap) { if (mtd->current == 0) { *************** *** 247,252 **** --- 249,260 ---- return (mtd->line_list[mtd->current].item->itemdata); } + const char * + mode_tree_get_current_name(struct mode_tree_data *mtd) + { + return (mtd->line_list[mtd->current].item->name); + } + void mode_tree_expand_current(struct mode_tree_data *mtd) { *************** *** 256,261 **** --- 264,278 ---- } } + void + mode_tree_collapse_current(struct mode_tree_data *mtd) + { + if (mtd->line_list[mtd->current].item->expanded) { + mtd->line_list[mtd->current].item->expanded = 0; + mode_tree_build(mtd); + } + } + static int mode_tree_get_tag(struct mode_tree_data *mtd, uint64_t tag, u_int *found) { *************** *** 343,349 **** struct mode_tree_data * mode_tree_start(struct window_pane *wp, struct args *args, mode_tree_build_cb buildcb, mode_tree_draw_cb drawcb, ! mode_tree_search_cb searchcb, mode_tree_menu_cb menucb, void *modedata, const struct menu_item *menu, const char **sort_list, u_int sort_size, struct screen **s) { --- 360,367 ---- struct mode_tree_data * mode_tree_start(struct window_pane *wp, struct args *args, mode_tree_build_cb buildcb, mode_tree_draw_cb drawcb, ! mode_tree_search_cb searchcb, mode_tree_menu_cb menucb, ! mode_tree_height_cb heightcb, void *modedata, const struct menu_item *menu, const char **sort_list, u_int sort_size, struct screen **s) { *************** *** 381,386 **** --- 399,405 ---- mtd->drawcb = drawcb; mtd->searchcb = searchcb; mtd->menucb = menucb; + mtd->heightcb = heightcb; TAILQ_INIT(&mtd->children); *************** *** 404,409 **** --- 423,449 ---- mtd->zoomed = -1; } + static void + mode_tree_set_height(struct mode_tree_data *mtd) + { + struct screen *s = &mtd->screen; + u_int height; + + if (mtd->heightcb != NULL) { + height = mtd->heightcb(mtd, screen_size_y(s)); + if (height < screen_size_y(s)) + mtd->height = screen_size_y(s) - height; + } else { + mtd->height = (screen_size_y(s) / 3) * 2; + if (mtd->height > mtd->line_size) + mtd->height = screen_size_y(s) / 2; + } + if (mtd->height < 10) + mtd->height = screen_size_y(s); + if (screen_size_y(s) - mtd->height < 2) + mtd->height = screen_size_y(s); + } + void mode_tree_build(struct mode_tree_data *mtd) { *************** *** 434,448 **** mode_tree_set_current(mtd, tag); mtd->width = screen_size_x(s); ! if (mtd->preview) { ! mtd->height = (screen_size_y(s) / 3) * 2; ! if (mtd->height > mtd->line_size) ! mtd->height = screen_size_y(s) / 2; ! if (mtd->height < 10) ! mtd->height = screen_size_y(s); ! if (screen_size_y(s) - mtd->height < 2) ! mtd->height = screen_size_y(s); ! } else mtd->height = screen_size_y(s); mode_tree_check_selected(mtd); } --- 474,482 ---- mode_tree_set_current(mtd, tag); mtd->width = screen_size_x(s); ! if (mtd->preview) ! mode_tree_set_height(mtd); ! else mtd->height = screen_size_y(s); mode_tree_check_selected(mtd); } *************** *** 494,500 **** struct mode_tree_item *mti, *saved; log_debug("%s: %llu, %s %s", __func__, (unsigned long long)tag, ! name, text); mti = xcalloc(1, sizeof *mti); mti->parent = parent; --- 528,534 ---- struct mode_tree_item *mti, *saved; log_debug("%s: %llu, %s %s", __func__, (unsigned long long)tag, ! name, (text == NULL ? "" : text)); mti = xcalloc(1, sizeof *mti); mti->parent = parent; *************** *** 502,508 **** mti->tag = tag; mti->name = xstrdup(name); ! mti->text = xstrdup(text); saved = mode_tree_find_item(&mtd->saved, tag); if (saved != NULL) { --- 536,543 ---- mti->tag = tag; mti->name = xstrdup(name); ! if (text != NULL) ! mti->text = xstrdup(text); saved = mode_tree_find_item(&mtd->saved, tag); if (saved != NULL) { *************** *** 525,530 **** --- 560,571 ---- } void + mode_tree_draw_as_parent(struct mode_tree_item *mti) + { + mti->draw_as_parent = 1; + } + + void mode_tree_remove(struct mode_tree_data *mtd, struct mode_tree_item *mti) { struct mode_tree_item *parent = mti->parent; *************** *** 621,628 **** tag = "*"; else tag = ""; ! xasprintf(&text, "%-*s%s%s%s: ", keylen, key, start, mti->name, ! tag); width = utf8_cstrwidth(text); if (width > w) width = w; --- 662,669 ---- tag = "*"; else tag = ""; ! xasprintf(&text, "%-*s%s%s%s%s", keylen, key, start, mti->name, ! tag, (mti->text != NULL) ? ": " : "" ); width = utf8_cstrwidth(text); if (width > w) width = w; *************** *** 636,646 **** if (i != mtd->current) { screen_write_clearendofline(&ctx, 8); screen_write_nputs(&ctx, w, &gc0, "%s", text); ! format_draw(&ctx, &gc0, w - width, mti->text, NULL); } else { screen_write_clearendofline(&ctx, gc.bg); screen_write_nputs(&ctx, w, &gc, "%s", text); ! format_draw(&ctx, &gc, w - width, mti->text, NULL); } free(text); --- 677,693 ---- if (i != mtd->current) { screen_write_clearendofline(&ctx, 8); screen_write_nputs(&ctx, w, &gc0, "%s", text); ! if (mti->text != NULL) { ! format_draw(&ctx, &gc0, w - width, mti->text, ! NULL); ! } } else { screen_write_clearendofline(&ctx, gc.bg); screen_write_nputs(&ctx, w, &gc, "%s", text); ! if (mti->text != NULL) { ! format_draw(&ctx, &gc, w - width, mti->text, ! NULL); ! } } free(text); *************** *** 658,670 **** line = &mtd->line_list[mtd->current]; mti = line->item; screen_write_cursormove(&ctx, 0, h, 0); screen_write_box(&ctx, w, sy - h); ! xasprintf(&text, " %s (sort: %s%s)", mti->name, ! mtd->sort_list[mtd->sort_crit.field], ! mtd->sort_crit.reversed ? ", reversed" : ""); if (w - 2 >= strlen(text)) { screen_write_cursormove(&ctx, 1, h, 0); screen_write_puts(&ctx, &gc0, "%s", text); --- 705,722 ---- line = &mtd->line_list[mtd->current]; mti = line->item; + if (mti->draw_as_parent) + mti = mti->parent; screen_write_cursormove(&ctx, 0, h, 0); screen_write_box(&ctx, w, sy - h); ! if (mtd->sort_list != NULL) { ! xasprintf(&text, " %s (sort: %s%s)", mti->name, ! mtd->sort_list[mtd->sort_crit.field], ! mtd->sort_crit.reversed ? ", reversed" : ""); ! } else ! xasprintf(&text, " %s", mti->name); if (w - 2 >= strlen(text)) { screen_write_cursormove(&ctx, 1, h, 0); screen_write_puts(&ctx, &gc0, "%s", text); *************** *** 680,686 **** else screen_write_puts(&ctx, &gc0, "active"); screen_write_puts(&ctx, &gc0, ") "); ! } } free(text); --- 732,739 ---- else screen_write_puts(&ctx, &gc0, "active"); screen_write_puts(&ctx, &gc0, ") "); ! } else ! screen_write_puts(&ctx, &gc0, " "); } free(text); *************** *** 1027,1033 **** break; case 'O': mtd->sort_crit.field++; ! if (mtd->sort_crit.field == mtd->sort_size) mtd->sort_crit.field = 0; mode_tree_build(mtd); break; --- 1080,1086 ---- break; case 'O': mtd->sort_crit.field++; ! if (mtd->sort_crit.field >= mtd->sort_size) mtd->sort_crit.field = 0; mode_tree_build(mtd); break;