@@ -139,14 +139,22 @@ static void cmd_help(int argc, char *argv[])
return bt_shell_noninteractive_quit(EXIT_SUCCESS);
}
-static const struct bt_shell_menu *find_menu(const char *name, size_t len)
+static const struct bt_shell_menu *find_menu(const char *name, size_t len,
+ int *index)
{
const struct queue_entry *entry;
+ int i;
- for (entry = queue_get_entries(data.submenus); entry;
- entry = entry->next) {
+ for (i = 0, entry = queue_get_entries(data.submenus); entry;
+ entry = entry->next, i++) {
struct bt_shell_menu *menu = entry->data;
+ if (index) {
+ if (i < *index)
+ continue;
+ (*index)++;
+ }
+
if (!strncmp(menu->name, name, len))
return menu;
}
@@ -188,7 +196,7 @@ static void cmd_menu(int argc, char *argv[])
return bt_shell_noninteractive_quit(EXIT_FAILURE);
}
- menu = find_menu(argv[1], strlen(argv[1]));
+ menu = find_menu(argv[1], strlen(argv[1]), NULL);
if (!menu) {
bt_shell_printf("Unable find menu with name: %s\n", argv[1]);
return bt_shell_noninteractive_quit(EXIT_FAILURE);
@@ -485,7 +493,7 @@ static int submenu_exec(int argc, char *argv[])
len = name - argv[0];
name[0] = '\0';
- submenu = find_menu(argv[0], strlen(argv[0]));
+ submenu = find_menu(argv[0], strlen(argv[0]), NULL);
if (!submenu)
return -ENOENT;
@@ -735,7 +743,7 @@ static char *find_cmd(const char *text,
static char *cmd_generator(const char *text, int state)
{
static int index;
- static bool default_menu_enabled, submenu_enabled;
+ static bool default_menu_enabled, menu_enabled, submenu_enabled;
static const struct bt_shell_menu *menu;
char *cmd;
@@ -754,9 +762,22 @@ static char *cmd_generator(const char *text, int state)
index = 0;
menu = data.menu;
default_menu_enabled = false;
+
+ if (data.main == data.menu)
+ menu_enabled = true;
}
}
+ if (menu_enabled) {
+ menu = find_menu(text, strlen(text), &index);
+ if (menu)
+ return strdup(menu->name);
+
+ index = 0;
+ menu = data.menu;
+ menu_enabled = false;
+ }
+
if (!submenu_enabled) {
cmd = find_cmd(text, menu->entries, &index);
if (cmd || menu != data.main)
@@ -766,7 +787,7 @@ static char *cmd_generator(const char *text, int state)
if (!cmd)
return NULL;
- menu = find_menu(text, cmd - text);
+ menu = find_menu(text, cmd - text, NULL);
if (!menu)
return NULL;
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> submenus should be part of the list of possible auto completes just as other commands. --- src/shared/shell.c | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-)