menu item, from Alexis Hildebrandt.
-/* $OpenBSD: cmd-display-menu.c,v 1.41 2023/08/08 08:08:47 nicm Exp $ */
+/* $OpenBSD: cmd-display-menu.c,v 1.42 2023/08/15 07:01:47 nicm Exp $ */
/*
* Copyright (c) 2019 Nicholas Marriott <nicholas.marriott@gmail.com>
.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 },
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;
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);
}
-/* $OpenBSD: menu.c,v 1.51 2023/08/08 08:08:47 nicm Exp $ */
+/* $OpenBSD: menu.c,v 1.52 2023/08/15 07:01:47 nicm Exp $ */
/*
* Copyright (c) 2019 Nicholas Marriott <nicholas.marriott@gmail.com>
struct grid_cell style;
struct grid_cell border_style;
+ struct grid_cell selected_style;
enum box_lines border_lines;
struct cmd_find_state fs;
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);
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++) {
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)
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);
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,
-/* $OpenBSD: mode-tree.c,v 1.65 2023/08/11 17:09:00 nicm Exp $ */
+/* $OpenBSD: mode-tree.c,v 1.66 2023/08/15 07:01:47 nicm Exp $ */
/*
* Copyright (c) 2017 Nicholas Marriott <nicholas.marriott@gmail.com>
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);
}
-/* $OpenBSD: options-table.c,v 1.166 2023/08/08 08:08:47 nicm Exp $ */
+/* $OpenBSD: options-table.c,v 1.167 2023/08/15 07:01:47 nicm Exp $ */
/*
* Copyright (c) 2011 Nicholas Marriott <nicholas.marriott@gmail.com>
.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,
{ .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."
},
-/* $OpenBSD: popup.c,v 1.51 2023/08/08 08:08:47 nicm Exp $ */
+/* $OpenBSD: popup.c,v 1.52 2023/08/15 07:01:47 nicm Exp $ */
/*
* Copyright (c) 2020 Nicholas Marriott <nicholas.marriott@gmail.com>
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:
-/* $OpenBSD: screen-write.c,v 1.217 2023/08/08 08:08:47 nicm Exp $ */
+/* $OpenBSD: screen-write.c,v 1.218 2023/08/15 07:01:47 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
continue;
}
- format_draw(ctx, gc, width, name, NULL, gc == choice_gc);
+ format_draw(ctx, gc, width, name, NULL, 0);
gc = &default_gc;
}
-/* $OpenBSD: status.c,v 1.239 2023/08/08 08:08:47 nicm Exp $ */
+/* $OpenBSD: status.c,v 1.240 2023/08/15 07:01:47 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
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);
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);
-.\" $OpenBSD: tmux.1,v 1.926 2023/08/08 08:21:30 nicm Exp $
+.\" $OpenBSD: tmux.1,v 1.927 2023/08/15 07:01:47 nicm Exp $
.\"
.\" Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
.\"
.\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
.\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd $Mdocdate: August 8 2023 $
+.Dd $Mdocdate: August 15 2023 $
.Dt TMUX 1
.Os
.Sh NAME
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
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
.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
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
-/* $OpenBSD: tmux.h,v 1.1204 2023/08/08 08:21:30 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.1205 2023/08/15 07:01:47 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
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 *);