1692d97c3Snir.tzachar@gmail.com /* 2692d97c3Snir.tzachar@gmail.com * Copyright (C) 2008 Nir Tzachar <nir.tzachar@gmail.com? 3692d97c3Snir.tzachar@gmail.com * Released under the terms of the GNU GPL v2.0. 4692d97c3Snir.tzachar@gmail.com * 5692d97c3Snir.tzachar@gmail.com * Derived from menuconfig. 6692d97c3Snir.tzachar@gmail.com * 7692d97c3Snir.tzachar@gmail.com */ 8*0eb47346SCheah Kok Cheong #ifndef _GNU_SOURCE 9a72f3e2bSNir Tzachar #define _GNU_SOURCE 10*0eb47346SCheah Kok Cheong #endif 11a72f3e2bSNir Tzachar #include <string.h> 129a926d43SYann E. MORIN #include <stdlib.h> 135a6f8d2bSArnaud Lacombe 14692d97c3Snir.tzachar@gmail.com #include "lkc.h" 15692d97c3Snir.tzachar@gmail.com #include "nconf.h" 16a72f3e2bSNir Tzachar #include <ctype.h> 17692d97c3Snir.tzachar@gmail.com 180b616500SRoland Eggner static const char nconf_global_help[] = N_( 190b616500SRoland Eggner "Help windows\n" 200b616500SRoland Eggner "------------\n" 210b616500SRoland Eggner "o Global help: Unless in a data entry window, pressing <F1> will give \n" 220b616500SRoland Eggner " you the global help window, which you are just reading.\n" 23692d97c3Snir.tzachar@gmail.com "\n" 240b616500SRoland Eggner "o A short version of the global help is available by pressing <F3>.\n" 250b616500SRoland Eggner "\n" 260b616500SRoland Eggner "o Local help: To get help related to the current menu entry, use any\n" 270b616500SRoland Eggner " of <?> <h>, or if in a data entry window then press <F1>.\n" 280b616500SRoland Eggner "\n" 290b616500SRoland Eggner "\n" 300b616500SRoland Eggner "Menu entries\n" 310b616500SRoland Eggner "------------\n" 320b616500SRoland Eggner "This interface lets you select features and parameters for the kernel\n" 330b616500SRoland Eggner "build. Kernel features can either be built-in, modularized, or removed.\n" 340b616500SRoland Eggner "Parameters must be entered as text or decimal or hexadecimal numbers.\n" 350b616500SRoland Eggner "\n" 360b616500SRoland Eggner "Menu entries beginning with following braces represent features that\n" 37692d97c3Snir.tzachar@gmail.com " [ ] can be built in or removed\n" 38692d97c3Snir.tzachar@gmail.com " < > can be built in, modularized or removed\n" 390b616500SRoland Eggner " { } can be built in or modularized, are selected by another feature\n" 400b616500SRoland Eggner " - - are selected by another feature\n" 410b616500SRoland Eggner " XXX cannot be selected. Symbol Info <F2> tells you why.\n" 420b616500SRoland Eggner "*, M or whitespace inside braces means to build in, build as a module\n" 430b616500SRoland Eggner "or to exclude the feature respectively.\n" 44692d97c3Snir.tzachar@gmail.com "\n" 450b616500SRoland Eggner "To change any of these features, highlight it with the movement keys\n" 460b616500SRoland Eggner "listed below and press <y> to build it in, <m> to make it a module or\n" 470b616500SRoland Eggner "<n> to remove it. You may press the <Space> key to cycle through the\n" 480b616500SRoland Eggner "available options.\n" 49692d97c3Snir.tzachar@gmail.com "\n" 501278ebdbSDirk Gouders "A trailing \"--->\" designates a submenu, a trailing \"----\" an\n" 511278ebdbSDirk Gouders "empty submenu.\n" 520b616500SRoland Eggner "\n" 530b616500SRoland Eggner "Menu navigation keys\n" 540b616500SRoland Eggner "----------------------------------------------------------------------\n" 550b616500SRoland Eggner "Linewise up <Up>\n" 560b616500SRoland Eggner "Linewise down <Down>\n" 570b616500SRoland Eggner "Pagewise up <Page Up>\n" 580b616500SRoland Eggner "Pagewise down <Page Down>\n" 590b616500SRoland Eggner "First entry <Home>\n" 600b616500SRoland Eggner "Last entry <End>\n" 610b616500SRoland Eggner "Enter a submenu <Right> <Enter>\n" 620b616500SRoland Eggner "Go back to parent menu <Left> <Esc> <F5>\n" 630b616500SRoland Eggner "Close a help window <Enter> <Esc> <F5>\n" 640b616500SRoland Eggner "Close entry window, apply <Enter>\n" 650b616500SRoland Eggner "Close entry window, forget <Esc> <F5>\n" 660b616500SRoland Eggner "Start incremental, case-insensitive search for STRING in menu entries,\n" 670b616500SRoland Eggner " no regex support, STRING is displayed in upper left corner\n" 680b616500SRoland Eggner " </>STRING\n" 690b616500SRoland Eggner " Remove last character <Backspace>\n" 700b616500SRoland Eggner " Jump to next hit <Down>\n" 710b616500SRoland Eggner " Jump to previous hit <Up>\n" 720b616500SRoland Eggner "Exit menu search mode </> <Esc>\n" 730b616500SRoland Eggner "Search for configuration variables with or without leading CONFIG_\n" 740b616500SRoland Eggner " <F8>RegExpr<Enter>\n" 750b616500SRoland Eggner "Verbose search help <F8><F1>\n" 760b616500SRoland Eggner "----------------------------------------------------------------------\n" 770b616500SRoland Eggner "\n" 780b616500SRoland Eggner "Unless in a data entry window, key <1> may be used instead of <F1>,\n" 790b616500SRoland Eggner "<2> instead of <F2>, etc.\n" 800b616500SRoland Eggner "\n" 810b616500SRoland Eggner "\n" 820b616500SRoland Eggner "Radiolist (Choice list)\n" 830b616500SRoland Eggner "-----------------------\n" 840b616500SRoland Eggner "Use the movement keys listed above to select the option you wish to set\n" 850b616500SRoland Eggner "and press <Space>.\n" 860b616500SRoland Eggner "\n" 870b616500SRoland Eggner "\n" 880b616500SRoland Eggner "Data entry\n" 89692d97c3Snir.tzachar@gmail.com "----------\n" 900b616500SRoland Eggner "Enter the requested information and press <Enter>. Hexadecimal values\n" 910b616500SRoland Eggner "may be entered without the \"0x\" prefix.\n" 92692d97c3Snir.tzachar@gmail.com "\n" 93692d97c3Snir.tzachar@gmail.com "\n" 94692d97c3Snir.tzachar@gmail.com "Text Box (Help Window)\n" 950b616500SRoland Eggner "----------------------\n" 960b616500SRoland Eggner "Use movement keys as listed in table above.\n" 97692d97c3Snir.tzachar@gmail.com "\n" 980b616500SRoland Eggner "Press any of <Enter> <Esc> <q> <F5> <F9> to exit.\n" 99692d97c3Snir.tzachar@gmail.com "\n" 100692d97c3Snir.tzachar@gmail.com "\n" 1010b616500SRoland Eggner "Alternate configuration files\n" 102692d97c3Snir.tzachar@gmail.com "-----------------------------\n" 1030b616500SRoland Eggner "nconfig supports switching between different configurations.\n" 1040b616500SRoland Eggner "Press <F6> to save your current configuration. Press <F7> and enter\n" 1050b616500SRoland Eggner "a file name to load a previously saved configuration.\n" 106692d97c3Snir.tzachar@gmail.com "\n" 107692d97c3Snir.tzachar@gmail.com "\n" 1080b616500SRoland Eggner "Terminal configuration\n" 1090b616500SRoland Eggner "----------------------\n" 1100b616500SRoland Eggner "If you use nconfig in a xterm window, make sure your TERM environment\n" 1110b616500SRoland Eggner "variable specifies a terminal configuration which supports at least\n" 1120b616500SRoland Eggner "16 colors. Otherwise nconfig will look rather bad.\n" 113692d97c3Snir.tzachar@gmail.com "\n" 1140b616500SRoland Eggner "If the \"stty size\" command reports the current terminalsize correctly,\n" 1150b616500SRoland Eggner "nconfig will adapt to sizes larger than the traditional 80x25 \"standard\"\n" 1160b616500SRoland Eggner "and display longer menus properly.\n" 117692d97c3Snir.tzachar@gmail.com "\n" 118692d97c3Snir.tzachar@gmail.com "\n" 1190b616500SRoland Eggner "Single menu mode\n" 1200b616500SRoland Eggner "----------------\n" 1210b616500SRoland Eggner "If you prefer to have all of the menu entries listed in a single menu,\n" 1220b616500SRoland Eggner "rather than the default multimenu hierarchy, run nconfig with\n" 1230b616500SRoland Eggner "NCONFIG_MODE environment variable set to single_menu. Example:\n" 124692d97c3Snir.tzachar@gmail.com "\n" 125692d97c3Snir.tzachar@gmail.com "make NCONFIG_MODE=single_menu nconfig\n" 126692d97c3Snir.tzachar@gmail.com "\n" 1270b616500SRoland Eggner "<Enter> will then unfold the appropriate category, or fold it if it\n" 1280b616500SRoland Eggner "is already unfolded. Folded menu entries will be designated by a\n" 1290b616500SRoland Eggner "leading \"++>\" and unfolded entries by a leading \"-->\".\n" 130692d97c3Snir.tzachar@gmail.com "\n" 1310b616500SRoland Eggner "Note that this mode can eventually be a little more CPU expensive than\n" 1320b616500SRoland Eggner "the default mode, especially with a larger number of unfolded submenus.\n" 133692d97c3Snir.tzachar@gmail.com "\n"), 134692d97c3Snir.tzachar@gmail.com menu_no_f_instructions[] = N_( 135692d97c3Snir.tzachar@gmail.com "Legend: [*] built-in [ ] excluded <M> module < > module capable.\n" 1361278ebdbSDirk Gouders "Submenus are designated by a trailing \"--->\", empty ones by \"----\".\n" 1370b616500SRoland Eggner "\n" 1380b616500SRoland Eggner "Use the following keys to navigate the menus:\n" 1390b616500SRoland Eggner "Move up or down with <Up> and <Down>.\n" 1400b616500SRoland Eggner "Enter a submenu with <Enter> or <Right>.\n" 1410b616500SRoland Eggner "Exit a submenu to its parent menu with <Esc> or <Left>.\n" 1420b616500SRoland Eggner "Pressing <y> includes, <n> excludes, <m> modularizes features.\n" 1430b616500SRoland Eggner "Pressing <Space> cycles through the available options.\n" 1440b616500SRoland Eggner "To search for menu entries press </>.\n" 1450b616500SRoland Eggner "<Esc> always leaves the current window.\n" 1460b616500SRoland Eggner "\n" 1470b616500SRoland Eggner "You do not have function keys support.\n" 1480b616500SRoland Eggner "Press <1> instead of <F1>, <2> instead of <F2>, etc.\n" 1490b616500SRoland Eggner "For verbose global help use key <1>.\n" 1500b616500SRoland Eggner "For help related to the current menu entry press <?> or <h>.\n"), 151692d97c3Snir.tzachar@gmail.com menu_instructions[] = N_( 152692d97c3Snir.tzachar@gmail.com "Legend: [*] built-in [ ] excluded <M> module < > module capable.\n" 1531278ebdbSDirk Gouders "Submenus are designated by a trailing \"--->\", empty ones by \"----\".\n" 1540b616500SRoland Eggner "\n" 1550b616500SRoland Eggner "Use the following keys to navigate the menus:\n" 1560b616500SRoland Eggner "Move up or down with <Up> or <Down>.\n" 1570b616500SRoland Eggner "Enter a submenu with <Enter> or <Right>.\n" 1580b616500SRoland Eggner "Exit a submenu to its parent menu with <Esc> or <Left>.\n" 1590b616500SRoland Eggner "Pressing <y> includes, <n> excludes, <m> modularizes features.\n" 1600b616500SRoland Eggner "Pressing <Space> cycles through the available options.\n" 1610b616500SRoland Eggner "To search for menu entries press </>.\n" 1620b616500SRoland Eggner "<Esc> always leaves the current window.\n" 1630b616500SRoland Eggner "\n" 1640b616500SRoland Eggner "Pressing <1> may be used instead of <F1>, <2> instead of <F2>, etc.\n" 1650b616500SRoland Eggner "For verbose global help press <F1>.\n" 1660b616500SRoland Eggner "For help related to the current menu entry press <?> or <h>.\n"), 167692d97c3Snir.tzachar@gmail.com radiolist_instructions[] = N_( 1680b616500SRoland Eggner "Press <Up>, <Down>, <Home> or <End> to navigate a radiolist, select\n" 1690b616500SRoland Eggner "with <Space>.\n" 1700b616500SRoland Eggner "For help related to the current entry press <?> or <h>.\n" 1710b616500SRoland Eggner "For global help press <F1>.\n"), 172692d97c3Snir.tzachar@gmail.com inputbox_instructions_int[] = N_( 173692d97c3Snir.tzachar@gmail.com "Please enter a decimal value.\n" 174692d97c3Snir.tzachar@gmail.com "Fractions will not be accepted.\n" 1750b616500SRoland Eggner "Press <Enter> to apply, <Esc> to cancel."), 176692d97c3Snir.tzachar@gmail.com inputbox_instructions_hex[] = N_( 177692d97c3Snir.tzachar@gmail.com "Please enter a hexadecimal value.\n" 1780b616500SRoland Eggner "Press <Enter> to apply, <Esc> to cancel."), 179692d97c3Snir.tzachar@gmail.com inputbox_instructions_string[] = N_( 180692d97c3Snir.tzachar@gmail.com "Please enter a string value.\n" 1810b616500SRoland Eggner "Press <Enter> to apply, <Esc> to cancel."), 182692d97c3Snir.tzachar@gmail.com setmod_text[] = N_( 1830b616500SRoland Eggner "This feature depends on another feature which has been configured as a\n" 1840b616500SRoland Eggner "module. As a result, the current feature will be built as a module too."), 185692d97c3Snir.tzachar@gmail.com load_config_text[] = N_( 186692d97c3Snir.tzachar@gmail.com "Enter the name of the configuration file you wish to load.\n" 1870b616500SRoland Eggner "Accept the name shown to restore the configuration you last\n" 1880b616500SRoland Eggner "retrieved. Leave empty to abort."), 189692d97c3Snir.tzachar@gmail.com load_config_help[] = N_( 190652cf982SArnaud Lacombe "For various reasons, one may wish to keep several different\n" 191692d97c3Snir.tzachar@gmail.com "configurations available on a single machine.\n" 192692d97c3Snir.tzachar@gmail.com "\n" 193692d97c3Snir.tzachar@gmail.com "If you have saved a previous configuration in a file other than the\n" 1940b616500SRoland Eggner "default one, entering its name here will allow you to load and modify\n" 1950b616500SRoland Eggner "that configuration.\n" 196692d97c3Snir.tzachar@gmail.com "\n" 1970b616500SRoland Eggner "Leave empty to abort.\n"), 198692d97c3Snir.tzachar@gmail.com save_config_text[] = N_( 199692d97c3Snir.tzachar@gmail.com "Enter a filename to which this configuration should be saved\n" 2000b616500SRoland Eggner "as an alternate. Leave empty to abort."), 201692d97c3Snir.tzachar@gmail.com save_config_help[] = N_( 2020b616500SRoland Eggner "For various reasons, one may wish to keep several different\n" 2030b616500SRoland Eggner "configurations available on a single machine.\n" 204692d97c3Snir.tzachar@gmail.com "\n" 205692d97c3Snir.tzachar@gmail.com "Entering a file name here will allow you to later retrieve, modify\n" 206692d97c3Snir.tzachar@gmail.com "and use the current configuration as an alternate to whatever\n" 207692d97c3Snir.tzachar@gmail.com "configuration options you have selected at that time.\n" 208692d97c3Snir.tzachar@gmail.com "\n" 2090b616500SRoland Eggner "Leave empty to abort.\n"), 210692d97c3Snir.tzachar@gmail.com search_help[] = N_( 2110b616500SRoland Eggner "Search for symbols (configuration variable names CONFIG_*) and display\n" 2120b616500SRoland Eggner "their relations. Regular expressions are supported.\n" 2130b616500SRoland Eggner "Example: Search for \"^FOO\".\n" 214692d97c3Snir.tzachar@gmail.com "Result:\n" 215692d97c3Snir.tzachar@gmail.com "-----------------------------------------------------------------\n" 216692d97c3Snir.tzachar@gmail.com "Symbol: FOO [ = m]\n" 217692d97c3Snir.tzachar@gmail.com "Prompt: Foo bus is used to drive the bar HW\n" 218692d97c3Snir.tzachar@gmail.com "Defined at drivers/pci/Kconfig:47\n" 219692d97c3Snir.tzachar@gmail.com "Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n" 220692d97c3Snir.tzachar@gmail.com "Location:\n" 221bb8187d3SPaul Gortmaker " -> Bus options (PCI, PCMCIA, EISA, ISA)\n" 222692d97c3Snir.tzachar@gmail.com " -> PCI support (PCI [ = y])\n" 223692d97c3Snir.tzachar@gmail.com " -> PCI access mode (<choice> [ = y])\n" 224692d97c3Snir.tzachar@gmail.com "Selects: LIBCRC32\n" 225692d97c3Snir.tzachar@gmail.com "Selected by: BAR\n" 226692d97c3Snir.tzachar@gmail.com "-----------------------------------------------------------------\n" 2270b616500SRoland Eggner "o The line 'Prompt:' shows the text displayed for this symbol in\n" 2280b616500SRoland Eggner " the menu hierarchy.\n" 2290b616500SRoland Eggner "o The 'Defined at' line tells at what file / line number the symbol is\n" 2300b616500SRoland Eggner " defined.\n" 2310b616500SRoland Eggner "o The 'Depends on:' line lists symbols that need to be defined for\n" 2320b616500SRoland Eggner " this symbol to be visible and selectable in the menu.\n" 2330b616500SRoland Eggner "o The 'Location:' lines tell, where in the menu structure this symbol\n" 2340b616500SRoland Eggner " is located. A location followed by a [ = y] indicates that this is\n" 2350b616500SRoland Eggner " a selectable menu item, and the current value is displayed inside\n" 2360b616500SRoland Eggner " brackets.\n" 2370b616500SRoland Eggner "o The 'Selects:' line tells, what symbol will be automatically selected\n" 2380b616500SRoland Eggner " if this symbol is selected (y or m).\n" 2390b616500SRoland Eggner "o The 'Selected by' line tells what symbol has selected this symbol.\n" 240692d97c3Snir.tzachar@gmail.com "\n" 241692d97c3Snir.tzachar@gmail.com "Only relevant lines are shown.\n" 242692d97c3Snir.tzachar@gmail.com "\n\n" 243692d97c3Snir.tzachar@gmail.com "Search examples:\n" 2440b616500SRoland Eggner "USB => find all symbols containing USB\n" 24559dfa24dSArnaud Lacombe "^USB => find all symbols starting with USB\n" 24659dfa24dSArnaud Lacombe "USB$ => find all symbols ending with USB\n" 247692d97c3Snir.tzachar@gmail.com "\n"); 248692d97c3Snir.tzachar@gmail.com 249692d97c3Snir.tzachar@gmail.com struct mitem { 250692d97c3Snir.tzachar@gmail.com char str[256]; 251692d97c3Snir.tzachar@gmail.com char tag; 252692d97c3Snir.tzachar@gmail.com void *usrptr; 253692d97c3Snir.tzachar@gmail.com int is_visible; 254692d97c3Snir.tzachar@gmail.com }; 255692d97c3Snir.tzachar@gmail.com 256692d97c3Snir.tzachar@gmail.com #define MAX_MENU_ITEMS 4096 257692d97c3Snir.tzachar@gmail.com static int show_all_items; 258692d97c3Snir.tzachar@gmail.com static int indent; 259692d97c3Snir.tzachar@gmail.com static struct menu *current_menu; 260692d97c3Snir.tzachar@gmail.com static int child_count; 261692d97c3Snir.tzachar@gmail.com static int single_menu_mode; 262692d97c3Snir.tzachar@gmail.com /* the window in which all information appears */ 263692d97c3Snir.tzachar@gmail.com static WINDOW *main_window; 264692d97c3Snir.tzachar@gmail.com /* the largest size of the menu window */ 265692d97c3Snir.tzachar@gmail.com static int mwin_max_lines; 266692d97c3Snir.tzachar@gmail.com static int mwin_max_cols; 267692d97c3Snir.tzachar@gmail.com /* the window in which we show option buttons */ 268692d97c3Snir.tzachar@gmail.com static MENU *curses_menu; 269692d97c3Snir.tzachar@gmail.com static ITEM *curses_menu_items[MAX_MENU_ITEMS]; 270692d97c3Snir.tzachar@gmail.com static struct mitem k_menu_items[MAX_MENU_ITEMS]; 271692d97c3Snir.tzachar@gmail.com static int items_num; 272692d97c3Snir.tzachar@gmail.com static int global_exit; 273692d97c3Snir.tzachar@gmail.com /* the currently selected button */ 274692d97c3Snir.tzachar@gmail.com const char *current_instructions = menu_instructions; 275692d97c3Snir.tzachar@gmail.com 2765ea9f64fSCheng Renquan static char *dialog_input_result; 2775ea9f64fSCheng Renquan static int dialog_input_result_len; 2785ea9f64fSCheng Renquan 279692d97c3Snir.tzachar@gmail.com static void conf(struct menu *menu); 280692d97c3Snir.tzachar@gmail.com static void conf_choice(struct menu *menu); 281692d97c3Snir.tzachar@gmail.com static void conf_string(struct menu *menu); 282692d97c3Snir.tzachar@gmail.com static void conf_load(void); 283692d97c3Snir.tzachar@gmail.com static void conf_save(void); 284692d97c3Snir.tzachar@gmail.com static void show_help(struct menu *menu); 285692d97c3Snir.tzachar@gmail.com static int do_exit(void); 286692d97c3Snir.tzachar@gmail.com static void setup_windows(void); 287a72f3e2bSNir Tzachar static void search_conf(void); 288692d97c3Snir.tzachar@gmail.com 289692d97c3Snir.tzachar@gmail.com typedef void (*function_key_handler_t)(int *key, struct menu *menu); 290692d97c3Snir.tzachar@gmail.com static void handle_f1(int *key, struct menu *current_item); 291692d97c3Snir.tzachar@gmail.com static void handle_f2(int *key, struct menu *current_item); 292692d97c3Snir.tzachar@gmail.com static void handle_f3(int *key, struct menu *current_item); 293692d97c3Snir.tzachar@gmail.com static void handle_f4(int *key, struct menu *current_item); 294692d97c3Snir.tzachar@gmail.com static void handle_f5(int *key, struct menu *current_item); 295692d97c3Snir.tzachar@gmail.com static void handle_f6(int *key, struct menu *current_item); 296692d97c3Snir.tzachar@gmail.com static void handle_f7(int *key, struct menu *current_item); 297692d97c3Snir.tzachar@gmail.com static void handle_f8(int *key, struct menu *current_item); 298a72f3e2bSNir Tzachar static void handle_f9(int *key, struct menu *current_item); 299692d97c3Snir.tzachar@gmail.com 300692d97c3Snir.tzachar@gmail.com struct function_keys { 301692d97c3Snir.tzachar@gmail.com const char *key_str; 302692d97c3Snir.tzachar@gmail.com const char *func; 303692d97c3Snir.tzachar@gmail.com function_key key; 304692d97c3Snir.tzachar@gmail.com function_key_handler_t handler; 305692d97c3Snir.tzachar@gmail.com }; 306692d97c3Snir.tzachar@gmail.com 307a72f3e2bSNir Tzachar static const int function_keys_num = 9; 308692d97c3Snir.tzachar@gmail.com struct function_keys function_keys[] = { 309692d97c3Snir.tzachar@gmail.com { 310692d97c3Snir.tzachar@gmail.com .key_str = "F1", 311692d97c3Snir.tzachar@gmail.com .func = "Help", 312692d97c3Snir.tzachar@gmail.com .key = F_HELP, 313692d97c3Snir.tzachar@gmail.com .handler = handle_f1, 314692d97c3Snir.tzachar@gmail.com }, 315692d97c3Snir.tzachar@gmail.com { 316692d97c3Snir.tzachar@gmail.com .key_str = "F2", 317a72f3e2bSNir Tzachar .func = "SymInfo", 318692d97c3Snir.tzachar@gmail.com .key = F_SYMBOL, 319692d97c3Snir.tzachar@gmail.com .handler = handle_f2, 320692d97c3Snir.tzachar@gmail.com }, 321692d97c3Snir.tzachar@gmail.com { 322692d97c3Snir.tzachar@gmail.com .key_str = "F3", 3232c68115cSRoland Eggner .func = "Help 2", 324692d97c3Snir.tzachar@gmail.com .key = F_INSTS, 325692d97c3Snir.tzachar@gmail.com .handler = handle_f3, 326692d97c3Snir.tzachar@gmail.com }, 327692d97c3Snir.tzachar@gmail.com { 328692d97c3Snir.tzachar@gmail.com .key_str = "F4", 3292c68115cSRoland Eggner .func = "ShowAll", 330692d97c3Snir.tzachar@gmail.com .key = F_CONF, 331692d97c3Snir.tzachar@gmail.com .handler = handle_f4, 332692d97c3Snir.tzachar@gmail.com }, 333692d97c3Snir.tzachar@gmail.com { 334692d97c3Snir.tzachar@gmail.com .key_str = "F5", 335692d97c3Snir.tzachar@gmail.com .func = "Back", 336692d97c3Snir.tzachar@gmail.com .key = F_BACK, 337692d97c3Snir.tzachar@gmail.com .handler = handle_f5, 338692d97c3Snir.tzachar@gmail.com }, 339692d97c3Snir.tzachar@gmail.com { 340692d97c3Snir.tzachar@gmail.com .key_str = "F6", 341692d97c3Snir.tzachar@gmail.com .func = "Save", 342692d97c3Snir.tzachar@gmail.com .key = F_SAVE, 343692d97c3Snir.tzachar@gmail.com .handler = handle_f6, 344692d97c3Snir.tzachar@gmail.com }, 345692d97c3Snir.tzachar@gmail.com { 346692d97c3Snir.tzachar@gmail.com .key_str = "F7", 347692d97c3Snir.tzachar@gmail.com .func = "Load", 348692d97c3Snir.tzachar@gmail.com .key = F_LOAD, 349692d97c3Snir.tzachar@gmail.com .handler = handle_f7, 350692d97c3Snir.tzachar@gmail.com }, 351692d97c3Snir.tzachar@gmail.com { 352692d97c3Snir.tzachar@gmail.com .key_str = "F8", 353a72f3e2bSNir Tzachar .func = "SymSearch", 354a72f3e2bSNir Tzachar .key = F_SEARCH, 355a72f3e2bSNir Tzachar .handler = handle_f8, 356a72f3e2bSNir Tzachar }, 357a72f3e2bSNir Tzachar { 358a72f3e2bSNir Tzachar .key_str = "F9", 359692d97c3Snir.tzachar@gmail.com .func = "Exit", 360692d97c3Snir.tzachar@gmail.com .key = F_EXIT, 361a72f3e2bSNir Tzachar .handler = handle_f9, 362692d97c3Snir.tzachar@gmail.com }, 363692d97c3Snir.tzachar@gmail.com }; 364692d97c3Snir.tzachar@gmail.com 365692d97c3Snir.tzachar@gmail.com static void print_function_line(void) 366692d97c3Snir.tzachar@gmail.com { 367692d97c3Snir.tzachar@gmail.com int i; 368692d97c3Snir.tzachar@gmail.com int offset = 1; 369692d97c3Snir.tzachar@gmail.com const int skip = 1; 370e0b42605SDirk Gouders int lines = getmaxy(stdscr); 371692d97c3Snir.tzachar@gmail.com 372692d97c3Snir.tzachar@gmail.com for (i = 0; i < function_keys_num; i++) { 37310175ba6SStephen Boyd (void) wattrset(main_window, attributes[FUNCTION_HIGHLIGHT]); 374e0b42605SDirk Gouders mvwprintw(main_window, lines-3, offset, 375692d97c3Snir.tzachar@gmail.com "%s", 376692d97c3Snir.tzachar@gmail.com function_keys[i].key_str); 37710175ba6SStephen Boyd (void) wattrset(main_window, attributes[FUNCTION_TEXT]); 378692d97c3Snir.tzachar@gmail.com offset += strlen(function_keys[i].key_str); 379e0b42605SDirk Gouders mvwprintw(main_window, lines-3, 380692d97c3Snir.tzachar@gmail.com offset, "%s", 381692d97c3Snir.tzachar@gmail.com function_keys[i].func); 382692d97c3Snir.tzachar@gmail.com offset += strlen(function_keys[i].func) + skip; 383692d97c3Snir.tzachar@gmail.com } 38410175ba6SStephen Boyd (void) wattrset(main_window, attributes[NORMAL]); 385692d97c3Snir.tzachar@gmail.com } 386692d97c3Snir.tzachar@gmail.com 387692d97c3Snir.tzachar@gmail.com /* help */ 388692d97c3Snir.tzachar@gmail.com static void handle_f1(int *key, struct menu *current_item) 389692d97c3Snir.tzachar@gmail.com { 390692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 3910b616500SRoland Eggner _("Global help"), _(nconf_global_help)); 392692d97c3Snir.tzachar@gmail.com return; 393692d97c3Snir.tzachar@gmail.com } 394692d97c3Snir.tzachar@gmail.com 395692d97c3Snir.tzachar@gmail.com /* symbole help */ 396692d97c3Snir.tzachar@gmail.com static void handle_f2(int *key, struct menu *current_item) 397692d97c3Snir.tzachar@gmail.com { 398692d97c3Snir.tzachar@gmail.com show_help(current_item); 399692d97c3Snir.tzachar@gmail.com return; 400692d97c3Snir.tzachar@gmail.com } 401692d97c3Snir.tzachar@gmail.com 402692d97c3Snir.tzachar@gmail.com /* instructions */ 403692d97c3Snir.tzachar@gmail.com static void handle_f3(int *key, struct menu *current_item) 404692d97c3Snir.tzachar@gmail.com { 405692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 4060b616500SRoland Eggner _("Short help"), 407692d97c3Snir.tzachar@gmail.com _(current_instructions)); 408692d97c3Snir.tzachar@gmail.com return; 409692d97c3Snir.tzachar@gmail.com } 410692d97c3Snir.tzachar@gmail.com 411692d97c3Snir.tzachar@gmail.com /* config */ 412692d97c3Snir.tzachar@gmail.com static void handle_f4(int *key, struct menu *current_item) 413692d97c3Snir.tzachar@gmail.com { 414692d97c3Snir.tzachar@gmail.com int res = btn_dialog(main_window, 415692d97c3Snir.tzachar@gmail.com _("Show all symbols?"), 416692d97c3Snir.tzachar@gmail.com 2, 417692d97c3Snir.tzachar@gmail.com " <Show All> ", 418692d97c3Snir.tzachar@gmail.com "<Don't show all>"); 419692d97c3Snir.tzachar@gmail.com if (res == 0) 420692d97c3Snir.tzachar@gmail.com show_all_items = 1; 421692d97c3Snir.tzachar@gmail.com else if (res == 1) 422692d97c3Snir.tzachar@gmail.com show_all_items = 0; 423692d97c3Snir.tzachar@gmail.com 424692d97c3Snir.tzachar@gmail.com return; 425692d97c3Snir.tzachar@gmail.com } 426692d97c3Snir.tzachar@gmail.com 427692d97c3Snir.tzachar@gmail.com /* back */ 428692d97c3Snir.tzachar@gmail.com static void handle_f5(int *key, struct menu *current_item) 429692d97c3Snir.tzachar@gmail.com { 430692d97c3Snir.tzachar@gmail.com *key = KEY_LEFT; 431692d97c3Snir.tzachar@gmail.com return; 432692d97c3Snir.tzachar@gmail.com } 433692d97c3Snir.tzachar@gmail.com 434692d97c3Snir.tzachar@gmail.com /* save */ 435692d97c3Snir.tzachar@gmail.com static void handle_f6(int *key, struct menu *current_item) 436692d97c3Snir.tzachar@gmail.com { 437692d97c3Snir.tzachar@gmail.com conf_save(); 438692d97c3Snir.tzachar@gmail.com return; 439692d97c3Snir.tzachar@gmail.com } 440692d97c3Snir.tzachar@gmail.com 441692d97c3Snir.tzachar@gmail.com /* load */ 442692d97c3Snir.tzachar@gmail.com static void handle_f7(int *key, struct menu *current_item) 443692d97c3Snir.tzachar@gmail.com { 444692d97c3Snir.tzachar@gmail.com conf_load(); 445692d97c3Snir.tzachar@gmail.com return; 446692d97c3Snir.tzachar@gmail.com } 447692d97c3Snir.tzachar@gmail.com 448a72f3e2bSNir Tzachar /* search */ 449692d97c3Snir.tzachar@gmail.com static void handle_f8(int *key, struct menu *current_item) 450692d97c3Snir.tzachar@gmail.com { 451a72f3e2bSNir Tzachar search_conf(); 452a72f3e2bSNir Tzachar return; 453a72f3e2bSNir Tzachar } 454a72f3e2bSNir Tzachar 455a72f3e2bSNir Tzachar /* exit */ 456a72f3e2bSNir Tzachar static void handle_f9(int *key, struct menu *current_item) 457a72f3e2bSNir Tzachar { 458692d97c3Snir.tzachar@gmail.com do_exit(); 459692d97c3Snir.tzachar@gmail.com return; 460692d97c3Snir.tzachar@gmail.com } 461692d97c3Snir.tzachar@gmail.com 462692d97c3Snir.tzachar@gmail.com /* return != 0 to indicate the key was handles */ 463851190c9SMichal Marek static int process_special_keys(int *key, struct menu *menu) 464692d97c3Snir.tzachar@gmail.com { 465692d97c3Snir.tzachar@gmail.com int i; 466692d97c3Snir.tzachar@gmail.com 467692d97c3Snir.tzachar@gmail.com if (*key == KEY_RESIZE) { 468692d97c3Snir.tzachar@gmail.com setup_windows(); 469692d97c3Snir.tzachar@gmail.com return 1; 470692d97c3Snir.tzachar@gmail.com } 471692d97c3Snir.tzachar@gmail.com 472692d97c3Snir.tzachar@gmail.com for (i = 0; i < function_keys_num; i++) { 473692d97c3Snir.tzachar@gmail.com if (*key == KEY_F(function_keys[i].key) || 474692d97c3Snir.tzachar@gmail.com *key == '0' + function_keys[i].key){ 475692d97c3Snir.tzachar@gmail.com function_keys[i].handler(key, menu); 476692d97c3Snir.tzachar@gmail.com return 1; 477692d97c3Snir.tzachar@gmail.com } 478692d97c3Snir.tzachar@gmail.com } 479692d97c3Snir.tzachar@gmail.com 480692d97c3Snir.tzachar@gmail.com return 0; 481692d97c3Snir.tzachar@gmail.com } 482692d97c3Snir.tzachar@gmail.com 483692d97c3Snir.tzachar@gmail.com static void clean_items(void) 484692d97c3Snir.tzachar@gmail.com { 485692d97c3Snir.tzachar@gmail.com int i; 486692d97c3Snir.tzachar@gmail.com for (i = 0; curses_menu_items[i]; i++) 487692d97c3Snir.tzachar@gmail.com free_item(curses_menu_items[i]); 488692d97c3Snir.tzachar@gmail.com bzero(curses_menu_items, sizeof(curses_menu_items)); 489692d97c3Snir.tzachar@gmail.com bzero(k_menu_items, sizeof(k_menu_items)); 490692d97c3Snir.tzachar@gmail.com items_num = 0; 491692d97c3Snir.tzachar@gmail.com } 492692d97c3Snir.tzachar@gmail.com 493a72f3e2bSNir Tzachar typedef enum {MATCH_TINKER_PATTERN_UP, MATCH_TINKER_PATTERN_DOWN, 494a72f3e2bSNir Tzachar FIND_NEXT_MATCH_DOWN, FIND_NEXT_MATCH_UP} match_f; 495692d97c3Snir.tzachar@gmail.com 496a72f3e2bSNir Tzachar /* return the index of the matched item, or -1 if no such item exists */ 497a72f3e2bSNir Tzachar static int get_mext_match(const char *match_str, match_f flag) 498a72f3e2bSNir Tzachar { 499a72f3e2bSNir Tzachar int match_start = item_index(current_item(curses_menu)); 500a72f3e2bSNir Tzachar int index; 501a72f3e2bSNir Tzachar 502a72f3e2bSNir Tzachar if (flag == FIND_NEXT_MATCH_DOWN) 503a72f3e2bSNir Tzachar ++match_start; 504a72f3e2bSNir Tzachar else if (flag == FIND_NEXT_MATCH_UP) 505a72f3e2bSNir Tzachar --match_start; 506a72f3e2bSNir Tzachar 507a72f3e2bSNir Tzachar index = match_start; 508a72f3e2bSNir Tzachar index = (index + items_num) % items_num; 509a72f3e2bSNir Tzachar while (true) { 510a72f3e2bSNir Tzachar char *str = k_menu_items[index].str; 511a72f3e2bSNir Tzachar if (strcasestr(str, match_str) != 0) 512a72f3e2bSNir Tzachar return index; 513a72f3e2bSNir Tzachar if (flag == FIND_NEXT_MATCH_UP || 514a72f3e2bSNir Tzachar flag == MATCH_TINKER_PATTERN_UP) 515a72f3e2bSNir Tzachar --index; 516a72f3e2bSNir Tzachar else 517a72f3e2bSNir Tzachar ++index; 518a72f3e2bSNir Tzachar index = (index + items_num) % items_num; 519a72f3e2bSNir Tzachar if (index == match_start) 520692d97c3Snir.tzachar@gmail.com return -1; 521692d97c3Snir.tzachar@gmail.com } 522692d97c3Snir.tzachar@gmail.com } 523692d97c3Snir.tzachar@gmail.com 524a72f3e2bSNir Tzachar /* Make a new item. */ 525851190c9SMichal Marek static void item_make(struct menu *menu, char tag, const char *fmt, ...) 526692d97c3Snir.tzachar@gmail.com { 527692d97c3Snir.tzachar@gmail.com va_list ap; 528692d97c3Snir.tzachar@gmail.com 529692d97c3Snir.tzachar@gmail.com if (items_num > MAX_MENU_ITEMS-1) 530692d97c3Snir.tzachar@gmail.com return; 531692d97c3Snir.tzachar@gmail.com 532692d97c3Snir.tzachar@gmail.com bzero(&k_menu_items[items_num], sizeof(k_menu_items[0])); 533692d97c3Snir.tzachar@gmail.com k_menu_items[items_num].tag = tag; 534692d97c3Snir.tzachar@gmail.com k_menu_items[items_num].usrptr = menu; 535692d97c3Snir.tzachar@gmail.com if (menu != NULL) 536692d97c3Snir.tzachar@gmail.com k_menu_items[items_num].is_visible = 537692d97c3Snir.tzachar@gmail.com menu_is_visible(menu); 538692d97c3Snir.tzachar@gmail.com else 539692d97c3Snir.tzachar@gmail.com k_menu_items[items_num].is_visible = 1; 540692d97c3Snir.tzachar@gmail.com 541692d97c3Snir.tzachar@gmail.com va_start(ap, fmt); 542a72f3e2bSNir Tzachar vsnprintf(k_menu_items[items_num].str, 543a72f3e2bSNir Tzachar sizeof(k_menu_items[items_num].str), 544a72f3e2bSNir Tzachar fmt, ap); 545692d97c3Snir.tzachar@gmail.com va_end(ap); 546a72f3e2bSNir Tzachar 547a72f3e2bSNir Tzachar if (!k_menu_items[items_num].is_visible) 548a72f3e2bSNir Tzachar memcpy(k_menu_items[items_num].str, "XXX", 3); 549692d97c3Snir.tzachar@gmail.com 550692d97c3Snir.tzachar@gmail.com curses_menu_items[items_num] = new_item( 551692d97c3Snir.tzachar@gmail.com k_menu_items[items_num].str, 552692d97c3Snir.tzachar@gmail.com k_menu_items[items_num].str); 553692d97c3Snir.tzachar@gmail.com set_item_userptr(curses_menu_items[items_num], 554692d97c3Snir.tzachar@gmail.com &k_menu_items[items_num]); 555692d97c3Snir.tzachar@gmail.com /* 556692d97c3Snir.tzachar@gmail.com if (!k_menu_items[items_num].is_visible) 557692d97c3Snir.tzachar@gmail.com item_opts_off(curses_menu_items[items_num], O_SELECTABLE); 558692d97c3Snir.tzachar@gmail.com */ 559692d97c3Snir.tzachar@gmail.com 560692d97c3Snir.tzachar@gmail.com items_num++; 561692d97c3Snir.tzachar@gmail.com curses_menu_items[items_num] = NULL; 562692d97c3Snir.tzachar@gmail.com } 563692d97c3Snir.tzachar@gmail.com 564692d97c3Snir.tzachar@gmail.com /* very hackish. adds a string to the last item added */ 565851190c9SMichal Marek static void item_add_str(const char *fmt, ...) 566692d97c3Snir.tzachar@gmail.com { 567692d97c3Snir.tzachar@gmail.com va_list ap; 568692d97c3Snir.tzachar@gmail.com int index = items_num-1; 569692d97c3Snir.tzachar@gmail.com char new_str[256]; 570692d97c3Snir.tzachar@gmail.com char tmp_str[256]; 571692d97c3Snir.tzachar@gmail.com 572692d97c3Snir.tzachar@gmail.com if (index < 0) 573692d97c3Snir.tzachar@gmail.com return; 574692d97c3Snir.tzachar@gmail.com 575692d97c3Snir.tzachar@gmail.com va_start(ap, fmt); 576692d97c3Snir.tzachar@gmail.com vsnprintf(new_str, sizeof(new_str), fmt, ap); 577692d97c3Snir.tzachar@gmail.com va_end(ap); 578692d97c3Snir.tzachar@gmail.com snprintf(tmp_str, sizeof(tmp_str), "%s%s", 579692d97c3Snir.tzachar@gmail.com k_menu_items[index].str, new_str); 580692d97c3Snir.tzachar@gmail.com strncpy(k_menu_items[index].str, 581692d97c3Snir.tzachar@gmail.com tmp_str, 582692d97c3Snir.tzachar@gmail.com sizeof(k_menu_items[index].str)); 583692d97c3Snir.tzachar@gmail.com 584692d97c3Snir.tzachar@gmail.com free_item(curses_menu_items[index]); 585692d97c3Snir.tzachar@gmail.com curses_menu_items[index] = new_item( 586692d97c3Snir.tzachar@gmail.com k_menu_items[index].str, 587692d97c3Snir.tzachar@gmail.com k_menu_items[index].str); 588692d97c3Snir.tzachar@gmail.com set_item_userptr(curses_menu_items[index], 589692d97c3Snir.tzachar@gmail.com &k_menu_items[index]); 590692d97c3Snir.tzachar@gmail.com } 591692d97c3Snir.tzachar@gmail.com 592692d97c3Snir.tzachar@gmail.com /* get the tag of the currently selected item */ 593851190c9SMichal Marek static char item_tag(void) 594692d97c3Snir.tzachar@gmail.com { 595692d97c3Snir.tzachar@gmail.com ITEM *cur; 596692d97c3Snir.tzachar@gmail.com struct mitem *mcur; 597692d97c3Snir.tzachar@gmail.com 598692d97c3Snir.tzachar@gmail.com cur = current_item(curses_menu); 599692d97c3Snir.tzachar@gmail.com if (cur == NULL) 600692d97c3Snir.tzachar@gmail.com return 0; 601692d97c3Snir.tzachar@gmail.com mcur = (struct mitem *) item_userptr(cur); 602692d97c3Snir.tzachar@gmail.com return mcur->tag; 603692d97c3Snir.tzachar@gmail.com } 604692d97c3Snir.tzachar@gmail.com 605851190c9SMichal Marek static int curses_item_index(void) 606692d97c3Snir.tzachar@gmail.com { 607692d97c3Snir.tzachar@gmail.com return item_index(current_item(curses_menu)); 608692d97c3Snir.tzachar@gmail.com } 609692d97c3Snir.tzachar@gmail.com 610851190c9SMichal Marek static void *item_data(void) 611692d97c3Snir.tzachar@gmail.com { 612692d97c3Snir.tzachar@gmail.com ITEM *cur; 613692d97c3Snir.tzachar@gmail.com struct mitem *mcur; 614692d97c3Snir.tzachar@gmail.com 615692d97c3Snir.tzachar@gmail.com cur = current_item(curses_menu); 616866af407SAndrej Gelenberg if (!cur) 617866af407SAndrej Gelenberg return NULL; 618692d97c3Snir.tzachar@gmail.com mcur = (struct mitem *) item_userptr(cur); 619692d97c3Snir.tzachar@gmail.com return mcur->usrptr; 620692d97c3Snir.tzachar@gmail.com 621692d97c3Snir.tzachar@gmail.com } 622692d97c3Snir.tzachar@gmail.com 623851190c9SMichal Marek static int item_is_tag(char tag) 624692d97c3Snir.tzachar@gmail.com { 625692d97c3Snir.tzachar@gmail.com return item_tag() == tag; 626692d97c3Snir.tzachar@gmail.com } 627692d97c3Snir.tzachar@gmail.com 628692d97c3Snir.tzachar@gmail.com static char filename[PATH_MAX+1]; 629692d97c3Snir.tzachar@gmail.com static char menu_backtitle[PATH_MAX+128]; 630851190c9SMichal Marek static const char *set_config_filename(const char *config_filename) 631692d97c3Snir.tzachar@gmail.com { 632692d97c3Snir.tzachar@gmail.com int size; 633692d97c3Snir.tzachar@gmail.com 634692d97c3Snir.tzachar@gmail.com size = snprintf(menu_backtitle, sizeof(menu_backtitle), 6350954828fSArnaud Lacombe "%s - %s", config_filename, rootmenu.prompt->text); 636692d97c3Snir.tzachar@gmail.com if (size >= sizeof(menu_backtitle)) 637692d97c3Snir.tzachar@gmail.com menu_backtitle[sizeof(menu_backtitle)-1] = '\0'; 638692d97c3Snir.tzachar@gmail.com 639692d97c3Snir.tzachar@gmail.com size = snprintf(filename, sizeof(filename), "%s", config_filename); 640692d97c3Snir.tzachar@gmail.com if (size >= sizeof(filename)) 641692d97c3Snir.tzachar@gmail.com filename[sizeof(filename)-1] = '\0'; 642692d97c3Snir.tzachar@gmail.com return menu_backtitle; 643692d97c3Snir.tzachar@gmail.com } 644692d97c3Snir.tzachar@gmail.com 645692d97c3Snir.tzachar@gmail.com /* return = 0 means we are successful. 646692d97c3Snir.tzachar@gmail.com * -1 means go on doing what you were doing 647692d97c3Snir.tzachar@gmail.com */ 648692d97c3Snir.tzachar@gmail.com static int do_exit(void) 649692d97c3Snir.tzachar@gmail.com { 650692d97c3Snir.tzachar@gmail.com int res; 651692d97c3Snir.tzachar@gmail.com if (!conf_get_changed()) { 652692d97c3Snir.tzachar@gmail.com global_exit = 1; 653692d97c3Snir.tzachar@gmail.com return 0; 654692d97c3Snir.tzachar@gmail.com } 655692d97c3Snir.tzachar@gmail.com res = btn_dialog(main_window, 656652cf982SArnaud Lacombe _("Do you wish to save your new configuration?\n" 657692d97c3Snir.tzachar@gmail.com "<ESC> to cancel and resume nconfig."), 658692d97c3Snir.tzachar@gmail.com 2, 659692d97c3Snir.tzachar@gmail.com " <save> ", 660692d97c3Snir.tzachar@gmail.com "<don't save>"); 661692d97c3Snir.tzachar@gmail.com if (res == KEY_EXIT) { 662692d97c3Snir.tzachar@gmail.com global_exit = 0; 663692d97c3Snir.tzachar@gmail.com return -1; 664692d97c3Snir.tzachar@gmail.com } 665692d97c3Snir.tzachar@gmail.com 666692d97c3Snir.tzachar@gmail.com /* if we got here, the user really wants to exit */ 667692d97c3Snir.tzachar@gmail.com switch (res) { 668692d97c3Snir.tzachar@gmail.com case 0: 669692d97c3Snir.tzachar@gmail.com res = conf_write(filename); 670692d97c3Snir.tzachar@gmail.com if (res) 671692d97c3Snir.tzachar@gmail.com btn_dialog( 672692d97c3Snir.tzachar@gmail.com main_window, 673652cf982SArnaud Lacombe _("Error during writing of configuration.\n" 674652cf982SArnaud Lacombe "Your configuration changes were NOT saved."), 675692d97c3Snir.tzachar@gmail.com 1, 676692d97c3Snir.tzachar@gmail.com "<OK>"); 677692d97c3Snir.tzachar@gmail.com break; 678692d97c3Snir.tzachar@gmail.com default: 679692d97c3Snir.tzachar@gmail.com btn_dialog( 680692d97c3Snir.tzachar@gmail.com main_window, 681652cf982SArnaud Lacombe _("Your configuration changes were NOT saved."), 682692d97c3Snir.tzachar@gmail.com 1, 683692d97c3Snir.tzachar@gmail.com "<OK>"); 684692d97c3Snir.tzachar@gmail.com break; 685692d97c3Snir.tzachar@gmail.com } 686692d97c3Snir.tzachar@gmail.com global_exit = 1; 687692d97c3Snir.tzachar@gmail.com return 0; 688692d97c3Snir.tzachar@gmail.com } 689692d97c3Snir.tzachar@gmail.com 690692d97c3Snir.tzachar@gmail.com 691692d97c3Snir.tzachar@gmail.com static void search_conf(void) 692692d97c3Snir.tzachar@gmail.com { 693692d97c3Snir.tzachar@gmail.com struct symbol **sym_arr; 694692d97c3Snir.tzachar@gmail.com struct gstr res; 695337a275dSYann E. MORIN struct gstr title; 696692d97c3Snir.tzachar@gmail.com char *dialog_input; 697692d97c3Snir.tzachar@gmail.com int dres; 698337a275dSYann E. MORIN 699337a275dSYann E. MORIN title = str_new(); 700f6eb6e46SYann E. MORIN str_printf( &title, _("Enter (sub)string or regexp to search for " 701f6eb6e46SYann E. MORIN "(with or without \"%s\")"), CONFIG_); 702337a275dSYann E. MORIN 703692d97c3Snir.tzachar@gmail.com again: 704692d97c3Snir.tzachar@gmail.com dres = dialog_inputbox(main_window, 705692d97c3Snir.tzachar@gmail.com _("Search Configuration Parameter"), 706337a275dSYann E. MORIN str_get(&title), 7075ea9f64fSCheng Renquan "", &dialog_input_result, &dialog_input_result_len); 708692d97c3Snir.tzachar@gmail.com switch (dres) { 709692d97c3Snir.tzachar@gmail.com case 0: 710692d97c3Snir.tzachar@gmail.com break; 711692d97c3Snir.tzachar@gmail.com case 1: 712692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 713692d97c3Snir.tzachar@gmail.com _("Search Configuration"), search_help); 714692d97c3Snir.tzachar@gmail.com goto again; 715692d97c3Snir.tzachar@gmail.com default: 716337a275dSYann E. MORIN str_free(&title); 717692d97c3Snir.tzachar@gmail.com return; 718692d97c3Snir.tzachar@gmail.com } 719692d97c3Snir.tzachar@gmail.com 720ffb5957bSArnaud Lacombe /* strip the prefix if necessary */ 721692d97c3Snir.tzachar@gmail.com dialog_input = dialog_input_result; 722ffb5957bSArnaud Lacombe if (strncasecmp(dialog_input_result, CONFIG_, strlen(CONFIG_)) == 0) 723ffb5957bSArnaud Lacombe dialog_input += strlen(CONFIG_); 724692d97c3Snir.tzachar@gmail.com 725692d97c3Snir.tzachar@gmail.com sym_arr = sym_re_search(dialog_input); 7265e609addSBenjamin Poirier res = get_relations_str(sym_arr, NULL); 727692d97c3Snir.tzachar@gmail.com free(sym_arr); 728692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 729692d97c3Snir.tzachar@gmail.com _("Search Results"), str_get(&res)); 730692d97c3Snir.tzachar@gmail.com str_free(&res); 731337a275dSYann E. MORIN str_free(&title); 732692d97c3Snir.tzachar@gmail.com } 733692d97c3Snir.tzachar@gmail.com 734692d97c3Snir.tzachar@gmail.com 735692d97c3Snir.tzachar@gmail.com static void build_conf(struct menu *menu) 736692d97c3Snir.tzachar@gmail.com { 737692d97c3Snir.tzachar@gmail.com struct symbol *sym; 738692d97c3Snir.tzachar@gmail.com struct property *prop; 739692d97c3Snir.tzachar@gmail.com struct menu *child; 740692d97c3Snir.tzachar@gmail.com int type, tmp, doint = 2; 741692d97c3Snir.tzachar@gmail.com tristate val; 742692d97c3Snir.tzachar@gmail.com char ch; 743692d97c3Snir.tzachar@gmail.com 744692d97c3Snir.tzachar@gmail.com if (!menu || (!show_all_items && !menu_is_visible(menu))) 745692d97c3Snir.tzachar@gmail.com return; 746692d97c3Snir.tzachar@gmail.com 747692d97c3Snir.tzachar@gmail.com sym = menu->sym; 748692d97c3Snir.tzachar@gmail.com prop = menu->prompt; 749692d97c3Snir.tzachar@gmail.com if (!sym) { 750692d97c3Snir.tzachar@gmail.com if (prop && menu != current_menu) { 751692d97c3Snir.tzachar@gmail.com const char *prompt = menu_get_prompt(menu); 752692d97c3Snir.tzachar@gmail.com enum prop_type ptype; 753692d97c3Snir.tzachar@gmail.com ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 754692d97c3Snir.tzachar@gmail.com switch (ptype) { 755692d97c3Snir.tzachar@gmail.com case P_MENU: 756692d97c3Snir.tzachar@gmail.com child_count++; 757692d97c3Snir.tzachar@gmail.com prompt = _(prompt); 758692d97c3Snir.tzachar@gmail.com if (single_menu_mode) { 759692d97c3Snir.tzachar@gmail.com item_make(menu, 'm', 760692d97c3Snir.tzachar@gmail.com "%s%*c%s", 761692d97c3Snir.tzachar@gmail.com menu->data ? "-->" : "++>", 762692d97c3Snir.tzachar@gmail.com indent + 1, ' ', prompt); 763692d97c3Snir.tzachar@gmail.com } else 764692d97c3Snir.tzachar@gmail.com item_make(menu, 'm', 7651278ebdbSDirk Gouders " %*c%s %s", 7661278ebdbSDirk Gouders indent + 1, ' ', prompt, 7671278ebdbSDirk Gouders menu_is_empty(menu) ? "----" : "--->"); 768692d97c3Snir.tzachar@gmail.com 769692d97c3Snir.tzachar@gmail.com if (single_menu_mode && menu->data) 770692d97c3Snir.tzachar@gmail.com goto conf_childs; 771692d97c3Snir.tzachar@gmail.com return; 772692d97c3Snir.tzachar@gmail.com case P_COMMENT: 773692d97c3Snir.tzachar@gmail.com if (prompt) { 774692d97c3Snir.tzachar@gmail.com child_count++; 775692d97c3Snir.tzachar@gmail.com item_make(menu, ':', 776692d97c3Snir.tzachar@gmail.com " %*c*** %s ***", 777692d97c3Snir.tzachar@gmail.com indent + 1, ' ', 778692d97c3Snir.tzachar@gmail.com _(prompt)); 779692d97c3Snir.tzachar@gmail.com } 780692d97c3Snir.tzachar@gmail.com break; 781692d97c3Snir.tzachar@gmail.com default: 782692d97c3Snir.tzachar@gmail.com if (prompt) { 783692d97c3Snir.tzachar@gmail.com child_count++; 784692d97c3Snir.tzachar@gmail.com item_make(menu, ':', "---%*c%s", 785692d97c3Snir.tzachar@gmail.com indent + 1, ' ', 786692d97c3Snir.tzachar@gmail.com _(prompt)); 787692d97c3Snir.tzachar@gmail.com } 788692d97c3Snir.tzachar@gmail.com } 789692d97c3Snir.tzachar@gmail.com } else 790692d97c3Snir.tzachar@gmail.com doint = 0; 791692d97c3Snir.tzachar@gmail.com goto conf_childs; 792692d97c3Snir.tzachar@gmail.com } 793692d97c3Snir.tzachar@gmail.com 794692d97c3Snir.tzachar@gmail.com type = sym_get_type(sym); 795692d97c3Snir.tzachar@gmail.com if (sym_is_choice(sym)) { 796692d97c3Snir.tzachar@gmail.com struct symbol *def_sym = sym_get_choice_value(sym); 797692d97c3Snir.tzachar@gmail.com struct menu *def_menu = NULL; 798692d97c3Snir.tzachar@gmail.com 799692d97c3Snir.tzachar@gmail.com child_count++; 800692d97c3Snir.tzachar@gmail.com for (child = menu->list; child; child = child->next) { 801692d97c3Snir.tzachar@gmail.com if (menu_is_visible(child) && child->sym == def_sym) 802692d97c3Snir.tzachar@gmail.com def_menu = child; 803692d97c3Snir.tzachar@gmail.com } 804692d97c3Snir.tzachar@gmail.com 805692d97c3Snir.tzachar@gmail.com val = sym_get_tristate_value(sym); 806692d97c3Snir.tzachar@gmail.com if (sym_is_changable(sym)) { 807692d97c3Snir.tzachar@gmail.com switch (type) { 808692d97c3Snir.tzachar@gmail.com case S_BOOLEAN: 809692d97c3Snir.tzachar@gmail.com item_make(menu, 't', "[%c]", 810692d97c3Snir.tzachar@gmail.com val == no ? ' ' : '*'); 811692d97c3Snir.tzachar@gmail.com break; 812692d97c3Snir.tzachar@gmail.com case S_TRISTATE: 813692d97c3Snir.tzachar@gmail.com switch (val) { 814692d97c3Snir.tzachar@gmail.com case yes: 815692d97c3Snir.tzachar@gmail.com ch = '*'; 816692d97c3Snir.tzachar@gmail.com break; 817692d97c3Snir.tzachar@gmail.com case mod: 818692d97c3Snir.tzachar@gmail.com ch = 'M'; 819692d97c3Snir.tzachar@gmail.com break; 820692d97c3Snir.tzachar@gmail.com default: 821692d97c3Snir.tzachar@gmail.com ch = ' '; 822692d97c3Snir.tzachar@gmail.com break; 823692d97c3Snir.tzachar@gmail.com } 824692d97c3Snir.tzachar@gmail.com item_make(menu, 't', "<%c>", ch); 825692d97c3Snir.tzachar@gmail.com break; 826692d97c3Snir.tzachar@gmail.com } 827692d97c3Snir.tzachar@gmail.com } else { 828692d97c3Snir.tzachar@gmail.com item_make(menu, def_menu ? 't' : ':', " "); 829692d97c3Snir.tzachar@gmail.com } 830692d97c3Snir.tzachar@gmail.com 831692d97c3Snir.tzachar@gmail.com item_add_str("%*c%s", indent + 1, 832692d97c3Snir.tzachar@gmail.com ' ', _(menu_get_prompt(menu))); 833692d97c3Snir.tzachar@gmail.com if (val == yes) { 834692d97c3Snir.tzachar@gmail.com if (def_menu) { 835692d97c3Snir.tzachar@gmail.com item_add_str(" (%s)", 836692d97c3Snir.tzachar@gmail.com _(menu_get_prompt(def_menu))); 837692d97c3Snir.tzachar@gmail.com item_add_str(" --->"); 838692d97c3Snir.tzachar@gmail.com if (def_menu->list) { 839692d97c3Snir.tzachar@gmail.com indent += 2; 840692d97c3Snir.tzachar@gmail.com build_conf(def_menu); 841692d97c3Snir.tzachar@gmail.com indent -= 2; 842692d97c3Snir.tzachar@gmail.com } 843692d97c3Snir.tzachar@gmail.com } 844692d97c3Snir.tzachar@gmail.com return; 845692d97c3Snir.tzachar@gmail.com } 846692d97c3Snir.tzachar@gmail.com } else { 847692d97c3Snir.tzachar@gmail.com if (menu == current_menu) { 848692d97c3Snir.tzachar@gmail.com item_make(menu, ':', 849692d97c3Snir.tzachar@gmail.com "---%*c%s", indent + 1, 850692d97c3Snir.tzachar@gmail.com ' ', _(menu_get_prompt(menu))); 851692d97c3Snir.tzachar@gmail.com goto conf_childs; 852692d97c3Snir.tzachar@gmail.com } 853692d97c3Snir.tzachar@gmail.com child_count++; 854692d97c3Snir.tzachar@gmail.com val = sym_get_tristate_value(sym); 855692d97c3Snir.tzachar@gmail.com if (sym_is_choice_value(sym) && val == yes) { 856692d97c3Snir.tzachar@gmail.com item_make(menu, ':', " "); 857692d97c3Snir.tzachar@gmail.com } else { 858692d97c3Snir.tzachar@gmail.com switch (type) { 859692d97c3Snir.tzachar@gmail.com case S_BOOLEAN: 860692d97c3Snir.tzachar@gmail.com if (sym_is_changable(sym)) 861692d97c3Snir.tzachar@gmail.com item_make(menu, 't', "[%c]", 862692d97c3Snir.tzachar@gmail.com val == no ? ' ' : '*'); 863692d97c3Snir.tzachar@gmail.com else 864692d97c3Snir.tzachar@gmail.com item_make(menu, 't', "-%c-", 865692d97c3Snir.tzachar@gmail.com val == no ? ' ' : '*'); 866692d97c3Snir.tzachar@gmail.com break; 867692d97c3Snir.tzachar@gmail.com case S_TRISTATE: 868692d97c3Snir.tzachar@gmail.com switch (val) { 869692d97c3Snir.tzachar@gmail.com case yes: 870692d97c3Snir.tzachar@gmail.com ch = '*'; 871692d97c3Snir.tzachar@gmail.com break; 872692d97c3Snir.tzachar@gmail.com case mod: 873692d97c3Snir.tzachar@gmail.com ch = 'M'; 874692d97c3Snir.tzachar@gmail.com break; 875692d97c3Snir.tzachar@gmail.com default: 876692d97c3Snir.tzachar@gmail.com ch = ' '; 877692d97c3Snir.tzachar@gmail.com break; 878692d97c3Snir.tzachar@gmail.com } 879692d97c3Snir.tzachar@gmail.com if (sym_is_changable(sym)) { 880692d97c3Snir.tzachar@gmail.com if (sym->rev_dep.tri == mod) 881692d97c3Snir.tzachar@gmail.com item_make(menu, 882692d97c3Snir.tzachar@gmail.com 't', "{%c}", ch); 883692d97c3Snir.tzachar@gmail.com else 884692d97c3Snir.tzachar@gmail.com item_make(menu, 885692d97c3Snir.tzachar@gmail.com 't', "<%c>", ch); 886692d97c3Snir.tzachar@gmail.com } else 887692d97c3Snir.tzachar@gmail.com item_make(menu, 't', "-%c-", ch); 888692d97c3Snir.tzachar@gmail.com break; 889692d97c3Snir.tzachar@gmail.com default: 890692d97c3Snir.tzachar@gmail.com tmp = 2 + strlen(sym_get_string_value(sym)); 891692d97c3Snir.tzachar@gmail.com item_make(menu, 's', " (%s)", 892692d97c3Snir.tzachar@gmail.com sym_get_string_value(sym)); 893692d97c3Snir.tzachar@gmail.com tmp = indent - tmp + 4; 894692d97c3Snir.tzachar@gmail.com if (tmp < 0) 895692d97c3Snir.tzachar@gmail.com tmp = 0; 896692d97c3Snir.tzachar@gmail.com item_add_str("%*c%s%s", tmp, ' ', 897692d97c3Snir.tzachar@gmail.com _(menu_get_prompt(menu)), 898692d97c3Snir.tzachar@gmail.com (sym_has_value(sym) || 899692d97c3Snir.tzachar@gmail.com !sym_is_changable(sym)) ? "" : 900692d97c3Snir.tzachar@gmail.com _(" (NEW)")); 901692d97c3Snir.tzachar@gmail.com goto conf_childs; 902692d97c3Snir.tzachar@gmail.com } 903692d97c3Snir.tzachar@gmail.com } 904692d97c3Snir.tzachar@gmail.com item_add_str("%*c%s%s", indent + 1, ' ', 905692d97c3Snir.tzachar@gmail.com _(menu_get_prompt(menu)), 906692d97c3Snir.tzachar@gmail.com (sym_has_value(sym) || !sym_is_changable(sym)) ? 907692d97c3Snir.tzachar@gmail.com "" : _(" (NEW)")); 908692d97c3Snir.tzachar@gmail.com if (menu->prompt && menu->prompt->type == P_MENU) { 9091278ebdbSDirk Gouders item_add_str(" %s", menu_is_empty(menu) ? "----" : "--->"); 910692d97c3Snir.tzachar@gmail.com return; 911692d97c3Snir.tzachar@gmail.com } 912692d97c3Snir.tzachar@gmail.com } 913692d97c3Snir.tzachar@gmail.com 914692d97c3Snir.tzachar@gmail.com conf_childs: 915692d97c3Snir.tzachar@gmail.com indent += doint; 916692d97c3Snir.tzachar@gmail.com for (child = menu->list; child; child = child->next) 917692d97c3Snir.tzachar@gmail.com build_conf(child); 918692d97c3Snir.tzachar@gmail.com indent -= doint; 919692d97c3Snir.tzachar@gmail.com } 920692d97c3Snir.tzachar@gmail.com 921692d97c3Snir.tzachar@gmail.com static void reset_menu(void) 922692d97c3Snir.tzachar@gmail.com { 923692d97c3Snir.tzachar@gmail.com unpost_menu(curses_menu); 924692d97c3Snir.tzachar@gmail.com clean_items(); 925692d97c3Snir.tzachar@gmail.com } 926692d97c3Snir.tzachar@gmail.com 927692d97c3Snir.tzachar@gmail.com /* adjust the menu to show this item. 928692d97c3Snir.tzachar@gmail.com * prefer not to scroll the menu if possible*/ 929692d97c3Snir.tzachar@gmail.com static void center_item(int selected_index, int *last_top_row) 930692d97c3Snir.tzachar@gmail.com { 931692d97c3Snir.tzachar@gmail.com int toprow; 932692d97c3Snir.tzachar@gmail.com 933692d97c3Snir.tzachar@gmail.com set_top_row(curses_menu, *last_top_row); 934692d97c3Snir.tzachar@gmail.com toprow = top_row(curses_menu); 935a72f3e2bSNir Tzachar if (selected_index < toprow || 936a72f3e2bSNir Tzachar selected_index >= toprow+mwin_max_lines) { 937a72f3e2bSNir Tzachar toprow = max(selected_index-mwin_max_lines/2, 0); 938a72f3e2bSNir Tzachar if (toprow >= item_count(curses_menu)-mwin_max_lines) 939692d97c3Snir.tzachar@gmail.com toprow = item_count(curses_menu)-mwin_max_lines; 940692d97c3Snir.tzachar@gmail.com set_top_row(curses_menu, toprow); 941a72f3e2bSNir Tzachar } 942692d97c3Snir.tzachar@gmail.com set_current_item(curses_menu, 943692d97c3Snir.tzachar@gmail.com curses_menu_items[selected_index]); 944692d97c3Snir.tzachar@gmail.com *last_top_row = toprow; 945692d97c3Snir.tzachar@gmail.com post_menu(curses_menu); 946692d97c3Snir.tzachar@gmail.com refresh_all_windows(main_window); 947692d97c3Snir.tzachar@gmail.com } 948692d97c3Snir.tzachar@gmail.com 949692d97c3Snir.tzachar@gmail.com /* this function assumes reset_menu has been called before */ 950692d97c3Snir.tzachar@gmail.com static void show_menu(const char *prompt, const char *instructions, 951692d97c3Snir.tzachar@gmail.com int selected_index, int *last_top_row) 952692d97c3Snir.tzachar@gmail.com { 953692d97c3Snir.tzachar@gmail.com int maxx, maxy; 954692d97c3Snir.tzachar@gmail.com WINDOW *menu_window; 955692d97c3Snir.tzachar@gmail.com 956692d97c3Snir.tzachar@gmail.com current_instructions = instructions; 957692d97c3Snir.tzachar@gmail.com 958692d97c3Snir.tzachar@gmail.com clear(); 95910175ba6SStephen Boyd (void) wattrset(main_window, attributes[NORMAL]); 960e0b42605SDirk Gouders print_in_middle(stdscr, 1, 0, getmaxx(stdscr), 961692d97c3Snir.tzachar@gmail.com menu_backtitle, 962692d97c3Snir.tzachar@gmail.com attributes[MAIN_HEADING]); 963692d97c3Snir.tzachar@gmail.com 96410175ba6SStephen Boyd (void) wattrset(main_window, attributes[MAIN_MENU_BOX]); 965692d97c3Snir.tzachar@gmail.com box(main_window, 0, 0); 96610175ba6SStephen Boyd (void) wattrset(main_window, attributes[MAIN_MENU_HEADING]); 967692d97c3Snir.tzachar@gmail.com mvwprintw(main_window, 0, 3, " %s ", prompt); 96810175ba6SStephen Boyd (void) wattrset(main_window, attributes[NORMAL]); 969692d97c3Snir.tzachar@gmail.com 970692d97c3Snir.tzachar@gmail.com set_menu_items(curses_menu, curses_menu_items); 971692d97c3Snir.tzachar@gmail.com 972692d97c3Snir.tzachar@gmail.com /* position the menu at the middle of the screen */ 973692d97c3Snir.tzachar@gmail.com scale_menu(curses_menu, &maxy, &maxx); 97468c16eddSNir Tzachar maxx = min(maxx, mwin_max_cols-2); 975a72f3e2bSNir Tzachar maxy = mwin_max_lines; 976692d97c3Snir.tzachar@gmail.com menu_window = derwin(main_window, 977692d97c3Snir.tzachar@gmail.com maxy, 978692d97c3Snir.tzachar@gmail.com maxx, 979692d97c3Snir.tzachar@gmail.com 2, 980692d97c3Snir.tzachar@gmail.com (mwin_max_cols-maxx)/2); 981692d97c3Snir.tzachar@gmail.com keypad(menu_window, TRUE); 982692d97c3Snir.tzachar@gmail.com set_menu_win(curses_menu, menu_window); 983692d97c3Snir.tzachar@gmail.com set_menu_sub(curses_menu, menu_window); 984692d97c3Snir.tzachar@gmail.com 985692d97c3Snir.tzachar@gmail.com /* must reassert this after changing items, otherwise returns to a 986692d97c3Snir.tzachar@gmail.com * default of 16 987692d97c3Snir.tzachar@gmail.com */ 988692d97c3Snir.tzachar@gmail.com set_menu_format(curses_menu, maxy, 1); 989692d97c3Snir.tzachar@gmail.com center_item(selected_index, last_top_row); 990692d97c3Snir.tzachar@gmail.com set_menu_format(curses_menu, maxy, 1); 991692d97c3Snir.tzachar@gmail.com 992692d97c3Snir.tzachar@gmail.com print_function_line(); 993692d97c3Snir.tzachar@gmail.com 994692d97c3Snir.tzachar@gmail.com /* Post the menu */ 995692d97c3Snir.tzachar@gmail.com post_menu(curses_menu); 996692d97c3Snir.tzachar@gmail.com refresh_all_windows(main_window); 997692d97c3Snir.tzachar@gmail.com } 998692d97c3Snir.tzachar@gmail.com 999a72f3e2bSNir Tzachar static void adj_match_dir(match_f *match_direction) 1000a72f3e2bSNir Tzachar { 1001a72f3e2bSNir Tzachar if (*match_direction == FIND_NEXT_MATCH_DOWN) 1002a72f3e2bSNir Tzachar *match_direction = 1003a72f3e2bSNir Tzachar MATCH_TINKER_PATTERN_DOWN; 1004a72f3e2bSNir Tzachar else if (*match_direction == FIND_NEXT_MATCH_UP) 1005a72f3e2bSNir Tzachar *match_direction = 1006a72f3e2bSNir Tzachar MATCH_TINKER_PATTERN_UP; 1007a72f3e2bSNir Tzachar /* else, do no change.. */ 1008a72f3e2bSNir Tzachar } 1009a72f3e2bSNir Tzachar 1010a72f3e2bSNir Tzachar struct match_state 1011a72f3e2bSNir Tzachar { 1012a72f3e2bSNir Tzachar int in_search; 1013a72f3e2bSNir Tzachar match_f match_direction; 1014a72f3e2bSNir Tzachar char pattern[256]; 1015a72f3e2bSNir Tzachar }; 1016a72f3e2bSNir Tzachar 1017a72f3e2bSNir Tzachar /* Return 0 means I have handled the key. In such a case, ans should hold the 1018a72f3e2bSNir Tzachar * item to center, or -1 otherwise. 1019a72f3e2bSNir Tzachar * Else return -1 . 1020a72f3e2bSNir Tzachar */ 1021a72f3e2bSNir Tzachar static int do_match(int key, struct match_state *state, int *ans) 1022a72f3e2bSNir Tzachar { 1023a72f3e2bSNir Tzachar char c = (char) key; 1024a72f3e2bSNir Tzachar int terminate_search = 0; 1025a72f3e2bSNir Tzachar *ans = -1; 1026a72f3e2bSNir Tzachar if (key == '/' || (state->in_search && key == 27)) { 1027a72f3e2bSNir Tzachar move(0, 0); 1028a72f3e2bSNir Tzachar refresh(); 1029a72f3e2bSNir Tzachar clrtoeol(); 1030a72f3e2bSNir Tzachar state->in_search = 1-state->in_search; 1031a72f3e2bSNir Tzachar bzero(state->pattern, sizeof(state->pattern)); 1032a72f3e2bSNir Tzachar state->match_direction = MATCH_TINKER_PATTERN_DOWN; 1033a72f3e2bSNir Tzachar return 0; 1034a72f3e2bSNir Tzachar } else if (!state->in_search) 1035a72f3e2bSNir Tzachar return 1; 1036a72f3e2bSNir Tzachar 1037a72f3e2bSNir Tzachar if (isalnum(c) || isgraph(c) || c == ' ') { 1038a72f3e2bSNir Tzachar state->pattern[strlen(state->pattern)] = c; 1039a72f3e2bSNir Tzachar state->pattern[strlen(state->pattern)] = '\0'; 1040a72f3e2bSNir Tzachar adj_match_dir(&state->match_direction); 1041a72f3e2bSNir Tzachar *ans = get_mext_match(state->pattern, 1042a72f3e2bSNir Tzachar state->match_direction); 1043a72f3e2bSNir Tzachar } else if (key == KEY_DOWN) { 1044a72f3e2bSNir Tzachar state->match_direction = FIND_NEXT_MATCH_DOWN; 1045a72f3e2bSNir Tzachar *ans = get_mext_match(state->pattern, 1046a72f3e2bSNir Tzachar state->match_direction); 1047a72f3e2bSNir Tzachar } else if (key == KEY_UP) { 1048a72f3e2bSNir Tzachar state->match_direction = FIND_NEXT_MATCH_UP; 1049a72f3e2bSNir Tzachar *ans = get_mext_match(state->pattern, 1050a72f3e2bSNir Tzachar state->match_direction); 1051a72f3e2bSNir Tzachar } else if (key == KEY_BACKSPACE || key == 127) { 1052a72f3e2bSNir Tzachar state->pattern[strlen(state->pattern)-1] = '\0'; 1053a72f3e2bSNir Tzachar adj_match_dir(&state->match_direction); 1054a72f3e2bSNir Tzachar } else 1055a72f3e2bSNir Tzachar terminate_search = 1; 1056a72f3e2bSNir Tzachar 1057a72f3e2bSNir Tzachar if (terminate_search) { 1058a72f3e2bSNir Tzachar state->in_search = 0; 1059a72f3e2bSNir Tzachar bzero(state->pattern, sizeof(state->pattern)); 1060a72f3e2bSNir Tzachar move(0, 0); 1061a72f3e2bSNir Tzachar refresh(); 1062a72f3e2bSNir Tzachar clrtoeol(); 1063a72f3e2bSNir Tzachar return -1; 1064a72f3e2bSNir Tzachar } 1065a72f3e2bSNir Tzachar return 0; 1066a72f3e2bSNir Tzachar } 1067692d97c3Snir.tzachar@gmail.com 1068692d97c3Snir.tzachar@gmail.com static void conf(struct menu *menu) 1069692d97c3Snir.tzachar@gmail.com { 1070692d97c3Snir.tzachar@gmail.com struct menu *submenu = 0; 1071692d97c3Snir.tzachar@gmail.com const char *prompt = menu_get_prompt(menu); 1072692d97c3Snir.tzachar@gmail.com struct symbol *sym; 1073692d97c3Snir.tzachar@gmail.com int res; 1074692d97c3Snir.tzachar@gmail.com int current_index = 0; 1075692d97c3Snir.tzachar@gmail.com int last_top_row = 0; 1076a72f3e2bSNir Tzachar struct match_state match_state = { 1077a72f3e2bSNir Tzachar .in_search = 0, 1078a72f3e2bSNir Tzachar .match_direction = MATCH_TINKER_PATTERN_DOWN, 1079a72f3e2bSNir Tzachar .pattern = "", 1080a72f3e2bSNir Tzachar }; 1081692d97c3Snir.tzachar@gmail.com 1082692d97c3Snir.tzachar@gmail.com while (!global_exit) { 1083692d97c3Snir.tzachar@gmail.com reset_menu(); 1084692d97c3Snir.tzachar@gmail.com current_menu = menu; 1085692d97c3Snir.tzachar@gmail.com build_conf(menu); 1086692d97c3Snir.tzachar@gmail.com if (!child_count) 1087692d97c3Snir.tzachar@gmail.com break; 1088692d97c3Snir.tzachar@gmail.com 1089692d97c3Snir.tzachar@gmail.com show_menu(prompt ? _(prompt) : _("Main Menu"), 1090692d97c3Snir.tzachar@gmail.com _(menu_instructions), 1091692d97c3Snir.tzachar@gmail.com current_index, &last_top_row); 1092692d97c3Snir.tzachar@gmail.com keypad((menu_win(curses_menu)), TRUE); 1093a72f3e2bSNir Tzachar while (!global_exit) { 1094a72f3e2bSNir Tzachar if (match_state.in_search) { 1095a72f3e2bSNir Tzachar mvprintw(0, 0, 1096a72f3e2bSNir Tzachar "searching: %s", match_state.pattern); 1097a72f3e2bSNir Tzachar clrtoeol(); 1098a72f3e2bSNir Tzachar } 1099a72f3e2bSNir Tzachar refresh_all_windows(main_window); 1100a72f3e2bSNir Tzachar res = wgetch(menu_win(curses_menu)); 1101a72f3e2bSNir Tzachar if (!res) 1102a72f3e2bSNir Tzachar break; 1103a72f3e2bSNir Tzachar if (do_match(res, &match_state, ¤t_index) == 0) { 1104a72f3e2bSNir Tzachar if (current_index != -1) 1105a72f3e2bSNir Tzachar center_item(current_index, 1106a72f3e2bSNir Tzachar &last_top_row); 1107a72f3e2bSNir Tzachar continue; 1108a72f3e2bSNir Tzachar } 1109692d97c3Snir.tzachar@gmail.com if (process_special_keys(&res, 1110692d97c3Snir.tzachar@gmail.com (struct menu *) item_data())) 1111692d97c3Snir.tzachar@gmail.com break; 1112692d97c3Snir.tzachar@gmail.com switch (res) { 1113692d97c3Snir.tzachar@gmail.com case KEY_DOWN: 1114692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_DOWN_ITEM); 1115692d97c3Snir.tzachar@gmail.com break; 1116692d97c3Snir.tzachar@gmail.com case KEY_UP: 1117692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_UP_ITEM); 1118692d97c3Snir.tzachar@gmail.com break; 1119692d97c3Snir.tzachar@gmail.com case KEY_NPAGE: 1120692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_SCR_DPAGE); 1121692d97c3Snir.tzachar@gmail.com break; 1122692d97c3Snir.tzachar@gmail.com case KEY_PPAGE: 1123692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_SCR_UPAGE); 1124692d97c3Snir.tzachar@gmail.com break; 1125692d97c3Snir.tzachar@gmail.com case KEY_HOME: 1126692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_FIRST_ITEM); 1127692d97c3Snir.tzachar@gmail.com break; 1128692d97c3Snir.tzachar@gmail.com case KEY_END: 1129692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_LAST_ITEM); 1130692d97c3Snir.tzachar@gmail.com break; 1131692d97c3Snir.tzachar@gmail.com case 'h': 1132692d97c3Snir.tzachar@gmail.com case '?': 1133692d97c3Snir.tzachar@gmail.com show_help((struct menu *) item_data()); 1134692d97c3Snir.tzachar@gmail.com break; 1135692d97c3Snir.tzachar@gmail.com } 1136692d97c3Snir.tzachar@gmail.com if (res == 10 || res == 27 || 1137692d97c3Snir.tzachar@gmail.com res == 32 || res == 'n' || res == 'y' || 1138692d97c3Snir.tzachar@gmail.com res == KEY_LEFT || res == KEY_RIGHT || 1139a72f3e2bSNir Tzachar res == 'm') 1140692d97c3Snir.tzachar@gmail.com break; 1141692d97c3Snir.tzachar@gmail.com refresh_all_windows(main_window); 1142692d97c3Snir.tzachar@gmail.com } 1143692d97c3Snir.tzachar@gmail.com 1144692d97c3Snir.tzachar@gmail.com refresh_all_windows(main_window); 1145692d97c3Snir.tzachar@gmail.com /* if ESC or left*/ 1146692d97c3Snir.tzachar@gmail.com if (res == 27 || (menu != &rootmenu && res == KEY_LEFT)) 1147692d97c3Snir.tzachar@gmail.com break; 1148692d97c3Snir.tzachar@gmail.com 1149692d97c3Snir.tzachar@gmail.com /* remember location in the menu */ 1150692d97c3Snir.tzachar@gmail.com last_top_row = top_row(curses_menu); 1151692d97c3Snir.tzachar@gmail.com current_index = curses_item_index(); 1152692d97c3Snir.tzachar@gmail.com 1153692d97c3Snir.tzachar@gmail.com if (!item_tag()) 1154692d97c3Snir.tzachar@gmail.com continue; 1155692d97c3Snir.tzachar@gmail.com 1156692d97c3Snir.tzachar@gmail.com submenu = (struct menu *) item_data(); 1157692d97c3Snir.tzachar@gmail.com if (!submenu || !menu_is_visible(submenu)) 1158692d97c3Snir.tzachar@gmail.com continue; 1159692d97c3Snir.tzachar@gmail.com sym = submenu->sym; 1160692d97c3Snir.tzachar@gmail.com 1161692d97c3Snir.tzachar@gmail.com switch (res) { 1162692d97c3Snir.tzachar@gmail.com case ' ': 1163692d97c3Snir.tzachar@gmail.com if (item_is_tag('t')) 1164692d97c3Snir.tzachar@gmail.com sym_toggle_tristate_value(sym); 1165692d97c3Snir.tzachar@gmail.com else if (item_is_tag('m')) 1166692d97c3Snir.tzachar@gmail.com conf(submenu); 1167692d97c3Snir.tzachar@gmail.com break; 1168692d97c3Snir.tzachar@gmail.com case KEY_RIGHT: 1169692d97c3Snir.tzachar@gmail.com case 10: /* ENTER WAS PRESSED */ 1170692d97c3Snir.tzachar@gmail.com switch (item_tag()) { 1171692d97c3Snir.tzachar@gmail.com case 'm': 1172692d97c3Snir.tzachar@gmail.com if (single_menu_mode) 1173692d97c3Snir.tzachar@gmail.com submenu->data = 1174692d97c3Snir.tzachar@gmail.com (void *) (long) !submenu->data; 1175692d97c3Snir.tzachar@gmail.com else 1176692d97c3Snir.tzachar@gmail.com conf(submenu); 1177692d97c3Snir.tzachar@gmail.com break; 1178692d97c3Snir.tzachar@gmail.com case 't': 1179692d97c3Snir.tzachar@gmail.com if (sym_is_choice(sym) && 1180692d97c3Snir.tzachar@gmail.com sym_get_tristate_value(sym) == yes) 1181692d97c3Snir.tzachar@gmail.com conf_choice(submenu); 1182692d97c3Snir.tzachar@gmail.com else if (submenu->prompt && 1183692d97c3Snir.tzachar@gmail.com submenu->prompt->type == P_MENU) 1184692d97c3Snir.tzachar@gmail.com conf(submenu); 1185692d97c3Snir.tzachar@gmail.com else if (res == 10) 1186692d97c3Snir.tzachar@gmail.com sym_toggle_tristate_value(sym); 1187692d97c3Snir.tzachar@gmail.com break; 1188692d97c3Snir.tzachar@gmail.com case 's': 1189692d97c3Snir.tzachar@gmail.com conf_string(submenu); 1190692d97c3Snir.tzachar@gmail.com break; 1191692d97c3Snir.tzachar@gmail.com } 1192692d97c3Snir.tzachar@gmail.com break; 1193692d97c3Snir.tzachar@gmail.com case 'y': 1194692d97c3Snir.tzachar@gmail.com if (item_is_tag('t')) { 1195692d97c3Snir.tzachar@gmail.com if (sym_set_tristate_value(sym, yes)) 1196692d97c3Snir.tzachar@gmail.com break; 1197692d97c3Snir.tzachar@gmail.com if (sym_set_tristate_value(sym, mod)) 1198692d97c3Snir.tzachar@gmail.com btn_dialog(main_window, setmod_text, 0); 1199692d97c3Snir.tzachar@gmail.com } 1200692d97c3Snir.tzachar@gmail.com break; 1201692d97c3Snir.tzachar@gmail.com case 'n': 1202692d97c3Snir.tzachar@gmail.com if (item_is_tag('t')) 1203692d97c3Snir.tzachar@gmail.com sym_set_tristate_value(sym, no); 1204692d97c3Snir.tzachar@gmail.com break; 1205692d97c3Snir.tzachar@gmail.com case 'm': 1206692d97c3Snir.tzachar@gmail.com if (item_is_tag('t')) 1207692d97c3Snir.tzachar@gmail.com sym_set_tristate_value(sym, mod); 1208692d97c3Snir.tzachar@gmail.com break; 1209692d97c3Snir.tzachar@gmail.com } 1210692d97c3Snir.tzachar@gmail.com } 1211692d97c3Snir.tzachar@gmail.com } 1212692d97c3Snir.tzachar@gmail.com 121342368c37SMichal Marek static void conf_message_callback(const char *fmt, va_list ap) 121442368c37SMichal Marek { 121542368c37SMichal Marek char buf[1024]; 121642368c37SMichal Marek 121742368c37SMichal Marek vsnprintf(buf, sizeof(buf), fmt, ap); 121842368c37SMichal Marek btn_dialog(main_window, buf, 1, "<OK>"); 121942368c37SMichal Marek } 122042368c37SMichal Marek 1221692d97c3Snir.tzachar@gmail.com static void show_help(struct menu *menu) 1222692d97c3Snir.tzachar@gmail.com { 1223f98ee769SArnaud Lacombe struct gstr help; 1224f98ee769SArnaud Lacombe 1225f98ee769SArnaud Lacombe if (!menu) 1226f98ee769SArnaud Lacombe return; 1227f98ee769SArnaud Lacombe 1228f98ee769SArnaud Lacombe help = str_new(); 122954168578SArnaud Lacombe menu_get_ext_help(menu, &help); 1230692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, _(menu_get_prompt(menu)), str_get(&help)); 1231692d97c3Snir.tzachar@gmail.com str_free(&help); 1232692d97c3Snir.tzachar@gmail.com } 1233692d97c3Snir.tzachar@gmail.com 1234692d97c3Snir.tzachar@gmail.com static void conf_choice(struct menu *menu) 1235692d97c3Snir.tzachar@gmail.com { 1236692d97c3Snir.tzachar@gmail.com const char *prompt = _(menu_get_prompt(menu)); 1237692d97c3Snir.tzachar@gmail.com struct menu *child = 0; 1238692d97c3Snir.tzachar@gmail.com struct symbol *active; 1239692d97c3Snir.tzachar@gmail.com int selected_index = 0; 1240692d97c3Snir.tzachar@gmail.com int last_top_row = 0; 1241692d97c3Snir.tzachar@gmail.com int res, i = 0; 1242a72f3e2bSNir Tzachar struct match_state match_state = { 1243a72f3e2bSNir Tzachar .in_search = 0, 1244a72f3e2bSNir Tzachar .match_direction = MATCH_TINKER_PATTERN_DOWN, 1245a72f3e2bSNir Tzachar .pattern = "", 1246a72f3e2bSNir Tzachar }; 1247692d97c3Snir.tzachar@gmail.com 1248692d97c3Snir.tzachar@gmail.com active = sym_get_choice_value(menu->sym); 1249692d97c3Snir.tzachar@gmail.com /* this is mostly duplicated from the conf() function. */ 1250692d97c3Snir.tzachar@gmail.com while (!global_exit) { 1251692d97c3Snir.tzachar@gmail.com reset_menu(); 1252692d97c3Snir.tzachar@gmail.com 1253692d97c3Snir.tzachar@gmail.com for (i = 0, child = menu->list; child; child = child->next) { 1254692d97c3Snir.tzachar@gmail.com if (!show_all_items && !menu_is_visible(child)) 1255692d97c3Snir.tzachar@gmail.com continue; 1256692d97c3Snir.tzachar@gmail.com 1257692d97c3Snir.tzachar@gmail.com if (child->sym == sym_get_choice_value(menu->sym)) 1258692d97c3Snir.tzachar@gmail.com item_make(child, ':', "<X> %s", 1259692d97c3Snir.tzachar@gmail.com _(menu_get_prompt(child))); 126039177ec3SPeter Korsgaard else if (child->sym) 1261692d97c3Snir.tzachar@gmail.com item_make(child, ':', " %s", 1262692d97c3Snir.tzachar@gmail.com _(menu_get_prompt(child))); 126339177ec3SPeter Korsgaard else 126439177ec3SPeter Korsgaard item_make(child, ':', "*** %s ***", 126539177ec3SPeter Korsgaard _(menu_get_prompt(child))); 126639177ec3SPeter Korsgaard 1267692d97c3Snir.tzachar@gmail.com if (child->sym == active){ 1268692d97c3Snir.tzachar@gmail.com last_top_row = top_row(curses_menu); 1269692d97c3Snir.tzachar@gmail.com selected_index = i; 1270692d97c3Snir.tzachar@gmail.com } 1271692d97c3Snir.tzachar@gmail.com i++; 1272692d97c3Snir.tzachar@gmail.com } 1273692d97c3Snir.tzachar@gmail.com show_menu(prompt ? _(prompt) : _("Choice Menu"), 1274692d97c3Snir.tzachar@gmail.com _(radiolist_instructions), 1275692d97c3Snir.tzachar@gmail.com selected_index, 1276692d97c3Snir.tzachar@gmail.com &last_top_row); 1277a72f3e2bSNir Tzachar while (!global_exit) { 1278a72f3e2bSNir Tzachar if (match_state.in_search) { 1279a72f3e2bSNir Tzachar mvprintw(0, 0, "searching: %s", 1280a72f3e2bSNir Tzachar match_state.pattern); 1281a72f3e2bSNir Tzachar clrtoeol(); 1282a72f3e2bSNir Tzachar } 1283a72f3e2bSNir Tzachar refresh_all_windows(main_window); 1284a72f3e2bSNir Tzachar res = wgetch(menu_win(curses_menu)); 1285a72f3e2bSNir Tzachar if (!res) 1286a72f3e2bSNir Tzachar break; 1287a72f3e2bSNir Tzachar if (do_match(res, &match_state, &selected_index) == 0) { 1288a72f3e2bSNir Tzachar if (selected_index != -1) 1289a72f3e2bSNir Tzachar center_item(selected_index, 1290a72f3e2bSNir Tzachar &last_top_row); 1291a72f3e2bSNir Tzachar continue; 1292a72f3e2bSNir Tzachar } 1293692d97c3Snir.tzachar@gmail.com if (process_special_keys( 1294692d97c3Snir.tzachar@gmail.com &res, 1295692d97c3Snir.tzachar@gmail.com (struct menu *) item_data())) 1296692d97c3Snir.tzachar@gmail.com break; 1297692d97c3Snir.tzachar@gmail.com switch (res) { 1298692d97c3Snir.tzachar@gmail.com case KEY_DOWN: 1299692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_DOWN_ITEM); 1300692d97c3Snir.tzachar@gmail.com break; 1301692d97c3Snir.tzachar@gmail.com case KEY_UP: 1302692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_UP_ITEM); 1303692d97c3Snir.tzachar@gmail.com break; 1304692d97c3Snir.tzachar@gmail.com case KEY_NPAGE: 1305692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_SCR_DPAGE); 1306692d97c3Snir.tzachar@gmail.com break; 1307692d97c3Snir.tzachar@gmail.com case KEY_PPAGE: 1308692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_SCR_UPAGE); 1309692d97c3Snir.tzachar@gmail.com break; 1310692d97c3Snir.tzachar@gmail.com case KEY_HOME: 1311692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_FIRST_ITEM); 1312692d97c3Snir.tzachar@gmail.com break; 1313692d97c3Snir.tzachar@gmail.com case KEY_END: 1314692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_LAST_ITEM); 1315692d97c3Snir.tzachar@gmail.com break; 1316692d97c3Snir.tzachar@gmail.com case 'h': 1317692d97c3Snir.tzachar@gmail.com case '?': 1318692d97c3Snir.tzachar@gmail.com show_help((struct menu *) item_data()); 1319692d97c3Snir.tzachar@gmail.com break; 1320692d97c3Snir.tzachar@gmail.com } 1321692d97c3Snir.tzachar@gmail.com if (res == 10 || res == 27 || res == ' ' || 1322a72f3e2bSNir Tzachar res == KEY_LEFT){ 1323692d97c3Snir.tzachar@gmail.com break; 1324692d97c3Snir.tzachar@gmail.com } 1325692d97c3Snir.tzachar@gmail.com refresh_all_windows(main_window); 1326692d97c3Snir.tzachar@gmail.com } 1327692d97c3Snir.tzachar@gmail.com /* if ESC or left */ 1328692d97c3Snir.tzachar@gmail.com if (res == 27 || res == KEY_LEFT) 1329692d97c3Snir.tzachar@gmail.com break; 1330692d97c3Snir.tzachar@gmail.com 1331692d97c3Snir.tzachar@gmail.com child = item_data(); 133239177ec3SPeter Korsgaard if (!child || !menu_is_visible(child) || !child->sym) 1333692d97c3Snir.tzachar@gmail.com continue; 1334692d97c3Snir.tzachar@gmail.com switch (res) { 1335692d97c3Snir.tzachar@gmail.com case ' ': 1336692d97c3Snir.tzachar@gmail.com case 10: 1337692d97c3Snir.tzachar@gmail.com case KEY_RIGHT: 1338692d97c3Snir.tzachar@gmail.com sym_set_tristate_value(child->sym, yes); 1339692d97c3Snir.tzachar@gmail.com return; 1340692d97c3Snir.tzachar@gmail.com case 'h': 1341692d97c3Snir.tzachar@gmail.com case '?': 1342692d97c3Snir.tzachar@gmail.com show_help(child); 1343692d97c3Snir.tzachar@gmail.com active = child->sym; 1344692d97c3Snir.tzachar@gmail.com break; 1345692d97c3Snir.tzachar@gmail.com case KEY_EXIT: 1346692d97c3Snir.tzachar@gmail.com return; 1347692d97c3Snir.tzachar@gmail.com } 1348692d97c3Snir.tzachar@gmail.com } 1349692d97c3Snir.tzachar@gmail.com } 1350692d97c3Snir.tzachar@gmail.com 1351692d97c3Snir.tzachar@gmail.com static void conf_string(struct menu *menu) 1352692d97c3Snir.tzachar@gmail.com { 1353692d97c3Snir.tzachar@gmail.com const char *prompt = menu_get_prompt(menu); 1354692d97c3Snir.tzachar@gmail.com 1355692d97c3Snir.tzachar@gmail.com while (1) { 1356692d97c3Snir.tzachar@gmail.com int res; 1357692d97c3Snir.tzachar@gmail.com const char *heading; 1358692d97c3Snir.tzachar@gmail.com 1359692d97c3Snir.tzachar@gmail.com switch (sym_get_type(menu->sym)) { 1360692d97c3Snir.tzachar@gmail.com case S_INT: 1361692d97c3Snir.tzachar@gmail.com heading = _(inputbox_instructions_int); 1362692d97c3Snir.tzachar@gmail.com break; 1363692d97c3Snir.tzachar@gmail.com case S_HEX: 1364692d97c3Snir.tzachar@gmail.com heading = _(inputbox_instructions_hex); 1365692d97c3Snir.tzachar@gmail.com break; 1366692d97c3Snir.tzachar@gmail.com case S_STRING: 1367692d97c3Snir.tzachar@gmail.com heading = _(inputbox_instructions_string); 1368692d97c3Snir.tzachar@gmail.com break; 1369692d97c3Snir.tzachar@gmail.com default: 1370692d97c3Snir.tzachar@gmail.com heading = _("Internal nconf error!"); 1371692d97c3Snir.tzachar@gmail.com } 1372692d97c3Snir.tzachar@gmail.com res = dialog_inputbox(main_window, 1373692d97c3Snir.tzachar@gmail.com prompt ? _(prompt) : _("Main Menu"), 1374692d97c3Snir.tzachar@gmail.com heading, 1375692d97c3Snir.tzachar@gmail.com sym_get_string_value(menu->sym), 13765ea9f64fSCheng Renquan &dialog_input_result, 13775ea9f64fSCheng Renquan &dialog_input_result_len); 1378692d97c3Snir.tzachar@gmail.com switch (res) { 1379692d97c3Snir.tzachar@gmail.com case 0: 1380692d97c3Snir.tzachar@gmail.com if (sym_set_string_value(menu->sym, 1381692d97c3Snir.tzachar@gmail.com dialog_input_result)) 1382692d97c3Snir.tzachar@gmail.com return; 1383692d97c3Snir.tzachar@gmail.com btn_dialog(main_window, 1384692d97c3Snir.tzachar@gmail.com _("You have made an invalid entry."), 0); 1385692d97c3Snir.tzachar@gmail.com break; 1386692d97c3Snir.tzachar@gmail.com case 1: 1387692d97c3Snir.tzachar@gmail.com show_help(menu); 1388692d97c3Snir.tzachar@gmail.com break; 1389692d97c3Snir.tzachar@gmail.com case KEY_EXIT: 1390692d97c3Snir.tzachar@gmail.com return; 1391692d97c3Snir.tzachar@gmail.com } 1392692d97c3Snir.tzachar@gmail.com } 1393692d97c3Snir.tzachar@gmail.com } 1394692d97c3Snir.tzachar@gmail.com 1395692d97c3Snir.tzachar@gmail.com static void conf_load(void) 1396692d97c3Snir.tzachar@gmail.com { 1397692d97c3Snir.tzachar@gmail.com while (1) { 1398692d97c3Snir.tzachar@gmail.com int res; 1399692d97c3Snir.tzachar@gmail.com res = dialog_inputbox(main_window, 1400692d97c3Snir.tzachar@gmail.com NULL, load_config_text, 1401692d97c3Snir.tzachar@gmail.com filename, 14025ea9f64fSCheng Renquan &dialog_input_result, 14035ea9f64fSCheng Renquan &dialog_input_result_len); 1404692d97c3Snir.tzachar@gmail.com switch (res) { 1405692d97c3Snir.tzachar@gmail.com case 0: 1406692d97c3Snir.tzachar@gmail.com if (!dialog_input_result[0]) 1407692d97c3Snir.tzachar@gmail.com return; 1408692d97c3Snir.tzachar@gmail.com if (!conf_read(dialog_input_result)) { 1409692d97c3Snir.tzachar@gmail.com set_config_filename(dialog_input_result); 1410692d97c3Snir.tzachar@gmail.com sym_set_change_count(1); 1411692d97c3Snir.tzachar@gmail.com return; 1412692d97c3Snir.tzachar@gmail.com } 1413692d97c3Snir.tzachar@gmail.com btn_dialog(main_window, _("File does not exist!"), 0); 1414692d97c3Snir.tzachar@gmail.com break; 1415692d97c3Snir.tzachar@gmail.com case 1: 1416692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 1417692d97c3Snir.tzachar@gmail.com _("Load Alternate Configuration"), 1418692d97c3Snir.tzachar@gmail.com load_config_help); 1419692d97c3Snir.tzachar@gmail.com break; 1420692d97c3Snir.tzachar@gmail.com case KEY_EXIT: 1421692d97c3Snir.tzachar@gmail.com return; 1422692d97c3Snir.tzachar@gmail.com } 1423692d97c3Snir.tzachar@gmail.com } 1424692d97c3Snir.tzachar@gmail.com } 1425692d97c3Snir.tzachar@gmail.com 1426692d97c3Snir.tzachar@gmail.com static void conf_save(void) 1427692d97c3Snir.tzachar@gmail.com { 1428692d97c3Snir.tzachar@gmail.com while (1) { 1429692d97c3Snir.tzachar@gmail.com int res; 1430692d97c3Snir.tzachar@gmail.com res = dialog_inputbox(main_window, 1431692d97c3Snir.tzachar@gmail.com NULL, save_config_text, 1432692d97c3Snir.tzachar@gmail.com filename, 14335ea9f64fSCheng Renquan &dialog_input_result, 14345ea9f64fSCheng Renquan &dialog_input_result_len); 1435692d97c3Snir.tzachar@gmail.com switch (res) { 1436692d97c3Snir.tzachar@gmail.com case 0: 1437692d97c3Snir.tzachar@gmail.com if (!dialog_input_result[0]) 1438692d97c3Snir.tzachar@gmail.com return; 1439692d97c3Snir.tzachar@gmail.com res = conf_write(dialog_input_result); 1440692d97c3Snir.tzachar@gmail.com if (!res) { 1441692d97c3Snir.tzachar@gmail.com set_config_filename(dialog_input_result); 1442692d97c3Snir.tzachar@gmail.com return; 1443692d97c3Snir.tzachar@gmail.com } 1444692d97c3Snir.tzachar@gmail.com btn_dialog(main_window, _("Can't create file! " 1445692d97c3Snir.tzachar@gmail.com "Probably a nonexistent directory."), 1446692d97c3Snir.tzachar@gmail.com 1, "<OK>"); 1447692d97c3Snir.tzachar@gmail.com break; 1448692d97c3Snir.tzachar@gmail.com case 1: 1449692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 1450692d97c3Snir.tzachar@gmail.com _("Save Alternate Configuration"), 1451692d97c3Snir.tzachar@gmail.com save_config_help); 1452692d97c3Snir.tzachar@gmail.com break; 1453692d97c3Snir.tzachar@gmail.com case KEY_EXIT: 1454692d97c3Snir.tzachar@gmail.com return; 1455692d97c3Snir.tzachar@gmail.com } 1456692d97c3Snir.tzachar@gmail.com } 1457692d97c3Snir.tzachar@gmail.com } 1458692d97c3Snir.tzachar@gmail.com 1459692d97c3Snir.tzachar@gmail.com void setup_windows(void) 1460692d97c3Snir.tzachar@gmail.com { 1461e0b42605SDirk Gouders int lines, columns; 1462e0b42605SDirk Gouders 1463e0b42605SDirk Gouders getmaxyx(stdscr, lines, columns); 1464e0b42605SDirk Gouders 1465692d97c3Snir.tzachar@gmail.com if (main_window != NULL) 1466692d97c3Snir.tzachar@gmail.com delwin(main_window); 1467692d97c3Snir.tzachar@gmail.com 1468692d97c3Snir.tzachar@gmail.com /* set up the menu and menu window */ 1469e0b42605SDirk Gouders main_window = newwin(lines-2, columns-2, 2, 1); 1470692d97c3Snir.tzachar@gmail.com keypad(main_window, TRUE); 1471e0b42605SDirk Gouders mwin_max_lines = lines-7; 1472e0b42605SDirk Gouders mwin_max_cols = columns-6; 1473692d97c3Snir.tzachar@gmail.com 1474692d97c3Snir.tzachar@gmail.com /* panels order is from bottom to top */ 1475692d97c3Snir.tzachar@gmail.com new_panel(main_window); 1476692d97c3Snir.tzachar@gmail.com } 1477692d97c3Snir.tzachar@gmail.com 1478692d97c3Snir.tzachar@gmail.com int main(int ac, char **av) 1479692d97c3Snir.tzachar@gmail.com { 1480e0b42605SDirk Gouders int lines, columns; 1481692d97c3Snir.tzachar@gmail.com char *mode; 1482692d97c3Snir.tzachar@gmail.com 1483692d97c3Snir.tzachar@gmail.com setlocale(LC_ALL, ""); 1484692d97c3Snir.tzachar@gmail.com bindtextdomain(PACKAGE, LOCALEDIR); 1485692d97c3Snir.tzachar@gmail.com textdomain(PACKAGE); 1486692d97c3Snir.tzachar@gmail.com 14870a1f00a1SMichal Marek if (ac > 1 && strcmp(av[1], "-s") == 0) { 14880a1f00a1SMichal Marek /* Silence conf_read() until the real callback is set up */ 14890a1f00a1SMichal Marek conf_set_message_callback(NULL); 14900a1f00a1SMichal Marek av++; 14910a1f00a1SMichal Marek } 1492692d97c3Snir.tzachar@gmail.com conf_parse(av[1]); 1493692d97c3Snir.tzachar@gmail.com conf_read(NULL); 1494692d97c3Snir.tzachar@gmail.com 1495692d97c3Snir.tzachar@gmail.com mode = getenv("NCONFIG_MODE"); 1496692d97c3Snir.tzachar@gmail.com if (mode) { 1497692d97c3Snir.tzachar@gmail.com if (!strcasecmp(mode, "single_menu")) 1498692d97c3Snir.tzachar@gmail.com single_menu_mode = 1; 1499692d97c3Snir.tzachar@gmail.com } 1500692d97c3Snir.tzachar@gmail.com 1501692d97c3Snir.tzachar@gmail.com /* Initialize curses */ 1502692d97c3Snir.tzachar@gmail.com initscr(); 1503692d97c3Snir.tzachar@gmail.com /* set color theme */ 1504692d97c3Snir.tzachar@gmail.com set_colors(); 1505692d97c3Snir.tzachar@gmail.com 1506692d97c3Snir.tzachar@gmail.com cbreak(); 1507692d97c3Snir.tzachar@gmail.com noecho(); 1508692d97c3Snir.tzachar@gmail.com keypad(stdscr, TRUE); 1509692d97c3Snir.tzachar@gmail.com curs_set(0); 1510692d97c3Snir.tzachar@gmail.com 1511e0b42605SDirk Gouders getmaxyx(stdscr, lines, columns); 1512e0b42605SDirk Gouders if (columns < 75 || lines < 20) { 1513692d97c3Snir.tzachar@gmail.com endwin(); 1514692d97c3Snir.tzachar@gmail.com printf("Your terminal should have at " 1515692d97c3Snir.tzachar@gmail.com "least 20 lines and 75 columns\n"); 1516692d97c3Snir.tzachar@gmail.com return 1; 1517692d97c3Snir.tzachar@gmail.com } 1518692d97c3Snir.tzachar@gmail.com 1519692d97c3Snir.tzachar@gmail.com notimeout(stdscr, FALSE); 1520d7c67a2eSYaakov Selkowitz #if NCURSES_REENTRANT 1521d7c67a2eSYaakov Selkowitz set_escdelay(1); 1522d7c67a2eSYaakov Selkowitz #else 1523692d97c3Snir.tzachar@gmail.com ESCDELAY = 1; 1524d7c67a2eSYaakov Selkowitz #endif 1525692d97c3Snir.tzachar@gmail.com 1526692d97c3Snir.tzachar@gmail.com /* set btns menu */ 1527692d97c3Snir.tzachar@gmail.com curses_menu = new_menu(curses_menu_items); 1528692d97c3Snir.tzachar@gmail.com menu_opts_off(curses_menu, O_SHOWDESC); 1529a72f3e2bSNir Tzachar menu_opts_on(curses_menu, O_SHOWMATCH); 1530692d97c3Snir.tzachar@gmail.com menu_opts_on(curses_menu, O_ONEVALUE); 1531692d97c3Snir.tzachar@gmail.com menu_opts_on(curses_menu, O_NONCYCLIC); 1532a72f3e2bSNir Tzachar menu_opts_on(curses_menu, O_IGNORECASE); 1533692d97c3Snir.tzachar@gmail.com set_menu_mark(curses_menu, " "); 1534692d97c3Snir.tzachar@gmail.com set_menu_fore(curses_menu, attributes[MAIN_MENU_FORE]); 1535692d97c3Snir.tzachar@gmail.com set_menu_back(curses_menu, attributes[MAIN_MENU_BACK]); 1536692d97c3Snir.tzachar@gmail.com set_menu_grey(curses_menu, attributes[MAIN_MENU_GREY]); 1537692d97c3Snir.tzachar@gmail.com 1538692d97c3Snir.tzachar@gmail.com set_config_filename(conf_get_configname()); 1539692d97c3Snir.tzachar@gmail.com setup_windows(); 1540692d97c3Snir.tzachar@gmail.com 1541692d97c3Snir.tzachar@gmail.com /* check for KEY_FUNC(1) */ 1542692d97c3Snir.tzachar@gmail.com if (has_key(KEY_F(1)) == FALSE) { 1543692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 1544692d97c3Snir.tzachar@gmail.com _("Instructions"), 1545692d97c3Snir.tzachar@gmail.com _(menu_no_f_instructions)); 1546692d97c3Snir.tzachar@gmail.com } 1547692d97c3Snir.tzachar@gmail.com 154842368c37SMichal Marek conf_set_message_callback(conf_message_callback); 1549692d97c3Snir.tzachar@gmail.com /* do the work */ 1550692d97c3Snir.tzachar@gmail.com while (!global_exit) { 1551692d97c3Snir.tzachar@gmail.com conf(&rootmenu); 1552692d97c3Snir.tzachar@gmail.com if (!global_exit && do_exit() == 0) 1553692d97c3Snir.tzachar@gmail.com break; 1554692d97c3Snir.tzachar@gmail.com } 1555692d97c3Snir.tzachar@gmail.com /* ok, we are done */ 1556692d97c3Snir.tzachar@gmail.com unpost_menu(curses_menu); 1557692d97c3Snir.tzachar@gmail.com free_menu(curses_menu); 1558692d97c3Snir.tzachar@gmail.com delwin(main_window); 1559692d97c3Snir.tzachar@gmail.com clear(); 1560692d97c3Snir.tzachar@gmail.com refresh(); 1561692d97c3Snir.tzachar@gmail.com endwin(); 1562692d97c3Snir.tzachar@gmail.com return 0; 1563692d97c3Snir.tzachar@gmail.com } 1564