Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2345VOR
rt-thread
提交
6ce20716
R
rt-thread
项目概览
2345VOR
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
6ce20716
编写于
9月 12, 2018
作者:
B
Bernard Xiong
提交者:
GitHub
9月 12, 2018
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #1800 from SummerGGift/add_silent_mode
[tools]: add menconfig silent mode
上级
6e3e9cc0
c831fae9
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
775 addition
and
752 deletion
+775
-752
tools/kconfig-frontends/frontends/mconf/mconf.c
tools/kconfig-frontends/frontends/mconf/mconf.c
+775
-752
未找到文件。
tools/kconfig-frontends/frontends/mconf/mconf.c
浏览文件 @
6ce20716
...
...
@@ -173,105 +173,105 @@ static const char mconf_readme[] = N_(
" bluetitle => an LCD friendly version of classic. (default)
\n
"
"
\n
"
),
menu_instructions
[]
=
N_
(
"Arrow keys navigate the menu. "
"<Enter> selects submenus ---> (or empty submenus ----). "
"Highlighted letters are hotkeys. "
"Pressing <Y> includes, <N> excludes, <M> modularizes features. "
"Press <Esc><Esc> to exit, <?> for Help, </> for Search. "
"Legend: [*] built-in [ ] excluded <M> module < > module capable"
),
"Arrow keys navigate the menu. "
"<Enter> selects submenus ---> (or empty submenus ----). "
"Highlighted letters are hotkeys. "
"Pressing <Y> includes, <N> excludes, <M> modularizes features. "
"Press <Esc><Esc> to exit, <?> for Help, </> for Search. "
"Legend: [*] built-in [ ] excluded <M> module < > module capable"
),
radiolist_instructions
[]
=
N_
(
"Use the arrow keys to navigate this window or "
"press the hotkey of the item you wish to select "
"followed by the <SPACE BAR>. "
"Press <?> for additional information about this option."
),
"Use the arrow keys to navigate this window or "
"press the hotkey of the item you wish to select "
"followed by the <SPACE BAR>. "
"Press <?> for additional information about this option."
),
inputbox_instructions_int
[]
=
N_
(
"Please enter a decimal value. "
"Fractions will not be accepted. "
"Use the <TAB> key to move from the input field to the buttons below it."
),
"Please enter a decimal value. "
"Fractions will not be accepted. "
"Use the <TAB> key to move from the input field to the buttons below it."
),
inputbox_instructions_hex
[]
=
N_
(
"Please enter a hexadecimal value. "
"Use the <TAB> key to move from the input field to the buttons below it."
),
"Please enter a hexadecimal value. "
"Use the <TAB> key to move from the input field to the buttons below it."
),
inputbox_instructions_string
[]
=
N_
(
"Please enter a string value. "
"Use the <TAB> key to move from the input field to the buttons below it."
),
"Please enter a string value. "
"Use the <TAB> key to move from the input field to the buttons below it."
),
setmod_text
[]
=
N_
(
"This feature depends on another which has been configured as a module.
\n
"
"As a result, this feature will be built as a module."
),
"This feature depends on another which has been configured as a module.
\n
"
"As a result, this feature will be built as a module."
),
load_config_text
[]
=
N_
(
"Enter the name of the configuration file you wish to load. "
"Accept the name shown to restore the configuration you "
"last retrieved. Leave blank to abort."
),
"Enter the name of the configuration file you wish to load. "
"Accept the name shown to restore the configuration you "
"last retrieved. Leave blank to abort."
),
load_config_help
[]
=
N_
(
"
\n
"
"For various reasons, one may wish to keep several different
\n
"
"configurations available on a single machine.
\n
"
"
\n
"
"If you have saved a previous configuration in a file other than the
\n
"
"default one, entering its name here will allow you to modify that
\n
"
"configuration.
\n
"
"
\n
"
"If you are uncertain, then you have probably never used alternate
\n
"
"configuration files. You should therefore leave this blank to abort.
\n
"
),
"
\n
"
"For various reasons, one may wish to keep several different
\n
"
"configurations available on a single machine.
\n
"
"
\n
"
"If you have saved a previous configuration in a file other than the
\n
"
"default one, entering its name here will allow you to modify that
\n
"
"configuration.
\n
"
"
\n
"
"If you are uncertain, then you have probably never used alternate
\n
"
"configuration files. You should therefore leave this blank to abort.
\n
"
),
save_config_text
[]
=
N_
(
"Enter a filename to which this configuration should be saved "
"as an alternate. Leave blank to abort."
),
"Enter a filename to which this configuration should be saved "
"as an alternate. Leave blank to abort."
),
save_config_help
[]
=
N_
(
"
\n
"
"For various reasons, one may wish to keep different configurations
\n
"
"available on a single machine.
\n
"
"
\n
"
"Entering a file name here will allow you to later retrieve, modify
\n
"
"and use the current configuration as an alternate to whatever
\n
"
"configuration options you have selected at that time.
\n
"
"
\n
"
"If you are uncertain what all this means then you should probably
\n
"
"leave this blank.
\n
"
),
"
\n
"
"For various reasons, one may wish to keep different configurations
\n
"
"available on a single machine.
\n
"
"
\n
"
"Entering a file name here will allow you to later retrieve, modify
\n
"
"and use the current configuration as an alternate to whatever
\n
"
"configuration options you have selected at that time.
\n
"
"
\n
"
"If you are uncertain what all this means then you should probably
\n
"
"leave this blank.
\n
"
),
search_help
[]
=
N_
(
"
\n
"
"Search for symbols and display their relations.
\n
"
"Regular expressions are allowed.
\n
"
"Example: search for
\"
^FOO
\"\n
"
"Result:
\n
"
"-----------------------------------------------------------------
\n
"
"Symbol: FOO [=m]
\n
"
"Type : tristate
\n
"
"Prompt: Foo bus is used to drive the bar HW
\n
"
" Location:
\n
"
" -> Bus options (PCI, PCMCIA, EISA, ISA)
\n
"
" -> PCI support (PCI [=y])
\n
"
"(1) -> PCI access mode (<choice> [=y])
\n
"
" Defined at drivers/pci/Kconfig:47
\n
"
" Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64
\n
"
" Selects: LIBCRC32
\n
"
" Selected by: BAR [=n]
\n
"
"-----------------------------------------------------------------
\n
"
"o The line 'Type:' shows the type of the configuration option for
\n
"
" this symbol (boolean, tristate, string, ...)
\n
"
"o The line 'Prompt:' shows the text used in the menu structure for
\n
"
" this symbol
\n
"
"o The 'Defined at' line tells at what file / line number the symbol
\n
"
" is defined
\n
"
"o The 'Depends on:' line tells what symbols need to be defined for
\n
"
" this symbol to be visible in the menu (selectable)
\n
"
"o The 'Location:' lines tells where in the menu structure this symbol
\n
"
" is located
\n
"
" A location followed by a [=y] indicates that this is a
\n
"
" 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 symbols will be automatically
\n
"
" selected if this symbol is selected (y or m)
\n
"
"o The 'Selected by' line tells what symbol has selected this symbol
\n
"
"
\n
"
"Only relevant lines are shown.
\n
"
"
\n\n
"
"Search examples:
\n
"
"Examples: USB
=> find all symbols containing USB
\n
"
" ^USB => find all symbols starting with USB
\n
"
" USB$ => find all symbols ending with USB
\n
"
"
\n
"
);
"
\n
"
"Search for symbols and display their relations.
\n
"
"Regular expressions are allowed.
\n
"
"Example: search for
\"
^FOO
\"\n
"
"Result:
\n
"
"-----------------------------------------------------------------
\n
"
"Symbol: FOO [=m]
\n
"
"Type : tristate
\n
"
"Prompt: Foo bus is used to drive the bar HW
\n
"
" Location:
\n
"
" -> Bus options (PCI, PCMCIA, EISA, ISA)
\n
"
" -> PCI support (PCI [=y])
\n
"
"(1) -> PCI access mode (<choice> [=y])
\n
"
" Defined at drivers/pci/Kconfig:47
\n
"
" Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64
\n
"
" Selects: LIBCRC32
\n
"
" Selected by: BAR [=n]
\n
"
"-----------------------------------------------------------------
\n
"
"o The line 'Type:' shows the type of the configuration option for
\n
"
" this symbol (boolean, tristate, string, ...)
\n
"
"o The line 'Prompt:' shows the text used in the menu structure for
\n
"
" this symbol
\n
"
"o The 'Defined at' line tells at what file / line number the symbol
\n
"
" is defined
\n
"
"o The 'Depends on:' line tells what symbols need to be defined for
\n
"
" this symbol to be visible in the menu (selectable)
\n
"
"o The 'Location:' lines tells where in the menu structure this symbol
\n
"
" is located
\n
"
" A location followed by a [=y] indicates that this is a
\n
"
" 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 symbols will be automatically
\n
"
" selected if this symbol is selected (y or m)
\n
"
"o The 'Selected by' line tells what symbol has selected this symbol
\n
"
"
\n
"
"Only relevant lines are shown.
\n
"
"
\n\n
"
"Search examples:
\n
"
"Examples: USB
=> find all symbols containing USB
\n
"
" ^USB => find all symbols starting with USB
\n
"
" USB$ => find all symbols ending with USB
\n
"
"
\n
"
);
static
int
indent
;
static
struct
menu
*
current_menu
;
...
...
@@ -287,8 +287,8 @@ static void conf_string(struct menu *menu);
static
void
conf_load
(
void
);
static
void
conf_save
(
void
);
static
int
show_textbox_ext
(
const
char
*
title
,
char
*
text
,
int
r
,
int
c
,
int
*
keys
,
int
*
vscroll
,
int
*
hscroll
,
update_text_fn
update_text
,
void
*
data
);
int
*
keys
,
int
*
vscroll
,
int
*
hscroll
,
update_text_fn
update_text
,
void
*
data
);
static
void
show_textbox
(
const
char
*
title
,
const
char
*
text
,
int
r
,
int
c
);
static
void
show_helptext
(
const
char
*
title
,
const
char
*
text
);
static
void
show_help
(
struct
menu
*
menu
);
...
...
@@ -296,752 +296,775 @@ static void show_help(struct menu *menu);
static
char
filename
[
PATH_MAX
+
1
];
static
void
set_config_filename
(
const
char
*
config_filename
)
{
static
char
menu_backtitle
[
PATH_MAX
+
128
];
int
size
;
size
=
snprintf
(
menu_backtitle
,
sizeof
(
menu_backtitle
),
"%s - %s"
,
config_filename
,
rootmenu
.
prompt
->
text
);
if
(
size
>=
sizeof
(
menu_backtitle
))
menu_backtitle
[
sizeof
(
menu_backtitle
)
-
1
]
=
'\0'
;
set_dialog_backtitle
(
menu_backtitle
);
size
=
snprintf
(
filename
,
sizeof
(
filename
),
"%s"
,
config_filename
);
if
(
size
>=
sizeof
(
filename
))
filename
[
sizeof
(
filename
)
-
1
]
=
'\0'
;
static
char
menu_backtitle
[
PATH_MAX
+
128
];
int
size
;
size
=
snprintf
(
menu_backtitle
,
sizeof
(
menu_backtitle
),
"%s - %s"
,
config_filename
,
rootmenu
.
prompt
->
text
);
if
(
size
>=
sizeof
(
menu_backtitle
))
menu_backtitle
[
sizeof
(
menu_backtitle
)
-
1
]
=
'\0'
;
set_dialog_backtitle
(
menu_backtitle
);
size
=
snprintf
(
filename
,
sizeof
(
filename
),
"%s"
,
config_filename
);
if
(
size
>=
sizeof
(
filename
))
filename
[
sizeof
(
filename
)
-
1
]
=
'\0'
;
}
struct
subtitle_part
{
struct
list_head
entries
;
const
char
*
text
;
struct
list_head
entries
;
const
char
*
text
;
};
static
LIST_HEAD
(
trail
);
static
struct
subtitle_list
*
subtitles
;
static
void
set_subtitle
(
void
)
{
struct
subtitle_part
*
sp
;
struct
subtitle_list
*
pos
,
*
tmp
;
for
(
pos
=
subtitles
;
pos
!=
NULL
;
pos
=
tmp
)
{
tmp
=
pos
->
next
;
free
(
pos
);
}
subtitles
=
NULL
;
list_for_each_entry
(
sp
,
&
trail
,
entries
)
{
if
(
sp
->
text
)
{
if
(
pos
)
{
pos
->
next
=
xcalloc
(
1
,
sizeof
(
*
pos
));
pos
=
pos
->
next
;
}
else
{
subtitles
=
pos
=
xcalloc
(
1
,
sizeof
(
*
pos
));
}
pos
->
text
=
sp
->
text
;
}
}
set_dialog_subtitles
(
subtitles
);
struct
subtitle_part
*
sp
;
struct
subtitle_list
*
pos
,
*
tmp
;
for
(
pos
=
subtitles
;
pos
!=
NULL
;
pos
=
tmp
)
{
tmp
=
pos
->
next
;
free
(
pos
);
}
subtitles
=
NULL
;
list_for_each_entry
(
sp
,
&
trail
,
entries
)
{
if
(
sp
->
text
)
{
if
(
pos
)
{
pos
->
next
=
xcalloc
(
1
,
sizeof
(
*
pos
));
pos
=
pos
->
next
;
}
else
{
subtitles
=
pos
=
xcalloc
(
1
,
sizeof
(
*
pos
));
}
pos
->
text
=
sp
->
text
;
}
}
set_dialog_subtitles
(
subtitles
);
}
static
void
reset_subtitle
(
void
)
{
struct
subtitle_list
*
pos
,
*
tmp
;
for
(
pos
=
subtitles
;
pos
!=
NULL
;
pos
=
tmp
)
{
tmp
=
pos
->
next
;
free
(
pos
);
}
subtitles
=
NULL
;
set_dialog_subtitles
(
subtitles
);
struct
subtitle_list
*
pos
,
*
tmp
;
for
(
pos
=
subtitles
;
pos
!=
NULL
;
pos
=
tmp
)
{
tmp
=
pos
->
next
;
free
(
pos
);
}
subtitles
=
NULL
;
set_dialog_subtitles
(
subtitles
);
}
struct
search_data
{
struct
list_head
*
head
;
struct
menu
**
targets
;
int
*
keys
;
struct
list_head
*
head
;
struct
menu
**
targets
;
int
*
keys
;
};
static
void
update_text
(
char
*
buf
,
size_t
start
,
size_t
end
,
void
*
_data
)
{
struct
search_data
*
data
=
_data
;
struct
jump_key
*
pos
;
int
k
=
0
;
list_for_each_entry
(
pos
,
data
->
head
,
entries
)
{
if
(
pos
->
offset
>=
start
&&
pos
->
offset
<
end
)
{
char
header
[
4
];
if
(
k
<
JUMP_NB
)
{
int
key
=
'0'
+
(
pos
->
index
%
JUMP_NB
)
+
1
;
sprintf
(
header
,
"(%c)"
,
key
);
data
->
keys
[
k
]
=
key
;
data
->
targets
[
k
]
=
pos
->
target
;
k
++
;
}
else
{
sprintf
(
header
,
" "
);
}
memcpy
(
buf
+
pos
->
offset
,
header
,
sizeof
(
header
)
-
1
);
}
}
data
->
keys
[
k
]
=
0
;
struct
search_data
*
data
=
_data
;
struct
jump_key
*
pos
;
int
k
=
0
;
list_for_each_entry
(
pos
,
data
->
head
,
entries
)
{
if
(
pos
->
offset
>=
start
&&
pos
->
offset
<
end
)
{
char
header
[
4
];
if
(
k
<
JUMP_NB
)
{
int
key
=
'0'
+
(
pos
->
index
%
JUMP_NB
)
+
1
;
sprintf
(
header
,
"(%c)"
,
key
);
data
->
keys
[
k
]
=
key
;
data
->
targets
[
k
]
=
pos
->
target
;
k
++
;
}
else
{
sprintf
(
header
,
" "
);
}
memcpy
(
buf
+
pos
->
offset
,
header
,
sizeof
(
header
)
-
1
);
}
}
data
->
keys
[
k
]
=
0
;
}
static
void
search_conf
(
void
)
{
struct
symbol
**
sym_arr
;
struct
gstr
res
;
struct
gstr
title
;
char
*
dialog_input
;
int
dres
,
vscroll
=
0
,
hscroll
=
0
;
bool
again
;
struct
gstr
sttext
;
struct
subtitle_part
stpart
;
title
=
str_new
();
str_printf
(
&
title
,
_
(
"Enter (sub)string or regexp to search for "
"(with or without
\"
%s
\"
)"
),
CONFIG_
);
struct
symbol
**
sym_arr
;
struct
gstr
res
;
struct
gstr
title
;
char
*
dialog_input
;
int
dres
,
vscroll
=
0
,
hscroll
=
0
;
bool
again
;
struct
gstr
sttext
;
struct
subtitle_part
stpart
;
title
=
str_new
();
str_printf
(
&
title
,
_
(
"Enter (sub)string or regexp to search for "
"(with or without
\"
%s
\"
)"
),
CONFIG_
);
again:
dialog_clear
();
dres
=
dialog_inputbox
(
_
(
"Search Configuration Parameter"
),
str_get
(
&
title
),
10
,
75
,
""
);
switch
(
dres
)
{
case
0
:
break
;
case
1
:
show_helptext
(
_
(
"Search Configuration"
),
search_help
);
goto
again
;
default:
str_free
(
&
title
);
return
;
}
/* strip the prefix if necessary */
dialog_input
=
dialog_input_result
;
if
(
strncasecmp
(
dialog_input_result
,
CONFIG_
,
strlen
(
CONFIG_
))
==
0
)
dialog_input
+=
strlen
(
CONFIG_
);
sttext
=
str_new
();
str_printf
(
&
sttext
,
"Search (%s)"
,
dialog_input_result
);
stpart
.
text
=
str_get
(
&
sttext
);
list_add_tail
(
&
stpart
.
entries
,
&
trail
);
sym_arr
=
sym_re_search
(
dialog_input
);
do
{
LIST_HEAD
(
head
);
struct
menu
*
targets
[
JUMP_NB
];
int
keys
[
JUMP_NB
+
1
],
i
;
struct
search_data
data
=
{
.
head
=
&
head
,
.
targets
=
targets
,
.
keys
=
keys
,
};
struct
jump_key
*
pos
,
*
tmp
;
res
=
get_relations_str
(
sym_arr
,
&
head
);
set_subtitle
();
dres
=
show_textbox_ext
(
_
(
"Search Results"
),
(
char
*
)
str_get
(
&
res
),
0
,
0
,
keys
,
&
vscroll
,
&
hscroll
,
&
update_text
,
(
void
*
)
&
data
);
again
=
false
;
for
(
i
=
0
;
i
<
JUMP_NB
&&
keys
[
i
];
i
++
)
if
(
dres
==
keys
[
i
])
{
conf
(
targets
[
i
]
->
parent
,
targets
[
i
]);
again
=
true
;
}
str_free
(
&
res
);
list_for_each_entry_safe
(
pos
,
tmp
,
&
head
,
entries
)
free
(
pos
);
}
while
(
again
);
free
(
sym_arr
);
str_free
(
&
title
);
list_del
(
trail
.
prev
);
str_free
(
&
sttext
);
dialog_clear
();
dres
=
dialog_inputbox
(
_
(
"Search Configuration Parameter"
),
str_get
(
&
title
),
10
,
75
,
""
);
switch
(
dres
)
{
case
0
:
break
;
case
1
:
show_helptext
(
_
(
"Search Configuration"
),
search_help
);
goto
again
;
default:
str_free
(
&
title
);
return
;
}
/* strip the prefix if necessary */
dialog_input
=
dialog_input_result
;
if
(
strncasecmp
(
dialog_input_result
,
CONFIG_
,
strlen
(
CONFIG_
))
==
0
)
dialog_input
+=
strlen
(
CONFIG_
);
sttext
=
str_new
();
str_printf
(
&
sttext
,
"Search (%s)"
,
dialog_input_result
);
stpart
.
text
=
str_get
(
&
sttext
);
list_add_tail
(
&
stpart
.
entries
,
&
trail
);
sym_arr
=
sym_re_search
(
dialog_input
);
do
{
LIST_HEAD
(
head
);
struct
menu
*
targets
[
JUMP_NB
];
int
keys
[
JUMP_NB
+
1
],
i
;
struct
search_data
data
=
{
.
head
=
&
head
,
.
targets
=
targets
,
.
keys
=
keys
,
};
struct
jump_key
*
pos
,
*
tmp
;
res
=
get_relations_str
(
sym_arr
,
&
head
);
set_subtitle
();
dres
=
show_textbox_ext
(
_
(
"Search Results"
),
(
char
*
)
str_get
(
&
res
),
0
,
0
,
keys
,
&
vscroll
,
&
hscroll
,
&
update_text
,
(
void
*
)
&
data
);
again
=
false
;
for
(
i
=
0
;
i
<
JUMP_NB
&&
keys
[
i
];
i
++
)
if
(
dres
==
keys
[
i
])
{
conf
(
targets
[
i
]
->
parent
,
targets
[
i
]);
again
=
true
;
}
str_free
(
&
res
);
list_for_each_entry_safe
(
pos
,
tmp
,
&
head
,
entries
)
free
(
pos
);
}
while
(
again
);
free
(
sym_arr
);
str_free
(
&
title
);
list_del
(
trail
.
prev
);
str_free
(
&
sttext
);
}
static
void
build_conf
(
struct
menu
*
menu
)
{
struct
symbol
*
sym
;
struct
property
*
prop
;
struct
menu
*
child
;
int
type
,
tmp
,
doint
=
2
;
tristate
val
;
char
ch
;
bool
visible
;
/*
* note: menu_is_visible() has side effect that it will
* recalc the value of the symbol.
*/
visible
=
menu_is_visible
(
menu
);
if
(
show_all_options
&&
!
menu_has_prompt
(
menu
))
return
;
else
if
(
!
show_all_options
&&
!
visible
)
return
;
sym
=
menu
->
sym
;
prop
=
menu
->
prompt
;
if
(
!
sym
)
{
if
(
prop
&&
menu
!=
current_menu
)
{
const
char
*
prompt
=
menu_get_prompt
(
menu
);
switch
(
prop
->
type
)
{
case
P_MENU
:
child_count
++
;
prompt
=
_
(
prompt
);
if
(
single_menu_mode
)
{
item_make
(
"%s%*c%s"
,
menu
->
data
?
"-->"
:
"++>"
,
indent
+
1
,
' '
,
prompt
);
}
else
item_make
(
" %*c%s %s"
,
indent
+
1
,
' '
,
prompt
,
menu_is_empty
(
menu
)
?
"----"
:
"--->"
);
item_set_tag
(
'm'
);
item_set_data
(
menu
);
if
(
single_menu_mode
&&
menu
->
data
)
goto
conf_childs
;
return
;
case
P_COMMENT
:
if
(
prompt
)
{
child_count
++
;
item_make
(
" %*c*** %s ***"
,
indent
+
1
,
' '
,
_
(
prompt
));
item_set_tag
(
':'
);
item_set_data
(
menu
);
}
break
;
default:
if
(
prompt
)
{
child_count
++
;
item_make
(
"---%*c%s"
,
indent
+
1
,
' '
,
_
(
prompt
));
item_set_tag
(
':'
);
item_set_data
(
menu
);
}
}
}
else
doint
=
0
;
goto
conf_childs
;
}
type
=
sym_get_type
(
sym
);
if
(
sym_is_choice
(
sym
))
{
struct
symbol
*
def_sym
=
sym_get_choice_value
(
sym
);
struct
menu
*
def_menu
=
NULL
;
child_count
++
;
for
(
child
=
menu
->
list
;
child
;
child
=
child
->
next
)
{
if
(
menu_is_visible
(
child
)
&&
child
->
sym
==
def_sym
)
def_menu
=
child
;
}
val
=
sym_get_tristate_value
(
sym
);
if
(
sym_is_changable
(
sym
))
{
switch
(
type
)
{
case
S_BOOLEAN
:
item_make
(
"[%c]"
,
val
==
no
?
' '
:
'*'
);
break
;
case
S_TRISTATE
:
switch
(
val
)
{
case
yes
:
ch
=
'*'
;
break
;
case
mod
:
ch
=
'M'
;
break
;
default:
ch
=
' '
;
break
;
}
item_make
(
"<%c>"
,
ch
);
break
;
}
item_set_tag
(
't'
);
item_set_data
(
menu
);
}
else
{
item_make
(
" "
);
item_set_tag
(
def_menu
?
't'
:
':'
);
item_set_data
(
menu
);
}
item_add_str
(
"%*c%s"
,
indent
+
1
,
' '
,
_
(
menu_get_prompt
(
menu
)));
if
(
val
==
yes
)
{
if
(
def_menu
)
{
item_add_str
(
" (%s)"
,
_
(
menu_get_prompt
(
def_menu
)));
item_add_str
(
" --->"
);
if
(
def_menu
->
list
)
{
indent
+=
2
;
build_conf
(
def_menu
);
indent
-=
2
;
}
}
return
;
}
}
else
{
if
(
menu
==
current_menu
)
{
item_make
(
"---%*c%s"
,
indent
+
1
,
' '
,
_
(
menu_get_prompt
(
menu
)));
item_set_tag
(
':'
);
item_set_data
(
menu
);
goto
conf_childs
;
}
child_count
++
;
val
=
sym_get_tristate_value
(
sym
);
if
(
sym_is_choice_value
(
sym
)
&&
val
==
yes
)
{
item_make
(
" "
);
item_set_tag
(
':'
);
item_set_data
(
menu
);
}
else
{
switch
(
type
)
{
case
S_BOOLEAN
:
if
(
sym_is_changable
(
sym
))
item_make
(
"[%c]"
,
val
==
no
?
' '
:
'*'
);
else
item_make
(
"-%c-"
,
val
==
no
?
' '
:
'*'
);
item_set_tag
(
't'
);
item_set_data
(
menu
);
break
;
case
S_TRISTATE
:
switch
(
val
)
{
case
yes
:
ch
=
'*'
;
break
;
case
mod
:
ch
=
'M'
;
break
;
default:
ch
=
' '
;
break
;
}
if
(
sym_is_changable
(
sym
))
{
if
(
sym
->
rev_dep
.
tri
==
mod
)
item_make
(
"{%c}"
,
ch
);
else
item_make
(
"<%c>"
,
ch
);
}
else
item_make
(
"-%c-"
,
ch
);
item_set_tag
(
't'
);
item_set_data
(
menu
);
break
;
default:
tmp
=
2
+
strlen
(
sym_get_string_value
(
sym
));
/* () = 2 */
item_make
(
"(%s)"
,
sym_get_string_value
(
sym
));
tmp
=
indent
-
tmp
+
4
;
if
(
tmp
<
0
)
tmp
=
0
;
item_add_str
(
"%*c%s%s"
,
tmp
,
' '
,
_
(
menu_get_prompt
(
menu
)),
(
sym_has_value
(
sym
)
||
!
sym_is_changable
(
sym
))
?
""
:
_
(
" (NEW)"
));
item_set_tag
(
's'
);
item_set_data
(
menu
);
goto
conf_childs
;
}
}
item_add_str
(
"%*c%s%s"
,
indent
+
1
,
' '
,
_
(
menu_get_prompt
(
menu
)),
(
sym_has_value
(
sym
)
||
!
sym_is_changable
(
sym
))
?
""
:
_
(
" (NEW)"
));
if
(
menu
->
prompt
->
type
==
P_MENU
)
{
item_add_str
(
" %s"
,
menu_is_empty
(
menu
)
?
"----"
:
"--->"
);
return
;
}
}
struct
symbol
*
sym
;
struct
property
*
prop
;
struct
menu
*
child
;
int
type
,
tmp
,
doint
=
2
;
tristate
val
;
char
ch
;
bool
visible
;
/*
* note: menu_is_visible() has side effect that it will
* recalc the value of the symbol.
*/
visible
=
menu_is_visible
(
menu
);
if
(
show_all_options
&&
!
menu_has_prompt
(
menu
))
return
;
else
if
(
!
show_all_options
&&
!
visible
)
return
;
sym
=
menu
->
sym
;
prop
=
menu
->
prompt
;
if
(
!
sym
)
{
if
(
prop
&&
menu
!=
current_menu
)
{
const
char
*
prompt
=
menu_get_prompt
(
menu
);
switch
(
prop
->
type
)
{
case
P_MENU
:
child_count
++
;
prompt
=
_
(
prompt
);
if
(
single_menu_mode
)
{
item_make
(
"%s%*c%s"
,
menu
->
data
?
"-->"
:
"++>"
,
indent
+
1
,
' '
,
prompt
);
}
else
item_make
(
" %*c%s %s"
,
indent
+
1
,
' '
,
prompt
,
menu_is_empty
(
menu
)
?
"----"
:
"--->"
);
item_set_tag
(
'm'
);
item_set_data
(
menu
);
if
(
single_menu_mode
&&
menu
->
data
)
goto
conf_childs
;
return
;
case
P_COMMENT
:
if
(
prompt
)
{
child_count
++
;
item_make
(
" %*c*** %s ***"
,
indent
+
1
,
' '
,
_
(
prompt
));
item_set_tag
(
':'
);
item_set_data
(
menu
);
}
break
;
default:
if
(
prompt
)
{
child_count
++
;
item_make
(
"---%*c%s"
,
indent
+
1
,
' '
,
_
(
prompt
));
item_set_tag
(
':'
);
item_set_data
(
menu
);
}
}
}
else
doint
=
0
;
goto
conf_childs
;
}
type
=
sym_get_type
(
sym
);
if
(
sym_is_choice
(
sym
))
{
struct
symbol
*
def_sym
=
sym_get_choice_value
(
sym
);
struct
menu
*
def_menu
=
NULL
;
child_count
++
;
for
(
child
=
menu
->
list
;
child
;
child
=
child
->
next
)
{
if
(
menu_is_visible
(
child
)
&&
child
->
sym
==
def_sym
)
def_menu
=
child
;
}
val
=
sym_get_tristate_value
(
sym
);
if
(
sym_is_changable
(
sym
))
{
switch
(
type
)
{
case
S_BOOLEAN
:
item_make
(
"[%c]"
,
val
==
no
?
' '
:
'*'
);
break
;
case
S_TRISTATE
:
switch
(
val
)
{
case
yes
:
ch
=
'*'
;
break
;
case
mod
:
ch
=
'M'
;
break
;
default:
ch
=
' '
;
break
;
}
item_make
(
"<%c>"
,
ch
);
break
;
}
item_set_tag
(
't'
);
item_set_data
(
menu
);
}
else
{
item_make
(
" "
);
item_set_tag
(
def_menu
?
't'
:
':'
);
item_set_data
(
menu
);
}
item_add_str
(
"%*c%s"
,
indent
+
1
,
' '
,
_
(
menu_get_prompt
(
menu
)));
if
(
val
==
yes
)
{
if
(
def_menu
)
{
item_add_str
(
" (%s)"
,
_
(
menu_get_prompt
(
def_menu
)));
item_add_str
(
" --->"
);
if
(
def_menu
->
list
)
{
indent
+=
2
;
build_conf
(
def_menu
);
indent
-=
2
;
}
}
return
;
}
}
else
{
if
(
menu
==
current_menu
)
{
item_make
(
"---%*c%s"
,
indent
+
1
,
' '
,
_
(
menu_get_prompt
(
menu
)));
item_set_tag
(
':'
);
item_set_data
(
menu
);
goto
conf_childs
;
}
child_count
++
;
val
=
sym_get_tristate_value
(
sym
);
if
(
sym_is_choice_value
(
sym
)
&&
val
==
yes
)
{
item_make
(
" "
);
item_set_tag
(
':'
);
item_set_data
(
menu
);
}
else
{
switch
(
type
)
{
case
S_BOOLEAN
:
if
(
sym_is_changable
(
sym
))
item_make
(
"[%c]"
,
val
==
no
?
' '
:
'*'
);
else
item_make
(
"-%c-"
,
val
==
no
?
' '
:
'*'
);
item_set_tag
(
't'
);
item_set_data
(
menu
);
break
;
case
S_TRISTATE
:
switch
(
val
)
{
case
yes
:
ch
=
'*'
;
break
;
case
mod
:
ch
=
'M'
;
break
;
default:
ch
=
' '
;
break
;
}
if
(
sym_is_changable
(
sym
))
{
if
(
sym
->
rev_dep
.
tri
==
mod
)
item_make
(
"{%c}"
,
ch
);
else
item_make
(
"<%c>"
,
ch
);
}
else
item_make
(
"-%c-"
,
ch
);
item_set_tag
(
't'
);
item_set_data
(
menu
);
break
;
default:
tmp
=
2
+
strlen
(
sym_get_string_value
(
sym
));
/* () = 2 */
item_make
(
"(%s)"
,
sym_get_string_value
(
sym
));
tmp
=
indent
-
tmp
+
4
;
if
(
tmp
<
0
)
tmp
=
0
;
item_add_str
(
"%*c%s%s"
,
tmp
,
' '
,
_
(
menu_get_prompt
(
menu
)),
(
sym_has_value
(
sym
)
||
!
sym_is_changable
(
sym
))
?
""
:
_
(
" (NEW)"
));
item_set_tag
(
's'
);
item_set_data
(
menu
);
goto
conf_childs
;
}
}
item_add_str
(
"%*c%s%s"
,
indent
+
1
,
' '
,
_
(
menu_get_prompt
(
menu
)),
(
sym_has_value
(
sym
)
||
!
sym_is_changable
(
sym
))
?
""
:
_
(
" (NEW)"
));
if
(
menu
->
prompt
->
type
==
P_MENU
)
{
item_add_str
(
" %s"
,
menu_is_empty
(
menu
)
?
"----"
:
"--->"
);
return
;
}
}
conf_childs:
indent
+=
doint
;
for
(
child
=
menu
->
list
;
child
;
child
=
child
->
next
)
build_conf
(
child
);
indent
-=
doint
;
indent
+=
doint
;
for
(
child
=
menu
->
list
;
child
;
child
=
child
->
next
)
build_conf
(
child
);
indent
-=
doint
;
}
static
void
conf
(
struct
menu
*
menu
,
struct
menu
*
active_menu
)
{
struct
menu
*
submenu
;
const
char
*
prompt
=
menu_get_prompt
(
menu
);
struct
subtitle_part
stpart
;
struct
symbol
*
sym
;
int
res
;
int
s_scroll
=
0
;
if
(
menu
!=
&
rootmenu
)
stpart
.
text
=
menu_get_prompt
(
menu
);
else
stpart
.
text
=
NULL
;
list_add_tail
(
&
stpart
.
entries
,
&
trail
);
while
(
1
)
{
item_reset
();
current_menu
=
menu
;
build_conf
(
menu
);
if
(
!
child_count
)
break
;
set_subtitle
();
dialog_clear
();
res
=
dialog_menu
(
prompt
?
_
(
prompt
)
:
_
(
"Main Menu"
),
_
(
menu_instructions
),
active_menu
,
&
s_scroll
);
if
(
res
==
1
||
res
==
KEY_ESC
||
res
==
-
ERRDISPLAYTOOSMALL
)
break
;
if
(
item_count
()
!=
0
)
{
if
(
!
item_activate_selected
())
continue
;
if
(
!
item_tag
())
continue
;
}
submenu
=
item_data
();
active_menu
=
item_data
();
if
(
submenu
)
sym
=
submenu
->
sym
;
else
sym
=
NULL
;
switch
(
res
)
{
case
0
:
switch
(
item_tag
())
{
case
'm'
:
if
(
single_menu_mode
)
submenu
->
data
=
(
void
*
)
(
long
)
!
submenu
->
data
;
else
conf
(
submenu
,
NULL
);
break
;
case
't'
:
if
(
sym_is_choice
(
sym
)
&&
sym_get_tristate_value
(
sym
)
==
yes
)
conf_choice
(
submenu
);
else
if
(
submenu
->
prompt
->
type
==
P_MENU
)
conf
(
submenu
,
NULL
);
break
;
case
's'
:
conf_string
(
submenu
);
break
;
}
break
;
case
2
:
if
(
sym
)
show_help
(
submenu
);
else
{
reset_subtitle
();
show_helptext
(
_
(
"README"
),
_
(
mconf_readme
));
}
break
;
case
3
:
reset_subtitle
();
conf_save
();
break
;
case
4
:
reset_subtitle
();
conf_load
();
break
;
case
5
:
if
(
item_is_tag
(
't'
))
{
if
(
sym_set_tristate_value
(
sym
,
yes
))
break
;
if
(
sym_set_tristate_value
(
sym
,
mod
))
show_textbox
(
NULL
,
setmod_text
,
6
,
74
);
}
break
;
case
6
:
if
(
item_is_tag
(
't'
))
sym_set_tristate_value
(
sym
,
no
);
break
;
case
7
:
if
(
item_is_tag
(
't'
))
sym_set_tristate_value
(
sym
,
mod
);
break
;
case
8
:
if
(
item_is_tag
(
't'
))
sym_toggle_tristate_value
(
sym
);
else
if
(
item_is_tag
(
'm'
))
conf
(
submenu
,
NULL
);
break
;
case
9
:
search_conf
();
break
;
case
10
:
show_all_options
=
!
show_all_options
;
break
;
}
}
list_del
(
trail
.
prev
);
struct
menu
*
submenu
;
const
char
*
prompt
=
menu_get_prompt
(
menu
);
struct
subtitle_part
stpart
;
struct
symbol
*
sym
;
int
res
;
int
s_scroll
=
0
;
if
(
menu
!=
&
rootmenu
)
stpart
.
text
=
menu_get_prompt
(
menu
);
else
stpart
.
text
=
NULL
;
list_add_tail
(
&
stpart
.
entries
,
&
trail
);
while
(
1
)
{
item_reset
();
current_menu
=
menu
;
build_conf
(
menu
);
if
(
!
child_count
)
break
;
set_subtitle
();
dialog_clear
();
res
=
dialog_menu
(
prompt
?
_
(
prompt
)
:
_
(
"Main Menu"
),
_
(
menu_instructions
),
active_menu
,
&
s_scroll
);
if
(
res
==
1
||
res
==
KEY_ESC
||
res
==
-
ERRDISPLAYTOOSMALL
)
break
;
if
(
item_count
()
!=
0
)
{
if
(
!
item_activate_selected
())
continue
;
if
(
!
item_tag
())
continue
;
}
submenu
=
item_data
();
active_menu
=
item_data
();
if
(
submenu
)
sym
=
submenu
->
sym
;
else
sym
=
NULL
;
switch
(
res
)
{
case
0
:
switch
(
item_tag
())
{
case
'm'
:
if
(
single_menu_mode
)
submenu
->
data
=
(
void
*
)
(
long
)
!
submenu
->
data
;
else
conf
(
submenu
,
NULL
);
break
;
case
't'
:
if
(
sym_is_choice
(
sym
)
&&
sym_get_tristate_value
(
sym
)
==
yes
)
conf_choice
(
submenu
);
else
if
(
submenu
->
prompt
->
type
==
P_MENU
)
conf
(
submenu
,
NULL
);
break
;
case
's'
:
conf_string
(
submenu
);
break
;
}
break
;
case
2
:
if
(
sym
)
show_help
(
submenu
);
else
{
reset_subtitle
();
show_helptext
(
_
(
"README"
),
_
(
mconf_readme
));
}
break
;
case
3
:
reset_subtitle
();
conf_save
();
break
;
case
4
:
reset_subtitle
();
conf_load
();
break
;
case
5
:
if
(
item_is_tag
(
't'
))
{
if
(
sym_set_tristate_value
(
sym
,
yes
))
break
;
if
(
sym_set_tristate_value
(
sym
,
mod
))
show_textbox
(
NULL
,
setmod_text
,
6
,
74
);
}
break
;
case
6
:
if
(
item_is_tag
(
't'
))
sym_set_tristate_value
(
sym
,
no
);
break
;
case
7
:
if
(
item_is_tag
(
't'
))
sym_set_tristate_value
(
sym
,
mod
);
break
;
case
8
:
if
(
item_is_tag
(
't'
))
sym_toggle_tristate_value
(
sym
);
else
if
(
item_is_tag
(
'm'
))
conf
(
submenu
,
NULL
);
break
;
case
9
:
search_conf
();
break
;
case
10
:
show_all_options
=
!
show_all_options
;
break
;
}
}
list_del
(
trail
.
prev
);
}
static
int
show_textbox_ext
(
const
char
*
title
,
char
*
text
,
int
r
,
int
c
,
int
*
keys
,
int
*
vscroll
,
int
*
hscroll
,
update_text_fn
update_text
,
void
*
data
)
*
keys
,
int
*
vscroll
,
int
*
hscroll
,
update_text_fn
update_text
,
void
*
data
)
{
dialog_clear
();
return
dialog_textbox
(
title
,
text
,
r
,
c
,
keys
,
vscroll
,
hscroll
,
update_text
,
data
);
dialog_clear
();
return
dialog_textbox
(
title
,
text
,
r
,
c
,
keys
,
vscroll
,
hscroll
,
update_text
,
data
);
}
static
void
show_textbox
(
const
char
*
title
,
const
char
*
text
,
int
r
,
int
c
)
{
show_textbox_ext
(
title
,
(
char
*
)
text
,
r
,
c
,
(
int
[])
{
0
},
NULL
,
NULL
,
NULL
,
NULL
);
show_textbox_ext
(
title
,
(
char
*
)
text
,
r
,
c
,
(
int
[])
{
0
},
NULL
,
NULL
,
NULL
,
NULL
);
}
static
void
show_helptext
(
const
char
*
title
,
const
char
*
text
)
{
show_textbox
(
title
,
text
,
0
,
0
);
show_textbox
(
title
,
text
,
0
,
0
);
}
static
void
conf_message_callback
(
const
char
*
fmt
,
va_list
ap
)
{
char
buf
[
PATH_MAX
+
1
];
vsnprintf
(
buf
,
sizeof
(
buf
),
fmt
,
ap
);
if
(
save_and_exit
)
{
if
(
!
silent
)
printf
(
"%s"
,
buf
);
}
else
{
show_textbox
(
NULL
,
buf
,
6
,
60
);
}
char
buf
[
PATH_MAX
+
1
];
vsnprintf
(
buf
,
sizeof
(
buf
),
fmt
,
ap
);
if
(
save_and_exit
)
{
if
(
!
silent
)
printf
(
"%s"
,
buf
);
}
else
{
show_textbox
(
NULL
,
buf
,
6
,
60
);
}
}
static
void
show_help
(
struct
menu
*
menu
)
{
struct
gstr
help
=
str_new
();
struct
gstr
help
=
str_new
();
help
.
max_width
=
getmaxx
(
stdscr
)
-
10
;
menu_get_ext_help
(
menu
,
&
help
);
help
.
max_width
=
getmaxx
(
stdscr
)
-
10
;
menu_get_ext_help
(
menu
,
&
help
);
show_helptext
(
_
(
menu_get_prompt
(
menu
)),
str_get
(
&
help
));
str_free
(
&
help
);
show_helptext
(
_
(
menu_get_prompt
(
menu
)),
str_get
(
&
help
));
str_free
(
&
help
);
}
static
void
conf_choice
(
struct
menu
*
menu
)
{
const
char
*
prompt
=
_
(
menu_get_prompt
(
menu
));
struct
menu
*
child
;
struct
symbol
*
active
;
active
=
sym_get_choice_value
(
menu
->
sym
);
while
(
1
)
{
int
res
;
int
selected
;
item_reset
();
current_menu
=
menu
;
for
(
child
=
menu
->
list
;
child
;
child
=
child
->
next
)
{
if
(
!
menu_is_visible
(
child
))
continue
;
if
(
child
->
sym
)
item_make
(
"%s"
,
_
(
menu_get_prompt
(
child
)));
else
{
item_make
(
"*** %s ***"
,
_
(
menu_get_prompt
(
child
)));
item_set_tag
(
':'
);
}
item_set_data
(
child
);
if
(
child
->
sym
==
active
)
item_set_selected
(
1
);
if
(
child
->
sym
==
sym_get_choice_value
(
menu
->
sym
))
item_set_tag
(
'X'
);
}
dialog_clear
();
res
=
dialog_checklist
(
prompt
?
_
(
prompt
)
:
_
(
"Main Menu"
),
_
(
radiolist_instructions
),
MENUBOX_HEIGTH_MIN
,
MENUBOX_WIDTH_MIN
,
CHECKLIST_HEIGTH_MIN
);
selected
=
item_activate_selected
();
switch
(
res
)
{
case
0
:
if
(
selected
)
{
child
=
item_data
();
if
(
!
child
->
sym
)
break
;
sym_set_tristate_value
(
child
->
sym
,
yes
);
}
return
;
case
1
:
if
(
selected
)
{
child
=
item_data
();
show_help
(
child
);
active
=
child
->
sym
;
}
else
show_help
(
menu
);
break
;
case
KEY_ESC
:
return
;
case
-
ERRDISPLAYTOOSMALL
:
return
;
}
}
const
char
*
prompt
=
_
(
menu_get_prompt
(
menu
));
struct
menu
*
child
;
struct
symbol
*
active
;
active
=
sym_get_choice_value
(
menu
->
sym
);
while
(
1
)
{
int
res
;
int
selected
;
item_reset
();
current_menu
=
menu
;
for
(
child
=
menu
->
list
;
child
;
child
=
child
->
next
)
{
if
(
!
menu_is_visible
(
child
))
continue
;
if
(
child
->
sym
)
item_make
(
"%s"
,
_
(
menu_get_prompt
(
child
)));
else
{
item_make
(
"*** %s ***"
,
_
(
menu_get_prompt
(
child
)));
item_set_tag
(
':'
);
}
item_set_data
(
child
);
if
(
child
->
sym
==
active
)
item_set_selected
(
1
);
if
(
child
->
sym
==
sym_get_choice_value
(
menu
->
sym
))
item_set_tag
(
'X'
);
}
dialog_clear
();
res
=
dialog_checklist
(
prompt
?
_
(
prompt
)
:
_
(
"Main Menu"
),
_
(
radiolist_instructions
),
MENUBOX_HEIGTH_MIN
,
MENUBOX_WIDTH_MIN
,
CHECKLIST_HEIGTH_MIN
);
selected
=
item_activate_selected
();
switch
(
res
)
{
case
0
:
if
(
selected
)
{
child
=
item_data
();
if
(
!
child
->
sym
)
break
;
sym_set_tristate_value
(
child
->
sym
,
yes
);
}
return
;
case
1
:
if
(
selected
)
{
child
=
item_data
();
show_help
(
child
);
active
=
child
->
sym
;
}
else
show_help
(
menu
);
break
;
case
KEY_ESC
:
return
;
case
-
ERRDISPLAYTOOSMALL
:
return
;
}
}
}
static
void
conf_string
(
struct
menu
*
menu
)
{
const
char
*
prompt
=
menu_get_prompt
(
menu
);
while
(
1
)
{
int
res
;
const
char
*
heading
;
switch
(
sym_get_type
(
menu
->
sym
))
{
case
S_INT
:
heading
=
_
(
inputbox_instructions_int
);
break
;
case
S_HEX
:
heading
=
_
(
inputbox_instructions_hex
);
break
;
case
S_STRING
:
heading
=
_
(
inputbox_instructions_string
);
break
;
default:
heading
=
_
(
"Internal mconf error!"
);
}
dialog_clear
();
res
=
dialog_inputbox
(
prompt
?
_
(
prompt
)
:
_
(
"Main Menu"
),
heading
,
10
,
75
,
sym_get_string_value
(
menu
->
sym
));
switch
(
res
)
{
case
0
:
if
(
sym_set_string_value
(
menu
->
sym
,
dialog_input_result
))
return
;
show_textbox
(
NULL
,
_
(
"You have made an invalid entry."
),
5
,
43
);
break
;
case
1
:
show_help
(
menu
);
break
;
case
KEY_ESC
:
return
;
}
}
const
char
*
prompt
=
menu_get_prompt
(
menu
);
while
(
1
)
{
int
res
;
const
char
*
heading
;
switch
(
sym_get_type
(
menu
->
sym
))
{
case
S_INT
:
heading
=
_
(
inputbox_instructions_int
);
break
;
case
S_HEX
:
heading
=
_
(
inputbox_instructions_hex
);
break
;
case
S_STRING
:
heading
=
_
(
inputbox_instructions_string
);
break
;
default:
heading
=
_
(
"Internal mconf error!"
);
}
dialog_clear
();
res
=
dialog_inputbox
(
prompt
?
_
(
prompt
)
:
_
(
"Main Menu"
),
heading
,
10
,
75
,
sym_get_string_value
(
menu
->
sym
));
switch
(
res
)
{
case
0
:
if
(
sym_set_string_value
(
menu
->
sym
,
dialog_input_result
))
return
;
show_textbox
(
NULL
,
_
(
"You have made an invalid entry."
),
5
,
43
);
break
;
case
1
:
show_help
(
menu
);
break
;
case
KEY_ESC
:
return
;
}
}
}
static
void
conf_load
(
void
)
{
while
(
1
)
{
int
res
;
dialog_clear
();
res
=
dialog_inputbox
(
NULL
,
load_config_text
,
11
,
55
,
filename
);
switch
(
res
)
{
case
0
:
if
(
!
dialog_input_result
[
0
])
return
;
if
(
!
conf_read
(
dialog_input_result
))
{
set_config_filename
(
dialog_input_result
);
sym_set_change_count
(
1
);
return
;
}
show_textbox
(
NULL
,
_
(
"File does not exist!"
),
5
,
38
);
break
;
case
1
:
show_helptext
(
_
(
"Load Alternate Configuration"
),
load_config_help
);
break
;
case
KEY_ESC
:
return
;
}
}
while
(
1
)
{
int
res
;
dialog_clear
();
res
=
dialog_inputbox
(
NULL
,
load_config_text
,
11
,
55
,
filename
);
switch
(
res
)
{
case
0
:
if
(
!
dialog_input_result
[
0
])
return
;
if
(
!
conf_read
(
dialog_input_result
))
{
set_config_filename
(
dialog_input_result
);
sym_set_change_count
(
1
);
return
;
}
show_textbox
(
NULL
,
_
(
"File does not exist!"
),
5
,
38
);
break
;
case
1
:
show_helptext
(
_
(
"Load Alternate Configuration"
),
load_config_help
);
break
;
case
KEY_ESC
:
return
;
}
}
}
static
void
conf_save
(
void
)
{
while
(
1
)
{
int
res
;
dialog_clear
();
res
=
dialog_inputbox
(
NULL
,
save_config_text
,
11
,
55
,
filename
);
switch
(
res
)
{
case
0
:
if
(
!
dialog_input_result
[
0
])
return
;
if
(
!
conf_write
(
dialog_input_result
))
{
set_config_filename
(
dialog_input_result
);
return
;
}
show_textbox
(
NULL
,
_
(
"Can't create file! Probably a nonexistent directory."
),
5
,
60
);
break
;
case
1
:
show_helptext
(
_
(
"Save Alternate Configuration"
),
save_config_help
);
break
;
case
KEY_ESC
:
return
;
}
}
while
(
1
)
{
int
res
;
dialog_clear
();
res
=
dialog_inputbox
(
NULL
,
save_config_text
,
11
,
55
,
filename
);
switch
(
res
)
{
case
0
:
if
(
!
dialog_input_result
[
0
])
return
;
if
(
!
conf_write
(
dialog_input_result
))
{
set_config_filename
(
dialog_input_result
);
return
;
}
show_textbox
(
NULL
,
_
(
"Can't create file! Probably a nonexistent directory."
),
5
,
60
);
break
;
case
1
:
show_helptext
(
_
(
"Save Alternate Configuration"
),
save_config_help
);
break
;
case
KEY_ESC
:
return
;
}
}
}
static
int
handle_exit
(
void
)
{
int
res
;
save_and_exit
=
1
;
reset_subtitle
();
dialog_clear
();
if
(
conf_get_changed
())
res
=
dialog_yesno
(
NULL
,
_
(
"Do you wish to save your new configuration?
\n
"
"(Press <ESC><ESC> to continue kernel configuration.)"
),
6
,
60
);
else
res
=
-
1
;
end_dialog
(
saved_x
,
saved_y
);
switch
(
res
)
{
case
0
:
if
(
conf_write
(
filename
))
{
fprintf
(
stderr
,
_
(
"
\n\n
"
"Error while writing of the configuration.
\n
"
"Your configuration changes were NOT saved."
"
\n\n
"
));
return
1
;
}
/* fall through */
case
-
1
:
if
(
!
silent
)
printf
(
_
(
"
\n\n
"
"*** End of the configuration.
\n
"
"*** Execute 'make' to start the build or try 'make help'."
"
\n\n
"
));
res
=
0
;
break
;
default:
if
(
!
silent
)
fprintf
(
stderr
,
_
(
"
\n\n
"
"Your configuration changes were NOT saved."
"
\n\n
"
));
if
(
res
!=
KEY_ESC
)
res
=
0
;
}
return
res
;
int
res
=
0
;
save_and_exit
=
1
;
reset_subtitle
();
dialog_clear
();
if
(
conf_get_changed
())
{
if
(
silent
)
{
/* save change */
res
=
0
;
}
else
{
res
=
dialog_yesno
(
NULL
,
_
(
"Do you wish to save your new configuration?
\n
"
"(Press <ESC><ESC> to continue kernel configuration.)"
),
6
,
60
);
}
}
else
res
=
-
1
;
if
(
!
silent
)
end_dialog
(
saved_x
,
saved_y
);
switch
(
res
)
{
case
0
:
if
(
conf_write
(
filename
))
{
fprintf
(
stderr
,
_
(
"
\n\n
"
"Error while writing of the configuration.
\n
"
"Your configuration changes were NOT saved."
"
\n\n
"
));
return
1
;
}
/* fall through */
case
-
1
:
if
(
!
silent
)
printf
(
_
(
"
\n\n
"
"*** End of the configuration.
\n
"
"*** Execute 'make' to start the build or try 'make help'."
"
\n\n
"
));
res
=
0
;
break
;
default:
if
(
!
silent
)
fprintf
(
stderr
,
_
(
"
\n\n
"
"Your configuration changes were NOT saved."
"
\n\n
"
));
if
(
res
!=
KEY_ESC
)
res
=
0
;
}
return
res
;
}
static
void
sig_handler
(
int
signo
)
{
exit
(
handle_exit
());
exit
(
handle_exit
());
}
int
main
(
int
ac
,
char
**
av
)
{
char
*
mode
;
int
res
;
setlocale
(
LC_ALL
,
""
);
bindtextdomain
(
PACKAGE
,
LOCALEDIR
);
textdomain
(
PACKAGE
);
signal
(
SIGINT
,
sig_handler
);
if
(
ac
>
1
&&
strcmp
(
av
[
1
],
"-s"
)
==
0
)
{
silent
=
1
;
/* Silence conf_read() until the real callback is set up */
conf_set_message_callback
(
NULL
);
av
++
;
}
conf_parse
(
av
[
1
]);
conf_read
(
NULL
);
mode
=
getenv
(
"MENUCONFIG_MODE"
);
if
(
mode
)
{
if
(
!
strcasecmp
(
mode
,
"single_menu"
))
single_menu_mode
=
1
;
}
if
(
init_dialog
(
NULL
))
{
fprintf
(
stderr
,
N_
(
"Your display is too small to run Menuconfig!
\n
"
));
fprintf
(
stderr
,
N_
(
"It must be at least 19 lines by 80 columns.
\n
"
));
return
1
;
}
set_config_filename
(
conf_get_configname
());
conf_set_message_callback
(
conf_message_callback
);
do
{
conf
(
&
rootmenu
,
NULL
);
res
=
handle_exit
();
}
while
(
res
==
KEY_ESC
);
return
res
;
char
*
mode
;
int
res
;
setlocale
(
LC_ALL
,
""
);
bindtextdomain
(
PACKAGE
,
LOCALEDIR
);
textdomain
(
PACKAGE
);
signal
(
SIGINT
,
sig_handler
);
if
(
ac
>
1
&&
strcmp
(
av
[
1
],
"-s"
)
==
0
)
{
silent
=
1
;
/* Silence conf_read() until the real callback is set up */
conf_set_message_callback
(
NULL
);
av
++
;
}
conf_parse
(
av
[
1
]);
conf_read
(
NULL
);
mode
=
getenv
(
"MENUCONFIG_MODE"
);
if
(
mode
)
{
if
(
!
strcasecmp
(
mode
,
"single_menu"
))
single_menu_mode
=
1
;
}
if
(
init_dialog
(
NULL
))
{
fprintf
(
stderr
,
N_
(
"Your display is too small to run Menuconfig!
\n
"
));
fprintf
(
stderr
,
N_
(
"It must be at least 19 lines by 80 columns.
\n
"
));
return
1
;
}
set_config_filename
(
conf_get_configname
());
conf_set_message_callback
(
conf_message_callback
);
if
(
ac
>
2
&&
strcmp
(
av
[
2
],
"-n"
)
==
0
)
{
fprintf
(
stderr
,
N_
(
"Debug mode,don't display menuconfig window.
\n
"
));
silent
=
1
;
/* Silence conf_read() until the real callback is set up */
conf_set_message_callback
(
NULL
);
av
++
;
res
=
handle_exit
();
return
1
;
}
do
{
conf
(
&
rootmenu
,
NULL
);
res
=
handle_exit
();
}
while
(
res
==
KEY_ESC
);
return
res
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录