aboutsummaryrefslogtreecommitdiff
path: root/mode-tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'mode-tree.c')
-rw-r--r--mode-tree.c30
1 files changed, 12 insertions, 18 deletions
diff --git a/mode-tree.c b/mode-tree.c
index c92f7cff..c007e27f 100644
--- a/mode-tree.c
+++ b/mode-tree.c
@@ -104,7 +104,6 @@ struct mode_tree_menu {
struct mode_tree_data *data;
struct client *c;
u_int line;
- void *itemdata;
};
static void mode_tree_free_items(struct mode_tree_list *);
@@ -716,14 +715,14 @@ mode_tree_draw(struct mode_tree_data *mtd)
screen_write_nputs(&ctx, w, &gc0, "%s", text);
if (mti->text != NULL) {
format_draw(&ctx, &gc0, w - width, mti->text,
- NULL);
+ NULL, 0);
}
} 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);
+ NULL, 0);
}
}
free(text);
@@ -736,10 +735,8 @@ mode_tree_draw(struct mode_tree_data *mtd)
}
sy = screen_size_y(s);
- if (!mtd->preview || sy <= 4 || h <= 4 || sy - h <= 4 || w <= 4) {
- screen_write_stop(&ctx);
- return;
- }
+ if (!mtd->preview || sy <= 4 || h <= 4 || sy - h <= 4 || w <= 4)
+ goto done;
line = &mtd->line_list[mtd->current];
mti = line->item;
@@ -747,7 +744,7 @@ mode_tree_draw(struct mode_tree_data *mtd)
mti = mti->parent;
screen_write_cursormove(&ctx, 0, h, 0);
- screen_write_box(&ctx, w, sy - h);
+ screen_write_box(&ctx, w, sy - h, BOX_LINES_DEFAULT, NULL, NULL);
if (mtd->sort_list != NULL) {
xasprintf(&text, " %s (sort: %s%s)", mti->name,
@@ -783,6 +780,8 @@ mode_tree_draw(struct mode_tree_data *mtd)
mtd->drawcb(mtd->modedata, mti->itemdata, &ctx, box_x, box_y);
}
+done:
+ screen_write_cursormove(&ctx, 0, mtd->current - mtd->offset, 0);
screen_write_stop(&ctx);
}
@@ -909,18 +908,14 @@ static void
mode_tree_menu_callback(__unused struct menu *menu, __unused u_int idx,
key_code key, void *data)
{
- struct mode_tree_menu *mtm = data;
- struct mode_tree_data *mtd = mtm->data;
- struct mode_tree_item *mti;
+ struct mode_tree_menu *mtm = data;
+ struct mode_tree_data *mtd = mtm->data;
if (mtd->dead || key == KEYC_NONE)
goto out;
if (mtm->line >= mtd->line_size)
goto out;
- mti = mtd->line_list[mtm->line].item;
- if (mti->itemdata != mtm->itemdata)
- goto out;
mtd->current = mtm->line;
mtd->menucb(mtd->modedata, mtm->c, key);
@@ -954,14 +949,13 @@ mode_tree_display_menu(struct mode_tree_data *mtd, struct client *c, u_int x,
title = xstrdup("");
}
menu = menu_create(title);
- menu_add_items(menu, items, NULL, NULL, NULL);
+ menu_add_items(menu, items, NULL, c, NULL);
free(title);
mtm = xmalloc(sizeof *mtm);
mtm->data = mtd;
mtm->c = c;
mtm->line = line;
- mtm->itemdata = mti->itemdata;
mtd->references++;
if (x >= (menu->width + 4) / 2)
@@ -1055,7 +1049,6 @@ mode_tree_key(struct mode_tree_data *mtd, struct client *c, key_code *key,
case '\016': /* C-n */
mode_tree_down(mtd, 1);
break;
- case 'g':
case KEYC_PPAGE:
case '\002': /* C-b */
for (i = 0; i < mtd->height; i++) {
@@ -1064,7 +1057,6 @@ mode_tree_key(struct mode_tree_data *mtd, struct client *c, key_code *key,
mode_tree_up(mtd, 1);
}
break;
- case 'G':
case KEYC_NPAGE:
case '\006': /* C-f */
for (i = 0; i < mtd->height; i++) {
@@ -1073,10 +1065,12 @@ mode_tree_key(struct mode_tree_data *mtd, struct client *c, key_code *key,
mode_tree_down(mtd, 1);
}
break;
+ case 'g':
case KEYC_HOME:
mtd->current = 0;
mtd->offset = 0;
break;
+ case 'G':
case KEYC_END:
mtd->current = mtd->line_size - 1;
if (mtd->current > mtd->height - 1)