Add an option menu-selected-style to configure the currently selected
authornicm <nicm@openbsd.org>
Tue, 15 Aug 2023 07:01:47 +0000 (07:01 +0000)
committernicm <nicm@openbsd.org>
Tue, 15 Aug 2023 07:01:47 +0000 (07:01 +0000)
menu item, from Alexis Hildebrandt.

usr.bin/tmux/cmd-display-menu.c
usr.bin/tmux/menu.c
usr.bin/tmux/mode-tree.c
usr.bin/tmux/options-table.c
usr.bin/tmux/popup.c
usr.bin/tmux/screen-write.c
usr.bin/tmux/status.c
usr.bin/tmux/tmux.1
usr.bin/tmux/tmux.h

index d616d0c..5f0a011 100644 (file)
@@ -1,4 +1,4 @@
-/* $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>
@@ -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);
 }
index 4b06220..79ad009 100644 (file)
@@ -1,4 +1,4 @@
-/* $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>
@@ -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,
index 7951cc8..c1f3b5f 100644 (file)
@@ -1,4 +1,4 @@
-/* $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>
@@ -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);
 }
 
index 211257f..9b46389 100644 (file)
@@ -1,4 +1,4 @@
-/* $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>
@@ -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."
        },
index 35adb1b..e625506 100644 (file)
@@ -1,4 +1,4 @@
-/* $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>
@@ -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:
index 8d98e0e..a288353 100644 (file)
@@ -1,4 +1,4 @@
-/* $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>
@@ -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;
        }
 
index ce8c9f7..9e7aa29 100644 (file)
@@ -1,4 +1,4 @@
-/* $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>
@@ -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);
index 6a22779..1e43c29 100644 (file)
@@ -1,4 +1,4 @@
-.\" $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>
 .\"
@@ -14,7 +14,7 @@
 .\" 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
@@ -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
index 78df276..0ee5813 100644 (file)
@@ -1,4 +1,4 @@
-/* $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>
@@ -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 *);