diff --git a/cmd-display-menu.c b/cmd-display-menu.c index a0a86b1f..7d0d3e59 100644 --- a/cmd-display-menu.c +++ b/cmd-display-menu.c @@ -39,11 +39,11 @@ const struct cmd_entry cmd_display_menu_entry = { .name = "display-menu", .alias = "menu", - .args = { "b:c:C:t:s:S:OT:x:y:", 1, -1, cmd_display_menu_args_parse }, + .args = { "b:c:C:H:s:S:Ot:T:x:y:", 1, -1, cmd_display_menu_args_parse }, .usage = "[-O] [-b border-lines] [-c target-client] " - "[-C starting-choice] [-s style] [-S border-style] " - CMD_TARGET_PANE_USAGE "[-T title] [-x position] [-y position] " - "name key command ...", + "[-C starting-choice] [-H selected-style] [-s style] " + "[-S border-style] " CMD_TARGET_PANE_USAGE "[-T title] " + "[-x position] [-y position] name key command ...", .target = { 't', CMD_FIND_PANE, 0 }, @@ -293,6 +293,7 @@ cmd_display_menu_exec(struct cmd *self, struct cmdq_item *item) const char *key, *name, *value; const char *style = args_get(args, 's'); const char *border_style = args_get(args, 'S'); + const char *selected_style = args_get(args, 'H'); enum box_lines lines = BOX_LINES_DEFAULT; char *title, *cause; int flags = 0, starting_choice = 0; @@ -376,7 +377,7 @@ cmd_display_menu_exec(struct cmd *self, struct cmdq_item *item) if (!event->m.valid) flags |= MENU_NOMOUSE; if (menu_display(menu, flags, starting_choice, item, px, py, tc, lines, - style, border_style, target, NULL, NULL) != 0) + style, selected_style, border_style, target, NULL, NULL) != 0) return (CMD_RETURN_NORMAL); return (CMD_RETURN_WAIT); } diff --git a/menu.c b/menu.c index 4d2fb95a..8d7b40a2 100644 --- a/menu.c +++ b/menu.c @@ -29,6 +29,7 @@ struct menu_data { struct grid_cell style; struct grid_cell border_style; + struct grid_cell selected_style; enum box_lines border_lines; struct cmd_find_state fs; @@ -201,7 +202,6 @@ menu_draw_cb(struct client *c, void *data, struct menu *menu = md->menu; struct screen_write_ctx ctx; u_int i, px = md->px, py = md->py; - struct grid_cell gc; screen_write_start(&ctx, s); screen_write_clearscreen(&ctx, 8); @@ -210,10 +210,9 @@ menu_draw_cb(struct client *c, void *data, screen_write_box(&ctx, menu->width + 4, menu->count + 2, md->border_lines, &md->border_style, menu->title); } - style_apply(&gc, c->session->curw->window->options, "mode-style", NULL); screen_write_menu(&ctx, menu, md->choice, md->border_lines, - &md->style, &md->border_style, &gc); + &md->style, &md->border_style, &md->selected_style); screen_write_stop(&ctx); for (i = 0; i < screen_size_y(&md->s); i++) { @@ -438,16 +437,35 @@ chosen: return (1); } +static void +menu_set_style(struct client *c, struct grid_cell *gc, const char *style, + const char *option) +{ + struct style sytmp; + struct options *o = c->session->curw->window->options; + + memcpy(gc, &grid_default_cell, sizeof *gc); + style_apply(gc, o, option, NULL); + if (style != NULL) { + style_set(&sytmp, &grid_default_cell); + if (style_parse(&sytmp, gc, style) == 0) { + gc->fg = sytmp.gc.fg; + gc->bg = sytmp.gc.bg; + } + } + gc->attr = 0; +} + struct menu_data * menu_prepare(struct menu *menu, int flags, int starting_choice, struct cmdq_item *item, u_int px, u_int py, struct client *c, - enum box_lines lines, const char *style, const char *border_style, - struct cmd_find_state *fs, menu_choice_cb cb, void *data) + enum box_lines lines, const char *style, const char *selected_style, + const char *border_style, struct cmd_find_state *fs, menu_choice_cb cb, + void *data) { struct menu_data *md; int choice; const char *name; - struct style sytmp; struct options *o = c->session->curw->window->options; if (c->tty.sx < menu->width + 4 || c->tty.sy < menu->count + 2) @@ -465,27 +483,10 @@ menu_prepare(struct menu *menu, int flags, int starting_choice, md->flags = flags; md->border_lines = lines; - memcpy(&md->style, &grid_default_cell, sizeof md->style); - style_apply(&md->style, o, "menu-style", NULL); - if (style != NULL) { - style_set(&sytmp, &grid_default_cell); - if (style_parse(&sytmp, &md->style, style) == 0) { - md->style.fg = sytmp.gc.fg; - md->style.bg = sytmp.gc.bg; - } - } - md->style.attr = 0; - - memcpy(&md->border_style, &grid_default_cell, sizeof md->border_style); - style_apply(&md->border_style, o, "menu-border-style", NULL); - if (border_style != NULL) { - style_set(&sytmp, &grid_default_cell); - if (style_parse(&sytmp, &md->border_style, border_style) == 0) { - md->border_style.fg = sytmp.gc.fg; - md->border_style.bg = sytmp.gc.bg; - } - } - md->border_style.attr = 0; + menu_set_style(c, &md->style, style, "menu-style"); + menu_set_style(c, &md->selected_style, selected_style, + "menu-selected-style"); + menu_set_style(c, &md->border_style, border_style, "menu-border-style"); if (fs != NULL) cmd_find_copy_state(&md->fs, fs); @@ -539,13 +540,14 @@ menu_prepare(struct menu *menu, int flags, int starting_choice, int menu_display(struct menu *menu, int flags, int starting_choice, struct cmdq_item *item, u_int px, u_int py, struct client *c, - enum box_lines lines, const char *style, const char *border_style, - struct cmd_find_state *fs, menu_choice_cb cb, void *data) + enum box_lines lines, const char *style, const char *selected_style, + const char *border_style, struct cmd_find_state *fs, menu_choice_cb cb, + void *data) { struct menu_data *md; md = menu_prepare(menu, flags, starting_choice, item, px, py, c, lines, - style, border_style, fs, cb, data); + style, selected_style, border_style, fs, cb, data); if (md == NULL) return (-1); server_client_set_overlay(c, 0, NULL, menu_mode_cb, menu_draw_cb, diff --git a/mode-tree.c b/mode-tree.c index fa251c8d..cebd4f05 100644 --- a/mode-tree.c +++ b/mode-tree.c @@ -963,7 +963,7 @@ mode_tree_display_menu(struct mode_tree_data *mtd, struct client *c, u_int x, else x = 0; if (menu_display(menu, 0, 0, NULL, x, y, c, BOX_LINES_DEFAULT, NULL, - NULL, NULL, mode_tree_menu_callback, mtm) != 0) + NULL, NULL, NULL, mode_tree_menu_callback, mtm) != 0) menu_free(menu); } diff --git a/options-table.c b/options-table.c index 745f2b3b..eacf0947 100644 --- a/options-table.c +++ b/options-table.c @@ -336,6 +336,15 @@ const struct options_table_entry options_table[] = { .text = "Default style of menu." }, + { .name = "menu-selected-style", + .type = OPTIONS_TABLE_STRING, + .scope = OPTIONS_TABLE_WINDOW, + .flags = OPTIONS_TABLE_IS_STYLE, + .default_str = "bg=yellow,fg=black", + .separator = ",", + .text = "Default style of selected menu item." + }, + { .name = "menu-border-style", .type = OPTIONS_TABLE_STRING, .scope = OPTIONS_TABLE_WINDOW, @@ -962,8 +971,8 @@ const struct options_table_entry options_table[] = { { .name = "mode-style", .type = OPTIONS_TABLE_STRING, .scope = OPTIONS_TABLE_WINDOW, - .default_str = "bg=yellow,fg=black", .flags = OPTIONS_TABLE_IS_STYLE, + .default_str = "bg=yellow,fg=black", .separator = ",", .text = "Style of indicators and highlighting in modes." }, diff --git a/popup.c b/popup.c index 2fb6f1fa..38a4c17f 100644 --- a/popup.c +++ b/popup.c @@ -576,7 +576,7 @@ menu: else x = 0; pd->md = menu_prepare(pd->menu, 0, 0, NULL, x, m->y, c, - BOX_LINES_DEFAULT, NULL, NULL, NULL, popup_menu_done, pd); + BOX_LINES_DEFAULT, NULL, NULL, NULL, NULL, popup_menu_done, pd); c->flags |= CLIENT_REDRAWOVERLAY; out: diff --git a/screen-write.c b/screen-write.c index 25158ee5..ee3a31a1 100644 --- a/screen-write.c +++ b/screen-write.c @@ -733,7 +733,7 @@ screen_write_menu(struct screen_write_ctx *ctx, struct menu *menu, int choice, continue; } - format_draw(ctx, gc, width, name, NULL, gc == choice_gc); + format_draw(ctx, gc, width, name, NULL, 0); gc = &default_gc; } diff --git a/status.c b/status.c index 66f2dfb6..a15981e9 100644 --- a/status.c +++ b/status.c @@ -1765,8 +1765,8 @@ status_prompt_complete_list_menu(struct client *c, char **list, u_int size, offset = 0; if (menu_display(menu, MENU_NOMOUSE|MENU_TAB, 0, NULL, offset, py, c, - BOX_LINES_DEFAULT, NULL, NULL, NULL, status_prompt_menu_callback, - spm) != 0) { + BOX_LINES_DEFAULT, NULL, NULL, NULL, NULL, + status_prompt_menu_callback, spm) != 0) { menu_free(menu); free(spm); return (0); @@ -1859,8 +1859,8 @@ status_prompt_complete_window_menu(struct client *c, struct session *s, offset = 0; if (menu_display(menu, MENU_NOMOUSE|MENU_TAB, 0, NULL, offset, py, c, - BOX_LINES_DEFAULT, NULL, NULL, NULL, status_prompt_menu_callback, - spm) != 0) { + BOX_LINES_DEFAULT, NULL, NULL, NULL, NULL, + status_prompt_menu_callback, spm) != 0) { menu_free(menu); free(spm); return (NULL); diff --git a/tmux.1 b/tmux.1 index 8647ea4c..8191b6dc 100644 --- a/tmux.1 +++ b/tmux.1 @@ -4096,6 +4096,13 @@ See the section on how to specify .Ar style . Attributes are ignored. +.It Ic menu-selected-style Ar style +Set the selected menu item style. +See the +.Sx STYLES +section on how to specify +.Ar style . +Attributes are ignored. .It Ic menu-border-style Ar style Set the menu border style. See the @@ -4108,7 +4115,7 @@ Set the type of characters used for drawing menu borders. See .Ic popup-border-lines for possible values for -.Ar type . +.Ar border-lines . .It Ic message-command-style Ar style Set status line message command style. This is used for the command prompt with @@ -6064,10 +6071,11 @@ the default is .Op Fl O .Op Fl b Ar border-lines .Op Fl c Ar target-client +.Op Fl C Ar starting-choice +.Op Fl H Ar selected-style .Op Fl s Ar style .Op Fl S Ar border-style .Op Fl t Ar target-pane -.Op Fl C Ar starting-choice .Op Fl T Ar title .Op Fl x Ar position .Op Fl y Ar position @@ -6101,6 +6109,10 @@ See for possible values for .Ar border-lines . .Pp +.Fl H +sets the style for the selected menu item (see +.Sx STYLES ) . +.Pp .Fl s sets the style for the menu and .Fl S diff --git a/tmux.h b/tmux.h index e26cabdf..378871b7 100644 --- a/tmux.h +++ b/tmux.h @@ -3308,12 +3308,12 @@ void menu_add_item(struct menu *, const struct menu_item *, void menu_free(struct menu *); struct menu_data *menu_prepare(struct menu *, int, int, struct cmdq_item *, u_int, u_int, struct client *, enum box_lines, const char *, - const char *, struct cmd_find_state *, menu_choice_cb, - void *); + const char *, const char *, struct cmd_find_state *, + menu_choice_cb, void *); int menu_display(struct menu *, int, int, struct cmdq_item *, u_int, u_int, struct client *, enum box_lines, const char *, - const char *, struct cmd_find_state *, menu_choice_cb, - void *); + const char *, const char *, struct cmd_find_state *, + menu_choice_cb, void *); struct screen *menu_mode_cb(struct client *, void *, u_int *, u_int *); void menu_check_cb(struct client *, void *, u_int, u_int, u_int, struct overlay_ranges *);