10a9064fbSMasahiro Yamada /*
20a9064fbSMasahiro Yamada * Copyright (C) 2008 Nir Tzachar <nir.tzachar@gmail.com?
30a9064fbSMasahiro Yamada * Released under the terms of the GNU GPL v2.0.
40a9064fbSMasahiro Yamada *
50a9064fbSMasahiro Yamada * Derived from menuconfig.
60a9064fbSMasahiro Yamada *
70a9064fbSMasahiro Yamada */
8*bf7ab1e7SMasahiro Yamada #ifndef _GNU_SOURCE
90a9064fbSMasahiro Yamada #define _GNU_SOURCE
10*bf7ab1e7SMasahiro Yamada #endif
110a9064fbSMasahiro Yamada #include <string.h>
120a9064fbSMasahiro Yamada #include <stdlib.h>
130a9064fbSMasahiro Yamada
140a9064fbSMasahiro Yamada #include "lkc.h"
150a9064fbSMasahiro Yamada #include "nconf.h"
160a9064fbSMasahiro Yamada #include <ctype.h>
170a9064fbSMasahiro Yamada
180a9064fbSMasahiro Yamada static const char nconf_global_help[] = N_(
190a9064fbSMasahiro Yamada "Help windows\n"
200a9064fbSMasahiro Yamada "------------\n"
210a9064fbSMasahiro Yamada "o Global help: Unless in a data entry window, pressing <F1> will give \n"
220a9064fbSMasahiro Yamada " you the global help window, which you are just reading.\n"
230a9064fbSMasahiro Yamada "\n"
240a9064fbSMasahiro Yamada "o A short version of the global help is available by pressing <F3>.\n"
250a9064fbSMasahiro Yamada "\n"
260a9064fbSMasahiro Yamada "o Local help: To get help related to the current menu entry, use any\n"
270a9064fbSMasahiro Yamada " of <?> <h>, or if in a data entry window then press <F1>.\n"
280a9064fbSMasahiro Yamada "\n"
290a9064fbSMasahiro Yamada "\n"
300a9064fbSMasahiro Yamada "Menu entries\n"
310a9064fbSMasahiro Yamada "------------\n"
320a9064fbSMasahiro Yamada "This interface lets you select features and parameters for the kernel\n"
330a9064fbSMasahiro Yamada "build. Kernel features can either be built-in, modularized, or removed.\n"
340a9064fbSMasahiro Yamada "Parameters must be entered as text or decimal or hexadecimal numbers.\n"
350a9064fbSMasahiro Yamada "\n"
360a9064fbSMasahiro Yamada "Menu entries beginning with following braces represent features that\n"
370a9064fbSMasahiro Yamada " [ ] can be built in or removed\n"
380a9064fbSMasahiro Yamada " < > can be built in, modularized or removed\n"
390a9064fbSMasahiro Yamada " { } can be built in or modularized, are selected by another feature\n"
400a9064fbSMasahiro Yamada " - - are selected by another feature\n"
410a9064fbSMasahiro Yamada " XXX cannot be selected. Symbol Info <F2> tells you why.\n"
420a9064fbSMasahiro Yamada "*, M or whitespace inside braces means to build in, build as a module\n"
430a9064fbSMasahiro Yamada "or to exclude the feature respectively.\n"
440a9064fbSMasahiro Yamada "\n"
450a9064fbSMasahiro Yamada "To change any of these features, highlight it with the movement keys\n"
460a9064fbSMasahiro Yamada "listed below and press <y> to build it in, <m> to make it a module or\n"
470a9064fbSMasahiro Yamada "<n> to remove it. You may press the <Space> key to cycle through the\n"
480a9064fbSMasahiro Yamada "available options.\n"
490a9064fbSMasahiro Yamada "\n"
500a9064fbSMasahiro Yamada "A trailing \"--->\" designates a submenu, a trailing \"----\" an\n"
510a9064fbSMasahiro Yamada "empty submenu.\n"
520a9064fbSMasahiro Yamada "\n"
530a9064fbSMasahiro Yamada "Menu navigation keys\n"
540a9064fbSMasahiro Yamada "----------------------------------------------------------------------\n"
550a9064fbSMasahiro Yamada "Linewise up <Up>\n"
560a9064fbSMasahiro Yamada "Linewise down <Down>\n"
570a9064fbSMasahiro Yamada "Pagewise up <Page Up>\n"
580a9064fbSMasahiro Yamada "Pagewise down <Page Down>\n"
590a9064fbSMasahiro Yamada "First entry <Home>\n"
600a9064fbSMasahiro Yamada "Last entry <End>\n"
610a9064fbSMasahiro Yamada "Enter a submenu <Right> <Enter>\n"
620a9064fbSMasahiro Yamada "Go back to parent menu <Left> <Esc> <F5>\n"
630a9064fbSMasahiro Yamada "Close a help window <Enter> <Esc> <F5>\n"
640a9064fbSMasahiro Yamada "Close entry window, apply <Enter>\n"
650a9064fbSMasahiro Yamada "Close entry window, forget <Esc> <F5>\n"
660a9064fbSMasahiro Yamada "Start incremental, case-insensitive search for STRING in menu entries,\n"
670a9064fbSMasahiro Yamada " no regex support, STRING is displayed in upper left corner\n"
680a9064fbSMasahiro Yamada " </>STRING\n"
690a9064fbSMasahiro Yamada " Remove last character <Backspace>\n"
700a9064fbSMasahiro Yamada " Jump to next hit <Down>\n"
710a9064fbSMasahiro Yamada " Jump to previous hit <Up>\n"
720a9064fbSMasahiro Yamada "Exit menu search mode </> <Esc>\n"
730a9064fbSMasahiro Yamada "Search for configuration variables with or without leading CONFIG_\n"
740a9064fbSMasahiro Yamada " <F8>RegExpr<Enter>\n"
750a9064fbSMasahiro Yamada "Verbose search help <F8><F1>\n"
760a9064fbSMasahiro Yamada "----------------------------------------------------------------------\n"
770a9064fbSMasahiro Yamada "\n"
780a9064fbSMasahiro Yamada "Unless in a data entry window, key <1> may be used instead of <F1>,\n"
790a9064fbSMasahiro Yamada "<2> instead of <F2>, etc.\n"
800a9064fbSMasahiro Yamada "\n"
810a9064fbSMasahiro Yamada "\n"
820a9064fbSMasahiro Yamada "Radiolist (Choice list)\n"
830a9064fbSMasahiro Yamada "-----------------------\n"
840a9064fbSMasahiro Yamada "Use the movement keys listed above to select the option you wish to set\n"
850a9064fbSMasahiro Yamada "and press <Space>.\n"
860a9064fbSMasahiro Yamada "\n"
870a9064fbSMasahiro Yamada "\n"
880a9064fbSMasahiro Yamada "Data entry\n"
890a9064fbSMasahiro Yamada "----------\n"
900a9064fbSMasahiro Yamada "Enter the requested information and press <Enter>. Hexadecimal values\n"
910a9064fbSMasahiro Yamada "may be entered without the \"0x\" prefix.\n"
920a9064fbSMasahiro Yamada "\n"
930a9064fbSMasahiro Yamada "\n"
940a9064fbSMasahiro Yamada "Text Box (Help Window)\n"
950a9064fbSMasahiro Yamada "----------------------\n"
960a9064fbSMasahiro Yamada "Use movement keys as listed in table above.\n"
970a9064fbSMasahiro Yamada "\n"
980a9064fbSMasahiro Yamada "Press any of <Enter> <Esc> <q> <F5> <F9> to exit.\n"
990a9064fbSMasahiro Yamada "\n"
1000a9064fbSMasahiro Yamada "\n"
1010a9064fbSMasahiro Yamada "Alternate configuration files\n"
1020a9064fbSMasahiro Yamada "-----------------------------\n"
1030a9064fbSMasahiro Yamada "nconfig supports switching between different configurations.\n"
1040a9064fbSMasahiro Yamada "Press <F6> to save your current configuration. Press <F7> and enter\n"
1050a9064fbSMasahiro Yamada "a file name to load a previously saved configuration.\n"
1060a9064fbSMasahiro Yamada "\n"
1070a9064fbSMasahiro Yamada "\n"
1080a9064fbSMasahiro Yamada "Terminal configuration\n"
1090a9064fbSMasahiro Yamada "----------------------\n"
1100a9064fbSMasahiro Yamada "If you use nconfig in a xterm window, make sure your TERM environment\n"
1110a9064fbSMasahiro Yamada "variable specifies a terminal configuration which supports at least\n"
1120a9064fbSMasahiro Yamada "16 colors. Otherwise nconfig will look rather bad.\n"
1130a9064fbSMasahiro Yamada "\n"
1140a9064fbSMasahiro Yamada "If the \"stty size\" command reports the current terminalsize correctly,\n"
1150a9064fbSMasahiro Yamada "nconfig will adapt to sizes larger than the traditional 80x25 \"standard\"\n"
1160a9064fbSMasahiro Yamada "and display longer menus properly.\n"
1170a9064fbSMasahiro Yamada "\n"
1180a9064fbSMasahiro Yamada "\n"
1190a9064fbSMasahiro Yamada "Single menu mode\n"
1200a9064fbSMasahiro Yamada "----------------\n"
1210a9064fbSMasahiro Yamada "If you prefer to have all of the menu entries listed in a single menu,\n"
1220a9064fbSMasahiro Yamada "rather than the default multimenu hierarchy, run nconfig with\n"
1230a9064fbSMasahiro Yamada "NCONFIG_MODE environment variable set to single_menu. Example:\n"
1240a9064fbSMasahiro Yamada "\n"
1250a9064fbSMasahiro Yamada "make NCONFIG_MODE=single_menu nconfig\n"
1260a9064fbSMasahiro Yamada "\n"
1270a9064fbSMasahiro Yamada "<Enter> will then unfold the appropriate category, or fold it if it\n"
1280a9064fbSMasahiro Yamada "is already unfolded. Folded menu entries will be designated by a\n"
1290a9064fbSMasahiro Yamada "leading \"++>\" and unfolded entries by a leading \"-->\".\n"
1300a9064fbSMasahiro Yamada "\n"
1310a9064fbSMasahiro Yamada "Note that this mode can eventually be a little more CPU expensive than\n"
1320a9064fbSMasahiro Yamada "the default mode, especially with a larger number of unfolded submenus.\n"
1330a9064fbSMasahiro Yamada "\n"),
1340a9064fbSMasahiro Yamada menu_no_f_instructions[] = N_(
1350a9064fbSMasahiro Yamada "Legend: [*] built-in [ ] excluded <M> module < > module capable.\n"
1360a9064fbSMasahiro Yamada "Submenus are designated by a trailing \"--->\", empty ones by \"----\".\n"
1370a9064fbSMasahiro Yamada "\n"
1380a9064fbSMasahiro Yamada "Use the following keys to navigate the menus:\n"
1390a9064fbSMasahiro Yamada "Move up or down with <Up> and <Down>.\n"
1400a9064fbSMasahiro Yamada "Enter a submenu with <Enter> or <Right>.\n"
1410a9064fbSMasahiro Yamada "Exit a submenu to its parent menu with <Esc> or <Left>.\n"
1420a9064fbSMasahiro Yamada "Pressing <y> includes, <n> excludes, <m> modularizes features.\n"
1430a9064fbSMasahiro Yamada "Pressing <Space> cycles through the available options.\n"
1440a9064fbSMasahiro Yamada "To search for menu entries press </>.\n"
1450a9064fbSMasahiro Yamada "<Esc> always leaves the current window.\n"
1460a9064fbSMasahiro Yamada "\n"
1470a9064fbSMasahiro Yamada "You do not have function keys support.\n"
1480a9064fbSMasahiro Yamada "Press <1> instead of <F1>, <2> instead of <F2>, etc.\n"
1490a9064fbSMasahiro Yamada "For verbose global help use key <1>.\n"
1500a9064fbSMasahiro Yamada "For help related to the current menu entry press <?> or <h>.\n"),
1510a9064fbSMasahiro Yamada menu_instructions[] = N_(
1520a9064fbSMasahiro Yamada "Legend: [*] built-in [ ] excluded <M> module < > module capable.\n"
1530a9064fbSMasahiro Yamada "Submenus are designated by a trailing \"--->\", empty ones by \"----\".\n"
1540a9064fbSMasahiro Yamada "\n"
1550a9064fbSMasahiro Yamada "Use the following keys to navigate the menus:\n"
1560a9064fbSMasahiro Yamada "Move up or down with <Up> or <Down>.\n"
1570a9064fbSMasahiro Yamada "Enter a submenu with <Enter> or <Right>.\n"
1580a9064fbSMasahiro Yamada "Exit a submenu to its parent menu with <Esc> or <Left>.\n"
1590a9064fbSMasahiro Yamada "Pressing <y> includes, <n> excludes, <m> modularizes features.\n"
1600a9064fbSMasahiro Yamada "Pressing <Space> cycles through the available options.\n"
1610a9064fbSMasahiro Yamada "To search for menu entries press </>.\n"
1620a9064fbSMasahiro Yamada "<Esc> always leaves the current window.\n"
1630a9064fbSMasahiro Yamada "\n"
1640a9064fbSMasahiro Yamada "Pressing <1> may be used instead of <F1>, <2> instead of <F2>, etc.\n"
1650a9064fbSMasahiro Yamada "For verbose global help press <F1>.\n"
1660a9064fbSMasahiro Yamada "For help related to the current menu entry press <?> or <h>.\n"),
1670a9064fbSMasahiro Yamada radiolist_instructions[] = N_(
1680a9064fbSMasahiro Yamada "Press <Up>, <Down>, <Home> or <End> to navigate a radiolist, select\n"
1690a9064fbSMasahiro Yamada "with <Space>.\n"
1700a9064fbSMasahiro Yamada "For help related to the current entry press <?> or <h>.\n"
1710a9064fbSMasahiro Yamada "For global help press <F1>.\n"),
1720a9064fbSMasahiro Yamada inputbox_instructions_int[] = N_(
1730a9064fbSMasahiro Yamada "Please enter a decimal value.\n"
1740a9064fbSMasahiro Yamada "Fractions will not be accepted.\n"
1750a9064fbSMasahiro Yamada "Press <Enter> to apply, <Esc> to cancel."),
1760a9064fbSMasahiro Yamada inputbox_instructions_hex[] = N_(
1770a9064fbSMasahiro Yamada "Please enter a hexadecimal value.\n"
1780a9064fbSMasahiro Yamada "Press <Enter> to apply, <Esc> to cancel."),
1790a9064fbSMasahiro Yamada inputbox_instructions_string[] = N_(
1800a9064fbSMasahiro Yamada "Please enter a string value.\n"
1810a9064fbSMasahiro Yamada "Press <Enter> to apply, <Esc> to cancel."),
1820a9064fbSMasahiro Yamada setmod_text[] = N_(
1830a9064fbSMasahiro Yamada "This feature depends on another feature which has been configured as a\n"
1840a9064fbSMasahiro Yamada "module. As a result, the current feature will be built as a module too."),
1850a9064fbSMasahiro Yamada load_config_text[] = N_(
1860a9064fbSMasahiro Yamada "Enter the name of the configuration file you wish to load.\n"
1870a9064fbSMasahiro Yamada "Accept the name shown to restore the configuration you last\n"
1880a9064fbSMasahiro Yamada "retrieved. Leave empty to abort."),
1890a9064fbSMasahiro Yamada load_config_help[] = N_(
1900a9064fbSMasahiro Yamada "For various reasons, one may wish to keep several different\n"
1910a9064fbSMasahiro Yamada "configurations available on a single machine.\n"
1920a9064fbSMasahiro Yamada "\n"
1930a9064fbSMasahiro Yamada "If you have saved a previous configuration in a file other than the\n"
1940a9064fbSMasahiro Yamada "default one, entering its name here will allow you to load and modify\n"
1950a9064fbSMasahiro Yamada "that configuration.\n"
1960a9064fbSMasahiro Yamada "\n"
1970a9064fbSMasahiro Yamada "Leave empty to abort.\n"),
1980a9064fbSMasahiro Yamada save_config_text[] = N_(
1990a9064fbSMasahiro Yamada "Enter a filename to which this configuration should be saved\n"
2000a9064fbSMasahiro Yamada "as an alternate. Leave empty to abort."),
2010a9064fbSMasahiro Yamada save_config_help[] = N_(
2020a9064fbSMasahiro Yamada "For various reasons, one may wish to keep several different\n"
2030a9064fbSMasahiro Yamada "configurations available on a single machine.\n"
2040a9064fbSMasahiro Yamada "\n"
2050a9064fbSMasahiro Yamada "Entering a file name here will allow you to later retrieve, modify\n"
2060a9064fbSMasahiro Yamada "and use the current configuration as an alternate to whatever\n"
2070a9064fbSMasahiro Yamada "configuration options you have selected at that time.\n"
2080a9064fbSMasahiro Yamada "\n"
2090a9064fbSMasahiro Yamada "Leave empty to abort.\n"),
2100a9064fbSMasahiro Yamada search_help[] = N_(
2110a9064fbSMasahiro Yamada "Search for symbols (configuration variable names CONFIG_*) and display\n"
2120a9064fbSMasahiro Yamada "their relations. Regular expressions are supported.\n"
2130a9064fbSMasahiro Yamada "Example: Search for \"^FOO\".\n"
2140a9064fbSMasahiro Yamada "Result:\n"
2150a9064fbSMasahiro Yamada "-----------------------------------------------------------------\n"
2160a9064fbSMasahiro Yamada "Symbol: FOO [ = m]\n"
2170a9064fbSMasahiro Yamada "Prompt: Foo bus is used to drive the bar HW\n"
2180a9064fbSMasahiro Yamada "Defined at drivers/pci/Kconfig:47\n"
2190a9064fbSMasahiro Yamada "Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
2200a9064fbSMasahiro Yamada "Location:\n"
2210a9064fbSMasahiro Yamada " -> Bus options (PCI, PCMCIA, EISA, ISA)\n"
2220a9064fbSMasahiro Yamada " -> PCI support (PCI [ = y])\n"
2230a9064fbSMasahiro Yamada " -> PCI access mode (<choice> [ = y])\n"
2240a9064fbSMasahiro Yamada "Selects: LIBCRC32\n"
2250a9064fbSMasahiro Yamada "Selected by: BAR\n"
2260a9064fbSMasahiro Yamada "-----------------------------------------------------------------\n"
2270a9064fbSMasahiro Yamada "o The line 'Prompt:' shows the text displayed for this symbol in\n"
2280a9064fbSMasahiro Yamada " the menu hierarchy.\n"
2290a9064fbSMasahiro Yamada "o The 'Defined at' line tells at what file / line number the symbol is\n"
2300a9064fbSMasahiro Yamada " defined.\n"
2310a9064fbSMasahiro Yamada "o The 'Depends on:' line lists symbols that need to be defined for\n"
2320a9064fbSMasahiro Yamada " this symbol to be visible and selectable in the menu.\n"
2330a9064fbSMasahiro Yamada "o The 'Location:' lines tell, where in the menu structure this symbol\n"
2340a9064fbSMasahiro Yamada " is located. A location followed by a [ = y] indicates that this is\n"
2350a9064fbSMasahiro Yamada " a selectable menu item, and the current value is displayed inside\n"
2360a9064fbSMasahiro Yamada " brackets.\n"
2370a9064fbSMasahiro Yamada "o The 'Selects:' line tells, what symbol will be automatically selected\n"
2380a9064fbSMasahiro Yamada " if this symbol is selected (y or m).\n"
2390a9064fbSMasahiro Yamada "o The 'Selected by' line tells what symbol has selected this symbol.\n"
2400a9064fbSMasahiro Yamada "\n"
2410a9064fbSMasahiro Yamada "Only relevant lines are shown.\n"
2420a9064fbSMasahiro Yamada "\n\n"
2430a9064fbSMasahiro Yamada "Search examples:\n"
2440a9064fbSMasahiro Yamada "USB => find all symbols containing USB\n"
2450a9064fbSMasahiro Yamada "^USB => find all symbols starting with USB\n"
2460a9064fbSMasahiro Yamada "USB$ => find all symbols ending with USB\n"
2470a9064fbSMasahiro Yamada "\n");
2480a9064fbSMasahiro Yamada
2490a9064fbSMasahiro Yamada struct mitem {
2500a9064fbSMasahiro Yamada char str[256];
2510a9064fbSMasahiro Yamada char tag;
2520a9064fbSMasahiro Yamada void *usrptr;
2530a9064fbSMasahiro Yamada int is_visible;
2540a9064fbSMasahiro Yamada };
2550a9064fbSMasahiro Yamada
2560a9064fbSMasahiro Yamada #define MAX_MENU_ITEMS 4096
2570a9064fbSMasahiro Yamada static int show_all_items;
2580a9064fbSMasahiro Yamada static int indent;
2590a9064fbSMasahiro Yamada static struct menu *current_menu;
2600a9064fbSMasahiro Yamada static int child_count;
2610a9064fbSMasahiro Yamada static int single_menu_mode;
2620a9064fbSMasahiro Yamada /* the window in which all information appears */
2630a9064fbSMasahiro Yamada static WINDOW *main_window;
2640a9064fbSMasahiro Yamada /* the largest size of the menu window */
2650a9064fbSMasahiro Yamada static int mwin_max_lines;
2660a9064fbSMasahiro Yamada static int mwin_max_cols;
2670a9064fbSMasahiro Yamada /* the window in which we show option buttons */
2680a9064fbSMasahiro Yamada static MENU *curses_menu;
2690a9064fbSMasahiro Yamada static ITEM *curses_menu_items[MAX_MENU_ITEMS];
2700a9064fbSMasahiro Yamada static struct mitem k_menu_items[MAX_MENU_ITEMS];
2710a9064fbSMasahiro Yamada static int items_num;
2720a9064fbSMasahiro Yamada static int global_exit;
2730a9064fbSMasahiro Yamada /* the currently selected button */
2740a9064fbSMasahiro Yamada const char *current_instructions = menu_instructions;
2750a9064fbSMasahiro Yamada
2760a9064fbSMasahiro Yamada static char *dialog_input_result;
2770a9064fbSMasahiro Yamada static int dialog_input_result_len;
2780a9064fbSMasahiro Yamada
2790a9064fbSMasahiro Yamada static void conf(struct menu *menu);
2800a9064fbSMasahiro Yamada static void conf_choice(struct menu *menu);
2810a9064fbSMasahiro Yamada static void conf_string(struct menu *menu);
2820a9064fbSMasahiro Yamada static void conf_load(void);
2830a9064fbSMasahiro Yamada static void conf_save(void);
2840a9064fbSMasahiro Yamada static void show_help(struct menu *menu);
2850a9064fbSMasahiro Yamada static int do_exit(void);
2860a9064fbSMasahiro Yamada static void setup_windows(void);
2870a9064fbSMasahiro Yamada static void search_conf(void);
2880a9064fbSMasahiro Yamada
2890a9064fbSMasahiro Yamada typedef void (*function_key_handler_t)(int *key, struct menu *menu);
2900a9064fbSMasahiro Yamada static void handle_f1(int *key, struct menu *current_item);
2910a9064fbSMasahiro Yamada static void handle_f2(int *key, struct menu *current_item);
2920a9064fbSMasahiro Yamada static void handle_f3(int *key, struct menu *current_item);
2930a9064fbSMasahiro Yamada static void handle_f4(int *key, struct menu *current_item);
2940a9064fbSMasahiro Yamada static void handle_f5(int *key, struct menu *current_item);
2950a9064fbSMasahiro Yamada static void handle_f6(int *key, struct menu *current_item);
2960a9064fbSMasahiro Yamada static void handle_f7(int *key, struct menu *current_item);
2970a9064fbSMasahiro Yamada static void handle_f8(int *key, struct menu *current_item);
2980a9064fbSMasahiro Yamada static void handle_f9(int *key, struct menu *current_item);
2990a9064fbSMasahiro Yamada
3000a9064fbSMasahiro Yamada struct function_keys {
3010a9064fbSMasahiro Yamada const char *key_str;
3020a9064fbSMasahiro Yamada const char *func;
3030a9064fbSMasahiro Yamada function_key key;
3040a9064fbSMasahiro Yamada function_key_handler_t handler;
3050a9064fbSMasahiro Yamada };
3060a9064fbSMasahiro Yamada
3070a9064fbSMasahiro Yamada static const int function_keys_num = 9;
3080a9064fbSMasahiro Yamada struct function_keys function_keys[] = {
3090a9064fbSMasahiro Yamada {
3100a9064fbSMasahiro Yamada .key_str = "F1",
3110a9064fbSMasahiro Yamada .func = "Help",
3120a9064fbSMasahiro Yamada .key = F_HELP,
3130a9064fbSMasahiro Yamada .handler = handle_f1,
3140a9064fbSMasahiro Yamada },
3150a9064fbSMasahiro Yamada {
3160a9064fbSMasahiro Yamada .key_str = "F2",
3170a9064fbSMasahiro Yamada .func = "SymInfo",
3180a9064fbSMasahiro Yamada .key = F_SYMBOL,
3190a9064fbSMasahiro Yamada .handler = handle_f2,
3200a9064fbSMasahiro Yamada },
3210a9064fbSMasahiro Yamada {
3220a9064fbSMasahiro Yamada .key_str = "F3",
3230a9064fbSMasahiro Yamada .func = "Help 2",
3240a9064fbSMasahiro Yamada .key = F_INSTS,
3250a9064fbSMasahiro Yamada .handler = handle_f3,
3260a9064fbSMasahiro Yamada },
3270a9064fbSMasahiro Yamada {
3280a9064fbSMasahiro Yamada .key_str = "F4",
3290a9064fbSMasahiro Yamada .func = "ShowAll",
3300a9064fbSMasahiro Yamada .key = F_CONF,
3310a9064fbSMasahiro Yamada .handler = handle_f4,
3320a9064fbSMasahiro Yamada },
3330a9064fbSMasahiro Yamada {
3340a9064fbSMasahiro Yamada .key_str = "F5",
3350a9064fbSMasahiro Yamada .func = "Back",
3360a9064fbSMasahiro Yamada .key = F_BACK,
3370a9064fbSMasahiro Yamada .handler = handle_f5,
3380a9064fbSMasahiro Yamada },
3390a9064fbSMasahiro Yamada {
3400a9064fbSMasahiro Yamada .key_str = "F6",
3410a9064fbSMasahiro Yamada .func = "Save",
3420a9064fbSMasahiro Yamada .key = F_SAVE,
3430a9064fbSMasahiro Yamada .handler = handle_f6,
3440a9064fbSMasahiro Yamada },
3450a9064fbSMasahiro Yamada {
3460a9064fbSMasahiro Yamada .key_str = "F7",
3470a9064fbSMasahiro Yamada .func = "Load",
3480a9064fbSMasahiro Yamada .key = F_LOAD,
3490a9064fbSMasahiro Yamada .handler = handle_f7,
3500a9064fbSMasahiro Yamada },
3510a9064fbSMasahiro Yamada {
3520a9064fbSMasahiro Yamada .key_str = "F8",
3530a9064fbSMasahiro Yamada .func = "SymSearch",
3540a9064fbSMasahiro Yamada .key = F_SEARCH,
3550a9064fbSMasahiro Yamada .handler = handle_f8,
3560a9064fbSMasahiro Yamada },
3570a9064fbSMasahiro Yamada {
3580a9064fbSMasahiro Yamada .key_str = "F9",
3590a9064fbSMasahiro Yamada .func = "Exit",
3600a9064fbSMasahiro Yamada .key = F_EXIT,
3610a9064fbSMasahiro Yamada .handler = handle_f9,
3620a9064fbSMasahiro Yamada },
3630a9064fbSMasahiro Yamada };
3640a9064fbSMasahiro Yamada
print_function_line(void)3650a9064fbSMasahiro Yamada static void print_function_line(void)
3660a9064fbSMasahiro Yamada {
3670a9064fbSMasahiro Yamada int i;
3680a9064fbSMasahiro Yamada int offset = 1;
3690a9064fbSMasahiro Yamada const int skip = 1;
3700a9064fbSMasahiro Yamada int lines = getmaxy(stdscr);
3710a9064fbSMasahiro Yamada
3720a9064fbSMasahiro Yamada for (i = 0; i < function_keys_num; i++) {
3730a9064fbSMasahiro Yamada (void) wattrset(main_window, attributes[FUNCTION_HIGHLIGHT]);
3740a9064fbSMasahiro Yamada mvwprintw(main_window, lines-3, offset,
3750a9064fbSMasahiro Yamada "%s",
3760a9064fbSMasahiro Yamada function_keys[i].key_str);
3770a9064fbSMasahiro Yamada (void) wattrset(main_window, attributes[FUNCTION_TEXT]);
3780a9064fbSMasahiro Yamada offset += strlen(function_keys[i].key_str);
3790a9064fbSMasahiro Yamada mvwprintw(main_window, lines-3,
3800a9064fbSMasahiro Yamada offset, "%s",
3810a9064fbSMasahiro Yamada function_keys[i].func);
3820a9064fbSMasahiro Yamada offset += strlen(function_keys[i].func) + skip;
3830a9064fbSMasahiro Yamada }
3840a9064fbSMasahiro Yamada (void) wattrset(main_window, attributes[NORMAL]);
3850a9064fbSMasahiro Yamada }
3860a9064fbSMasahiro Yamada
3870a9064fbSMasahiro Yamada /* help */
handle_f1(int * key,struct menu * current_item)3880a9064fbSMasahiro Yamada static void handle_f1(int *key, struct menu *current_item)
3890a9064fbSMasahiro Yamada {
3900a9064fbSMasahiro Yamada show_scroll_win(main_window,
3910a9064fbSMasahiro Yamada _("Global help"), _(nconf_global_help));
3920a9064fbSMasahiro Yamada return;
3930a9064fbSMasahiro Yamada }
3940a9064fbSMasahiro Yamada
3950a9064fbSMasahiro Yamada /* symbole help */
handle_f2(int * key,struct menu * current_item)3960a9064fbSMasahiro Yamada static void handle_f2(int *key, struct menu *current_item)
3970a9064fbSMasahiro Yamada {
3980a9064fbSMasahiro Yamada show_help(current_item);
3990a9064fbSMasahiro Yamada return;
4000a9064fbSMasahiro Yamada }
4010a9064fbSMasahiro Yamada
4020a9064fbSMasahiro Yamada /* instructions */
handle_f3(int * key,struct menu * current_item)4030a9064fbSMasahiro Yamada static void handle_f3(int *key, struct menu *current_item)
4040a9064fbSMasahiro Yamada {
4050a9064fbSMasahiro Yamada show_scroll_win(main_window,
4060a9064fbSMasahiro Yamada _("Short help"),
4070a9064fbSMasahiro Yamada _(current_instructions));
4080a9064fbSMasahiro Yamada return;
4090a9064fbSMasahiro Yamada }
4100a9064fbSMasahiro Yamada
4110a9064fbSMasahiro Yamada /* config */
handle_f4(int * key,struct menu * current_item)4120a9064fbSMasahiro Yamada static void handle_f4(int *key, struct menu *current_item)
4130a9064fbSMasahiro Yamada {
4140a9064fbSMasahiro Yamada int res = btn_dialog(main_window,
4150a9064fbSMasahiro Yamada _("Show all symbols?"),
4160a9064fbSMasahiro Yamada 2,
4170a9064fbSMasahiro Yamada " <Show All> ",
4180a9064fbSMasahiro Yamada "<Don't show all>");
4190a9064fbSMasahiro Yamada if (res == 0)
4200a9064fbSMasahiro Yamada show_all_items = 1;
4210a9064fbSMasahiro Yamada else if (res == 1)
4220a9064fbSMasahiro Yamada show_all_items = 0;
4230a9064fbSMasahiro Yamada
4240a9064fbSMasahiro Yamada return;
4250a9064fbSMasahiro Yamada }
4260a9064fbSMasahiro Yamada
4270a9064fbSMasahiro Yamada /* back */
handle_f5(int * key,struct menu * current_item)4280a9064fbSMasahiro Yamada static void handle_f5(int *key, struct menu *current_item)
4290a9064fbSMasahiro Yamada {
4300a9064fbSMasahiro Yamada *key = KEY_LEFT;
4310a9064fbSMasahiro Yamada return;
4320a9064fbSMasahiro Yamada }
4330a9064fbSMasahiro Yamada
4340a9064fbSMasahiro Yamada /* save */
handle_f6(int * key,struct menu * current_item)4350a9064fbSMasahiro Yamada static void handle_f6(int *key, struct menu *current_item)
4360a9064fbSMasahiro Yamada {
4370a9064fbSMasahiro Yamada conf_save();
4380a9064fbSMasahiro Yamada return;
4390a9064fbSMasahiro Yamada }
4400a9064fbSMasahiro Yamada
4410a9064fbSMasahiro Yamada /* load */
handle_f7(int * key,struct menu * current_item)4420a9064fbSMasahiro Yamada static void handle_f7(int *key, struct menu *current_item)
4430a9064fbSMasahiro Yamada {
4440a9064fbSMasahiro Yamada conf_load();
4450a9064fbSMasahiro Yamada return;
4460a9064fbSMasahiro Yamada }
4470a9064fbSMasahiro Yamada
4480a9064fbSMasahiro Yamada /* search */
handle_f8(int * key,struct menu * current_item)4490a9064fbSMasahiro Yamada static void handle_f8(int *key, struct menu *current_item)
4500a9064fbSMasahiro Yamada {
4510a9064fbSMasahiro Yamada search_conf();
4520a9064fbSMasahiro Yamada return;
4530a9064fbSMasahiro Yamada }
4540a9064fbSMasahiro Yamada
4550a9064fbSMasahiro Yamada /* exit */
handle_f9(int * key,struct menu * current_item)4560a9064fbSMasahiro Yamada static void handle_f9(int *key, struct menu *current_item)
4570a9064fbSMasahiro Yamada {
4580a9064fbSMasahiro Yamada do_exit();
4590a9064fbSMasahiro Yamada return;
4600a9064fbSMasahiro Yamada }
4610a9064fbSMasahiro Yamada
4620a9064fbSMasahiro Yamada /* return != 0 to indicate the key was handles */
process_special_keys(int * key,struct menu * menu)4630a9064fbSMasahiro Yamada static int process_special_keys(int *key, struct menu *menu)
4640a9064fbSMasahiro Yamada {
4650a9064fbSMasahiro Yamada int i;
4660a9064fbSMasahiro Yamada
4670a9064fbSMasahiro Yamada if (*key == KEY_RESIZE) {
4680a9064fbSMasahiro Yamada setup_windows();
4690a9064fbSMasahiro Yamada return 1;
4700a9064fbSMasahiro Yamada }
4710a9064fbSMasahiro Yamada
4720a9064fbSMasahiro Yamada for (i = 0; i < function_keys_num; i++) {
4730a9064fbSMasahiro Yamada if (*key == KEY_F(function_keys[i].key) ||
4740a9064fbSMasahiro Yamada *key == '0' + function_keys[i].key){
4750a9064fbSMasahiro Yamada function_keys[i].handler(key, menu);
4760a9064fbSMasahiro Yamada return 1;
4770a9064fbSMasahiro Yamada }
4780a9064fbSMasahiro Yamada }
4790a9064fbSMasahiro Yamada
4800a9064fbSMasahiro Yamada return 0;
4810a9064fbSMasahiro Yamada }
4820a9064fbSMasahiro Yamada
clean_items(void)4830a9064fbSMasahiro Yamada static void clean_items(void)
4840a9064fbSMasahiro Yamada {
4850a9064fbSMasahiro Yamada int i;
4860a9064fbSMasahiro Yamada for (i = 0; curses_menu_items[i]; i++)
4870a9064fbSMasahiro Yamada free_item(curses_menu_items[i]);
4880a9064fbSMasahiro Yamada bzero(curses_menu_items, sizeof(curses_menu_items));
4890a9064fbSMasahiro Yamada bzero(k_menu_items, sizeof(k_menu_items));
4900a9064fbSMasahiro Yamada items_num = 0;
4910a9064fbSMasahiro Yamada }
4920a9064fbSMasahiro Yamada
4930a9064fbSMasahiro Yamada typedef enum {MATCH_TINKER_PATTERN_UP, MATCH_TINKER_PATTERN_DOWN,
4940a9064fbSMasahiro Yamada FIND_NEXT_MATCH_DOWN, FIND_NEXT_MATCH_UP} match_f;
4950a9064fbSMasahiro Yamada
4960a9064fbSMasahiro Yamada /* return the index of the matched item, or -1 if no such item exists */
get_mext_match(const char * match_str,match_f flag)4970a9064fbSMasahiro Yamada static int get_mext_match(const char *match_str, match_f flag)
4980a9064fbSMasahiro Yamada {
4990a9064fbSMasahiro Yamada int match_start = item_index(current_item(curses_menu));
5000a9064fbSMasahiro Yamada int index;
5010a9064fbSMasahiro Yamada
5020a9064fbSMasahiro Yamada if (flag == FIND_NEXT_MATCH_DOWN)
5030a9064fbSMasahiro Yamada ++match_start;
5040a9064fbSMasahiro Yamada else if (flag == FIND_NEXT_MATCH_UP)
5050a9064fbSMasahiro Yamada --match_start;
5060a9064fbSMasahiro Yamada
5070a9064fbSMasahiro Yamada index = match_start;
5080a9064fbSMasahiro Yamada index = (index + items_num) % items_num;
5090a9064fbSMasahiro Yamada while (true) {
5100a9064fbSMasahiro Yamada char *str = k_menu_items[index].str;
5110a9064fbSMasahiro Yamada if (strcasestr(str, match_str) != 0)
5120a9064fbSMasahiro Yamada return index;
5130a9064fbSMasahiro Yamada if (flag == FIND_NEXT_MATCH_UP ||
5140a9064fbSMasahiro Yamada flag == MATCH_TINKER_PATTERN_UP)
5150a9064fbSMasahiro Yamada --index;
5160a9064fbSMasahiro Yamada else
5170a9064fbSMasahiro Yamada ++index;
5180a9064fbSMasahiro Yamada index = (index + items_num) % items_num;
5190a9064fbSMasahiro Yamada if (index == match_start)
5200a9064fbSMasahiro Yamada return -1;
5210a9064fbSMasahiro Yamada }
5220a9064fbSMasahiro Yamada }
5230a9064fbSMasahiro Yamada
5240a9064fbSMasahiro Yamada /* Make a new item. */
item_make(struct menu * menu,char tag,const char * fmt,...)5250a9064fbSMasahiro Yamada static void item_make(struct menu *menu, char tag, const char *fmt, ...)
5260a9064fbSMasahiro Yamada {
5270a9064fbSMasahiro Yamada va_list ap;
5280a9064fbSMasahiro Yamada
5290a9064fbSMasahiro Yamada if (items_num > MAX_MENU_ITEMS-1)
5300a9064fbSMasahiro Yamada return;
5310a9064fbSMasahiro Yamada
5320a9064fbSMasahiro Yamada bzero(&k_menu_items[items_num], sizeof(k_menu_items[0]));
5330a9064fbSMasahiro Yamada k_menu_items[items_num].tag = tag;
5340a9064fbSMasahiro Yamada k_menu_items[items_num].usrptr = menu;
5350a9064fbSMasahiro Yamada if (menu != NULL)
5360a9064fbSMasahiro Yamada k_menu_items[items_num].is_visible =
5370a9064fbSMasahiro Yamada menu_is_visible(menu);
5380a9064fbSMasahiro Yamada else
5390a9064fbSMasahiro Yamada k_menu_items[items_num].is_visible = 1;
5400a9064fbSMasahiro Yamada
5410a9064fbSMasahiro Yamada va_start(ap, fmt);
5420a9064fbSMasahiro Yamada vsnprintf(k_menu_items[items_num].str,
5430a9064fbSMasahiro Yamada sizeof(k_menu_items[items_num].str),
5440a9064fbSMasahiro Yamada fmt, ap);
5450a9064fbSMasahiro Yamada va_end(ap);
5460a9064fbSMasahiro Yamada
5470a9064fbSMasahiro Yamada if (!k_menu_items[items_num].is_visible)
5480a9064fbSMasahiro Yamada memcpy(k_menu_items[items_num].str, "XXX", 3);
5490a9064fbSMasahiro Yamada
5500a9064fbSMasahiro Yamada curses_menu_items[items_num] = new_item(
5510a9064fbSMasahiro Yamada k_menu_items[items_num].str,
5520a9064fbSMasahiro Yamada k_menu_items[items_num].str);
5530a9064fbSMasahiro Yamada set_item_userptr(curses_menu_items[items_num],
5540a9064fbSMasahiro Yamada &k_menu_items[items_num]);
5550a9064fbSMasahiro Yamada /*
5560a9064fbSMasahiro Yamada if (!k_menu_items[items_num].is_visible)
5570a9064fbSMasahiro Yamada item_opts_off(curses_menu_items[items_num], O_SELECTABLE);
5580a9064fbSMasahiro Yamada */
5590a9064fbSMasahiro Yamada
5600a9064fbSMasahiro Yamada items_num++;
5610a9064fbSMasahiro Yamada curses_menu_items[items_num] = NULL;
5620a9064fbSMasahiro Yamada }
5630a9064fbSMasahiro Yamada
5640a9064fbSMasahiro Yamada /* very hackish. adds a string to the last item added */
item_add_str(const char * fmt,...)5650a9064fbSMasahiro Yamada static void item_add_str(const char *fmt, ...)
5660a9064fbSMasahiro Yamada {
5670a9064fbSMasahiro Yamada va_list ap;
5680a9064fbSMasahiro Yamada int index = items_num-1;
5690a9064fbSMasahiro Yamada char new_str[256];
5700a9064fbSMasahiro Yamada char tmp_str[256];
5710a9064fbSMasahiro Yamada
5720a9064fbSMasahiro Yamada if (index < 0)
5730a9064fbSMasahiro Yamada return;
5740a9064fbSMasahiro Yamada
5750a9064fbSMasahiro Yamada va_start(ap, fmt);
5760a9064fbSMasahiro Yamada vsnprintf(new_str, sizeof(new_str), fmt, ap);
5770a9064fbSMasahiro Yamada va_end(ap);
5780a9064fbSMasahiro Yamada snprintf(tmp_str, sizeof(tmp_str), "%s%s",
5790a9064fbSMasahiro Yamada k_menu_items[index].str, new_str);
5800a9064fbSMasahiro Yamada strncpy(k_menu_items[index].str,
5810a9064fbSMasahiro Yamada tmp_str,
5820a9064fbSMasahiro Yamada sizeof(k_menu_items[index].str));
5830a9064fbSMasahiro Yamada
5840a9064fbSMasahiro Yamada free_item(curses_menu_items[index]);
5850a9064fbSMasahiro Yamada curses_menu_items[index] = new_item(
5860a9064fbSMasahiro Yamada k_menu_items[index].str,
5870a9064fbSMasahiro Yamada k_menu_items[index].str);
5880a9064fbSMasahiro Yamada set_item_userptr(curses_menu_items[index],
5890a9064fbSMasahiro Yamada &k_menu_items[index]);
5900a9064fbSMasahiro Yamada }
5910a9064fbSMasahiro Yamada
5920a9064fbSMasahiro Yamada /* get the tag of the currently selected item */
item_tag(void)5930a9064fbSMasahiro Yamada static char item_tag(void)
5940a9064fbSMasahiro Yamada {
5950a9064fbSMasahiro Yamada ITEM *cur;
5960a9064fbSMasahiro Yamada struct mitem *mcur;
5970a9064fbSMasahiro Yamada
5980a9064fbSMasahiro Yamada cur = current_item(curses_menu);
5990a9064fbSMasahiro Yamada if (cur == NULL)
6000a9064fbSMasahiro Yamada return 0;
6010a9064fbSMasahiro Yamada mcur = (struct mitem *) item_userptr(cur);
6020a9064fbSMasahiro Yamada return mcur->tag;
6030a9064fbSMasahiro Yamada }
6040a9064fbSMasahiro Yamada
curses_item_index(void)6050a9064fbSMasahiro Yamada static int curses_item_index(void)
6060a9064fbSMasahiro Yamada {
6070a9064fbSMasahiro Yamada return item_index(current_item(curses_menu));
6080a9064fbSMasahiro Yamada }
6090a9064fbSMasahiro Yamada
item_data(void)6100a9064fbSMasahiro Yamada static void *item_data(void)
6110a9064fbSMasahiro Yamada {
6120a9064fbSMasahiro Yamada ITEM *cur;
6130a9064fbSMasahiro Yamada struct mitem *mcur;
6140a9064fbSMasahiro Yamada
6150a9064fbSMasahiro Yamada cur = current_item(curses_menu);
6160a9064fbSMasahiro Yamada if (!cur)
6170a9064fbSMasahiro Yamada return NULL;
6180a9064fbSMasahiro Yamada mcur = (struct mitem *) item_userptr(cur);
6190a9064fbSMasahiro Yamada return mcur->usrptr;
6200a9064fbSMasahiro Yamada
6210a9064fbSMasahiro Yamada }
6220a9064fbSMasahiro Yamada
item_is_tag(char tag)6230a9064fbSMasahiro Yamada static int item_is_tag(char tag)
6240a9064fbSMasahiro Yamada {
6250a9064fbSMasahiro Yamada return item_tag() == tag;
6260a9064fbSMasahiro Yamada }
6270a9064fbSMasahiro Yamada
6280a9064fbSMasahiro Yamada static char filename[PATH_MAX+1];
6290a9064fbSMasahiro Yamada static char menu_backtitle[PATH_MAX+128];
set_config_filename(const char * config_filename)6300a9064fbSMasahiro Yamada static const char *set_config_filename(const char *config_filename)
6310a9064fbSMasahiro Yamada {
6320a9064fbSMasahiro Yamada int size;
6330a9064fbSMasahiro Yamada
6340a9064fbSMasahiro Yamada size = snprintf(menu_backtitle, sizeof(menu_backtitle),
6350a9064fbSMasahiro Yamada "%s - %s", config_filename, rootmenu.prompt->text);
6360a9064fbSMasahiro Yamada if (size >= sizeof(menu_backtitle))
6370a9064fbSMasahiro Yamada menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
6380a9064fbSMasahiro Yamada
6390a9064fbSMasahiro Yamada size = snprintf(filename, sizeof(filename), "%s", config_filename);
6400a9064fbSMasahiro Yamada if (size >= sizeof(filename))
6410a9064fbSMasahiro Yamada filename[sizeof(filename)-1] = '\0';
6420a9064fbSMasahiro Yamada return menu_backtitle;
6430a9064fbSMasahiro Yamada }
6440a9064fbSMasahiro Yamada
6450a9064fbSMasahiro Yamada /* return = 0 means we are successful.
6460a9064fbSMasahiro Yamada * -1 means go on doing what you were doing
6470a9064fbSMasahiro Yamada */
do_exit(void)6480a9064fbSMasahiro Yamada static int do_exit(void)
6490a9064fbSMasahiro Yamada {
6500a9064fbSMasahiro Yamada int res;
6510a9064fbSMasahiro Yamada if (!conf_get_changed()) {
6520a9064fbSMasahiro Yamada global_exit = 1;
6530a9064fbSMasahiro Yamada return 0;
6540a9064fbSMasahiro Yamada }
6550a9064fbSMasahiro Yamada res = btn_dialog(main_window,
6560a9064fbSMasahiro Yamada _("Do you wish to save your new configuration?\n"
6570a9064fbSMasahiro Yamada "<ESC> to cancel and resume nconfig."),
6580a9064fbSMasahiro Yamada 2,
6590a9064fbSMasahiro Yamada " <save> ",
6600a9064fbSMasahiro Yamada "<don't save>");
6610a9064fbSMasahiro Yamada if (res == KEY_EXIT) {
6620a9064fbSMasahiro Yamada global_exit = 0;
6630a9064fbSMasahiro Yamada return -1;
6640a9064fbSMasahiro Yamada }
6650a9064fbSMasahiro Yamada
6660a9064fbSMasahiro Yamada /* if we got here, the user really wants to exit */
6670a9064fbSMasahiro Yamada switch (res) {
6680a9064fbSMasahiro Yamada case 0:
6690a9064fbSMasahiro Yamada res = conf_write(filename);
6700a9064fbSMasahiro Yamada if (res)
6710a9064fbSMasahiro Yamada btn_dialog(
6720a9064fbSMasahiro Yamada main_window,
6730a9064fbSMasahiro Yamada _("Error during writing of configuration.\n"
6740a9064fbSMasahiro Yamada "Your configuration changes were NOT saved."),
6750a9064fbSMasahiro Yamada 1,
6760a9064fbSMasahiro Yamada "<OK>");
6770a9064fbSMasahiro Yamada break;
6780a9064fbSMasahiro Yamada default:
6790a9064fbSMasahiro Yamada btn_dialog(
6800a9064fbSMasahiro Yamada main_window,
6810a9064fbSMasahiro Yamada _("Your configuration changes were NOT saved."),
6820a9064fbSMasahiro Yamada 1,
6830a9064fbSMasahiro Yamada "<OK>");
6840a9064fbSMasahiro Yamada break;
6850a9064fbSMasahiro Yamada }
6860a9064fbSMasahiro Yamada global_exit = 1;
6870a9064fbSMasahiro Yamada return 0;
6880a9064fbSMasahiro Yamada }
6890a9064fbSMasahiro Yamada
6900a9064fbSMasahiro Yamada
search_conf(void)6910a9064fbSMasahiro Yamada static void search_conf(void)
6920a9064fbSMasahiro Yamada {
6930a9064fbSMasahiro Yamada struct symbol **sym_arr;
6940a9064fbSMasahiro Yamada struct gstr res;
6950a9064fbSMasahiro Yamada struct gstr title;
6960a9064fbSMasahiro Yamada char *dialog_input;
6970a9064fbSMasahiro Yamada int dres;
6980a9064fbSMasahiro Yamada
6990a9064fbSMasahiro Yamada title = str_new();
7000a9064fbSMasahiro Yamada str_printf( &title, _("Enter (sub)string or regexp to search for "
7010a9064fbSMasahiro Yamada "(with or without \"%s\")"), CONFIG_);
7020a9064fbSMasahiro Yamada
7030a9064fbSMasahiro Yamada again:
7040a9064fbSMasahiro Yamada dres = dialog_inputbox(main_window,
7050a9064fbSMasahiro Yamada _("Search Configuration Parameter"),
7060a9064fbSMasahiro Yamada str_get(&title),
7070a9064fbSMasahiro Yamada "", &dialog_input_result, &dialog_input_result_len);
7080a9064fbSMasahiro Yamada switch (dres) {
7090a9064fbSMasahiro Yamada case 0:
7100a9064fbSMasahiro Yamada break;
7110a9064fbSMasahiro Yamada case 1:
7120a9064fbSMasahiro Yamada show_scroll_win(main_window,
7130a9064fbSMasahiro Yamada _("Search Configuration"), search_help);
7140a9064fbSMasahiro Yamada goto again;
7150a9064fbSMasahiro Yamada default:
7160a9064fbSMasahiro Yamada str_free(&title);
7170a9064fbSMasahiro Yamada return;
7180a9064fbSMasahiro Yamada }
7190a9064fbSMasahiro Yamada
7200a9064fbSMasahiro Yamada /* strip the prefix if necessary */
7210a9064fbSMasahiro Yamada dialog_input = dialog_input_result;
7220a9064fbSMasahiro Yamada if (strncasecmp(dialog_input_result, CONFIG_, strlen(CONFIG_)) == 0)
7230a9064fbSMasahiro Yamada dialog_input += strlen(CONFIG_);
7240a9064fbSMasahiro Yamada
7250a9064fbSMasahiro Yamada sym_arr = sym_re_search(dialog_input);
7260a9064fbSMasahiro Yamada res = get_relations_str(sym_arr, NULL);
7270a9064fbSMasahiro Yamada free(sym_arr);
7280a9064fbSMasahiro Yamada show_scroll_win(main_window,
7290a9064fbSMasahiro Yamada _("Search Results"), str_get(&res));
7300a9064fbSMasahiro Yamada str_free(&res);
7310a9064fbSMasahiro Yamada str_free(&title);
7320a9064fbSMasahiro Yamada }
7330a9064fbSMasahiro Yamada
7340a9064fbSMasahiro Yamada
build_conf(struct menu * menu)7350a9064fbSMasahiro Yamada static void build_conf(struct menu *menu)
7360a9064fbSMasahiro Yamada {
7370a9064fbSMasahiro Yamada struct symbol *sym;
7380a9064fbSMasahiro Yamada struct property *prop;
7390a9064fbSMasahiro Yamada struct menu *child;
7400a9064fbSMasahiro Yamada int type, tmp, doint = 2;
7410a9064fbSMasahiro Yamada tristate val;
7420a9064fbSMasahiro Yamada char ch;
7430a9064fbSMasahiro Yamada
7440a9064fbSMasahiro Yamada if (!menu || (!show_all_items && !menu_is_visible(menu)))
7450a9064fbSMasahiro Yamada return;
7460a9064fbSMasahiro Yamada
7470a9064fbSMasahiro Yamada sym = menu->sym;
7480a9064fbSMasahiro Yamada prop = menu->prompt;
7490a9064fbSMasahiro Yamada if (!sym) {
7500a9064fbSMasahiro Yamada if (prop && menu != current_menu) {
7510a9064fbSMasahiro Yamada const char *prompt = menu_get_prompt(menu);
7520a9064fbSMasahiro Yamada enum prop_type ptype;
7530a9064fbSMasahiro Yamada ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
7540a9064fbSMasahiro Yamada switch (ptype) {
7550a9064fbSMasahiro Yamada case P_MENU:
7560a9064fbSMasahiro Yamada child_count++;
7570a9064fbSMasahiro Yamada prompt = _(prompt);
7580a9064fbSMasahiro Yamada if (single_menu_mode) {
7590a9064fbSMasahiro Yamada item_make(menu, 'm',
7600a9064fbSMasahiro Yamada "%s%*c%s",
7610a9064fbSMasahiro Yamada menu->data ? "-->" : "++>",
7620a9064fbSMasahiro Yamada indent + 1, ' ', prompt);
7630a9064fbSMasahiro Yamada } else
7640a9064fbSMasahiro Yamada item_make(menu, 'm',
7650a9064fbSMasahiro Yamada " %*c%s %s",
7660a9064fbSMasahiro Yamada indent + 1, ' ', prompt,
7670a9064fbSMasahiro Yamada menu_is_empty(menu) ? "----" : "--->");
7680a9064fbSMasahiro Yamada
7690a9064fbSMasahiro Yamada if (single_menu_mode && menu->data)
7700a9064fbSMasahiro Yamada goto conf_childs;
7710a9064fbSMasahiro Yamada return;
7720a9064fbSMasahiro Yamada case P_COMMENT:
7730a9064fbSMasahiro Yamada if (prompt) {
7740a9064fbSMasahiro Yamada child_count++;
7750a9064fbSMasahiro Yamada item_make(menu, ':',
7760a9064fbSMasahiro Yamada " %*c*** %s ***",
7770a9064fbSMasahiro Yamada indent + 1, ' ',
7780a9064fbSMasahiro Yamada _(prompt));
7790a9064fbSMasahiro Yamada }
7800a9064fbSMasahiro Yamada break;
7810a9064fbSMasahiro Yamada default:
7820a9064fbSMasahiro Yamada if (prompt) {
7830a9064fbSMasahiro Yamada child_count++;
7840a9064fbSMasahiro Yamada item_make(menu, ':', "---%*c%s",
7850a9064fbSMasahiro Yamada indent + 1, ' ',
7860a9064fbSMasahiro Yamada _(prompt));
7870a9064fbSMasahiro Yamada }
7880a9064fbSMasahiro Yamada }
7890a9064fbSMasahiro Yamada } else
7900a9064fbSMasahiro Yamada doint = 0;
7910a9064fbSMasahiro Yamada goto conf_childs;
7920a9064fbSMasahiro Yamada }
7930a9064fbSMasahiro Yamada
7940a9064fbSMasahiro Yamada type = sym_get_type(sym);
7950a9064fbSMasahiro Yamada if (sym_is_choice(sym)) {
7960a9064fbSMasahiro Yamada struct symbol *def_sym = sym_get_choice_value(sym);
7970a9064fbSMasahiro Yamada struct menu *def_menu = NULL;
7980a9064fbSMasahiro Yamada
7990a9064fbSMasahiro Yamada child_count++;
8000a9064fbSMasahiro Yamada for (child = menu->list; child; child = child->next) {
8010a9064fbSMasahiro Yamada if (menu_is_visible(child) && child->sym == def_sym)
8020a9064fbSMasahiro Yamada def_menu = child;
8030a9064fbSMasahiro Yamada }
8040a9064fbSMasahiro Yamada
8050a9064fbSMasahiro Yamada val = sym_get_tristate_value(sym);
8060a9064fbSMasahiro Yamada if (sym_is_changable(sym)) {
8070a9064fbSMasahiro Yamada switch (type) {
8080a9064fbSMasahiro Yamada case S_BOOLEAN:
8090a9064fbSMasahiro Yamada item_make(menu, 't', "[%c]",
8100a9064fbSMasahiro Yamada val == no ? ' ' : '*');
8110a9064fbSMasahiro Yamada break;
8120a9064fbSMasahiro Yamada case S_TRISTATE:
8130a9064fbSMasahiro Yamada switch (val) {
8140a9064fbSMasahiro Yamada case yes:
8150a9064fbSMasahiro Yamada ch = '*';
8160a9064fbSMasahiro Yamada break;
8170a9064fbSMasahiro Yamada case mod:
8180a9064fbSMasahiro Yamada ch = 'M';
8190a9064fbSMasahiro Yamada break;
8200a9064fbSMasahiro Yamada default:
8210a9064fbSMasahiro Yamada ch = ' ';
8220a9064fbSMasahiro Yamada break;
8230a9064fbSMasahiro Yamada }
8240a9064fbSMasahiro Yamada item_make(menu, 't', "<%c>", ch);
8250a9064fbSMasahiro Yamada break;
8260a9064fbSMasahiro Yamada }
8270a9064fbSMasahiro Yamada } else {
8280a9064fbSMasahiro Yamada item_make(menu, def_menu ? 't' : ':', " ");
8290a9064fbSMasahiro Yamada }
8300a9064fbSMasahiro Yamada
8310a9064fbSMasahiro Yamada item_add_str("%*c%s", indent + 1,
8320a9064fbSMasahiro Yamada ' ', _(menu_get_prompt(menu)));
8330a9064fbSMasahiro Yamada if (val == yes) {
8340a9064fbSMasahiro Yamada if (def_menu) {
8350a9064fbSMasahiro Yamada item_add_str(" (%s)",
8360a9064fbSMasahiro Yamada _(menu_get_prompt(def_menu)));
8370a9064fbSMasahiro Yamada item_add_str(" --->");
8380a9064fbSMasahiro Yamada if (def_menu->list) {
8390a9064fbSMasahiro Yamada indent += 2;
8400a9064fbSMasahiro Yamada build_conf(def_menu);
8410a9064fbSMasahiro Yamada indent -= 2;
8420a9064fbSMasahiro Yamada }
8430a9064fbSMasahiro Yamada }
8440a9064fbSMasahiro Yamada return;
8450a9064fbSMasahiro Yamada }
8460a9064fbSMasahiro Yamada } else {
8470a9064fbSMasahiro Yamada if (menu == current_menu) {
8480a9064fbSMasahiro Yamada item_make(menu, ':',
8490a9064fbSMasahiro Yamada "---%*c%s", indent + 1,
8500a9064fbSMasahiro Yamada ' ', _(menu_get_prompt(menu)));
8510a9064fbSMasahiro Yamada goto conf_childs;
8520a9064fbSMasahiro Yamada }
8530a9064fbSMasahiro Yamada child_count++;
8540a9064fbSMasahiro Yamada val = sym_get_tristate_value(sym);
8550a9064fbSMasahiro Yamada if (sym_is_choice_value(sym) && val == yes) {
8560a9064fbSMasahiro Yamada item_make(menu, ':', " ");
8570a9064fbSMasahiro Yamada } else {
8580a9064fbSMasahiro Yamada switch (type) {
8590a9064fbSMasahiro Yamada case S_BOOLEAN:
8600a9064fbSMasahiro Yamada if (sym_is_changable(sym))
8610a9064fbSMasahiro Yamada item_make(menu, 't', "[%c]",
8620a9064fbSMasahiro Yamada val == no ? ' ' : '*');
8630a9064fbSMasahiro Yamada else
8640a9064fbSMasahiro Yamada item_make(menu, 't', "-%c-",
8650a9064fbSMasahiro Yamada val == no ? ' ' : '*');
8660a9064fbSMasahiro Yamada break;
8670a9064fbSMasahiro Yamada case S_TRISTATE:
8680a9064fbSMasahiro Yamada switch (val) {
8690a9064fbSMasahiro Yamada case yes:
8700a9064fbSMasahiro Yamada ch = '*';
8710a9064fbSMasahiro Yamada break;
8720a9064fbSMasahiro Yamada case mod:
8730a9064fbSMasahiro Yamada ch = 'M';
8740a9064fbSMasahiro Yamada break;
8750a9064fbSMasahiro Yamada default:
8760a9064fbSMasahiro Yamada ch = ' ';
8770a9064fbSMasahiro Yamada break;
8780a9064fbSMasahiro Yamada }
8790a9064fbSMasahiro Yamada if (sym_is_changable(sym)) {
8800a9064fbSMasahiro Yamada if (sym->rev_dep.tri == mod)
8810a9064fbSMasahiro Yamada item_make(menu,
8820a9064fbSMasahiro Yamada 't', "{%c}", ch);
8830a9064fbSMasahiro Yamada else
8840a9064fbSMasahiro Yamada item_make(menu,
8850a9064fbSMasahiro Yamada 't', "<%c>", ch);
8860a9064fbSMasahiro Yamada } else
8870a9064fbSMasahiro Yamada item_make(menu, 't', "-%c-", ch);
8880a9064fbSMasahiro Yamada break;
8890a9064fbSMasahiro Yamada default:
8900a9064fbSMasahiro Yamada tmp = 2 + strlen(sym_get_string_value(sym));
8910a9064fbSMasahiro Yamada item_make(menu, 's', " (%s)",
8920a9064fbSMasahiro Yamada sym_get_string_value(sym));
8930a9064fbSMasahiro Yamada tmp = indent - tmp + 4;
8940a9064fbSMasahiro Yamada if (tmp < 0)
8950a9064fbSMasahiro Yamada tmp = 0;
8960a9064fbSMasahiro Yamada item_add_str("%*c%s%s", tmp, ' ',
8970a9064fbSMasahiro Yamada _(menu_get_prompt(menu)),
8980a9064fbSMasahiro Yamada (sym_has_value(sym) ||
8990a9064fbSMasahiro Yamada !sym_is_changable(sym)) ? "" :
9000a9064fbSMasahiro Yamada _(" (NEW)"));
9010a9064fbSMasahiro Yamada goto conf_childs;
9020a9064fbSMasahiro Yamada }
9030a9064fbSMasahiro Yamada }
9040a9064fbSMasahiro Yamada item_add_str("%*c%s%s", indent + 1, ' ',
9050a9064fbSMasahiro Yamada _(menu_get_prompt(menu)),
9060a9064fbSMasahiro Yamada (sym_has_value(sym) || !sym_is_changable(sym)) ?
9070a9064fbSMasahiro Yamada "" : _(" (NEW)"));
9080a9064fbSMasahiro Yamada if (menu->prompt && menu->prompt->type == P_MENU) {
9090a9064fbSMasahiro Yamada item_add_str(" %s", menu_is_empty(menu) ? "----" : "--->");
9100a9064fbSMasahiro Yamada return;
9110a9064fbSMasahiro Yamada }
9120a9064fbSMasahiro Yamada }
9130a9064fbSMasahiro Yamada
9140a9064fbSMasahiro Yamada conf_childs:
9150a9064fbSMasahiro Yamada indent += doint;
9160a9064fbSMasahiro Yamada for (child = menu->list; child; child = child->next)
9170a9064fbSMasahiro Yamada build_conf(child);
9180a9064fbSMasahiro Yamada indent -= doint;
9190a9064fbSMasahiro Yamada }
9200a9064fbSMasahiro Yamada
reset_menu(void)9210a9064fbSMasahiro Yamada static void reset_menu(void)
9220a9064fbSMasahiro Yamada {
9230a9064fbSMasahiro Yamada unpost_menu(curses_menu);
9240a9064fbSMasahiro Yamada clean_items();
9250a9064fbSMasahiro Yamada }
9260a9064fbSMasahiro Yamada
9270a9064fbSMasahiro Yamada /* adjust the menu to show this item.
9280a9064fbSMasahiro Yamada * prefer not to scroll the menu if possible*/
center_item(int selected_index,int * last_top_row)9290a9064fbSMasahiro Yamada static void center_item(int selected_index, int *last_top_row)
9300a9064fbSMasahiro Yamada {
9310a9064fbSMasahiro Yamada int toprow;
9320a9064fbSMasahiro Yamada
9330a9064fbSMasahiro Yamada set_top_row(curses_menu, *last_top_row);
9340a9064fbSMasahiro Yamada toprow = top_row(curses_menu);
9350a9064fbSMasahiro Yamada if (selected_index < toprow ||
9360a9064fbSMasahiro Yamada selected_index >= toprow+mwin_max_lines) {
9370a9064fbSMasahiro Yamada toprow = max(selected_index-mwin_max_lines/2, 0);
9380a9064fbSMasahiro Yamada if (toprow >= item_count(curses_menu)-mwin_max_lines)
9390a9064fbSMasahiro Yamada toprow = item_count(curses_menu)-mwin_max_lines;
9400a9064fbSMasahiro Yamada set_top_row(curses_menu, toprow);
9410a9064fbSMasahiro Yamada }
9420a9064fbSMasahiro Yamada set_current_item(curses_menu,
9430a9064fbSMasahiro Yamada curses_menu_items[selected_index]);
9440a9064fbSMasahiro Yamada *last_top_row = toprow;
9450a9064fbSMasahiro Yamada post_menu(curses_menu);
9460a9064fbSMasahiro Yamada refresh_all_windows(main_window);
9470a9064fbSMasahiro Yamada }
9480a9064fbSMasahiro Yamada
9490a9064fbSMasahiro Yamada /* this function assumes reset_menu has been called before */
show_menu(const char * prompt,const char * instructions,int selected_index,int * last_top_row)9500a9064fbSMasahiro Yamada static void show_menu(const char *prompt, const char *instructions,
9510a9064fbSMasahiro Yamada int selected_index, int *last_top_row)
9520a9064fbSMasahiro Yamada {
9530a9064fbSMasahiro Yamada int maxx, maxy;
9540a9064fbSMasahiro Yamada WINDOW *menu_window;
9550a9064fbSMasahiro Yamada
9560a9064fbSMasahiro Yamada current_instructions = instructions;
9570a9064fbSMasahiro Yamada
9580a9064fbSMasahiro Yamada clear();
9590a9064fbSMasahiro Yamada (void) wattrset(main_window, attributes[NORMAL]);
9600a9064fbSMasahiro Yamada print_in_middle(stdscr, 1, 0, getmaxx(stdscr),
9610a9064fbSMasahiro Yamada menu_backtitle,
9620a9064fbSMasahiro Yamada attributes[MAIN_HEADING]);
9630a9064fbSMasahiro Yamada
9640a9064fbSMasahiro Yamada (void) wattrset(main_window, attributes[MAIN_MENU_BOX]);
9650a9064fbSMasahiro Yamada box(main_window, 0, 0);
9660a9064fbSMasahiro Yamada (void) wattrset(main_window, attributes[MAIN_MENU_HEADING]);
9670a9064fbSMasahiro Yamada mvwprintw(main_window, 0, 3, " %s ", prompt);
9680a9064fbSMasahiro Yamada (void) wattrset(main_window, attributes[NORMAL]);
9690a9064fbSMasahiro Yamada
9700a9064fbSMasahiro Yamada set_menu_items(curses_menu, curses_menu_items);
9710a9064fbSMasahiro Yamada
9720a9064fbSMasahiro Yamada /* position the menu at the middle of the screen */
9730a9064fbSMasahiro Yamada scale_menu(curses_menu, &maxy, &maxx);
9740a9064fbSMasahiro Yamada maxx = min(maxx, mwin_max_cols-2);
9750a9064fbSMasahiro Yamada maxy = mwin_max_lines;
9760a9064fbSMasahiro Yamada menu_window = derwin(main_window,
9770a9064fbSMasahiro Yamada maxy,
9780a9064fbSMasahiro Yamada maxx,
9790a9064fbSMasahiro Yamada 2,
9800a9064fbSMasahiro Yamada (mwin_max_cols-maxx)/2);
9810a9064fbSMasahiro Yamada keypad(menu_window, TRUE);
9820a9064fbSMasahiro Yamada set_menu_win(curses_menu, menu_window);
9830a9064fbSMasahiro Yamada set_menu_sub(curses_menu, menu_window);
9840a9064fbSMasahiro Yamada
9850a9064fbSMasahiro Yamada /* must reassert this after changing items, otherwise returns to a
9860a9064fbSMasahiro Yamada * default of 16
9870a9064fbSMasahiro Yamada */
9880a9064fbSMasahiro Yamada set_menu_format(curses_menu, maxy, 1);
9890a9064fbSMasahiro Yamada center_item(selected_index, last_top_row);
9900a9064fbSMasahiro Yamada set_menu_format(curses_menu, maxy, 1);
9910a9064fbSMasahiro Yamada
9920a9064fbSMasahiro Yamada print_function_line();
9930a9064fbSMasahiro Yamada
9940a9064fbSMasahiro Yamada /* Post the menu */
9950a9064fbSMasahiro Yamada post_menu(curses_menu);
9960a9064fbSMasahiro Yamada refresh_all_windows(main_window);
9970a9064fbSMasahiro Yamada }
9980a9064fbSMasahiro Yamada
adj_match_dir(match_f * match_direction)9990a9064fbSMasahiro Yamada static void adj_match_dir(match_f *match_direction)
10000a9064fbSMasahiro Yamada {
10010a9064fbSMasahiro Yamada if (*match_direction == FIND_NEXT_MATCH_DOWN)
10020a9064fbSMasahiro Yamada *match_direction =
10030a9064fbSMasahiro Yamada MATCH_TINKER_PATTERN_DOWN;
10040a9064fbSMasahiro Yamada else if (*match_direction == FIND_NEXT_MATCH_UP)
10050a9064fbSMasahiro Yamada *match_direction =
10060a9064fbSMasahiro Yamada MATCH_TINKER_PATTERN_UP;
10070a9064fbSMasahiro Yamada /* else, do no change.. */
10080a9064fbSMasahiro Yamada }
10090a9064fbSMasahiro Yamada
10100a9064fbSMasahiro Yamada struct match_state
10110a9064fbSMasahiro Yamada {
10120a9064fbSMasahiro Yamada int in_search;
10130a9064fbSMasahiro Yamada match_f match_direction;
10140a9064fbSMasahiro Yamada char pattern[256];
10150a9064fbSMasahiro Yamada };
10160a9064fbSMasahiro Yamada
10170a9064fbSMasahiro Yamada /* Return 0 means I have handled the key. In such a case, ans should hold the
10180a9064fbSMasahiro Yamada * item to center, or -1 otherwise.
10190a9064fbSMasahiro Yamada * Else return -1 .
10200a9064fbSMasahiro Yamada */
do_match(int key,struct match_state * state,int * ans)10210a9064fbSMasahiro Yamada static int do_match(int key, struct match_state *state, int *ans)
10220a9064fbSMasahiro Yamada {
10230a9064fbSMasahiro Yamada char c = (char) key;
10240a9064fbSMasahiro Yamada int terminate_search = 0;
10250a9064fbSMasahiro Yamada *ans = -1;
10260a9064fbSMasahiro Yamada if (key == '/' || (state->in_search && key == 27)) {
10270a9064fbSMasahiro Yamada move(0, 0);
10280a9064fbSMasahiro Yamada refresh();
10290a9064fbSMasahiro Yamada clrtoeol();
10300a9064fbSMasahiro Yamada state->in_search = 1-state->in_search;
10310a9064fbSMasahiro Yamada bzero(state->pattern, sizeof(state->pattern));
10320a9064fbSMasahiro Yamada state->match_direction = MATCH_TINKER_PATTERN_DOWN;
10330a9064fbSMasahiro Yamada return 0;
10340a9064fbSMasahiro Yamada } else if (!state->in_search)
10350a9064fbSMasahiro Yamada return 1;
10360a9064fbSMasahiro Yamada
10370a9064fbSMasahiro Yamada if (isalnum(c) || isgraph(c) || c == ' ') {
10380a9064fbSMasahiro Yamada state->pattern[strlen(state->pattern)] = c;
10390a9064fbSMasahiro Yamada state->pattern[strlen(state->pattern)] = '\0';
10400a9064fbSMasahiro Yamada adj_match_dir(&state->match_direction);
10410a9064fbSMasahiro Yamada *ans = get_mext_match(state->pattern,
10420a9064fbSMasahiro Yamada state->match_direction);
10430a9064fbSMasahiro Yamada } else if (key == KEY_DOWN) {
10440a9064fbSMasahiro Yamada state->match_direction = FIND_NEXT_MATCH_DOWN;
10450a9064fbSMasahiro Yamada *ans = get_mext_match(state->pattern,
10460a9064fbSMasahiro Yamada state->match_direction);
10470a9064fbSMasahiro Yamada } else if (key == KEY_UP) {
10480a9064fbSMasahiro Yamada state->match_direction = FIND_NEXT_MATCH_UP;
10490a9064fbSMasahiro Yamada *ans = get_mext_match(state->pattern,
10500a9064fbSMasahiro Yamada state->match_direction);
10510a9064fbSMasahiro Yamada } else if (key == KEY_BACKSPACE || key == 127) {
10520a9064fbSMasahiro Yamada state->pattern[strlen(state->pattern)-1] = '\0';
10530a9064fbSMasahiro Yamada adj_match_dir(&state->match_direction);
10540a9064fbSMasahiro Yamada } else
10550a9064fbSMasahiro Yamada terminate_search = 1;
10560a9064fbSMasahiro Yamada
10570a9064fbSMasahiro Yamada if (terminate_search) {
10580a9064fbSMasahiro Yamada state->in_search = 0;
10590a9064fbSMasahiro Yamada bzero(state->pattern, sizeof(state->pattern));
10600a9064fbSMasahiro Yamada move(0, 0);
10610a9064fbSMasahiro Yamada refresh();
10620a9064fbSMasahiro Yamada clrtoeol();
10630a9064fbSMasahiro Yamada return -1;
10640a9064fbSMasahiro Yamada }
10650a9064fbSMasahiro Yamada return 0;
10660a9064fbSMasahiro Yamada }
10670a9064fbSMasahiro Yamada
conf(struct menu * menu)10680a9064fbSMasahiro Yamada static void conf(struct menu *menu)
10690a9064fbSMasahiro Yamada {
10700a9064fbSMasahiro Yamada struct menu *submenu = 0;
10710a9064fbSMasahiro Yamada const char *prompt = menu_get_prompt(menu);
10720a9064fbSMasahiro Yamada struct symbol *sym;
10730a9064fbSMasahiro Yamada int res;
10740a9064fbSMasahiro Yamada int current_index = 0;
10750a9064fbSMasahiro Yamada int last_top_row = 0;
10760a9064fbSMasahiro Yamada struct match_state match_state = {
10770a9064fbSMasahiro Yamada .in_search = 0,
10780a9064fbSMasahiro Yamada .match_direction = MATCH_TINKER_PATTERN_DOWN,
10790a9064fbSMasahiro Yamada .pattern = "",
10800a9064fbSMasahiro Yamada };
10810a9064fbSMasahiro Yamada
10820a9064fbSMasahiro Yamada while (!global_exit) {
10830a9064fbSMasahiro Yamada reset_menu();
10840a9064fbSMasahiro Yamada current_menu = menu;
10850a9064fbSMasahiro Yamada build_conf(menu);
10860a9064fbSMasahiro Yamada if (!child_count)
10870a9064fbSMasahiro Yamada break;
10880a9064fbSMasahiro Yamada
10890a9064fbSMasahiro Yamada show_menu(prompt ? _(prompt) : _("Main Menu"),
10900a9064fbSMasahiro Yamada _(menu_instructions),
10910a9064fbSMasahiro Yamada current_index, &last_top_row);
10920a9064fbSMasahiro Yamada keypad((menu_win(curses_menu)), TRUE);
10930a9064fbSMasahiro Yamada while (!global_exit) {
10940a9064fbSMasahiro Yamada if (match_state.in_search) {
10950a9064fbSMasahiro Yamada mvprintw(0, 0,
10960a9064fbSMasahiro Yamada "searching: %s", match_state.pattern);
10970a9064fbSMasahiro Yamada clrtoeol();
10980a9064fbSMasahiro Yamada }
10990a9064fbSMasahiro Yamada refresh_all_windows(main_window);
11000a9064fbSMasahiro Yamada res = wgetch(menu_win(curses_menu));
11010a9064fbSMasahiro Yamada if (!res)
11020a9064fbSMasahiro Yamada break;
11030a9064fbSMasahiro Yamada if (do_match(res, &match_state, ¤t_index) == 0) {
11040a9064fbSMasahiro Yamada if (current_index != -1)
11050a9064fbSMasahiro Yamada center_item(current_index,
11060a9064fbSMasahiro Yamada &last_top_row);
11070a9064fbSMasahiro Yamada continue;
11080a9064fbSMasahiro Yamada }
11090a9064fbSMasahiro Yamada if (process_special_keys(&res,
11100a9064fbSMasahiro Yamada (struct menu *) item_data()))
11110a9064fbSMasahiro Yamada break;
11120a9064fbSMasahiro Yamada switch (res) {
11130a9064fbSMasahiro Yamada case KEY_DOWN:
11140a9064fbSMasahiro Yamada menu_driver(curses_menu, REQ_DOWN_ITEM);
11150a9064fbSMasahiro Yamada break;
11160a9064fbSMasahiro Yamada case KEY_UP:
11170a9064fbSMasahiro Yamada menu_driver(curses_menu, REQ_UP_ITEM);
11180a9064fbSMasahiro Yamada break;
11190a9064fbSMasahiro Yamada case KEY_NPAGE:
11200a9064fbSMasahiro Yamada menu_driver(curses_menu, REQ_SCR_DPAGE);
11210a9064fbSMasahiro Yamada break;
11220a9064fbSMasahiro Yamada case KEY_PPAGE:
11230a9064fbSMasahiro Yamada menu_driver(curses_menu, REQ_SCR_UPAGE);
11240a9064fbSMasahiro Yamada break;
11250a9064fbSMasahiro Yamada case KEY_HOME:
11260a9064fbSMasahiro Yamada menu_driver(curses_menu, REQ_FIRST_ITEM);
11270a9064fbSMasahiro Yamada break;
11280a9064fbSMasahiro Yamada case KEY_END:
11290a9064fbSMasahiro Yamada menu_driver(curses_menu, REQ_LAST_ITEM);
11300a9064fbSMasahiro Yamada break;
11310a9064fbSMasahiro Yamada case 'h':
11320a9064fbSMasahiro Yamada case '?':
11330a9064fbSMasahiro Yamada show_help((struct menu *) item_data());
11340a9064fbSMasahiro Yamada break;
11350a9064fbSMasahiro Yamada }
11360a9064fbSMasahiro Yamada if (res == 10 || res == 27 ||
11370a9064fbSMasahiro Yamada res == 32 || res == 'n' || res == 'y' ||
11380a9064fbSMasahiro Yamada res == KEY_LEFT || res == KEY_RIGHT ||
11390a9064fbSMasahiro Yamada res == 'm')
11400a9064fbSMasahiro Yamada break;
11410a9064fbSMasahiro Yamada refresh_all_windows(main_window);
11420a9064fbSMasahiro Yamada }
11430a9064fbSMasahiro Yamada
11440a9064fbSMasahiro Yamada refresh_all_windows(main_window);
11450a9064fbSMasahiro Yamada /* if ESC or left*/
11460a9064fbSMasahiro Yamada if (res == 27 || (menu != &rootmenu && res == KEY_LEFT))
11470a9064fbSMasahiro Yamada break;
11480a9064fbSMasahiro Yamada
11490a9064fbSMasahiro Yamada /* remember location in the menu */
11500a9064fbSMasahiro Yamada last_top_row = top_row(curses_menu);
11510a9064fbSMasahiro Yamada current_index = curses_item_index();
11520a9064fbSMasahiro Yamada
11530a9064fbSMasahiro Yamada if (!item_tag())
11540a9064fbSMasahiro Yamada continue;
11550a9064fbSMasahiro Yamada
11560a9064fbSMasahiro Yamada submenu = (struct menu *) item_data();
11570a9064fbSMasahiro Yamada if (!submenu || !menu_is_visible(submenu))
11580a9064fbSMasahiro Yamada continue;
11590a9064fbSMasahiro Yamada sym = submenu->sym;
11600a9064fbSMasahiro Yamada
11610a9064fbSMasahiro Yamada switch (res) {
11620a9064fbSMasahiro Yamada case ' ':
11630a9064fbSMasahiro Yamada if (item_is_tag('t'))
11640a9064fbSMasahiro Yamada sym_toggle_tristate_value(sym);
11650a9064fbSMasahiro Yamada else if (item_is_tag('m'))
11660a9064fbSMasahiro Yamada conf(submenu);
11670a9064fbSMasahiro Yamada break;
11680a9064fbSMasahiro Yamada case KEY_RIGHT:
11690a9064fbSMasahiro Yamada case 10: /* ENTER WAS PRESSED */
11700a9064fbSMasahiro Yamada switch (item_tag()) {
11710a9064fbSMasahiro Yamada case 'm':
11720a9064fbSMasahiro Yamada if (single_menu_mode)
11730a9064fbSMasahiro Yamada submenu->data =
11740a9064fbSMasahiro Yamada (void *) (long) !submenu->data;
11750a9064fbSMasahiro Yamada else
11760a9064fbSMasahiro Yamada conf(submenu);
11770a9064fbSMasahiro Yamada break;
11780a9064fbSMasahiro Yamada case 't':
11790a9064fbSMasahiro Yamada if (sym_is_choice(sym) &&
11800a9064fbSMasahiro Yamada sym_get_tristate_value(sym) == yes)
11810a9064fbSMasahiro Yamada conf_choice(submenu);
11820a9064fbSMasahiro Yamada else if (submenu->prompt &&
11830a9064fbSMasahiro Yamada submenu->prompt->type == P_MENU)
11840a9064fbSMasahiro Yamada conf(submenu);
11850a9064fbSMasahiro Yamada else if (res == 10)
11860a9064fbSMasahiro Yamada sym_toggle_tristate_value(sym);
11870a9064fbSMasahiro Yamada break;
11880a9064fbSMasahiro Yamada case 's':
11890a9064fbSMasahiro Yamada conf_string(submenu);
11900a9064fbSMasahiro Yamada break;
11910a9064fbSMasahiro Yamada }
11920a9064fbSMasahiro Yamada break;
11930a9064fbSMasahiro Yamada case 'y':
11940a9064fbSMasahiro Yamada if (item_is_tag('t')) {
11950a9064fbSMasahiro Yamada if (sym_set_tristate_value(sym, yes))
11960a9064fbSMasahiro Yamada break;
11970a9064fbSMasahiro Yamada if (sym_set_tristate_value(sym, mod))
11980a9064fbSMasahiro Yamada btn_dialog(main_window, setmod_text, 0);
11990a9064fbSMasahiro Yamada }
12000a9064fbSMasahiro Yamada break;
12010a9064fbSMasahiro Yamada case 'n':
12020a9064fbSMasahiro Yamada if (item_is_tag('t'))
12030a9064fbSMasahiro Yamada sym_set_tristate_value(sym, no);
12040a9064fbSMasahiro Yamada break;
12050a9064fbSMasahiro Yamada case 'm':
12060a9064fbSMasahiro Yamada if (item_is_tag('t'))
12070a9064fbSMasahiro Yamada sym_set_tristate_value(sym, mod);
12080a9064fbSMasahiro Yamada break;
12090a9064fbSMasahiro Yamada }
12100a9064fbSMasahiro Yamada }
12110a9064fbSMasahiro Yamada }
12120a9064fbSMasahiro Yamada
conf_message_callback(const char * fmt,va_list ap)12130a9064fbSMasahiro Yamada static void conf_message_callback(const char *fmt, va_list ap)
12140a9064fbSMasahiro Yamada {
12150a9064fbSMasahiro Yamada char buf[1024];
12160a9064fbSMasahiro Yamada
12170a9064fbSMasahiro Yamada vsnprintf(buf, sizeof(buf), fmt, ap);
12180a9064fbSMasahiro Yamada btn_dialog(main_window, buf, 1, "<OK>");
12190a9064fbSMasahiro Yamada }
12200a9064fbSMasahiro Yamada
show_help(struct menu * menu)12210a9064fbSMasahiro Yamada static void show_help(struct menu *menu)
12220a9064fbSMasahiro Yamada {
12230a9064fbSMasahiro Yamada struct gstr help;
12240a9064fbSMasahiro Yamada
12250a9064fbSMasahiro Yamada if (!menu)
12260a9064fbSMasahiro Yamada return;
12270a9064fbSMasahiro Yamada
12280a9064fbSMasahiro Yamada help = str_new();
12290a9064fbSMasahiro Yamada menu_get_ext_help(menu, &help);
12300a9064fbSMasahiro Yamada show_scroll_win(main_window, _(menu_get_prompt(menu)), str_get(&help));
12310a9064fbSMasahiro Yamada str_free(&help);
12320a9064fbSMasahiro Yamada }
12330a9064fbSMasahiro Yamada
conf_choice(struct menu * menu)12340a9064fbSMasahiro Yamada static void conf_choice(struct menu *menu)
12350a9064fbSMasahiro Yamada {
12360a9064fbSMasahiro Yamada const char *prompt = _(menu_get_prompt(menu));
12370a9064fbSMasahiro Yamada struct menu *child = 0;
12380a9064fbSMasahiro Yamada struct symbol *active;
12390a9064fbSMasahiro Yamada int selected_index = 0;
12400a9064fbSMasahiro Yamada int last_top_row = 0;
12410a9064fbSMasahiro Yamada int res, i = 0;
12420a9064fbSMasahiro Yamada struct match_state match_state = {
12430a9064fbSMasahiro Yamada .in_search = 0,
12440a9064fbSMasahiro Yamada .match_direction = MATCH_TINKER_PATTERN_DOWN,
12450a9064fbSMasahiro Yamada .pattern = "",
12460a9064fbSMasahiro Yamada };
12470a9064fbSMasahiro Yamada
12480a9064fbSMasahiro Yamada active = sym_get_choice_value(menu->sym);
12490a9064fbSMasahiro Yamada /* this is mostly duplicated from the conf() function. */
12500a9064fbSMasahiro Yamada while (!global_exit) {
12510a9064fbSMasahiro Yamada reset_menu();
12520a9064fbSMasahiro Yamada
12530a9064fbSMasahiro Yamada for (i = 0, child = menu->list; child; child = child->next) {
12540a9064fbSMasahiro Yamada if (!show_all_items && !menu_is_visible(child))
12550a9064fbSMasahiro Yamada continue;
12560a9064fbSMasahiro Yamada
12570a9064fbSMasahiro Yamada if (child->sym == sym_get_choice_value(menu->sym))
12580a9064fbSMasahiro Yamada item_make(child, ':', "<X> %s",
12590a9064fbSMasahiro Yamada _(menu_get_prompt(child)));
12600a9064fbSMasahiro Yamada else if (child->sym)
12610a9064fbSMasahiro Yamada item_make(child, ':', " %s",
12620a9064fbSMasahiro Yamada _(menu_get_prompt(child)));
12630a9064fbSMasahiro Yamada else
12640a9064fbSMasahiro Yamada item_make(child, ':', "*** %s ***",
12650a9064fbSMasahiro Yamada _(menu_get_prompt(child)));
12660a9064fbSMasahiro Yamada
12670a9064fbSMasahiro Yamada if (child->sym == active){
12680a9064fbSMasahiro Yamada last_top_row = top_row(curses_menu);
12690a9064fbSMasahiro Yamada selected_index = i;
12700a9064fbSMasahiro Yamada }
12710a9064fbSMasahiro Yamada i++;
12720a9064fbSMasahiro Yamada }
12730a9064fbSMasahiro Yamada show_menu(prompt ? _(prompt) : _("Choice Menu"),
12740a9064fbSMasahiro Yamada _(radiolist_instructions),
12750a9064fbSMasahiro Yamada selected_index,
12760a9064fbSMasahiro Yamada &last_top_row);
12770a9064fbSMasahiro Yamada while (!global_exit) {
12780a9064fbSMasahiro Yamada if (match_state.in_search) {
12790a9064fbSMasahiro Yamada mvprintw(0, 0, "searching: %s",
12800a9064fbSMasahiro Yamada match_state.pattern);
12810a9064fbSMasahiro Yamada clrtoeol();
12820a9064fbSMasahiro Yamada }
12830a9064fbSMasahiro Yamada refresh_all_windows(main_window);
12840a9064fbSMasahiro Yamada res = wgetch(menu_win(curses_menu));
12850a9064fbSMasahiro Yamada if (!res)
12860a9064fbSMasahiro Yamada break;
12870a9064fbSMasahiro Yamada if (do_match(res, &match_state, &selected_index) == 0) {
12880a9064fbSMasahiro Yamada if (selected_index != -1)
12890a9064fbSMasahiro Yamada center_item(selected_index,
12900a9064fbSMasahiro Yamada &last_top_row);
12910a9064fbSMasahiro Yamada continue;
12920a9064fbSMasahiro Yamada }
12930a9064fbSMasahiro Yamada if (process_special_keys(
12940a9064fbSMasahiro Yamada &res,
12950a9064fbSMasahiro Yamada (struct menu *) item_data()))
12960a9064fbSMasahiro Yamada break;
12970a9064fbSMasahiro Yamada switch (res) {
12980a9064fbSMasahiro Yamada case KEY_DOWN:
12990a9064fbSMasahiro Yamada menu_driver(curses_menu, REQ_DOWN_ITEM);
13000a9064fbSMasahiro Yamada break;
13010a9064fbSMasahiro Yamada case KEY_UP:
13020a9064fbSMasahiro Yamada menu_driver(curses_menu, REQ_UP_ITEM);
13030a9064fbSMasahiro Yamada break;
13040a9064fbSMasahiro Yamada case KEY_NPAGE:
13050a9064fbSMasahiro Yamada menu_driver(curses_menu, REQ_SCR_DPAGE);
13060a9064fbSMasahiro Yamada break;
13070a9064fbSMasahiro Yamada case KEY_PPAGE:
13080a9064fbSMasahiro Yamada menu_driver(curses_menu, REQ_SCR_UPAGE);
13090a9064fbSMasahiro Yamada break;
13100a9064fbSMasahiro Yamada case KEY_HOME:
13110a9064fbSMasahiro Yamada menu_driver(curses_menu, REQ_FIRST_ITEM);
13120a9064fbSMasahiro Yamada break;
13130a9064fbSMasahiro Yamada case KEY_END:
13140a9064fbSMasahiro Yamada menu_driver(curses_menu, REQ_LAST_ITEM);
13150a9064fbSMasahiro Yamada break;
13160a9064fbSMasahiro Yamada case 'h':
13170a9064fbSMasahiro Yamada case '?':
13180a9064fbSMasahiro Yamada show_help((struct menu *) item_data());
13190a9064fbSMasahiro Yamada break;
13200a9064fbSMasahiro Yamada }
13210a9064fbSMasahiro Yamada if (res == 10 || res == 27 || res == ' ' ||
13220a9064fbSMasahiro Yamada res == KEY_LEFT){
13230a9064fbSMasahiro Yamada break;
13240a9064fbSMasahiro Yamada }
13250a9064fbSMasahiro Yamada refresh_all_windows(main_window);
13260a9064fbSMasahiro Yamada }
13270a9064fbSMasahiro Yamada /* if ESC or left */
13280a9064fbSMasahiro Yamada if (res == 27 || res == KEY_LEFT)
13290a9064fbSMasahiro Yamada break;
13300a9064fbSMasahiro Yamada
13310a9064fbSMasahiro Yamada child = item_data();
13320a9064fbSMasahiro Yamada if (!child || !menu_is_visible(child) || !child->sym)
13330a9064fbSMasahiro Yamada continue;
13340a9064fbSMasahiro Yamada switch (res) {
13350a9064fbSMasahiro Yamada case ' ':
13360a9064fbSMasahiro Yamada case 10:
13370a9064fbSMasahiro Yamada case KEY_RIGHT:
13380a9064fbSMasahiro Yamada sym_set_tristate_value(child->sym, yes);
13390a9064fbSMasahiro Yamada return;
13400a9064fbSMasahiro Yamada case 'h':
13410a9064fbSMasahiro Yamada case '?':
13420a9064fbSMasahiro Yamada show_help(child);
13430a9064fbSMasahiro Yamada active = child->sym;
13440a9064fbSMasahiro Yamada break;
13450a9064fbSMasahiro Yamada case KEY_EXIT:
13460a9064fbSMasahiro Yamada return;
13470a9064fbSMasahiro Yamada }
13480a9064fbSMasahiro Yamada }
13490a9064fbSMasahiro Yamada }
13500a9064fbSMasahiro Yamada
conf_string(struct menu * menu)13510a9064fbSMasahiro Yamada static void conf_string(struct menu *menu)
13520a9064fbSMasahiro Yamada {
13530a9064fbSMasahiro Yamada const char *prompt = menu_get_prompt(menu);
13540a9064fbSMasahiro Yamada
13550a9064fbSMasahiro Yamada while (1) {
13560a9064fbSMasahiro Yamada int res;
13570a9064fbSMasahiro Yamada const char *heading;
13580a9064fbSMasahiro Yamada
13590a9064fbSMasahiro Yamada switch (sym_get_type(menu->sym)) {
13600a9064fbSMasahiro Yamada case S_INT:
13610a9064fbSMasahiro Yamada heading = _(inputbox_instructions_int);
13620a9064fbSMasahiro Yamada break;
13630a9064fbSMasahiro Yamada case S_HEX:
13640a9064fbSMasahiro Yamada heading = _(inputbox_instructions_hex);
13650a9064fbSMasahiro Yamada break;
13660a9064fbSMasahiro Yamada case S_STRING:
13670a9064fbSMasahiro Yamada heading = _(inputbox_instructions_string);
13680a9064fbSMasahiro Yamada break;
13690a9064fbSMasahiro Yamada default:
13700a9064fbSMasahiro Yamada heading = _("Internal nconf error!");
13710a9064fbSMasahiro Yamada }
13720a9064fbSMasahiro Yamada res = dialog_inputbox(main_window,
13730a9064fbSMasahiro Yamada prompt ? _(prompt) : _("Main Menu"),
13740a9064fbSMasahiro Yamada heading,
13750a9064fbSMasahiro Yamada sym_get_string_value(menu->sym),
13760a9064fbSMasahiro Yamada &dialog_input_result,
13770a9064fbSMasahiro Yamada &dialog_input_result_len);
13780a9064fbSMasahiro Yamada switch (res) {
13790a9064fbSMasahiro Yamada case 0:
13800a9064fbSMasahiro Yamada if (sym_set_string_value(menu->sym,
13810a9064fbSMasahiro Yamada dialog_input_result))
13820a9064fbSMasahiro Yamada return;
13830a9064fbSMasahiro Yamada btn_dialog(main_window,
13840a9064fbSMasahiro Yamada _("You have made an invalid entry."), 0);
13850a9064fbSMasahiro Yamada break;
13860a9064fbSMasahiro Yamada case 1:
13870a9064fbSMasahiro Yamada show_help(menu);
13880a9064fbSMasahiro Yamada break;
13890a9064fbSMasahiro Yamada case KEY_EXIT:
13900a9064fbSMasahiro Yamada return;
13910a9064fbSMasahiro Yamada }
13920a9064fbSMasahiro Yamada }
13930a9064fbSMasahiro Yamada }
13940a9064fbSMasahiro Yamada
conf_load(void)13950a9064fbSMasahiro Yamada static void conf_load(void)
13960a9064fbSMasahiro Yamada {
13970a9064fbSMasahiro Yamada while (1) {
13980a9064fbSMasahiro Yamada int res;
13990a9064fbSMasahiro Yamada res = dialog_inputbox(main_window,
14000a9064fbSMasahiro Yamada NULL, load_config_text,
14010a9064fbSMasahiro Yamada filename,
14020a9064fbSMasahiro Yamada &dialog_input_result,
14030a9064fbSMasahiro Yamada &dialog_input_result_len);
14040a9064fbSMasahiro Yamada switch (res) {
14050a9064fbSMasahiro Yamada case 0:
14060a9064fbSMasahiro Yamada if (!dialog_input_result[0])
14070a9064fbSMasahiro Yamada return;
14080a9064fbSMasahiro Yamada if (!conf_read(dialog_input_result)) {
14090a9064fbSMasahiro Yamada set_config_filename(dialog_input_result);
14100a9064fbSMasahiro Yamada sym_set_change_count(1);
14110a9064fbSMasahiro Yamada return;
14120a9064fbSMasahiro Yamada }
14130a9064fbSMasahiro Yamada btn_dialog(main_window, _("File does not exist!"), 0);
14140a9064fbSMasahiro Yamada break;
14150a9064fbSMasahiro Yamada case 1:
14160a9064fbSMasahiro Yamada show_scroll_win(main_window,
14170a9064fbSMasahiro Yamada _("Load Alternate Configuration"),
14180a9064fbSMasahiro Yamada load_config_help);
14190a9064fbSMasahiro Yamada break;
14200a9064fbSMasahiro Yamada case KEY_EXIT:
14210a9064fbSMasahiro Yamada return;
14220a9064fbSMasahiro Yamada }
14230a9064fbSMasahiro Yamada }
14240a9064fbSMasahiro Yamada }
14250a9064fbSMasahiro Yamada
conf_save(void)14260a9064fbSMasahiro Yamada static void conf_save(void)
14270a9064fbSMasahiro Yamada {
14280a9064fbSMasahiro Yamada while (1) {
14290a9064fbSMasahiro Yamada int res;
14300a9064fbSMasahiro Yamada res = dialog_inputbox(main_window,
14310a9064fbSMasahiro Yamada NULL, save_config_text,
14320a9064fbSMasahiro Yamada filename,
14330a9064fbSMasahiro Yamada &dialog_input_result,
14340a9064fbSMasahiro Yamada &dialog_input_result_len);
14350a9064fbSMasahiro Yamada switch (res) {
14360a9064fbSMasahiro Yamada case 0:
14370a9064fbSMasahiro Yamada if (!dialog_input_result[0])
14380a9064fbSMasahiro Yamada return;
14390a9064fbSMasahiro Yamada res = conf_write(dialog_input_result);
14400a9064fbSMasahiro Yamada if (!res) {
14410a9064fbSMasahiro Yamada set_config_filename(dialog_input_result);
14420a9064fbSMasahiro Yamada return;
14430a9064fbSMasahiro Yamada }
14440a9064fbSMasahiro Yamada btn_dialog(main_window, _("Can't create file! "
14450a9064fbSMasahiro Yamada "Probably a nonexistent directory."),
14460a9064fbSMasahiro Yamada 1, "<OK>");
14470a9064fbSMasahiro Yamada break;
14480a9064fbSMasahiro Yamada case 1:
14490a9064fbSMasahiro Yamada show_scroll_win(main_window,
14500a9064fbSMasahiro Yamada _("Save Alternate Configuration"),
14510a9064fbSMasahiro Yamada save_config_help);
14520a9064fbSMasahiro Yamada break;
14530a9064fbSMasahiro Yamada case KEY_EXIT:
14540a9064fbSMasahiro Yamada return;
14550a9064fbSMasahiro Yamada }
14560a9064fbSMasahiro Yamada }
14570a9064fbSMasahiro Yamada }
14580a9064fbSMasahiro Yamada
setup_windows(void)14590a9064fbSMasahiro Yamada void setup_windows(void)
14600a9064fbSMasahiro Yamada {
14610a9064fbSMasahiro Yamada int lines, columns;
14620a9064fbSMasahiro Yamada
14630a9064fbSMasahiro Yamada getmaxyx(stdscr, lines, columns);
14640a9064fbSMasahiro Yamada
14650a9064fbSMasahiro Yamada if (main_window != NULL)
14660a9064fbSMasahiro Yamada delwin(main_window);
14670a9064fbSMasahiro Yamada
14680a9064fbSMasahiro Yamada /* set up the menu and menu window */
14690a9064fbSMasahiro Yamada main_window = newwin(lines-2, columns-2, 2, 1);
14700a9064fbSMasahiro Yamada keypad(main_window, TRUE);
14710a9064fbSMasahiro Yamada mwin_max_lines = lines-7;
14720a9064fbSMasahiro Yamada mwin_max_cols = columns-6;
14730a9064fbSMasahiro Yamada
14740a9064fbSMasahiro Yamada /* panels order is from bottom to top */
14750a9064fbSMasahiro Yamada new_panel(main_window);
14760a9064fbSMasahiro Yamada }
14770a9064fbSMasahiro Yamada
main(int ac,char ** av)14780a9064fbSMasahiro Yamada int main(int ac, char **av)
14790a9064fbSMasahiro Yamada {
14800a9064fbSMasahiro Yamada int lines, columns;
14810a9064fbSMasahiro Yamada char *mode;
14820a9064fbSMasahiro Yamada
14830a9064fbSMasahiro Yamada setlocale(LC_ALL, "");
14840a9064fbSMasahiro Yamada bindtextdomain(PACKAGE, LOCALEDIR);
14850a9064fbSMasahiro Yamada textdomain(PACKAGE);
14860a9064fbSMasahiro Yamada
14879b5f0b1dSMasahiro Yamada if (ac > 1 && strcmp(av[1], "-s") == 0) {
14889b5f0b1dSMasahiro Yamada /* Silence conf_read() until the real callback is set up */
14899b5f0b1dSMasahiro Yamada conf_set_message_callback(NULL);
14909b5f0b1dSMasahiro Yamada av++;
14919b5f0b1dSMasahiro Yamada }
14920a9064fbSMasahiro Yamada conf_parse(av[1]);
14930a9064fbSMasahiro Yamada conf_read(NULL);
14940a9064fbSMasahiro Yamada
14950a9064fbSMasahiro Yamada mode = getenv("NCONFIG_MODE");
14960a9064fbSMasahiro Yamada if (mode) {
14970a9064fbSMasahiro Yamada if (!strcasecmp(mode, "single_menu"))
14980a9064fbSMasahiro Yamada single_menu_mode = 1;
14990a9064fbSMasahiro Yamada }
15000a9064fbSMasahiro Yamada
15010a9064fbSMasahiro Yamada /* Initialize curses */
15020a9064fbSMasahiro Yamada initscr();
15030a9064fbSMasahiro Yamada /* set color theme */
15040a9064fbSMasahiro Yamada set_colors();
15050a9064fbSMasahiro Yamada
15060a9064fbSMasahiro Yamada cbreak();
15070a9064fbSMasahiro Yamada noecho();
15080a9064fbSMasahiro Yamada keypad(stdscr, TRUE);
15090a9064fbSMasahiro Yamada curs_set(0);
15100a9064fbSMasahiro Yamada
15110a9064fbSMasahiro Yamada getmaxyx(stdscr, lines, columns);
15120a9064fbSMasahiro Yamada if (columns < 75 || lines < 20) {
15130a9064fbSMasahiro Yamada endwin();
15140a9064fbSMasahiro Yamada printf("Your terminal should have at "
15150a9064fbSMasahiro Yamada "least 20 lines and 75 columns\n");
15160a9064fbSMasahiro Yamada return 1;
15170a9064fbSMasahiro Yamada }
15180a9064fbSMasahiro Yamada
15190a9064fbSMasahiro Yamada notimeout(stdscr, FALSE);
15200a9064fbSMasahiro Yamada #if NCURSES_REENTRANT
15210a9064fbSMasahiro Yamada set_escdelay(1);
15220a9064fbSMasahiro Yamada #else
15230a9064fbSMasahiro Yamada ESCDELAY = 1;
15240a9064fbSMasahiro Yamada #endif
15250a9064fbSMasahiro Yamada
15260a9064fbSMasahiro Yamada /* set btns menu */
15270a9064fbSMasahiro Yamada curses_menu = new_menu(curses_menu_items);
15280a9064fbSMasahiro Yamada menu_opts_off(curses_menu, O_SHOWDESC);
15290a9064fbSMasahiro Yamada menu_opts_on(curses_menu, O_SHOWMATCH);
15300a9064fbSMasahiro Yamada menu_opts_on(curses_menu, O_ONEVALUE);
15310a9064fbSMasahiro Yamada menu_opts_on(curses_menu, O_NONCYCLIC);
15320a9064fbSMasahiro Yamada menu_opts_on(curses_menu, O_IGNORECASE);
15330a9064fbSMasahiro Yamada set_menu_mark(curses_menu, " ");
15340a9064fbSMasahiro Yamada set_menu_fore(curses_menu, attributes[MAIN_MENU_FORE]);
15350a9064fbSMasahiro Yamada set_menu_back(curses_menu, attributes[MAIN_MENU_BACK]);
15360a9064fbSMasahiro Yamada set_menu_grey(curses_menu, attributes[MAIN_MENU_GREY]);
15370a9064fbSMasahiro Yamada
15380a9064fbSMasahiro Yamada set_config_filename(conf_get_configname());
15390a9064fbSMasahiro Yamada setup_windows();
15400a9064fbSMasahiro Yamada
15410a9064fbSMasahiro Yamada /* check for KEY_FUNC(1) */
15420a9064fbSMasahiro Yamada if (has_key(KEY_F(1)) == FALSE) {
15430a9064fbSMasahiro Yamada show_scroll_win(main_window,
15440a9064fbSMasahiro Yamada _("Instructions"),
15450a9064fbSMasahiro Yamada _(menu_no_f_instructions));
15460a9064fbSMasahiro Yamada }
15470a9064fbSMasahiro Yamada
15480a9064fbSMasahiro Yamada conf_set_message_callback(conf_message_callback);
15490a9064fbSMasahiro Yamada /* do the work */
15500a9064fbSMasahiro Yamada while (!global_exit) {
15510a9064fbSMasahiro Yamada conf(&rootmenu);
15520a9064fbSMasahiro Yamada if (!global_exit && do_exit() == 0)
15530a9064fbSMasahiro Yamada break;
15540a9064fbSMasahiro Yamada }
15550a9064fbSMasahiro Yamada /* ok, we are done */
15560a9064fbSMasahiro Yamada unpost_menu(curses_menu);
15570a9064fbSMasahiro Yamada free_menu(curses_menu);
15580a9064fbSMasahiro Yamada delwin(main_window);
15590a9064fbSMasahiro Yamada clear();
15600a9064fbSMasahiro Yamada refresh();
15610a9064fbSMasahiro Yamada endwin();
15620a9064fbSMasahiro Yamada return 0;
15630a9064fbSMasahiro Yamada }
1564