Lines Matching refs:mtd

171 mode_tree_check_selected(struct mode_tree_data *mtd)  in mode_tree_check_selected()  argument
177 if (mtd->current > mtd->height - 1) in mode_tree_check_selected()
178 mtd->offset = mtd->current - mtd->height + 1; in mode_tree_check_selected()
182 mode_tree_clear_lines(struct mode_tree_data *mtd) in mode_tree_clear_lines() argument
184 free(mtd->line_list); in mode_tree_clear_lines()
185 mtd->line_list = NULL; in mode_tree_clear_lines()
186 mtd->line_size = 0; in mode_tree_clear_lines()
190 mode_tree_build_lines(struct mode_tree_data *mtd, in mode_tree_build_lines() argument
198 mtd->depth = depth; in mode_tree_build_lines()
200 mtd->line_list = xreallocarray(mtd->line_list, in mode_tree_build_lines()
201 mtd->line_size + 1, sizeof *mtd->line_list); in mode_tree_build_lines()
203 line = &mtd->line_list[mtd->line_size++]; in mode_tree_build_lines()
208 mti->line = (mtd->line_size - 1); in mode_tree_build_lines()
212 mode_tree_build_lines(mtd, &mti->children, depth + 1); in mode_tree_build_lines()
214 if (mtd->keycb != NULL) { in mode_tree_build_lines()
215 mti->key = mtd->keycb(mtd->modedata, mti->itemdata, in mode_tree_build_lines()
235 for (i = 0; i < mtd->line_size; i++) { in mode_tree_build_lines()
236 line = &mtd->line_list[i]; in mode_tree_build_lines()
255 mode_tree_up(struct mode_tree_data *mtd, int wrap) in mode_tree_up() argument
257 if (mtd->current == 0) { in mode_tree_up()
259 mtd->current = mtd->line_size - 1; in mode_tree_up()
260 if (mtd->line_size >= mtd->height) in mode_tree_up()
261 mtd->offset = mtd->line_size - mtd->height; in mode_tree_up()
264 mtd->current--; in mode_tree_up()
265 if (mtd->current < mtd->offset) in mode_tree_up()
266 mtd->offset--; in mode_tree_up()
271 mode_tree_down(struct mode_tree_data *mtd, int wrap) in mode_tree_down() argument
273 if (mtd->current == mtd->line_size - 1) { in mode_tree_down()
275 mtd->current = 0; in mode_tree_down()
276 mtd->offset = 0; in mode_tree_down()
280 mtd->current++; in mode_tree_down()
281 if (mtd->current > mtd->offset + mtd->height - 1) in mode_tree_down()
282 mtd->offset++; in mode_tree_down()
288 mode_tree_get_current(struct mode_tree_data *mtd) in mode_tree_get_current() argument
290 return (mtd->line_list[mtd->current].item->itemdata); in mode_tree_get_current()
294 mode_tree_get_current_name(struct mode_tree_data *mtd) in mode_tree_get_current_name() argument
296 return (mtd->line_list[mtd->current].item->name); in mode_tree_get_current_name()
300 mode_tree_expand_current(struct mode_tree_data *mtd) in mode_tree_expand_current() argument
302 if (!mtd->line_list[mtd->current].item->expanded) { in mode_tree_expand_current()
303 mtd->line_list[mtd->current].item->expanded = 1; in mode_tree_expand_current()
304 mode_tree_build(mtd); in mode_tree_expand_current()
309 mode_tree_collapse_current(struct mode_tree_data *mtd) in mode_tree_collapse_current() argument
311 if (mtd->line_list[mtd->current].item->expanded) { in mode_tree_collapse_current()
312 mtd->line_list[mtd->current].item->expanded = 0; in mode_tree_collapse_current()
313 mode_tree_build(mtd); in mode_tree_collapse_current()
318 mode_tree_get_tag(struct mode_tree_data *mtd, uint64_t tag, u_int *found) in mode_tree_get_tag() argument
322 for (i = 0; i < mtd->line_size; i++) { in mode_tree_get_tag()
323 if (mtd->line_list[i].item->tag == tag) in mode_tree_get_tag()
326 if (i != mtd->line_size) { in mode_tree_get_tag()
334 mode_tree_expand(struct mode_tree_data *mtd, uint64_t tag) in mode_tree_expand() argument
338 if (!mode_tree_get_tag(mtd, tag, &found)) in mode_tree_expand()
340 if (!mtd->line_list[found].item->expanded) { in mode_tree_expand()
341 mtd->line_list[found].item->expanded = 1; in mode_tree_expand()
342 mode_tree_build(mtd); in mode_tree_expand()
347 mode_tree_set_current(struct mode_tree_data *mtd, uint64_t tag) in mode_tree_set_current() argument
351 if (mode_tree_get_tag(mtd, tag, &found)) { in mode_tree_set_current()
352 mtd->current = found; in mode_tree_set_current()
353 if (mtd->current > mtd->height - 1) in mode_tree_set_current()
354 mtd->offset = mtd->current - mtd->height + 1; in mode_tree_set_current()
356 mtd->offset = 0; in mode_tree_set_current()
359 if (mtd->current >= mtd->line_size) { in mode_tree_set_current()
360 mtd->current = mtd->line_size - 1; in mode_tree_set_current()
361 if (mtd->current > mtd->height - 1) in mode_tree_set_current()
362 mtd->offset = mtd->current - mtd->height + 1; in mode_tree_set_current()
364 mtd->offset = 0; in mode_tree_set_current()
370 mode_tree_count_tagged(struct mode_tree_data *mtd) in mode_tree_count_tagged() argument
376 for (i = 0; i < mtd->line_size; i++) { in mode_tree_count_tagged()
377 mti = mtd->line_list[i].item; in mode_tree_count_tagged()
385 mode_tree_each_tagged(struct mode_tree_data *mtd, mode_tree_each_cb cb, in mode_tree_each_tagged() argument
393 for (i = 0; i < mtd->line_size; i++) { in mode_tree_each_tagged()
394 mti = mtd->line_list[i].item; in mode_tree_each_tagged()
397 cb(mtd->modedata, mti->itemdata, c, key); in mode_tree_each_tagged()
401 mti = mtd->line_list[mtd->current].item; in mode_tree_each_tagged()
402 cb(mtd->modedata, mti->itemdata, c, key); in mode_tree_each_tagged()
414 struct mode_tree_data *mtd; in mode_tree_start() local
418 mtd = xcalloc(1, sizeof *mtd); in mode_tree_start()
419 mtd->references = 1; in mode_tree_start()
421 mtd->wp = wp; in mode_tree_start()
422 mtd->modedata = modedata; in mode_tree_start()
423 mtd->menu = menu; in mode_tree_start()
425 mtd->sort_list = sort_list; in mode_tree_start()
426 mtd->sort_size = sort_size; in mode_tree_start()
429 mtd->preview = MODE_TREE_PREVIEW_BIG; in mode_tree_start()
431 mtd->preview = MODE_TREE_PREVIEW_OFF; in mode_tree_start()
433 mtd->preview = MODE_TREE_PREVIEW_NORMAL; in mode_tree_start()
439 mtd->sort_crit.field = i; in mode_tree_start()
442 mtd->sort_crit.reversed = args_has(args, 'r'); in mode_tree_start()
445 mtd->filter = xstrdup(args_get(args, 'f')); in mode_tree_start()
447 mtd->filter = NULL; in mode_tree_start()
449 mtd->buildcb = buildcb; in mode_tree_start()
450 mtd->drawcb = drawcb; in mode_tree_start()
451 mtd->searchcb = searchcb; in mode_tree_start()
452 mtd->menucb = menucb; in mode_tree_start()
453 mtd->heightcb = heightcb; in mode_tree_start()
454 mtd->keycb = keycb; in mode_tree_start()
456 TAILQ_INIT(&mtd->children); in mode_tree_start()
458 *s = &mtd->screen; in mode_tree_start()
462 return (mtd); in mode_tree_start()
466 mode_tree_zoom(struct mode_tree_data *mtd, struct args *args) in mode_tree_zoom() argument
468 struct window_pane *wp = mtd->wp; in mode_tree_zoom()
471 mtd->zoomed = (wp->window->flags & WINDOW_ZOOMED); in mode_tree_zoom()
472 if (!mtd->zoomed && window_zoom(wp) == 0) in mode_tree_zoom()
475 mtd->zoomed = -1; in mode_tree_zoom()
479 mode_tree_set_height(struct mode_tree_data *mtd) in mode_tree_set_height() argument
481 struct screen *s = &mtd->screen; in mode_tree_set_height()
484 if (mtd->heightcb != NULL) { in mode_tree_set_height()
485 height = mtd->heightcb(mtd, screen_size_y(s)); in mode_tree_set_height()
487 mtd->height = screen_size_y(s) - height; in mode_tree_set_height()
489 if (mtd->preview == MODE_TREE_PREVIEW_NORMAL) { in mode_tree_set_height()
490 mtd->height = (screen_size_y(s) / 3) * 2; in mode_tree_set_height()
491 if (mtd->height > mtd->line_size) in mode_tree_set_height()
492 mtd->height = screen_size_y(s) / 2; in mode_tree_set_height()
493 if (mtd->height < 10) in mode_tree_set_height()
494 mtd->height = screen_size_y(s); in mode_tree_set_height()
495 } else if (mtd->preview == MODE_TREE_PREVIEW_BIG) { in mode_tree_set_height()
496 mtd->height = screen_size_y(s) / 4; in mode_tree_set_height()
497 if (mtd->height > mtd->line_size) in mode_tree_set_height()
498 mtd->height = mtd->line_size; in mode_tree_set_height()
499 if (mtd->height < 2) in mode_tree_set_height()
500 mtd->height = 2; in mode_tree_set_height()
502 mtd->height = screen_size_y(s); in mode_tree_set_height()
504 if (screen_size_y(s) - mtd->height < 2) in mode_tree_set_height()
505 mtd->height = screen_size_y(s); in mode_tree_set_height()
509 mode_tree_build(struct mode_tree_data *mtd) in mode_tree_build() argument
511 struct screen *s = &mtd->screen; in mode_tree_build()
514 if (mtd->line_list != NULL) in mode_tree_build()
515 tag = mtd->line_list[mtd->current].item->tag; in mode_tree_build()
519 TAILQ_CONCAT(&mtd->saved, &mtd->children, entry); in mode_tree_build()
520 TAILQ_INIT(&mtd->children); in mode_tree_build()
522 mtd->buildcb(mtd->modedata, &mtd->sort_crit, &tag, mtd->filter); in mode_tree_build()
523 mtd->no_matches = TAILQ_EMPTY(&mtd->children); in mode_tree_build()
524 if (mtd->no_matches) in mode_tree_build()
525 mtd->buildcb(mtd->modedata, &mtd->sort_crit, &tag, NULL); in mode_tree_build()
527 mode_tree_free_items(&mtd->saved); in mode_tree_build()
528 TAILQ_INIT(&mtd->saved); in mode_tree_build()
530 mode_tree_clear_lines(mtd); in mode_tree_build()
531 mode_tree_build_lines(mtd, &mtd->children, 0); in mode_tree_build()
533 if (mtd->line_list != NULL && tag == UINT64_MAX) in mode_tree_build()
534 tag = mtd->line_list[mtd->current].item->tag; in mode_tree_build()
535 mode_tree_set_current(mtd, tag); in mode_tree_build()
537 mtd->width = screen_size_x(s); in mode_tree_build()
538 if (mtd->preview != MODE_TREE_PREVIEW_OFF) in mode_tree_build()
539 mode_tree_set_height(mtd); in mode_tree_build()
541 mtd->height = screen_size_y(s); in mode_tree_build()
542 mode_tree_check_selected(mtd); in mode_tree_build()
546 mode_tree_remove_ref(struct mode_tree_data *mtd) in mode_tree_remove_ref() argument
548 if (--mtd->references == 0) in mode_tree_remove_ref()
549 free(mtd); in mode_tree_remove_ref()
553 mode_tree_free(struct mode_tree_data *mtd) in mode_tree_free() argument
555 struct window_pane *wp = mtd->wp; in mode_tree_free()
557 if (mtd->zoomed == 0) in mode_tree_free()
560 mode_tree_free_items(&mtd->children); in mode_tree_free()
561 mode_tree_clear_lines(mtd); in mode_tree_free()
562 screen_free(&mtd->screen); in mode_tree_free()
564 free(mtd->search); in mode_tree_free()
565 free(mtd->filter); in mode_tree_free()
567 mtd->dead = 1; in mode_tree_free()
568 mode_tree_remove_ref(mtd); in mode_tree_free()
572 mode_tree_resize(struct mode_tree_data *mtd, u_int sx, u_int sy) in mode_tree_resize() argument
574 struct screen *s = &mtd->screen; in mode_tree_resize()
578 mode_tree_build(mtd); in mode_tree_resize()
579 mode_tree_draw(mtd); in mode_tree_resize()
581 mtd->wp->flags |= PANE_REDRAW; in mode_tree_resize()
585 mode_tree_add(struct mode_tree_data *mtd, struct mode_tree_item *parent, in mode_tree_add() argument
603 saved = mode_tree_find_item(&mtd->saved, tag); in mode_tree_add()
618 TAILQ_INSERT_TAIL(&mtd->children, mti, entry); in mode_tree_add()
636 mode_tree_remove(struct mode_tree_data *mtd, struct mode_tree_item *mti) in mode_tree_remove() argument
643 TAILQ_REMOVE(&mtd->children, mti, entry); in mode_tree_remove()
648 mode_tree_draw(struct mode_tree_data *mtd) in mode_tree_draw() argument
650 struct window_pane *wp = mtd->wp; in mode_tree_draw()
651 struct screen *s = &mtd->screen; in mode_tree_draw()
663 if (mtd->line_size == 0) in mode_tree_draw()
670 w = mtd->width; in mode_tree_draw()
671 h = mtd->height; in mode_tree_draw()
677 for (i = 0; i < mtd->line_size; i++) { in mode_tree_draw()
678 mti = mtd->line_list[i].item; in mode_tree_draw()
685 for (i = 0; i < mtd->line_size; i++) { in mode_tree_draw()
686 if (i < mtd->offset) in mode_tree_draw()
688 if (i > mtd->offset + h - 1) in mode_tree_draw()
690 line = &mtd->line_list[i]; in mode_tree_draw()
693 screen_write_cursormove(&ctx, 0, i - mtd->offset, 0); in mode_tree_draw()
718 mtd->line_list[mti->parent->line].last) in mode_tree_draw()
746 if (i != mtd->current) { in mode_tree_draw()
770 if (mtd->preview == MODE_TREE_PREVIEW_OFF) in mode_tree_draw()
777 line = &mtd->line_list[mtd->current]; in mode_tree_draw()
785 if (mtd->sort_list != NULL) { in mode_tree_draw()
787 mtd->sort_list[mtd->sort_crit.field], in mode_tree_draw()
788 mtd->sort_crit.reversed ? ", reversed" : ""); in mode_tree_draw()
795 if (mtd->no_matches) in mode_tree_draw()
799 if (mtd->filter != NULL && w - 2 >= strlen(text) + 10 + n + 2) { in mode_tree_draw()
801 if (mtd->no_matches) in mode_tree_draw()
816 mtd->drawcb(mtd->modedata, mti->itemdata, &ctx, box_x, box_y); in mode_tree_draw()
820 screen_write_cursormove(&ctx, 0, mtd->current - mtd->offset, 0); in mode_tree_draw()
825 mode_tree_search_backward(struct mode_tree_data *mtd) in mode_tree_search_backward() argument
829 if (mtd->search == NULL) in mode_tree_search_backward()
832 mti = last = mtd->line_list[mtd->current].item; in mode_tree_search_backward()
846 prev = TAILQ_LAST(&mtd->children, mode_tree_list); in mode_tree_search_backward()
854 if (mtd->searchcb == NULL) { in mode_tree_search_backward()
855 if (strstr(mti->name, mtd->search) != NULL) in mode_tree_search_backward()
859 if (mtd->searchcb(mtd->modedata, mti->itemdata, mtd->search)) in mode_tree_search_backward()
867 mode_tree_search_forward(struct mode_tree_data *mtd) in mode_tree_search_forward() argument
871 if (mtd->search == NULL) in mode_tree_search_forward()
874 mti = last = mtd->line_list[mtd->current].item; in mode_tree_search_forward()
892 mti = TAILQ_FIRST(&mtd->children); in mode_tree_search_forward()
896 if (mtd->searchcb == NULL) { in mode_tree_search_forward()
897 if (strstr(mti->name, mtd->search) != NULL) in mode_tree_search_forward()
901 if (mtd->searchcb(mtd->modedata, mti->itemdata, mtd->search)) in mode_tree_search_forward()
908 mode_tree_search_set(struct mode_tree_data *mtd) in mode_tree_search_set() argument
913 if (mtd->search_dir == MODE_TREE_SEARCH_FORWARD) in mode_tree_search_set()
914 mti = mode_tree_search_forward(mtd); in mode_tree_search_set()
916 mti = mode_tree_search_backward(mtd); in mode_tree_search_set()
927 mode_tree_build(mtd); in mode_tree_search_set()
928 mode_tree_set_current(mtd, tag); in mode_tree_search_set()
929 mode_tree_draw(mtd); in mode_tree_search_set()
930 mtd->wp->flags |= PANE_REDRAW; in mode_tree_search_set()
937 struct mode_tree_data *mtd = data; in mode_tree_search_callback() local
939 if (mtd->dead) in mode_tree_search_callback()
942 free(mtd->search); in mode_tree_search_callback()
944 mtd->search = NULL; in mode_tree_search_callback()
947 mtd->search = xstrdup(s); in mode_tree_search_callback()
948 mode_tree_search_set(mtd); in mode_tree_search_callback()
963 struct mode_tree_data *mtd = data; in mode_tree_filter_callback() local
965 if (mtd->dead) in mode_tree_filter_callback()
968 if (mtd->filter != NULL) in mode_tree_filter_callback()
969 free(mtd->filter); in mode_tree_filter_callback()
971 mtd->filter = NULL; in mode_tree_filter_callback()
973 mtd->filter = xstrdup(s); in mode_tree_filter_callback()
975 mode_tree_build(mtd); in mode_tree_filter_callback()
976 mode_tree_draw(mtd); in mode_tree_filter_callback()
977 mtd->wp->flags |= PANE_REDRAW; in mode_tree_filter_callback()
993 struct mode_tree_data *mtd = mtm->data; in mode_tree_menu_callback() local
995 if (mtd->dead || key == KEYC_NONE) in mode_tree_menu_callback()
998 if (mtm->line >= mtd->line_size) in mode_tree_menu_callback()
1000 mtd->current = mtm->line; in mode_tree_menu_callback()
1001 mtd->menucb(mtd->modedata, mtm->c, key); in mode_tree_menu_callback()
1004 mode_tree_remove_ref(mtd); in mode_tree_menu_callback()
1009 mode_tree_display_menu(struct mode_tree_data *mtd, struct client *c, u_int x, in mode_tree_display_menu() argument
1019 if (mtd->offset + y > mtd->line_size - 1) in mode_tree_display_menu()
1020 line = mtd->current; in mode_tree_display_menu()
1022 line = mtd->offset + y; in mode_tree_display_menu()
1023 mti = mtd->line_list[line].item; in mode_tree_display_menu()
1026 items = mtd->menu; in mode_tree_display_menu()
1037 mtm->data = mtd; in mode_tree_display_menu()
1040 mtd->references++; in mode_tree_display_menu()
1048 mode_tree_remove_ref(mtd); in mode_tree_display_menu()
1055 mode_tree_key(struct mode_tree_data *mtd, struct client *c, key_code *key, in mode_tree_key() argument
1064 if (cmd_mouse_at(mtd->wp, m, &x, &y, 0) != 0) { in mode_tree_key()
1072 if (x > mtd->width || y > mtd->height) { in mode_tree_key()
1074 mode_tree_display_menu(mtd, c, x, y, 1); in mode_tree_key()
1075 if (mtd->preview == MODE_TREE_PREVIEW_OFF) in mode_tree_key()
1079 if (mtd->offset + y < mtd->line_size) { in mode_tree_key()
1083 mtd->current = mtd->offset + y; in mode_tree_key()
1088 mode_tree_display_menu(mtd, c, x, y, 0); in mode_tree_key()
1093 mode_tree_display_menu(mtd, c, x, y, 0); in mode_tree_key()
1099 line = &mtd->line_list[mtd->current]; in mode_tree_key()
1103 for (i = 0; i < mtd->line_size; i++) { in mode_tree_key()
1104 if (*key == mtd->line_list[i].item->key) { in mode_tree_key()
1110 if ((u_int)choice > mtd->line_size - 1) { in mode_tree_key()
1114 mtd->current = choice; in mode_tree_key()
1128 mode_tree_up(mtd, 1); in mode_tree_key()
1134 mode_tree_down(mtd, 1); in mode_tree_key()
1138 for (i = 0; i < mtd->height; i++) { in mode_tree_key()
1139 if (mtd->current == 0) in mode_tree_key()
1141 mode_tree_up(mtd, 1); in mode_tree_key()
1146 for (i = 0; i < mtd->height; i++) { in mode_tree_key()
1147 if (mtd->current == mtd->line_size - 1) in mode_tree_key()
1149 mode_tree_down(mtd, 1); in mode_tree_key()
1154 mtd->current = 0; in mode_tree_key()
1155 mtd->offset = 0; in mode_tree_key()
1159 mtd->current = mtd->line_size - 1; in mode_tree_key()
1160 if (mtd->current > mtd->height - 1) in mode_tree_key()
1161 mtd->offset = mtd->current - mtd->height + 1; in mode_tree_key()
1163 mtd->offset = 0; in mode_tree_key()
1183 mode_tree_down(mtd, 0); in mode_tree_key()
1186 for (i = 0; i < mtd->line_size; i++) in mode_tree_key()
1187 mtd->line_list[i].item->tagged = 0; in mode_tree_key()
1190 for (i = 0; i < mtd->line_size; i++) { in mode_tree_key()
1191 if ((mtd->line_list[i].item->parent == NULL && in mode_tree_key()
1192 !mtd->line_list[i].item->no_tag) || in mode_tree_key()
1193 (mtd->line_list[i].item->parent != NULL && in mode_tree_key()
1194 mtd->line_list[i].item->parent->no_tag)) in mode_tree_key()
1195 mtd->line_list[i].item->tagged = 1; in mode_tree_key()
1197 mtd->line_list[i].item->tagged = 0; in mode_tree_key()
1201 mtd->sort_crit.field++; in mode_tree_key()
1202 if (mtd->sort_crit.field >= mtd->sort_size) in mode_tree_key()
1203 mtd->sort_crit.field = 0; in mode_tree_key()
1204 mode_tree_build(mtd); in mode_tree_key()
1207 mtd->sort_crit.reversed = !mtd->sort_crit.reversed; in mode_tree_key()
1208 mode_tree_build(mtd); in mode_tree_key()
1216 mode_tree_up(mtd, 0); in mode_tree_key()
1219 mtd->current = current->line; in mode_tree_key()
1220 mode_tree_build(mtd); in mode_tree_key()
1227 mode_tree_down(mtd, 0); in mode_tree_key()
1230 mode_tree_build(mtd); in mode_tree_key()
1234 TAILQ_FOREACH(mti, &mtd->children, entry) in mode_tree_key()
1236 mode_tree_build(mtd); in mode_tree_key()
1239 TAILQ_FOREACH(mti, &mtd->children, entry) in mode_tree_key()
1241 mode_tree_build(mtd); in mode_tree_key()
1246 mtd->references++; in mode_tree_key()
1248 mode_tree_search_callback, mode_tree_search_free, mtd, in mode_tree_key()
1252 mtd->search_dir = MODE_TREE_SEARCH_FORWARD; in mode_tree_key()
1253 mode_tree_search_set(mtd); in mode_tree_key()
1256 mtd->search_dir = MODE_TREE_SEARCH_BACKWARD; in mode_tree_key()
1257 mode_tree_search_set(mtd); in mode_tree_key()
1260 mtd->references++; in mode_tree_key()
1261 status_prompt_set(c, NULL, "(filter) ", mtd->filter, in mode_tree_key()
1262 mode_tree_filter_callback, mode_tree_filter_free, mtd, in mode_tree_key()
1266 switch (mtd->preview) { in mode_tree_key()
1268 mtd->preview = MODE_TREE_PREVIEW_BIG; in mode_tree_key()
1271 mtd->preview = MODE_TREE_PREVIEW_OFF; in mode_tree_key()
1274 mtd->preview = MODE_TREE_PREVIEW_NORMAL; in mode_tree_key()
1277 mode_tree_build(mtd); in mode_tree_key()
1278 if (mtd->preview != MODE_TREE_PREVIEW_OFF) in mode_tree_key()
1279 mode_tree_check_selected(mtd); in mode_tree_key()