build: scripts/config - update to kconfig-v6.6.16
The main goal here is to keep this close to upstream. Changes include: - allow symbols implied by y to become m - make 'imply' obey the direct dependency - allow only 'config', 'comment', and 'if' inside 'choice' - qconf: make search fully work again on split mode - qconf: navigate menus on hyperlinks - remove '---help---' support - qconf: allow to edit "int", "hex", "string" menus in-place - qconf: drop Qt4 support - nconf: fix core dump when searching in empty menu - nconf: stop endless search loops - Create links to main menu items in search - fix segmentation fault in menuconfig search - nconf: Add search jump feature - port qconf to work with Qt6 in addition to Qt5 - fix possible buffer overflow - fix memory leak from range properties Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
This commit is contained in:
committed by
Robert Marko
parent
ff6df9ac9f
commit
65a3eb28d5
@@ -55,8 +55,8 @@ static const char nconf_global_help[] =
|
||||
"\n"
|
||||
"Menu navigation keys\n"
|
||||
"----------------------------------------------------------------------\n"
|
||||
"Linewise up <Up>\n"
|
||||
"Linewise down <Down>\n"
|
||||
"Linewise up <Up> <k>\n"
|
||||
"Linewise down <Down> <j>\n"
|
||||
"Pagewise up <Page Up>\n"
|
||||
"Pagewise down <Page Down>\n"
|
||||
"First entry <Home>\n"
|
||||
@@ -223,7 +223,7 @@ search_help[] =
|
||||
"Location:\n"
|
||||
" -> Bus options (PCI, PCMCIA, EISA, ISA)\n"
|
||||
" -> PCI support (PCI [ = y])\n"
|
||||
" -> PCI access mode (<choice> [ = y])\n"
|
||||
"(1) -> PCI access mode (<choice> [ = y])\n"
|
||||
"Selects: LIBCRC32\n"
|
||||
"Selected by: BAR\n"
|
||||
"-----------------------------------------------------------------\n"
|
||||
@@ -234,9 +234,13 @@ search_help[] =
|
||||
"o The 'Depends on:' line lists symbols that need to be defined for\n"
|
||||
" this symbol to be visible and selectable in the menu.\n"
|
||||
"o The 'Location:' lines tell, where in the menu structure this symbol\n"
|
||||
" is located. A location followed by a [ = y] indicates that this is\n"
|
||||
" a selectable menu item, and the current value is displayed inside\n"
|
||||
" brackets.\n"
|
||||
" is located.\n"
|
||||
" A location followed by a [ = y] indicates that this is\n"
|
||||
" a selectable menu item, and the current value is displayed inside\n"
|
||||
" brackets.\n"
|
||||
" Press the key in the (#) prefix to jump directly to that\n"
|
||||
" location. You will be returned to the current search results\n"
|
||||
" after exiting this new menu.\n"
|
||||
"o The 'Selects:' line tells, what symbol will be automatically selected\n"
|
||||
" if this symbol is selected (y or m).\n"
|
||||
"o The 'Selected by' line tells what symbol has selected this symbol.\n"
|
||||
@@ -278,7 +282,9 @@ static const char *current_instructions = menu_instructions;
|
||||
|
||||
static char *dialog_input_result;
|
||||
static int dialog_input_result_len;
|
||||
static int jump_key_char;
|
||||
|
||||
static void selected_conf(struct menu *menu, struct menu *active_menu);
|
||||
static void conf(struct menu *menu);
|
||||
static void conf_choice(struct menu *menu);
|
||||
static void conf_string(struct menu *menu);
|
||||
@@ -688,6 +694,57 @@ static int do_exit(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct search_data {
|
||||
struct list_head *head;
|
||||
struct menu *target;
|
||||
};
|
||||
|
||||
static int next_jump_key(int key)
|
||||
{
|
||||
if (key < '1' || key > '9')
|
||||
return '1';
|
||||
|
||||
key++;
|
||||
|
||||
if (key > '9')
|
||||
key = '1';
|
||||
|
||||
return key;
|
||||
}
|
||||
|
||||
static int handle_search_keys(int key, size_t start, size_t end, void *_data)
|
||||
{
|
||||
struct search_data *data = _data;
|
||||
struct jump_key *pos;
|
||||
int index = 0;
|
||||
|
||||
if (key < '1' || key > '9')
|
||||
return 0;
|
||||
|
||||
list_for_each_entry(pos, data->head, entries) {
|
||||
index = next_jump_key(index);
|
||||
|
||||
if (pos->offset < start)
|
||||
continue;
|
||||
|
||||
if (pos->offset >= end)
|
||||
break;
|
||||
|
||||
if (key == index) {
|
||||
data->target = pos->target;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_jump_key_char(void)
|
||||
{
|
||||
jump_key_char = next_jump_key(jump_key_char);
|
||||
|
||||
return jump_key_char;
|
||||
}
|
||||
|
||||
static void search_conf(void)
|
||||
{
|
||||
@@ -695,7 +752,8 @@ static void search_conf(void)
|
||||
struct gstr res;
|
||||
struct gstr title;
|
||||
char *dialog_input;
|
||||
int dres;
|
||||
int dres, vscroll = 0, hscroll = 0;
|
||||
bool again;
|
||||
|
||||
title = str_new();
|
||||
str_printf( &title, "Enter (sub)string or regexp to search for "
|
||||
@@ -724,11 +782,28 @@ again:
|
||||
dialog_input += strlen(CONFIG_);
|
||||
|
||||
sym_arr = sym_re_search(dialog_input);
|
||||
res = get_relations_str(sym_arr, NULL);
|
||||
|
||||
do {
|
||||
LIST_HEAD(head);
|
||||
struct search_data data = {
|
||||
.head = &head,
|
||||
.target = NULL,
|
||||
};
|
||||
jump_key_char = 0;
|
||||
res = get_relations_str(sym_arr, &head);
|
||||
dres = show_scroll_win_ext(main_window,
|
||||
"Search Results", str_get(&res),
|
||||
&vscroll, &hscroll,
|
||||
handle_search_keys, &data);
|
||||
again = false;
|
||||
if (dres >= '1' && dres <= '9') {
|
||||
assert(data.target != NULL);
|
||||
selected_conf(data.target->parent, data.target);
|
||||
again = true;
|
||||
}
|
||||
str_free(&res);
|
||||
} while (again);
|
||||
free(sym_arr);
|
||||
show_scroll_win(main_window,
|
||||
"Search Results", str_get(&res));
|
||||
str_free(&res);
|
||||
str_free(&title);
|
||||
}
|
||||
|
||||
@@ -1065,10 +1140,15 @@ static int do_match(int key, struct match_state *state, int *ans)
|
||||
}
|
||||
|
||||
static void conf(struct menu *menu)
|
||||
{
|
||||
selected_conf(menu, NULL);
|
||||
}
|
||||
|
||||
static void selected_conf(struct menu *menu, struct menu *active_menu)
|
||||
{
|
||||
struct menu *submenu = NULL;
|
||||
struct symbol *sym;
|
||||
int res;
|
||||
int i, res;
|
||||
int current_index = 0;
|
||||
int last_top_row = 0;
|
||||
struct match_state match_state = {
|
||||
@@ -1084,6 +1164,19 @@ static void conf(struct menu *menu)
|
||||
if (!child_count)
|
||||
break;
|
||||
|
||||
if (active_menu != NULL) {
|
||||
for (i = 0; i < items_num; i++) {
|
||||
struct mitem *mcur;
|
||||
|
||||
mcur = (struct mitem *) item_userptr(curses_menu_items[i]);
|
||||
if ((struct menu *) mcur->usrptr == active_menu) {
|
||||
current_index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
active_menu = NULL;
|
||||
}
|
||||
|
||||
show_menu(menu_get_prompt(menu), menu_instructions,
|
||||
current_index, &last_top_row);
|
||||
keypad((menu_win(curses_menu)), TRUE);
|
||||
@@ -1108,9 +1201,11 @@ static void conf(struct menu *menu)
|
||||
break;
|
||||
switch (res) {
|
||||
case KEY_DOWN:
|
||||
case 'j':
|
||||
menu_driver(curses_menu, REQ_DOWN_ITEM);
|
||||
break;
|
||||
case KEY_UP:
|
||||
case 'k':
|
||||
menu_driver(curses_menu, REQ_UP_ITEM);
|
||||
break;
|
||||
case KEY_NPAGE:
|
||||
@@ -1291,9 +1386,11 @@ static void conf_choice(struct menu *menu)
|
||||
break;
|
||||
switch (res) {
|
||||
case KEY_DOWN:
|
||||
case 'j':
|
||||
menu_driver(curses_menu, REQ_DOWN_ITEM);
|
||||
break;
|
||||
case KEY_UP:
|
||||
case 'k':
|
||||
menu_driver(curses_menu, REQ_UP_ITEM);
|
||||
break;
|
||||
case KEY_NPAGE:
|
||||
|
||||
Reference in New Issue
Block a user