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 */ 8692d97c3Snir.tzachar@gmail.com #define LKC_DIRECT_LINK 9692d97c3Snir.tzachar@gmail.com #include "lkc.h" 10692d97c3Snir.tzachar@gmail.com #include "nconf.h" 11692d97c3Snir.tzachar@gmail.com 12692d97c3Snir.tzachar@gmail.com static const char nconf_readme[] = N_( 13692d97c3Snir.tzachar@gmail.com "Overview\n" 14692d97c3Snir.tzachar@gmail.com "--------\n" 15692d97c3Snir.tzachar@gmail.com "Some kernel features may be built directly into the kernel.\n" 16692d97c3Snir.tzachar@gmail.com "Some may be made into loadable runtime modules. Some features\n" 17692d97c3Snir.tzachar@gmail.com "may be completely removed altogether. There are also certain\n" 18692d97c3Snir.tzachar@gmail.com "kernel parameters which are not really features, but must be\n" 19692d97c3Snir.tzachar@gmail.com "entered in as decimal or hexadecimal numbers or possibly text.\n" 20692d97c3Snir.tzachar@gmail.com "\n" 21692d97c3Snir.tzachar@gmail.com "Menu items beginning with following braces represent features that\n" 22692d97c3Snir.tzachar@gmail.com " [ ] can be built in or removed\n" 23692d97c3Snir.tzachar@gmail.com " < > can be built in, modularized or removed\n" 24692d97c3Snir.tzachar@gmail.com " { } can be built in or modularized (selected by other feature)\n" 25692d97c3Snir.tzachar@gmail.com " - - are selected by other feature,\n" 26692d97c3Snir.tzachar@gmail.com " XXX cannot be selected. use Symbol Info to find out why,\n" 27692d97c3Snir.tzachar@gmail.com "while *, M or whitespace inside braces means to build in, build as\n" 28692d97c3Snir.tzachar@gmail.com "a module or to exclude the feature respectively.\n" 29692d97c3Snir.tzachar@gmail.com "\n" 30692d97c3Snir.tzachar@gmail.com "To change any of these features, highlight it with the cursor\n" 31692d97c3Snir.tzachar@gmail.com "keys and press <Y> to build it in, <M> to make it a module or\n" 32692d97c3Snir.tzachar@gmail.com "<N> to removed it. You may also press the <Space Bar> to cycle\n" 33692d97c3Snir.tzachar@gmail.com "through the available options (ie. Y->N->M->Y).\n" 34692d97c3Snir.tzachar@gmail.com "\n" 35692d97c3Snir.tzachar@gmail.com "Some additional keyboard hints:\n" 36692d97c3Snir.tzachar@gmail.com "\n" 37692d97c3Snir.tzachar@gmail.com "Menus\n" 38692d97c3Snir.tzachar@gmail.com "----------\n" 39692d97c3Snir.tzachar@gmail.com "o Use the Up/Down arrow keys (cursor keys) to highlight the item\n" 40692d97c3Snir.tzachar@gmail.com " you wish to change use <Enter> or <Space>. Goto submenu by \n" 41692d97c3Snir.tzachar@gmail.com " pressing <Enter> of <right-arrow>. Use <Esc> or <left-arrow> to go back.\n" 42692d97c3Snir.tzachar@gmail.com " Submenus are designated by \"--->\".\n" 43692d97c3Snir.tzachar@gmail.com "\n" 44692d97c3Snir.tzachar@gmail.com " Shortcut: Press the option's highlighted letter (hotkey).\n" 45692d97c3Snir.tzachar@gmail.com " Pressing a hotkey more than once will sequence\n" 46692d97c3Snir.tzachar@gmail.com " through all visible items which use that hotkey.\n" 47692d97c3Snir.tzachar@gmail.com "\n" 48692d97c3Snir.tzachar@gmail.com " You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n" 49692d97c3Snir.tzachar@gmail.com " unseen options into view.\n" 50692d97c3Snir.tzachar@gmail.com "\n" 51692d97c3Snir.tzachar@gmail.com "o To exit a menu use the just press <ESC> <F5> <F8> or <left-arrow>.\n" 52692d97c3Snir.tzachar@gmail.com "\n" 53692d97c3Snir.tzachar@gmail.com "o To get help with an item, press <F1>\n" 54692d97c3Snir.tzachar@gmail.com " Shortcut: Press <h> or <?>.\n" 55692d97c3Snir.tzachar@gmail.com "\n" 56692d97c3Snir.tzachar@gmail.com "\n" 57692d97c3Snir.tzachar@gmail.com "Radiolists (Choice lists)\n" 58692d97c3Snir.tzachar@gmail.com "-----------\n" 59692d97c3Snir.tzachar@gmail.com "o Use the cursor keys to select the option you wish to set and press\n" 60692d97c3Snir.tzachar@gmail.com " <S> or the <SPACE BAR>.\n" 61692d97c3Snir.tzachar@gmail.com "\n" 62692d97c3Snir.tzachar@gmail.com " Shortcut: Press the first letter of the option you wish to set then\n" 63692d97c3Snir.tzachar@gmail.com " press <S> or <SPACE BAR>.\n" 64692d97c3Snir.tzachar@gmail.com "\n" 65692d97c3Snir.tzachar@gmail.com "o To see available help for the item, press <F1>\n" 66692d97c3Snir.tzachar@gmail.com " Shortcut: Press <H> or <?>.\n" 67692d97c3Snir.tzachar@gmail.com "\n" 68692d97c3Snir.tzachar@gmail.com "\n" 69692d97c3Snir.tzachar@gmail.com "Data Entry\n" 70692d97c3Snir.tzachar@gmail.com "-----------\n" 71692d97c3Snir.tzachar@gmail.com "o Enter the requested information and press <ENTER>\n" 72692d97c3Snir.tzachar@gmail.com " If you are entering hexadecimal values, it is not necessary to\n" 73692d97c3Snir.tzachar@gmail.com " add the '0x' prefix to the entry.\n" 74692d97c3Snir.tzachar@gmail.com "\n" 75692d97c3Snir.tzachar@gmail.com "o For help, press <F1>.\n" 76692d97c3Snir.tzachar@gmail.com "\n" 77692d97c3Snir.tzachar@gmail.com "\n" 78692d97c3Snir.tzachar@gmail.com "Text Box (Help Window)\n" 79692d97c3Snir.tzachar@gmail.com "--------\n" 80692d97c3Snir.tzachar@gmail.com "o Use the cursor keys to scroll up/down/left/right. The VI editor\n" 81692d97c3Snir.tzachar@gmail.com " keys h,j,k,l function here as do <SPACE BAR> for those\n" 82692d97c3Snir.tzachar@gmail.com " who are familiar with less and lynx.\n" 83692d97c3Snir.tzachar@gmail.com "\n" 84692d97c3Snir.tzachar@gmail.com "o Press <Enter>, <F1>, <F5>, <F7> or <Esc> to exit.\n" 85692d97c3Snir.tzachar@gmail.com "\n" 86692d97c3Snir.tzachar@gmail.com "\n" 87692d97c3Snir.tzachar@gmail.com "Alternate Configuration Files\n" 88692d97c3Snir.tzachar@gmail.com "-----------------------------\n" 89692d97c3Snir.tzachar@gmail.com "nconfig supports the use of alternate configuration files for\n" 90692d97c3Snir.tzachar@gmail.com "those who, for various reasons, find it necessary to switch\n" 91692d97c3Snir.tzachar@gmail.com "between different kernel configurations.\n" 92692d97c3Snir.tzachar@gmail.com "\n" 93692d97c3Snir.tzachar@gmail.com "At the end of the main menu you will find two options. One is\n" 94692d97c3Snir.tzachar@gmail.com "for saving the current configuration to a file of your choosing.\n" 95692d97c3Snir.tzachar@gmail.com "The other option is for loading a previously saved alternate\n" 96692d97c3Snir.tzachar@gmail.com "configuration.\n" 97692d97c3Snir.tzachar@gmail.com "\n" 98692d97c3Snir.tzachar@gmail.com "Even if you don't use alternate configuration files, but you\n" 99692d97c3Snir.tzachar@gmail.com "find during a nconfig session that you have completely messed\n" 100692d97c3Snir.tzachar@gmail.com "up your settings, you may use the \"Load Alternate...\" option to\n" 101692d97c3Snir.tzachar@gmail.com "restore your previously saved settings from \".config\" without\n" 102692d97c3Snir.tzachar@gmail.com "restarting nconfig.\n" 103692d97c3Snir.tzachar@gmail.com "\n" 104692d97c3Snir.tzachar@gmail.com "Other information\n" 105692d97c3Snir.tzachar@gmail.com "-----------------\n" 106692d97c3Snir.tzachar@gmail.com "If you use nconfig in an XTERM window make sure you have your\n" 107692d97c3Snir.tzachar@gmail.com "$TERM variable set to point to a xterm definition which supports color.\n" 108692d97c3Snir.tzachar@gmail.com "Otherwise, nconfig will look rather bad. nconfig will not\n" 109692d97c3Snir.tzachar@gmail.com "display correctly in a RXVT window because rxvt displays only one\n" 110692d97c3Snir.tzachar@gmail.com "intensity of color, bright.\n" 111692d97c3Snir.tzachar@gmail.com "\n" 112692d97c3Snir.tzachar@gmail.com "nconfig will display larger menus on screens or xterms which are\n" 113692d97c3Snir.tzachar@gmail.com "set to display more than the standard 25 row by 80 column geometry.\n" 114692d97c3Snir.tzachar@gmail.com "In order for this to work, the \"stty size\" command must be able to\n" 115692d97c3Snir.tzachar@gmail.com "display the screen's current row and column geometry. I STRONGLY\n" 116692d97c3Snir.tzachar@gmail.com "RECOMMEND that you make sure you do NOT have the shell variables\n" 117692d97c3Snir.tzachar@gmail.com "LINES and COLUMNS exported into your environment. Some distributions\n" 118692d97c3Snir.tzachar@gmail.com "export those variables via /etc/profile. Some ncurses programs can\n" 119692d97c3Snir.tzachar@gmail.com "become confused when those variables (LINES & COLUMNS) don't reflect\n" 120692d97c3Snir.tzachar@gmail.com "the true screen size.\n" 121692d97c3Snir.tzachar@gmail.com "\n" 122692d97c3Snir.tzachar@gmail.com "Optional personality available\n" 123692d97c3Snir.tzachar@gmail.com "------------------------------\n" 124692d97c3Snir.tzachar@gmail.com "If you prefer to have all of the kernel options listed in a single\n" 125692d97c3Snir.tzachar@gmail.com "menu, rather than the default multimenu hierarchy, run the nconfig\n" 126692d97c3Snir.tzachar@gmail.com "with NCONFIG_MODE environment variable set to single_menu. Example:\n" 127692d97c3Snir.tzachar@gmail.com "\n" 128692d97c3Snir.tzachar@gmail.com "make NCONFIG_MODE=single_menu nconfig\n" 129692d97c3Snir.tzachar@gmail.com "\n" 130692d97c3Snir.tzachar@gmail.com "<Enter> will then unroll the appropriate category, or enfold it if it\n" 131692d97c3Snir.tzachar@gmail.com "is already unrolled.\n" 132692d97c3Snir.tzachar@gmail.com "\n" 133692d97c3Snir.tzachar@gmail.com "Note that this mode can eventually be a little more CPU expensive\n" 134692d97c3Snir.tzachar@gmail.com "(especially with a larger number of unrolled categories) than the\n" 135692d97c3Snir.tzachar@gmail.com "default mode.\n" 136692d97c3Snir.tzachar@gmail.com "\n"), 137692d97c3Snir.tzachar@gmail.com menu_no_f_instructions[] = N_( 138692d97c3Snir.tzachar@gmail.com " You do not have function keys support. Please follow the\n" 139692d97c3Snir.tzachar@gmail.com " following instructions:\n" 140692d97c3Snir.tzachar@gmail.com " Arrow keys navigate the menu.\n" 141692d97c3Snir.tzachar@gmail.com " <Enter> or <right-arrow> selects submenus --->.\n" 142692d97c3Snir.tzachar@gmail.com " Capital Letters are hotkeys.\n" 143692d97c3Snir.tzachar@gmail.com " Pressing <Y> includes, <N> excludes, <M> modularizes features.\n" 144692d97c3Snir.tzachar@gmail.com " Pressing SpaceBar toggles between the above options\n" 145692d97c3Snir.tzachar@gmail.com " Press <Esc> or <left-arrow> to go back one menu, \n" 146692d97c3Snir.tzachar@gmail.com " <?> or <h> for Help, </> for Search.\n" 147692d97c3Snir.tzachar@gmail.com " <1> is interchangable with <F1>, <2> with <F2>, etc.\n" 148692d97c3Snir.tzachar@gmail.com " Legend: [*] built-in [ ] excluded <M> module < > module capable.\n" 149692d97c3Snir.tzachar@gmail.com " <Esc> always leaves the current window\n"), 150692d97c3Snir.tzachar@gmail.com menu_instructions[] = N_( 151692d97c3Snir.tzachar@gmail.com " Arrow keys navigate the menu.\n" 152692d97c3Snir.tzachar@gmail.com " <Enter> or <right-arrow> selects submenus --->.\n" 153692d97c3Snir.tzachar@gmail.com " Capital Letters are hotkeys.\n" 154692d97c3Snir.tzachar@gmail.com " Pressing <Y> includes, <N> excludes, <M> modularizes features.\n" 155692d97c3Snir.tzachar@gmail.com " Pressing SpaceBar toggles between the above options\n" 156692d97c3Snir.tzachar@gmail.com " Press <Esc>, <F3> or <left-arrow> to go back one menu, \n" 157692d97c3Snir.tzachar@gmail.com " <?>, <F1> or <h> for Help, </> for Search.\n" 158692d97c3Snir.tzachar@gmail.com " <1> is interchangable with <F1>, <2> with <F2>, etc.\n" 159692d97c3Snir.tzachar@gmail.com " Legend: [*] built-in [ ] excluded <M> module < > module capable.\n" 160692d97c3Snir.tzachar@gmail.com " <Esc> always leaves the current window\n"), 161692d97c3Snir.tzachar@gmail.com radiolist_instructions[] = N_( 162692d97c3Snir.tzachar@gmail.com " Use the arrow keys to navigate this window or\n" 163692d97c3Snir.tzachar@gmail.com " press the hotkey of the item you wish to select\n" 164692d97c3Snir.tzachar@gmail.com " followed by the <SPACE BAR>.\n" 165692d97c3Snir.tzachar@gmail.com " Press <?>, <F1> or <h> for additional information about this option.\n"), 166692d97c3Snir.tzachar@gmail.com inputbox_instructions_int[] = N_( 167692d97c3Snir.tzachar@gmail.com "Please enter a decimal value.\n" 168692d97c3Snir.tzachar@gmail.com "Fractions will not be accepted.\n" 169692d97c3Snir.tzachar@gmail.com "Press <RETURN> to accept, <ESC> to cancel."), 170692d97c3Snir.tzachar@gmail.com inputbox_instructions_hex[] = N_( 171692d97c3Snir.tzachar@gmail.com "Please enter a hexadecimal value.\n" 172692d97c3Snir.tzachar@gmail.com "Press <RETURN> to accept, <ESC> to cancel."), 173692d97c3Snir.tzachar@gmail.com inputbox_instructions_string[] = N_( 174692d97c3Snir.tzachar@gmail.com "Please enter a string value.\n" 175692d97c3Snir.tzachar@gmail.com "Press <RETURN> to accept, <ESC> to cancel."), 176692d97c3Snir.tzachar@gmail.com setmod_text[] = N_( 177692d97c3Snir.tzachar@gmail.com "This feature depends on another which\n" 178692d97c3Snir.tzachar@gmail.com "has been configured as a module.\n" 179692d97c3Snir.tzachar@gmail.com "As a result, this feature will be built as a module."), 180692d97c3Snir.tzachar@gmail.com nohelp_text[] = N_( 181692d97c3Snir.tzachar@gmail.com "There is no help available for this kernel option.\n"), 182692d97c3Snir.tzachar@gmail.com load_config_text[] = N_( 183692d97c3Snir.tzachar@gmail.com "Enter the name of the configuration file you wish to load.\n" 184692d97c3Snir.tzachar@gmail.com "Accept the name shown to restore the configuration you\n" 185692d97c3Snir.tzachar@gmail.com "last retrieved. Leave blank to abort."), 186692d97c3Snir.tzachar@gmail.com load_config_help[] = N_( 187692d97c3Snir.tzachar@gmail.com "\n" 188692d97c3Snir.tzachar@gmail.com "For various reasons, one may wish to keep several different kernel\n" 189692d97c3Snir.tzachar@gmail.com "configurations available on a single machine.\n" 190692d97c3Snir.tzachar@gmail.com "\n" 191692d97c3Snir.tzachar@gmail.com "If you have saved a previous configuration in a file other than the\n" 192692d97c3Snir.tzachar@gmail.com "kernel's default, entering the name of the file here will allow you\n" 193692d97c3Snir.tzachar@gmail.com "to modify that configuration.\n" 194692d97c3Snir.tzachar@gmail.com "\n" 195692d97c3Snir.tzachar@gmail.com "If you are uncertain, then you have probably never used alternate\n" 196692d97c3Snir.tzachar@gmail.com "configuration files. You should therefor leave this blank to abort.\n"), 197692d97c3Snir.tzachar@gmail.com save_config_text[] = N_( 198692d97c3Snir.tzachar@gmail.com "Enter a filename to which this configuration should be saved\n" 199692d97c3Snir.tzachar@gmail.com "as an alternate. Leave blank to abort."), 200692d97c3Snir.tzachar@gmail.com save_config_help[] = N_( 201692d97c3Snir.tzachar@gmail.com "\n" 202692d97c3Snir.tzachar@gmail.com "For various reasons, one may wish to keep different kernel\n" 203692d97c3Snir.tzachar@gmail.com "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" 209692d97c3Snir.tzachar@gmail.com "If you are uncertain what all this means then you should probably\n" 210692d97c3Snir.tzachar@gmail.com "leave this blank.\n"), 211692d97c3Snir.tzachar@gmail.com search_help[] = N_( 212692d97c3Snir.tzachar@gmail.com "\n" 213692d97c3Snir.tzachar@gmail.com "Search for CONFIG_ symbols and display their relations.\n" 214692d97c3Snir.tzachar@gmail.com "Regular expressions are allowed.\n" 215692d97c3Snir.tzachar@gmail.com "Example: search for \"^FOO\"\n" 216692d97c3Snir.tzachar@gmail.com "Result:\n" 217692d97c3Snir.tzachar@gmail.com "-----------------------------------------------------------------\n" 218692d97c3Snir.tzachar@gmail.com "Symbol: FOO [ = m]\n" 219692d97c3Snir.tzachar@gmail.com "Prompt: Foo bus is used to drive the bar HW\n" 220692d97c3Snir.tzachar@gmail.com "Defined at drivers/pci/Kconfig:47\n" 221692d97c3Snir.tzachar@gmail.com "Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n" 222692d97c3Snir.tzachar@gmail.com "Location:\n" 223692d97c3Snir.tzachar@gmail.com " -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n" 224692d97c3Snir.tzachar@gmail.com " -> PCI support (PCI [ = y])\n" 225692d97c3Snir.tzachar@gmail.com " -> PCI access mode (<choice> [ = y])\n" 226692d97c3Snir.tzachar@gmail.com "Selects: LIBCRC32\n" 227692d97c3Snir.tzachar@gmail.com "Selected by: BAR\n" 228692d97c3Snir.tzachar@gmail.com "-----------------------------------------------------------------\n" 229692d97c3Snir.tzachar@gmail.com "o The line 'Prompt:' shows the text used in the menu structure for\n" 230692d97c3Snir.tzachar@gmail.com " this CONFIG_ symbol\n" 231692d97c3Snir.tzachar@gmail.com "o The 'Defined at' line tell at what file / line number the symbol\n" 232692d97c3Snir.tzachar@gmail.com " is defined\n" 233692d97c3Snir.tzachar@gmail.com "o The 'Depends on:' line tell what symbols needs to be defined for\n" 234692d97c3Snir.tzachar@gmail.com " this symbol to be visible in the menu (selectable)\n" 235692d97c3Snir.tzachar@gmail.com "o The 'Location:' lines tell where in the menu structure this symbol\n" 236692d97c3Snir.tzachar@gmail.com " is located\n" 237692d97c3Snir.tzachar@gmail.com " A location followed by a [ = y] indicate that this is a selectable\n" 238692d97c3Snir.tzachar@gmail.com " menu item - and current value is displayed inside brackets.\n" 239692d97c3Snir.tzachar@gmail.com "o The 'Selects:' line tell what symbol will be automatically\n" 240692d97c3Snir.tzachar@gmail.com " selected if this symbol is selected (y or m)\n" 241692d97c3Snir.tzachar@gmail.com "o The 'Selected by' line tell what symbol has selected this symbol\n" 242692d97c3Snir.tzachar@gmail.com "\n" 243692d97c3Snir.tzachar@gmail.com "Only relevant lines are shown.\n" 244692d97c3Snir.tzachar@gmail.com "\n\n" 245692d97c3Snir.tzachar@gmail.com "Search examples:\n" 246692d97c3Snir.tzachar@gmail.com "Examples: USB = > find all CONFIG_ symbols containing USB\n" 247692d97c3Snir.tzachar@gmail.com " ^USB => find all CONFIG_ symbols starting with USB\n" 248692d97c3Snir.tzachar@gmail.com " USB$ => find all CONFIG_ symbols ending with USB\n" 249692d97c3Snir.tzachar@gmail.com "\n"); 250692d97c3Snir.tzachar@gmail.com 251692d97c3Snir.tzachar@gmail.com struct mitem { 252692d97c3Snir.tzachar@gmail.com char str[256]; 253692d97c3Snir.tzachar@gmail.com char tag; 254692d97c3Snir.tzachar@gmail.com void *usrptr; 255692d97c3Snir.tzachar@gmail.com int is_hot; 256692d97c3Snir.tzachar@gmail.com int is_visible; 257692d97c3Snir.tzachar@gmail.com }; 258692d97c3Snir.tzachar@gmail.com 259692d97c3Snir.tzachar@gmail.com #define MAX_MENU_ITEMS 4096 260692d97c3Snir.tzachar@gmail.com static int show_all_items; 261692d97c3Snir.tzachar@gmail.com static int indent; 262692d97c3Snir.tzachar@gmail.com static struct menu *current_menu; 263692d97c3Snir.tzachar@gmail.com static int child_count; 264692d97c3Snir.tzachar@gmail.com static int single_menu_mode; 265692d97c3Snir.tzachar@gmail.com /* the window in which all information appears */ 266692d97c3Snir.tzachar@gmail.com static WINDOW *main_window; 267692d97c3Snir.tzachar@gmail.com /* the largest size of the menu window */ 268692d97c3Snir.tzachar@gmail.com static int mwin_max_lines; 269692d97c3Snir.tzachar@gmail.com static int mwin_max_cols; 270692d97c3Snir.tzachar@gmail.com /* the window in which we show option buttons */ 271692d97c3Snir.tzachar@gmail.com static MENU *curses_menu; 272692d97c3Snir.tzachar@gmail.com static ITEM *curses_menu_items[MAX_MENU_ITEMS]; 273692d97c3Snir.tzachar@gmail.com static struct mitem k_menu_items[MAX_MENU_ITEMS]; 274692d97c3Snir.tzachar@gmail.com static int items_num; 275692d97c3Snir.tzachar@gmail.com static int global_exit; 276692d97c3Snir.tzachar@gmail.com /* the currently selected button */ 277692d97c3Snir.tzachar@gmail.com const char *current_instructions = menu_instructions; 278692d97c3Snir.tzachar@gmail.com /* this array is used to implement hot keys. it is updated in item_make and 279692d97c3Snir.tzachar@gmail.com * resetted in clean_items. It would be better to use a hash, but lets keep it 280692d97c3Snir.tzachar@gmail.com * simple... */ 281692d97c3Snir.tzachar@gmail.com #define MAX_SAME_KEY MAX_MENU_ITEMS 282692d97c3Snir.tzachar@gmail.com struct { 283692d97c3Snir.tzachar@gmail.com int count; 284692d97c3Snir.tzachar@gmail.com int ptrs[MAX_MENU_ITEMS]; 285692d97c3Snir.tzachar@gmail.com } hotkeys[1<<(sizeof(char)*8)]; 286692d97c3Snir.tzachar@gmail.com 287692d97c3Snir.tzachar@gmail.com static void conf(struct menu *menu); 288692d97c3Snir.tzachar@gmail.com static void conf_choice(struct menu *menu); 289692d97c3Snir.tzachar@gmail.com static void conf_string(struct menu *menu); 290692d97c3Snir.tzachar@gmail.com static void conf_load(void); 291692d97c3Snir.tzachar@gmail.com static void conf_save(void); 292692d97c3Snir.tzachar@gmail.com static void show_help(struct menu *menu); 293692d97c3Snir.tzachar@gmail.com static int do_exit(void); 294692d97c3Snir.tzachar@gmail.com static void setup_windows(void); 295692d97c3Snir.tzachar@gmail.com 296692d97c3Snir.tzachar@gmail.com typedef void (*function_key_handler_t)(int *key, struct menu *menu); 297692d97c3Snir.tzachar@gmail.com static void handle_f1(int *key, struct menu *current_item); 298692d97c3Snir.tzachar@gmail.com static void handle_f2(int *key, struct menu *current_item); 299692d97c3Snir.tzachar@gmail.com static void handle_f3(int *key, struct menu *current_item); 300692d97c3Snir.tzachar@gmail.com static void handle_f4(int *key, struct menu *current_item); 301692d97c3Snir.tzachar@gmail.com static void handle_f5(int *key, struct menu *current_item); 302692d97c3Snir.tzachar@gmail.com static void handle_f6(int *key, struct menu *current_item); 303692d97c3Snir.tzachar@gmail.com static void handle_f7(int *key, struct menu *current_item); 304692d97c3Snir.tzachar@gmail.com static void handle_f8(int *key, struct menu *current_item); 305692d97c3Snir.tzachar@gmail.com 306692d97c3Snir.tzachar@gmail.com struct function_keys { 307692d97c3Snir.tzachar@gmail.com const char *key_str; 308692d97c3Snir.tzachar@gmail.com const char *func; 309692d97c3Snir.tzachar@gmail.com function_key key; 310692d97c3Snir.tzachar@gmail.com function_key_handler_t handler; 311692d97c3Snir.tzachar@gmail.com }; 312692d97c3Snir.tzachar@gmail.com 313692d97c3Snir.tzachar@gmail.com static const int function_keys_num = 8; 314692d97c3Snir.tzachar@gmail.com struct function_keys function_keys[] = { 315692d97c3Snir.tzachar@gmail.com { 316692d97c3Snir.tzachar@gmail.com .key_str = "F1", 317692d97c3Snir.tzachar@gmail.com .func = "Help", 318692d97c3Snir.tzachar@gmail.com .key = F_HELP, 319692d97c3Snir.tzachar@gmail.com .handler = handle_f1, 320692d97c3Snir.tzachar@gmail.com }, 321692d97c3Snir.tzachar@gmail.com { 322692d97c3Snir.tzachar@gmail.com .key_str = "F2", 323692d97c3Snir.tzachar@gmail.com .func = "Symbol Info", 324692d97c3Snir.tzachar@gmail.com .key = F_SYMBOL, 325692d97c3Snir.tzachar@gmail.com .handler = handle_f2, 326692d97c3Snir.tzachar@gmail.com }, 327692d97c3Snir.tzachar@gmail.com { 328692d97c3Snir.tzachar@gmail.com .key_str = "F3", 329692d97c3Snir.tzachar@gmail.com .func = "Instructions", 330692d97c3Snir.tzachar@gmail.com .key = F_INSTS, 331692d97c3Snir.tzachar@gmail.com .handler = handle_f3, 332692d97c3Snir.tzachar@gmail.com }, 333692d97c3Snir.tzachar@gmail.com { 334692d97c3Snir.tzachar@gmail.com .key_str = "F4", 335692d97c3Snir.tzachar@gmail.com .func = "Config", 336692d97c3Snir.tzachar@gmail.com .key = F_CONF, 337692d97c3Snir.tzachar@gmail.com .handler = handle_f4, 338692d97c3Snir.tzachar@gmail.com }, 339692d97c3Snir.tzachar@gmail.com { 340692d97c3Snir.tzachar@gmail.com .key_str = "F5", 341692d97c3Snir.tzachar@gmail.com .func = "Back", 342692d97c3Snir.tzachar@gmail.com .key = F_BACK, 343692d97c3Snir.tzachar@gmail.com .handler = handle_f5, 344692d97c3Snir.tzachar@gmail.com }, 345692d97c3Snir.tzachar@gmail.com { 346692d97c3Snir.tzachar@gmail.com .key_str = "F6", 347692d97c3Snir.tzachar@gmail.com .func = "Save", 348692d97c3Snir.tzachar@gmail.com .key = F_SAVE, 349692d97c3Snir.tzachar@gmail.com .handler = handle_f6, 350692d97c3Snir.tzachar@gmail.com }, 351692d97c3Snir.tzachar@gmail.com { 352692d97c3Snir.tzachar@gmail.com .key_str = "F7", 353692d97c3Snir.tzachar@gmail.com .func = "Load", 354692d97c3Snir.tzachar@gmail.com .key = F_LOAD, 355692d97c3Snir.tzachar@gmail.com .handler = handle_f7, 356692d97c3Snir.tzachar@gmail.com }, 357692d97c3Snir.tzachar@gmail.com { 358692d97c3Snir.tzachar@gmail.com .key_str = "F8", 359692d97c3Snir.tzachar@gmail.com .func = "Exit", 360692d97c3Snir.tzachar@gmail.com .key = F_EXIT, 361692d97c3Snir.tzachar@gmail.com .handler = handle_f8, 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; 370692d97c3Snir.tzachar@gmail.com 371692d97c3Snir.tzachar@gmail.com for (i = 0; i < function_keys_num; i++) { 372692d97c3Snir.tzachar@gmail.com wattrset(main_window, attributes[FUNCTION_HIGHLIGHT]); 373692d97c3Snir.tzachar@gmail.com mvwprintw(main_window, LINES-3, offset, 374692d97c3Snir.tzachar@gmail.com "%s", 375692d97c3Snir.tzachar@gmail.com function_keys[i].key_str); 376692d97c3Snir.tzachar@gmail.com wattrset(main_window, attributes[FUNCTION_TEXT]); 377692d97c3Snir.tzachar@gmail.com offset += strlen(function_keys[i].key_str); 378692d97c3Snir.tzachar@gmail.com mvwprintw(main_window, LINES-3, 379692d97c3Snir.tzachar@gmail.com offset, "%s", 380692d97c3Snir.tzachar@gmail.com function_keys[i].func); 381692d97c3Snir.tzachar@gmail.com offset += strlen(function_keys[i].func) + skip; 382692d97c3Snir.tzachar@gmail.com } 383692d97c3Snir.tzachar@gmail.com wattrset(main_window, attributes[NORMAL]); 384692d97c3Snir.tzachar@gmail.com } 385692d97c3Snir.tzachar@gmail.com 386692d97c3Snir.tzachar@gmail.com /* help */ 387692d97c3Snir.tzachar@gmail.com static void handle_f1(int *key, struct menu *current_item) 388692d97c3Snir.tzachar@gmail.com { 389692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 390692d97c3Snir.tzachar@gmail.com _("README"), _(nconf_readme)); 391692d97c3Snir.tzachar@gmail.com return; 392692d97c3Snir.tzachar@gmail.com } 393692d97c3Snir.tzachar@gmail.com 394692d97c3Snir.tzachar@gmail.com /* symbole help */ 395692d97c3Snir.tzachar@gmail.com static void handle_f2(int *key, struct menu *current_item) 396692d97c3Snir.tzachar@gmail.com { 397692d97c3Snir.tzachar@gmail.com show_help(current_item); 398692d97c3Snir.tzachar@gmail.com return; 399692d97c3Snir.tzachar@gmail.com } 400692d97c3Snir.tzachar@gmail.com 401692d97c3Snir.tzachar@gmail.com /* instructions */ 402692d97c3Snir.tzachar@gmail.com static void handle_f3(int *key, struct menu *current_item) 403692d97c3Snir.tzachar@gmail.com { 404692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 405692d97c3Snir.tzachar@gmail.com _("Instructions"), 406692d97c3Snir.tzachar@gmail.com _(current_instructions)); 407692d97c3Snir.tzachar@gmail.com return; 408692d97c3Snir.tzachar@gmail.com } 409692d97c3Snir.tzachar@gmail.com 410692d97c3Snir.tzachar@gmail.com /* config */ 411692d97c3Snir.tzachar@gmail.com static void handle_f4(int *key, struct menu *current_item) 412692d97c3Snir.tzachar@gmail.com { 413692d97c3Snir.tzachar@gmail.com int res = btn_dialog(main_window, 414692d97c3Snir.tzachar@gmail.com _("Show all symbols?"), 415692d97c3Snir.tzachar@gmail.com 2, 416692d97c3Snir.tzachar@gmail.com " <Show All> ", 417692d97c3Snir.tzachar@gmail.com "<Don't show all>"); 418692d97c3Snir.tzachar@gmail.com if (res == 0) 419692d97c3Snir.tzachar@gmail.com show_all_items = 1; 420692d97c3Snir.tzachar@gmail.com else if (res == 1) 421692d97c3Snir.tzachar@gmail.com show_all_items = 0; 422692d97c3Snir.tzachar@gmail.com 423692d97c3Snir.tzachar@gmail.com return; 424692d97c3Snir.tzachar@gmail.com } 425692d97c3Snir.tzachar@gmail.com 426692d97c3Snir.tzachar@gmail.com /* back */ 427692d97c3Snir.tzachar@gmail.com static void handle_f5(int *key, struct menu *current_item) 428692d97c3Snir.tzachar@gmail.com { 429692d97c3Snir.tzachar@gmail.com *key = KEY_LEFT; 430692d97c3Snir.tzachar@gmail.com return; 431692d97c3Snir.tzachar@gmail.com } 432692d97c3Snir.tzachar@gmail.com 433692d97c3Snir.tzachar@gmail.com /* save */ 434692d97c3Snir.tzachar@gmail.com static void handle_f6(int *key, struct menu *current_item) 435692d97c3Snir.tzachar@gmail.com { 436692d97c3Snir.tzachar@gmail.com conf_save(); 437692d97c3Snir.tzachar@gmail.com return; 438692d97c3Snir.tzachar@gmail.com } 439692d97c3Snir.tzachar@gmail.com 440692d97c3Snir.tzachar@gmail.com /* load */ 441692d97c3Snir.tzachar@gmail.com static void handle_f7(int *key, struct menu *current_item) 442692d97c3Snir.tzachar@gmail.com { 443692d97c3Snir.tzachar@gmail.com conf_load(); 444692d97c3Snir.tzachar@gmail.com return; 445692d97c3Snir.tzachar@gmail.com } 446692d97c3Snir.tzachar@gmail.com 447692d97c3Snir.tzachar@gmail.com /* exit */ 448692d97c3Snir.tzachar@gmail.com static void handle_f8(int *key, struct menu *current_item) 449692d97c3Snir.tzachar@gmail.com { 450692d97c3Snir.tzachar@gmail.com do_exit(); 451692d97c3Snir.tzachar@gmail.com return; 452692d97c3Snir.tzachar@gmail.com } 453692d97c3Snir.tzachar@gmail.com 454692d97c3Snir.tzachar@gmail.com /* return != 0 to indicate the key was handles */ 455*851190c9SMichal Marek static int process_special_keys(int *key, struct menu *menu) 456692d97c3Snir.tzachar@gmail.com { 457692d97c3Snir.tzachar@gmail.com int i; 458692d97c3Snir.tzachar@gmail.com 459692d97c3Snir.tzachar@gmail.com if (*key == KEY_RESIZE) { 460692d97c3Snir.tzachar@gmail.com setup_windows(); 461692d97c3Snir.tzachar@gmail.com return 1; 462692d97c3Snir.tzachar@gmail.com } 463692d97c3Snir.tzachar@gmail.com 464692d97c3Snir.tzachar@gmail.com for (i = 0; i < function_keys_num; i++) { 465692d97c3Snir.tzachar@gmail.com if (*key == KEY_F(function_keys[i].key) || 466692d97c3Snir.tzachar@gmail.com *key == '0' + function_keys[i].key){ 467692d97c3Snir.tzachar@gmail.com function_keys[i].handler(key, menu); 468692d97c3Snir.tzachar@gmail.com return 1; 469692d97c3Snir.tzachar@gmail.com } 470692d97c3Snir.tzachar@gmail.com } 471692d97c3Snir.tzachar@gmail.com 472692d97c3Snir.tzachar@gmail.com return 0; 473692d97c3Snir.tzachar@gmail.com } 474692d97c3Snir.tzachar@gmail.com 475692d97c3Snir.tzachar@gmail.com static void clean_items(void) 476692d97c3Snir.tzachar@gmail.com { 477692d97c3Snir.tzachar@gmail.com int i; 478692d97c3Snir.tzachar@gmail.com for (i = 0; curses_menu_items[i]; i++) 479692d97c3Snir.tzachar@gmail.com free_item(curses_menu_items[i]); 480692d97c3Snir.tzachar@gmail.com bzero(curses_menu_items, sizeof(curses_menu_items)); 481692d97c3Snir.tzachar@gmail.com bzero(k_menu_items, sizeof(k_menu_items)); 482692d97c3Snir.tzachar@gmail.com bzero(hotkeys, sizeof(hotkeys)); 483692d97c3Snir.tzachar@gmail.com items_num = 0; 484692d97c3Snir.tzachar@gmail.com } 485692d97c3Snir.tzachar@gmail.com 486692d97c3Snir.tzachar@gmail.com /* return the index of the next hot item, or -1 if no such item exists */ 487*851190c9SMichal Marek static int get_next_hot(int c) 488692d97c3Snir.tzachar@gmail.com { 489692d97c3Snir.tzachar@gmail.com static int hot_index; 490692d97c3Snir.tzachar@gmail.com static int hot_char; 491692d97c3Snir.tzachar@gmail.com 492692d97c3Snir.tzachar@gmail.com if (c < 0 || c > 255 || hotkeys[c].count <= 0) 493692d97c3Snir.tzachar@gmail.com return -1; 494692d97c3Snir.tzachar@gmail.com 495692d97c3Snir.tzachar@gmail.com if (hot_char == c) { 496692d97c3Snir.tzachar@gmail.com hot_index = (hot_index+1)%hotkeys[c].count; 497692d97c3Snir.tzachar@gmail.com return hotkeys[c].ptrs[hot_index]; 498692d97c3Snir.tzachar@gmail.com } else { 499692d97c3Snir.tzachar@gmail.com hot_char = c; 500692d97c3Snir.tzachar@gmail.com hot_index = 0; 501692d97c3Snir.tzachar@gmail.com return hotkeys[c].ptrs[0]; 502692d97c3Snir.tzachar@gmail.com } 503692d97c3Snir.tzachar@gmail.com } 504692d97c3Snir.tzachar@gmail.com 505692d97c3Snir.tzachar@gmail.com /* can the char c be a hot key? no, if c is a common shortcut used elsewhere */ 506*851190c9SMichal Marek static int canbhot(char c) 507692d97c3Snir.tzachar@gmail.com { 508692d97c3Snir.tzachar@gmail.com c = tolower(c); 509692d97c3Snir.tzachar@gmail.com return isalnum(c) && c != 'y' && c != 'm' && c != 'h' && 510692d97c3Snir.tzachar@gmail.com c != 'n' && c != '?'; 511692d97c3Snir.tzachar@gmail.com } 512692d97c3Snir.tzachar@gmail.com 513692d97c3Snir.tzachar@gmail.com /* check if str already contains a hot key. */ 514*851190c9SMichal Marek static int is_hot(int index) 515692d97c3Snir.tzachar@gmail.com { 516692d97c3Snir.tzachar@gmail.com return k_menu_items[index].is_hot; 517692d97c3Snir.tzachar@gmail.com } 518692d97c3Snir.tzachar@gmail.com 519692d97c3Snir.tzachar@gmail.com /* find the first possible hot key, and mark it. 520692d97c3Snir.tzachar@gmail.com * index is the index of the item in the menu 521692d97c3Snir.tzachar@gmail.com * return 0 on success*/ 522*851190c9SMichal Marek static int make_hot(char *dest, int len, const char *org, int index) 523692d97c3Snir.tzachar@gmail.com { 524692d97c3Snir.tzachar@gmail.com int position = -1; 525692d97c3Snir.tzachar@gmail.com int i; 526692d97c3Snir.tzachar@gmail.com int tmp; 527692d97c3Snir.tzachar@gmail.com int c; 528692d97c3Snir.tzachar@gmail.com int org_len = strlen(org); 529692d97c3Snir.tzachar@gmail.com 530692d97c3Snir.tzachar@gmail.com if (org == NULL || is_hot(index)) 531692d97c3Snir.tzachar@gmail.com return 1; 532692d97c3Snir.tzachar@gmail.com 533692d97c3Snir.tzachar@gmail.com /* make sure not to make hot keys out of markers. 534692d97c3Snir.tzachar@gmail.com * find where to start looking for a hot key 535692d97c3Snir.tzachar@gmail.com */ 536692d97c3Snir.tzachar@gmail.com i = 0; 537692d97c3Snir.tzachar@gmail.com /* skip white space */ 538692d97c3Snir.tzachar@gmail.com while (i < org_len && org[i] == ' ') 539692d97c3Snir.tzachar@gmail.com i++; 540692d97c3Snir.tzachar@gmail.com if (i == org_len) 541692d97c3Snir.tzachar@gmail.com return -1; 542692d97c3Snir.tzachar@gmail.com /* if encountering '(' or '<' or '[', find the match and look from there 543692d97c3Snir.tzachar@gmail.com **/ 544692d97c3Snir.tzachar@gmail.com if (org[i] == '[' || org[i] == '<' || org[i] == '(') { 545692d97c3Snir.tzachar@gmail.com i++; 546692d97c3Snir.tzachar@gmail.com for (; i < org_len; i++) 547692d97c3Snir.tzachar@gmail.com if (org[i] == ']' || org[i] == '>' || org[i] == ')') 548692d97c3Snir.tzachar@gmail.com break; 549692d97c3Snir.tzachar@gmail.com } 550692d97c3Snir.tzachar@gmail.com if (i == org_len) 551692d97c3Snir.tzachar@gmail.com return -1; 552692d97c3Snir.tzachar@gmail.com for (; i < org_len; i++) { 553692d97c3Snir.tzachar@gmail.com if (canbhot(org[i]) && org[i-1] != '<' && org[i-1] != '(') { 554692d97c3Snir.tzachar@gmail.com position = i; 555692d97c3Snir.tzachar@gmail.com break; 556692d97c3Snir.tzachar@gmail.com } 557692d97c3Snir.tzachar@gmail.com } 558692d97c3Snir.tzachar@gmail.com if (position == -1) 559692d97c3Snir.tzachar@gmail.com return 1; 560692d97c3Snir.tzachar@gmail.com 561692d97c3Snir.tzachar@gmail.com /* ok, char at org[position] should be a hot key to this item */ 562692d97c3Snir.tzachar@gmail.com c = tolower(org[position]); 563692d97c3Snir.tzachar@gmail.com tmp = hotkeys[c].count; 564692d97c3Snir.tzachar@gmail.com hotkeys[c].ptrs[tmp] = index; 565692d97c3Snir.tzachar@gmail.com hotkeys[c].count++; 566692d97c3Snir.tzachar@gmail.com /* 567692d97c3Snir.tzachar@gmail.com snprintf(dest, len, "%.*s(%c)%s", position, org, org[position], 568692d97c3Snir.tzachar@gmail.com &org[position+1]); 569692d97c3Snir.tzachar@gmail.com */ 570692d97c3Snir.tzachar@gmail.com /* make org[position] uppercase, and all leading letter small case */ 571692d97c3Snir.tzachar@gmail.com strncpy(dest, org, len); 572692d97c3Snir.tzachar@gmail.com for (i = 0; i < position; i++) 573692d97c3Snir.tzachar@gmail.com dest[i] = tolower(dest[i]); 574692d97c3Snir.tzachar@gmail.com dest[position] = toupper(dest[position]); 575692d97c3Snir.tzachar@gmail.com k_menu_items[index].is_hot = 1; 576692d97c3Snir.tzachar@gmail.com return 0; 577692d97c3Snir.tzachar@gmail.com } 578692d97c3Snir.tzachar@gmail.com 579692d97c3Snir.tzachar@gmail.com /* Make a new item. Add a hotkey mark in the first possible letter. 580692d97c3Snir.tzachar@gmail.com * As ncurses does not allow any attributes inside menue item, we mark the 581692d97c3Snir.tzachar@gmail.com * hot key as the first capitalized letter in the string */ 582*851190c9SMichal Marek static void item_make(struct menu *menu, char tag, const char *fmt, ...) 583692d97c3Snir.tzachar@gmail.com { 584692d97c3Snir.tzachar@gmail.com va_list ap; 585692d97c3Snir.tzachar@gmail.com char tmp_str[256]; 586692d97c3Snir.tzachar@gmail.com 587692d97c3Snir.tzachar@gmail.com if (items_num > MAX_MENU_ITEMS-1) 588692d97c3Snir.tzachar@gmail.com return; 589692d97c3Snir.tzachar@gmail.com 590692d97c3Snir.tzachar@gmail.com bzero(&k_menu_items[items_num], sizeof(k_menu_items[0])); 591692d97c3Snir.tzachar@gmail.com k_menu_items[items_num].tag = tag; 592692d97c3Snir.tzachar@gmail.com k_menu_items[items_num].usrptr = menu; 593692d97c3Snir.tzachar@gmail.com if (menu != NULL) 594692d97c3Snir.tzachar@gmail.com k_menu_items[items_num].is_visible = 595692d97c3Snir.tzachar@gmail.com menu_is_visible(menu); 596692d97c3Snir.tzachar@gmail.com else 597692d97c3Snir.tzachar@gmail.com k_menu_items[items_num].is_visible = 1; 598692d97c3Snir.tzachar@gmail.com 599692d97c3Snir.tzachar@gmail.com va_start(ap, fmt); 600692d97c3Snir.tzachar@gmail.com vsnprintf(tmp_str, sizeof(tmp_str), fmt, ap); 601692d97c3Snir.tzachar@gmail.com if (!k_menu_items[items_num].is_visible) 602692d97c3Snir.tzachar@gmail.com memcpy(tmp_str, "XXX", 3); 603692d97c3Snir.tzachar@gmail.com va_end(ap); 604692d97c3Snir.tzachar@gmail.com if (make_hot( 605692d97c3Snir.tzachar@gmail.com k_menu_items[items_num].str, 606692d97c3Snir.tzachar@gmail.com sizeof(k_menu_items[items_num].str), tmp_str, items_num) != 0) 607692d97c3Snir.tzachar@gmail.com strncpy(k_menu_items[items_num].str, 608692d97c3Snir.tzachar@gmail.com tmp_str, 609692d97c3Snir.tzachar@gmail.com sizeof(k_menu_items[items_num].str)); 610692d97c3Snir.tzachar@gmail.com 611692d97c3Snir.tzachar@gmail.com curses_menu_items[items_num] = new_item( 612692d97c3Snir.tzachar@gmail.com k_menu_items[items_num].str, 613692d97c3Snir.tzachar@gmail.com k_menu_items[items_num].str); 614692d97c3Snir.tzachar@gmail.com set_item_userptr(curses_menu_items[items_num], 615692d97c3Snir.tzachar@gmail.com &k_menu_items[items_num]); 616692d97c3Snir.tzachar@gmail.com /* 617692d97c3Snir.tzachar@gmail.com if (!k_menu_items[items_num].is_visible) 618692d97c3Snir.tzachar@gmail.com item_opts_off(curses_menu_items[items_num], O_SELECTABLE); 619692d97c3Snir.tzachar@gmail.com */ 620692d97c3Snir.tzachar@gmail.com 621692d97c3Snir.tzachar@gmail.com items_num++; 622692d97c3Snir.tzachar@gmail.com curses_menu_items[items_num] = NULL; 623692d97c3Snir.tzachar@gmail.com } 624692d97c3Snir.tzachar@gmail.com 625692d97c3Snir.tzachar@gmail.com /* very hackish. adds a string to the last item added */ 626*851190c9SMichal Marek static void item_add_str(const char *fmt, ...) 627692d97c3Snir.tzachar@gmail.com { 628692d97c3Snir.tzachar@gmail.com va_list ap; 629692d97c3Snir.tzachar@gmail.com int index = items_num-1; 630692d97c3Snir.tzachar@gmail.com char new_str[256]; 631692d97c3Snir.tzachar@gmail.com char tmp_str[256]; 632692d97c3Snir.tzachar@gmail.com 633692d97c3Snir.tzachar@gmail.com if (index < 0) 634692d97c3Snir.tzachar@gmail.com return; 635692d97c3Snir.tzachar@gmail.com 636692d97c3Snir.tzachar@gmail.com va_start(ap, fmt); 637692d97c3Snir.tzachar@gmail.com vsnprintf(new_str, sizeof(new_str), fmt, ap); 638692d97c3Snir.tzachar@gmail.com va_end(ap); 639692d97c3Snir.tzachar@gmail.com snprintf(tmp_str, sizeof(tmp_str), "%s%s", 640692d97c3Snir.tzachar@gmail.com k_menu_items[index].str, new_str); 641692d97c3Snir.tzachar@gmail.com if (make_hot(k_menu_items[index].str, 642692d97c3Snir.tzachar@gmail.com sizeof(k_menu_items[index].str), tmp_str, index) != 0) 643692d97c3Snir.tzachar@gmail.com strncpy(k_menu_items[index].str, 644692d97c3Snir.tzachar@gmail.com tmp_str, 645692d97c3Snir.tzachar@gmail.com sizeof(k_menu_items[index].str)); 646692d97c3Snir.tzachar@gmail.com 647692d97c3Snir.tzachar@gmail.com free_item(curses_menu_items[index]); 648692d97c3Snir.tzachar@gmail.com curses_menu_items[index] = new_item( 649692d97c3Snir.tzachar@gmail.com k_menu_items[index].str, 650692d97c3Snir.tzachar@gmail.com k_menu_items[index].str); 651692d97c3Snir.tzachar@gmail.com set_item_userptr(curses_menu_items[index], 652692d97c3Snir.tzachar@gmail.com &k_menu_items[index]); 653692d97c3Snir.tzachar@gmail.com } 654692d97c3Snir.tzachar@gmail.com 655692d97c3Snir.tzachar@gmail.com /* get the tag of the currently selected item */ 656*851190c9SMichal Marek static char item_tag(void) 657692d97c3Snir.tzachar@gmail.com { 658692d97c3Snir.tzachar@gmail.com ITEM *cur; 659692d97c3Snir.tzachar@gmail.com struct mitem *mcur; 660692d97c3Snir.tzachar@gmail.com 661692d97c3Snir.tzachar@gmail.com cur = current_item(curses_menu); 662692d97c3Snir.tzachar@gmail.com if (cur == NULL) 663692d97c3Snir.tzachar@gmail.com return 0; 664692d97c3Snir.tzachar@gmail.com mcur = (struct mitem *) item_userptr(cur); 665692d97c3Snir.tzachar@gmail.com return mcur->tag; 666692d97c3Snir.tzachar@gmail.com } 667692d97c3Snir.tzachar@gmail.com 668*851190c9SMichal Marek static int curses_item_index(void) 669692d97c3Snir.tzachar@gmail.com { 670692d97c3Snir.tzachar@gmail.com return item_index(current_item(curses_menu)); 671692d97c3Snir.tzachar@gmail.com } 672692d97c3Snir.tzachar@gmail.com 673*851190c9SMichal Marek static void *item_data(void) 674692d97c3Snir.tzachar@gmail.com { 675692d97c3Snir.tzachar@gmail.com ITEM *cur; 676692d97c3Snir.tzachar@gmail.com struct mitem *mcur; 677692d97c3Snir.tzachar@gmail.com 678692d97c3Snir.tzachar@gmail.com cur = current_item(curses_menu); 679692d97c3Snir.tzachar@gmail.com mcur = (struct mitem *) item_userptr(cur); 680692d97c3Snir.tzachar@gmail.com return mcur->usrptr; 681692d97c3Snir.tzachar@gmail.com 682692d97c3Snir.tzachar@gmail.com } 683692d97c3Snir.tzachar@gmail.com 684*851190c9SMichal Marek static int item_is_tag(char tag) 685692d97c3Snir.tzachar@gmail.com { 686692d97c3Snir.tzachar@gmail.com return item_tag() == tag; 687692d97c3Snir.tzachar@gmail.com } 688692d97c3Snir.tzachar@gmail.com 689692d97c3Snir.tzachar@gmail.com static char filename[PATH_MAX+1]; 690692d97c3Snir.tzachar@gmail.com static char menu_backtitle[PATH_MAX+128]; 691*851190c9SMichal Marek static const char *set_config_filename(const char *config_filename) 692692d97c3Snir.tzachar@gmail.com { 693692d97c3Snir.tzachar@gmail.com int size; 694692d97c3Snir.tzachar@gmail.com struct symbol *sym; 695692d97c3Snir.tzachar@gmail.com 696692d97c3Snir.tzachar@gmail.com sym = sym_lookup("KERNELVERSION", 0); 697692d97c3Snir.tzachar@gmail.com sym_calc_value(sym); 698692d97c3Snir.tzachar@gmail.com size = snprintf(menu_backtitle, sizeof(menu_backtitle), 699692d97c3Snir.tzachar@gmail.com _("%s - Linux Kernel v%s Configuration"), 700692d97c3Snir.tzachar@gmail.com config_filename, sym_get_string_value(sym)); 701692d97c3Snir.tzachar@gmail.com if (size >= sizeof(menu_backtitle)) 702692d97c3Snir.tzachar@gmail.com menu_backtitle[sizeof(menu_backtitle)-1] = '\0'; 703692d97c3Snir.tzachar@gmail.com 704692d97c3Snir.tzachar@gmail.com size = snprintf(filename, sizeof(filename), "%s", config_filename); 705692d97c3Snir.tzachar@gmail.com if (size >= sizeof(filename)) 706692d97c3Snir.tzachar@gmail.com filename[sizeof(filename)-1] = '\0'; 707692d97c3Snir.tzachar@gmail.com return menu_backtitle; 708692d97c3Snir.tzachar@gmail.com } 709692d97c3Snir.tzachar@gmail.com 710692d97c3Snir.tzachar@gmail.com /* command = 0 is supress, 1 is restore */ 711692d97c3Snir.tzachar@gmail.com static void supress_stdout(int command) 712692d97c3Snir.tzachar@gmail.com { 713692d97c3Snir.tzachar@gmail.com static FILE *org_stdout; 714692d97c3Snir.tzachar@gmail.com static FILE *org_stderr; 715692d97c3Snir.tzachar@gmail.com 716692d97c3Snir.tzachar@gmail.com if (command == 0) { 717692d97c3Snir.tzachar@gmail.com org_stdout = stdout; 718692d97c3Snir.tzachar@gmail.com org_stderr = stderr; 719692d97c3Snir.tzachar@gmail.com stdout = fopen("/dev/null", "a"); 720692d97c3Snir.tzachar@gmail.com stderr = fopen("/dev/null", "a"); 721692d97c3Snir.tzachar@gmail.com } else { 722692d97c3Snir.tzachar@gmail.com fclose(stdout); 723692d97c3Snir.tzachar@gmail.com fclose(stderr); 724692d97c3Snir.tzachar@gmail.com stdout = org_stdout; 725692d97c3Snir.tzachar@gmail.com stderr = org_stderr; 726692d97c3Snir.tzachar@gmail.com } 727692d97c3Snir.tzachar@gmail.com } 728692d97c3Snir.tzachar@gmail.com 729692d97c3Snir.tzachar@gmail.com /* return = 0 means we are successful. 730692d97c3Snir.tzachar@gmail.com * -1 means go on doing what you were doing 731692d97c3Snir.tzachar@gmail.com */ 732692d97c3Snir.tzachar@gmail.com static int do_exit(void) 733692d97c3Snir.tzachar@gmail.com { 734692d97c3Snir.tzachar@gmail.com int res; 735692d97c3Snir.tzachar@gmail.com if (!conf_get_changed()) { 736692d97c3Snir.tzachar@gmail.com global_exit = 1; 737692d97c3Snir.tzachar@gmail.com return 0; 738692d97c3Snir.tzachar@gmail.com } 739692d97c3Snir.tzachar@gmail.com res = btn_dialog(main_window, 740692d97c3Snir.tzachar@gmail.com _("Do you wish to save your " 741692d97c3Snir.tzachar@gmail.com "new kernel configuration?\n" 742692d97c3Snir.tzachar@gmail.com "<ESC> to cancel and resume nconfig."), 743692d97c3Snir.tzachar@gmail.com 2, 744692d97c3Snir.tzachar@gmail.com " <save> ", 745692d97c3Snir.tzachar@gmail.com "<don't save>"); 746692d97c3Snir.tzachar@gmail.com if (res == KEY_EXIT) { 747692d97c3Snir.tzachar@gmail.com global_exit = 0; 748692d97c3Snir.tzachar@gmail.com return -1; 749692d97c3Snir.tzachar@gmail.com } 750692d97c3Snir.tzachar@gmail.com 751692d97c3Snir.tzachar@gmail.com /* if we got here, the user really wants to exit */ 752692d97c3Snir.tzachar@gmail.com switch (res) { 753692d97c3Snir.tzachar@gmail.com case 0: 754692d97c3Snir.tzachar@gmail.com supress_stdout(0); 755692d97c3Snir.tzachar@gmail.com res = conf_write(filename); 756692d97c3Snir.tzachar@gmail.com supress_stdout(1); 757692d97c3Snir.tzachar@gmail.com if (res) 758692d97c3Snir.tzachar@gmail.com btn_dialog( 759692d97c3Snir.tzachar@gmail.com main_window, 760692d97c3Snir.tzachar@gmail.com _("Error during writing of the kernel " 761692d97c3Snir.tzachar@gmail.com "configuration.\n" 762692d97c3Snir.tzachar@gmail.com "Your kernel configuration " 763692d97c3Snir.tzachar@gmail.com "changes were NOT saved."), 764692d97c3Snir.tzachar@gmail.com 1, 765692d97c3Snir.tzachar@gmail.com "<OK>"); 766692d97c3Snir.tzachar@gmail.com else { 767692d97c3Snir.tzachar@gmail.com char buf[1024]; 768692d97c3Snir.tzachar@gmail.com snprintf(buf, 1024, 769692d97c3Snir.tzachar@gmail.com _("Configuration written to %s\n" 770692d97c3Snir.tzachar@gmail.com "End of Linux kernel configuration.\n" 771692d97c3Snir.tzachar@gmail.com "Execute 'make' to build the kernel or try" 772692d97c3Snir.tzachar@gmail.com " 'make help'."), filename); 773692d97c3Snir.tzachar@gmail.com btn_dialog( 774692d97c3Snir.tzachar@gmail.com main_window, 775692d97c3Snir.tzachar@gmail.com buf, 776692d97c3Snir.tzachar@gmail.com 1, 777692d97c3Snir.tzachar@gmail.com "<OK>"); 778692d97c3Snir.tzachar@gmail.com } 779692d97c3Snir.tzachar@gmail.com break; 780692d97c3Snir.tzachar@gmail.com default: 781692d97c3Snir.tzachar@gmail.com btn_dialog( 782692d97c3Snir.tzachar@gmail.com main_window, 783692d97c3Snir.tzachar@gmail.com _("Your kernel configuration changes were NOT saved."), 784692d97c3Snir.tzachar@gmail.com 1, 785692d97c3Snir.tzachar@gmail.com "<OK>"); 786692d97c3Snir.tzachar@gmail.com break; 787692d97c3Snir.tzachar@gmail.com } 788692d97c3Snir.tzachar@gmail.com global_exit = 1; 789692d97c3Snir.tzachar@gmail.com return 0; 790692d97c3Snir.tzachar@gmail.com } 791692d97c3Snir.tzachar@gmail.com 792692d97c3Snir.tzachar@gmail.com 793692d97c3Snir.tzachar@gmail.com static void search_conf(void) 794692d97c3Snir.tzachar@gmail.com { 795692d97c3Snir.tzachar@gmail.com struct symbol **sym_arr; 796692d97c3Snir.tzachar@gmail.com struct gstr res; 797692d97c3Snir.tzachar@gmail.com char dialog_input_result[100]; 798692d97c3Snir.tzachar@gmail.com char *dialog_input; 799692d97c3Snir.tzachar@gmail.com int dres; 800692d97c3Snir.tzachar@gmail.com again: 801692d97c3Snir.tzachar@gmail.com dres = dialog_inputbox(main_window, 802692d97c3Snir.tzachar@gmail.com _("Search Configuration Parameter"), 803692d97c3Snir.tzachar@gmail.com _("Enter CONFIG_ (sub)string to search for " 804692d97c3Snir.tzachar@gmail.com "(with or without \"CONFIG\")"), 805692d97c3Snir.tzachar@gmail.com "", dialog_input_result, 99); 806692d97c3Snir.tzachar@gmail.com switch (dres) { 807692d97c3Snir.tzachar@gmail.com case 0: 808692d97c3Snir.tzachar@gmail.com break; 809692d97c3Snir.tzachar@gmail.com case 1: 810692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 811692d97c3Snir.tzachar@gmail.com _("Search Configuration"), search_help); 812692d97c3Snir.tzachar@gmail.com goto again; 813692d97c3Snir.tzachar@gmail.com default: 814692d97c3Snir.tzachar@gmail.com return; 815692d97c3Snir.tzachar@gmail.com } 816692d97c3Snir.tzachar@gmail.com 817692d97c3Snir.tzachar@gmail.com /* strip CONFIG_ if necessary */ 818692d97c3Snir.tzachar@gmail.com dialog_input = dialog_input_result; 819692d97c3Snir.tzachar@gmail.com if (strncasecmp(dialog_input_result, "CONFIG_", 7) == 0) 820692d97c3Snir.tzachar@gmail.com dialog_input += 7; 821692d97c3Snir.tzachar@gmail.com 822692d97c3Snir.tzachar@gmail.com sym_arr = sym_re_search(dialog_input); 823692d97c3Snir.tzachar@gmail.com res = get_relations_str(sym_arr); 824692d97c3Snir.tzachar@gmail.com free(sym_arr); 825692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 826692d97c3Snir.tzachar@gmail.com _("Search Results"), str_get(&res)); 827692d97c3Snir.tzachar@gmail.com str_free(&res); 828692d97c3Snir.tzachar@gmail.com } 829692d97c3Snir.tzachar@gmail.com 830692d97c3Snir.tzachar@gmail.com 831692d97c3Snir.tzachar@gmail.com static void build_conf(struct menu *menu) 832692d97c3Snir.tzachar@gmail.com { 833692d97c3Snir.tzachar@gmail.com struct symbol *sym; 834692d97c3Snir.tzachar@gmail.com struct property *prop; 835692d97c3Snir.tzachar@gmail.com struct menu *child; 836692d97c3Snir.tzachar@gmail.com int type, tmp, doint = 2; 837692d97c3Snir.tzachar@gmail.com tristate val; 838692d97c3Snir.tzachar@gmail.com char ch; 839692d97c3Snir.tzachar@gmail.com 840692d97c3Snir.tzachar@gmail.com if (!menu || (!show_all_items && !menu_is_visible(menu))) 841692d97c3Snir.tzachar@gmail.com return; 842692d97c3Snir.tzachar@gmail.com 843692d97c3Snir.tzachar@gmail.com sym = menu->sym; 844692d97c3Snir.tzachar@gmail.com prop = menu->prompt; 845692d97c3Snir.tzachar@gmail.com if (!sym) { 846692d97c3Snir.tzachar@gmail.com if (prop && menu != current_menu) { 847692d97c3Snir.tzachar@gmail.com const char *prompt = menu_get_prompt(menu); 848692d97c3Snir.tzachar@gmail.com enum prop_type ptype; 849692d97c3Snir.tzachar@gmail.com ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 850692d97c3Snir.tzachar@gmail.com switch (ptype) { 851692d97c3Snir.tzachar@gmail.com case P_MENU: 852692d97c3Snir.tzachar@gmail.com child_count++; 853692d97c3Snir.tzachar@gmail.com prompt = _(prompt); 854692d97c3Snir.tzachar@gmail.com if (single_menu_mode) { 855692d97c3Snir.tzachar@gmail.com item_make(menu, 'm', 856692d97c3Snir.tzachar@gmail.com "%s%*c%s", 857692d97c3Snir.tzachar@gmail.com menu->data ? "-->" : "++>", 858692d97c3Snir.tzachar@gmail.com indent + 1, ' ', prompt); 859692d97c3Snir.tzachar@gmail.com } else 860692d97c3Snir.tzachar@gmail.com item_make(menu, 'm', 861692d97c3Snir.tzachar@gmail.com " %*c%s --->", 862692d97c3Snir.tzachar@gmail.com indent + 1, 863692d97c3Snir.tzachar@gmail.com ' ', prompt); 864692d97c3Snir.tzachar@gmail.com 865692d97c3Snir.tzachar@gmail.com if (single_menu_mode && menu->data) 866692d97c3Snir.tzachar@gmail.com goto conf_childs; 867692d97c3Snir.tzachar@gmail.com return; 868692d97c3Snir.tzachar@gmail.com case P_COMMENT: 869692d97c3Snir.tzachar@gmail.com if (prompt) { 870692d97c3Snir.tzachar@gmail.com child_count++; 871692d97c3Snir.tzachar@gmail.com item_make(menu, ':', 872692d97c3Snir.tzachar@gmail.com " %*c*** %s ***", 873692d97c3Snir.tzachar@gmail.com indent + 1, ' ', 874692d97c3Snir.tzachar@gmail.com _(prompt)); 875692d97c3Snir.tzachar@gmail.com } 876692d97c3Snir.tzachar@gmail.com break; 877692d97c3Snir.tzachar@gmail.com default: 878692d97c3Snir.tzachar@gmail.com if (prompt) { 879692d97c3Snir.tzachar@gmail.com child_count++; 880692d97c3Snir.tzachar@gmail.com item_make(menu, ':', "---%*c%s", 881692d97c3Snir.tzachar@gmail.com indent + 1, ' ', 882692d97c3Snir.tzachar@gmail.com _(prompt)); 883692d97c3Snir.tzachar@gmail.com } 884692d97c3Snir.tzachar@gmail.com } 885692d97c3Snir.tzachar@gmail.com } else 886692d97c3Snir.tzachar@gmail.com doint = 0; 887692d97c3Snir.tzachar@gmail.com goto conf_childs; 888692d97c3Snir.tzachar@gmail.com } 889692d97c3Snir.tzachar@gmail.com 890692d97c3Snir.tzachar@gmail.com type = sym_get_type(sym); 891692d97c3Snir.tzachar@gmail.com if (sym_is_choice(sym)) { 892692d97c3Snir.tzachar@gmail.com struct symbol *def_sym = sym_get_choice_value(sym); 893692d97c3Snir.tzachar@gmail.com struct menu *def_menu = NULL; 894692d97c3Snir.tzachar@gmail.com 895692d97c3Snir.tzachar@gmail.com child_count++; 896692d97c3Snir.tzachar@gmail.com for (child = menu->list; child; child = child->next) { 897692d97c3Snir.tzachar@gmail.com if (menu_is_visible(child) && child->sym == def_sym) 898692d97c3Snir.tzachar@gmail.com def_menu = child; 899692d97c3Snir.tzachar@gmail.com } 900692d97c3Snir.tzachar@gmail.com 901692d97c3Snir.tzachar@gmail.com val = sym_get_tristate_value(sym); 902692d97c3Snir.tzachar@gmail.com if (sym_is_changable(sym)) { 903692d97c3Snir.tzachar@gmail.com switch (type) { 904692d97c3Snir.tzachar@gmail.com case S_BOOLEAN: 905692d97c3Snir.tzachar@gmail.com item_make(menu, 't', "[%c]", 906692d97c3Snir.tzachar@gmail.com val == no ? ' ' : '*'); 907692d97c3Snir.tzachar@gmail.com break; 908692d97c3Snir.tzachar@gmail.com case S_TRISTATE: 909692d97c3Snir.tzachar@gmail.com switch (val) { 910692d97c3Snir.tzachar@gmail.com case yes: 911692d97c3Snir.tzachar@gmail.com ch = '*'; 912692d97c3Snir.tzachar@gmail.com break; 913692d97c3Snir.tzachar@gmail.com case mod: 914692d97c3Snir.tzachar@gmail.com ch = 'M'; 915692d97c3Snir.tzachar@gmail.com break; 916692d97c3Snir.tzachar@gmail.com default: 917692d97c3Snir.tzachar@gmail.com ch = ' '; 918692d97c3Snir.tzachar@gmail.com break; 919692d97c3Snir.tzachar@gmail.com } 920692d97c3Snir.tzachar@gmail.com item_make(menu, 't', "<%c>", ch); 921692d97c3Snir.tzachar@gmail.com break; 922692d97c3Snir.tzachar@gmail.com } 923692d97c3Snir.tzachar@gmail.com } else { 924692d97c3Snir.tzachar@gmail.com item_make(menu, def_menu ? 't' : ':', " "); 925692d97c3Snir.tzachar@gmail.com } 926692d97c3Snir.tzachar@gmail.com 927692d97c3Snir.tzachar@gmail.com item_add_str("%*c%s", indent + 1, 928692d97c3Snir.tzachar@gmail.com ' ', _(menu_get_prompt(menu))); 929692d97c3Snir.tzachar@gmail.com if (val == yes) { 930692d97c3Snir.tzachar@gmail.com if (def_menu) { 931692d97c3Snir.tzachar@gmail.com item_add_str(" (%s)", 932692d97c3Snir.tzachar@gmail.com _(menu_get_prompt(def_menu))); 933692d97c3Snir.tzachar@gmail.com item_add_str(" --->"); 934692d97c3Snir.tzachar@gmail.com if (def_menu->list) { 935692d97c3Snir.tzachar@gmail.com indent += 2; 936692d97c3Snir.tzachar@gmail.com build_conf(def_menu); 937692d97c3Snir.tzachar@gmail.com indent -= 2; 938692d97c3Snir.tzachar@gmail.com } 939692d97c3Snir.tzachar@gmail.com } 940692d97c3Snir.tzachar@gmail.com return; 941692d97c3Snir.tzachar@gmail.com } 942692d97c3Snir.tzachar@gmail.com } else { 943692d97c3Snir.tzachar@gmail.com if (menu == current_menu) { 944692d97c3Snir.tzachar@gmail.com item_make(menu, ':', 945692d97c3Snir.tzachar@gmail.com "---%*c%s", indent + 1, 946692d97c3Snir.tzachar@gmail.com ' ', _(menu_get_prompt(menu))); 947692d97c3Snir.tzachar@gmail.com goto conf_childs; 948692d97c3Snir.tzachar@gmail.com } 949692d97c3Snir.tzachar@gmail.com child_count++; 950692d97c3Snir.tzachar@gmail.com val = sym_get_tristate_value(sym); 951692d97c3Snir.tzachar@gmail.com if (sym_is_choice_value(sym) && val == yes) { 952692d97c3Snir.tzachar@gmail.com item_make(menu, ':', " "); 953692d97c3Snir.tzachar@gmail.com } else { 954692d97c3Snir.tzachar@gmail.com switch (type) { 955692d97c3Snir.tzachar@gmail.com case S_BOOLEAN: 956692d97c3Snir.tzachar@gmail.com if (sym_is_changable(sym)) 957692d97c3Snir.tzachar@gmail.com item_make(menu, 't', "[%c]", 958692d97c3Snir.tzachar@gmail.com val == no ? ' ' : '*'); 959692d97c3Snir.tzachar@gmail.com else 960692d97c3Snir.tzachar@gmail.com item_make(menu, 't', "-%c-", 961692d97c3Snir.tzachar@gmail.com val == no ? ' ' : '*'); 962692d97c3Snir.tzachar@gmail.com break; 963692d97c3Snir.tzachar@gmail.com case S_TRISTATE: 964692d97c3Snir.tzachar@gmail.com switch (val) { 965692d97c3Snir.tzachar@gmail.com case yes: 966692d97c3Snir.tzachar@gmail.com ch = '*'; 967692d97c3Snir.tzachar@gmail.com break; 968692d97c3Snir.tzachar@gmail.com case mod: 969692d97c3Snir.tzachar@gmail.com ch = 'M'; 970692d97c3Snir.tzachar@gmail.com break; 971692d97c3Snir.tzachar@gmail.com default: 972692d97c3Snir.tzachar@gmail.com ch = ' '; 973692d97c3Snir.tzachar@gmail.com break; 974692d97c3Snir.tzachar@gmail.com } 975692d97c3Snir.tzachar@gmail.com if (sym_is_changable(sym)) { 976692d97c3Snir.tzachar@gmail.com if (sym->rev_dep.tri == mod) 977692d97c3Snir.tzachar@gmail.com item_make(menu, 978692d97c3Snir.tzachar@gmail.com 't', "{%c}", ch); 979692d97c3Snir.tzachar@gmail.com else 980692d97c3Snir.tzachar@gmail.com item_make(menu, 981692d97c3Snir.tzachar@gmail.com 't', "<%c>", ch); 982692d97c3Snir.tzachar@gmail.com } else 983692d97c3Snir.tzachar@gmail.com item_make(menu, 't', "-%c-", ch); 984692d97c3Snir.tzachar@gmail.com break; 985692d97c3Snir.tzachar@gmail.com default: 986692d97c3Snir.tzachar@gmail.com tmp = 2 + strlen(sym_get_string_value(sym)); 987692d97c3Snir.tzachar@gmail.com item_make(menu, 's', "(%s)", 988692d97c3Snir.tzachar@gmail.com sym_get_string_value(sym)); 989692d97c3Snir.tzachar@gmail.com tmp = indent - tmp + 4; 990692d97c3Snir.tzachar@gmail.com if (tmp < 0) 991692d97c3Snir.tzachar@gmail.com tmp = 0; 992692d97c3Snir.tzachar@gmail.com item_add_str("%*c%s%s", tmp, ' ', 993692d97c3Snir.tzachar@gmail.com _(menu_get_prompt(menu)), 994692d97c3Snir.tzachar@gmail.com (sym_has_value(sym) || 995692d97c3Snir.tzachar@gmail.com !sym_is_changable(sym)) ? "" : 996692d97c3Snir.tzachar@gmail.com _(" (NEW)")); 997692d97c3Snir.tzachar@gmail.com goto conf_childs; 998692d97c3Snir.tzachar@gmail.com } 999692d97c3Snir.tzachar@gmail.com } 1000692d97c3Snir.tzachar@gmail.com item_add_str("%*c%s%s", indent + 1, ' ', 1001692d97c3Snir.tzachar@gmail.com _(menu_get_prompt(menu)), 1002692d97c3Snir.tzachar@gmail.com (sym_has_value(sym) || !sym_is_changable(sym)) ? 1003692d97c3Snir.tzachar@gmail.com "" : _(" (NEW)")); 1004692d97c3Snir.tzachar@gmail.com if (menu->prompt && menu->prompt->type == P_MENU) { 1005692d97c3Snir.tzachar@gmail.com item_add_str(" --->"); 1006692d97c3Snir.tzachar@gmail.com return; 1007692d97c3Snir.tzachar@gmail.com } 1008692d97c3Snir.tzachar@gmail.com } 1009692d97c3Snir.tzachar@gmail.com 1010692d97c3Snir.tzachar@gmail.com conf_childs: 1011692d97c3Snir.tzachar@gmail.com indent += doint; 1012692d97c3Snir.tzachar@gmail.com for (child = menu->list; child; child = child->next) 1013692d97c3Snir.tzachar@gmail.com build_conf(child); 1014692d97c3Snir.tzachar@gmail.com indent -= doint; 1015692d97c3Snir.tzachar@gmail.com } 1016692d97c3Snir.tzachar@gmail.com 1017692d97c3Snir.tzachar@gmail.com static void reset_menu(void) 1018692d97c3Snir.tzachar@gmail.com { 1019692d97c3Snir.tzachar@gmail.com unpost_menu(curses_menu); 1020692d97c3Snir.tzachar@gmail.com clean_items(); 1021692d97c3Snir.tzachar@gmail.com } 1022692d97c3Snir.tzachar@gmail.com 1023692d97c3Snir.tzachar@gmail.com /* adjust the menu to show this item. 1024692d97c3Snir.tzachar@gmail.com * prefer not to scroll the menu if possible*/ 1025692d97c3Snir.tzachar@gmail.com static void center_item(int selected_index, int *last_top_row) 1026692d97c3Snir.tzachar@gmail.com { 1027692d97c3Snir.tzachar@gmail.com int toprow; 1028692d97c3Snir.tzachar@gmail.com int maxy, maxx; 1029692d97c3Snir.tzachar@gmail.com 1030692d97c3Snir.tzachar@gmail.com scale_menu(curses_menu, &maxy, &maxx); 1031692d97c3Snir.tzachar@gmail.com set_top_row(curses_menu, *last_top_row); 1032692d97c3Snir.tzachar@gmail.com toprow = top_row(curses_menu); 1033692d97c3Snir.tzachar@gmail.com if (selected_index >= toprow && selected_index < toprow+maxy) { 1034692d97c3Snir.tzachar@gmail.com /* we can only move the selected item. no need to scroll */ 1035692d97c3Snir.tzachar@gmail.com set_current_item(curses_menu, 1036692d97c3Snir.tzachar@gmail.com curses_menu_items[selected_index]); 1037692d97c3Snir.tzachar@gmail.com } else { 1038692d97c3Snir.tzachar@gmail.com toprow = max(selected_index-maxy/2, 0); 1039692d97c3Snir.tzachar@gmail.com if (toprow >= item_count(curses_menu)-maxy) 1040692d97c3Snir.tzachar@gmail.com toprow = item_count(curses_menu)-mwin_max_lines; 1041692d97c3Snir.tzachar@gmail.com set_top_row(curses_menu, toprow); 1042692d97c3Snir.tzachar@gmail.com set_current_item(curses_menu, 1043692d97c3Snir.tzachar@gmail.com curses_menu_items[selected_index]); 1044692d97c3Snir.tzachar@gmail.com } 1045692d97c3Snir.tzachar@gmail.com *last_top_row = toprow; 1046692d97c3Snir.tzachar@gmail.com post_menu(curses_menu); 1047692d97c3Snir.tzachar@gmail.com refresh_all_windows(main_window); 1048692d97c3Snir.tzachar@gmail.com } 1049692d97c3Snir.tzachar@gmail.com 1050692d97c3Snir.tzachar@gmail.com /* this function assumes reset_menu has been called before */ 1051692d97c3Snir.tzachar@gmail.com static void show_menu(const char *prompt, const char *instructions, 1052692d97c3Snir.tzachar@gmail.com int selected_index, int *last_top_row) 1053692d97c3Snir.tzachar@gmail.com { 1054692d97c3Snir.tzachar@gmail.com int maxx, maxy; 1055692d97c3Snir.tzachar@gmail.com WINDOW *menu_window; 1056692d97c3Snir.tzachar@gmail.com 1057692d97c3Snir.tzachar@gmail.com current_instructions = instructions; 1058692d97c3Snir.tzachar@gmail.com 1059692d97c3Snir.tzachar@gmail.com clear(); 1060692d97c3Snir.tzachar@gmail.com wattrset(main_window, attributes[NORMAL]); 1061692d97c3Snir.tzachar@gmail.com print_in_middle(stdscr, 1, 0, COLS, 1062692d97c3Snir.tzachar@gmail.com menu_backtitle, 1063692d97c3Snir.tzachar@gmail.com attributes[MAIN_HEADING]); 1064692d97c3Snir.tzachar@gmail.com 1065692d97c3Snir.tzachar@gmail.com wattrset(main_window, attributes[MAIN_MENU_BOX]); 1066692d97c3Snir.tzachar@gmail.com box(main_window, 0, 0); 1067692d97c3Snir.tzachar@gmail.com wattrset(main_window, attributes[MAIN_MENU_HEADING]); 1068692d97c3Snir.tzachar@gmail.com mvwprintw(main_window, 0, 3, " %s ", prompt); 1069692d97c3Snir.tzachar@gmail.com wattrset(main_window, attributes[NORMAL]); 1070692d97c3Snir.tzachar@gmail.com 1071692d97c3Snir.tzachar@gmail.com set_menu_items(curses_menu, curses_menu_items); 1072692d97c3Snir.tzachar@gmail.com 1073692d97c3Snir.tzachar@gmail.com /* position the menu at the middle of the screen */ 1074692d97c3Snir.tzachar@gmail.com scale_menu(curses_menu, &maxy, &maxx); 1075692d97c3Snir.tzachar@gmail.com maxx = min(maxx, mwin_max_cols); 1076692d97c3Snir.tzachar@gmail.com maxy = mwin_max_lines-1; 1077692d97c3Snir.tzachar@gmail.com menu_window = derwin(main_window, 1078692d97c3Snir.tzachar@gmail.com maxy, 1079692d97c3Snir.tzachar@gmail.com maxx, 1080692d97c3Snir.tzachar@gmail.com 2, 1081692d97c3Snir.tzachar@gmail.com (mwin_max_cols-maxx)/2); 1082692d97c3Snir.tzachar@gmail.com keypad(menu_window, TRUE); 1083692d97c3Snir.tzachar@gmail.com set_menu_win(curses_menu, menu_window); 1084692d97c3Snir.tzachar@gmail.com set_menu_sub(curses_menu, menu_window); 1085692d97c3Snir.tzachar@gmail.com 1086692d97c3Snir.tzachar@gmail.com /* must reassert this after changing items, otherwise returns to a 1087692d97c3Snir.tzachar@gmail.com * default of 16 1088692d97c3Snir.tzachar@gmail.com */ 1089692d97c3Snir.tzachar@gmail.com set_menu_format(curses_menu, maxy, 1); 1090692d97c3Snir.tzachar@gmail.com center_item(selected_index, last_top_row); 1091692d97c3Snir.tzachar@gmail.com set_menu_format(curses_menu, maxy, 1); 1092692d97c3Snir.tzachar@gmail.com 1093692d97c3Snir.tzachar@gmail.com print_function_line(); 1094692d97c3Snir.tzachar@gmail.com 1095692d97c3Snir.tzachar@gmail.com /* Post the menu */ 1096692d97c3Snir.tzachar@gmail.com post_menu(curses_menu); 1097692d97c3Snir.tzachar@gmail.com refresh_all_windows(main_window); 1098692d97c3Snir.tzachar@gmail.com } 1099692d97c3Snir.tzachar@gmail.com 1100692d97c3Snir.tzachar@gmail.com 1101692d97c3Snir.tzachar@gmail.com static void conf(struct menu *menu) 1102692d97c3Snir.tzachar@gmail.com { 1103692d97c3Snir.tzachar@gmail.com char pattern[256]; 1104692d97c3Snir.tzachar@gmail.com struct menu *submenu = 0; 1105692d97c3Snir.tzachar@gmail.com const char *prompt = menu_get_prompt(menu); 1106692d97c3Snir.tzachar@gmail.com struct symbol *sym; 1107692d97c3Snir.tzachar@gmail.com struct menu *active_menu = NULL; 1108692d97c3Snir.tzachar@gmail.com int res; 1109692d97c3Snir.tzachar@gmail.com int current_index = 0; 1110692d97c3Snir.tzachar@gmail.com int last_top_row = 0; 1111692d97c3Snir.tzachar@gmail.com 1112692d97c3Snir.tzachar@gmail.com bzero(pattern, sizeof(pattern)); 1113692d97c3Snir.tzachar@gmail.com 1114692d97c3Snir.tzachar@gmail.com while (!global_exit) { 1115692d97c3Snir.tzachar@gmail.com reset_menu(); 1116692d97c3Snir.tzachar@gmail.com current_menu = menu; 1117692d97c3Snir.tzachar@gmail.com build_conf(menu); 1118692d97c3Snir.tzachar@gmail.com if (!child_count) 1119692d97c3Snir.tzachar@gmail.com break; 1120692d97c3Snir.tzachar@gmail.com 1121692d97c3Snir.tzachar@gmail.com show_menu(prompt ? _(prompt) : _("Main Menu"), 1122692d97c3Snir.tzachar@gmail.com _(menu_instructions), 1123692d97c3Snir.tzachar@gmail.com current_index, &last_top_row); 1124692d97c3Snir.tzachar@gmail.com keypad((menu_win(curses_menu)), TRUE); 1125692d97c3Snir.tzachar@gmail.com while (!global_exit && (res = wgetch(menu_win(curses_menu)))) { 1126692d97c3Snir.tzachar@gmail.com if (process_special_keys(&res, 1127692d97c3Snir.tzachar@gmail.com (struct menu *) item_data())) 1128692d97c3Snir.tzachar@gmail.com break; 1129692d97c3Snir.tzachar@gmail.com switch (res) { 1130692d97c3Snir.tzachar@gmail.com case KEY_DOWN: 1131692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_DOWN_ITEM); 1132692d97c3Snir.tzachar@gmail.com break; 1133692d97c3Snir.tzachar@gmail.com case KEY_UP: 1134692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_UP_ITEM); 1135692d97c3Snir.tzachar@gmail.com break; 1136692d97c3Snir.tzachar@gmail.com case KEY_NPAGE: 1137692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_SCR_DPAGE); 1138692d97c3Snir.tzachar@gmail.com break; 1139692d97c3Snir.tzachar@gmail.com case KEY_PPAGE: 1140692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_SCR_UPAGE); 1141692d97c3Snir.tzachar@gmail.com break; 1142692d97c3Snir.tzachar@gmail.com case KEY_HOME: 1143692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_FIRST_ITEM); 1144692d97c3Snir.tzachar@gmail.com break; 1145692d97c3Snir.tzachar@gmail.com case KEY_END: 1146692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_LAST_ITEM); 1147692d97c3Snir.tzachar@gmail.com break; 1148692d97c3Snir.tzachar@gmail.com case 'h': 1149692d97c3Snir.tzachar@gmail.com case '?': 1150692d97c3Snir.tzachar@gmail.com show_help((struct menu *) item_data()); 1151692d97c3Snir.tzachar@gmail.com break; 1152692d97c3Snir.tzachar@gmail.com } 1153692d97c3Snir.tzachar@gmail.com if (res == 10 || res == 27 || 1154692d97c3Snir.tzachar@gmail.com res == 32 || res == 'n' || res == 'y' || 1155692d97c3Snir.tzachar@gmail.com res == KEY_LEFT || res == KEY_RIGHT || 1156692d97c3Snir.tzachar@gmail.com res == 'm' || res == '/') 1157692d97c3Snir.tzachar@gmail.com break; 1158692d97c3Snir.tzachar@gmail.com else if (canbhot(res)) { 1159692d97c3Snir.tzachar@gmail.com /* check for hot keys: */ 1160692d97c3Snir.tzachar@gmail.com int tmp = get_next_hot(res); 1161692d97c3Snir.tzachar@gmail.com if (tmp != -1) 1162692d97c3Snir.tzachar@gmail.com center_item(tmp, &last_top_row); 1163692d97c3Snir.tzachar@gmail.com } 1164692d97c3Snir.tzachar@gmail.com refresh_all_windows(main_window); 1165692d97c3Snir.tzachar@gmail.com } 1166692d97c3Snir.tzachar@gmail.com 1167692d97c3Snir.tzachar@gmail.com refresh_all_windows(main_window); 1168692d97c3Snir.tzachar@gmail.com /* if ESC or left*/ 1169692d97c3Snir.tzachar@gmail.com if (res == 27 || (menu != &rootmenu && res == KEY_LEFT)) 1170692d97c3Snir.tzachar@gmail.com break; 1171692d97c3Snir.tzachar@gmail.com 1172692d97c3Snir.tzachar@gmail.com /* remember location in the menu */ 1173692d97c3Snir.tzachar@gmail.com last_top_row = top_row(curses_menu); 1174692d97c3Snir.tzachar@gmail.com current_index = curses_item_index(); 1175692d97c3Snir.tzachar@gmail.com 1176692d97c3Snir.tzachar@gmail.com if (!item_tag()) 1177692d97c3Snir.tzachar@gmail.com continue; 1178692d97c3Snir.tzachar@gmail.com 1179692d97c3Snir.tzachar@gmail.com submenu = (struct menu *) item_data(); 1180692d97c3Snir.tzachar@gmail.com active_menu = (struct menu *)item_data(); 1181692d97c3Snir.tzachar@gmail.com if (!submenu || !menu_is_visible(submenu)) 1182692d97c3Snir.tzachar@gmail.com continue; 1183692d97c3Snir.tzachar@gmail.com if (submenu) 1184692d97c3Snir.tzachar@gmail.com sym = submenu->sym; 1185692d97c3Snir.tzachar@gmail.com else 1186692d97c3Snir.tzachar@gmail.com sym = NULL; 1187692d97c3Snir.tzachar@gmail.com 1188692d97c3Snir.tzachar@gmail.com switch (res) { 1189692d97c3Snir.tzachar@gmail.com case ' ': 1190692d97c3Snir.tzachar@gmail.com if (item_is_tag('t')) 1191692d97c3Snir.tzachar@gmail.com sym_toggle_tristate_value(sym); 1192692d97c3Snir.tzachar@gmail.com else if (item_is_tag('m')) 1193692d97c3Snir.tzachar@gmail.com conf(submenu); 1194692d97c3Snir.tzachar@gmail.com break; 1195692d97c3Snir.tzachar@gmail.com case KEY_RIGHT: 1196692d97c3Snir.tzachar@gmail.com case 10: /* ENTER WAS PRESSED */ 1197692d97c3Snir.tzachar@gmail.com switch (item_tag()) { 1198692d97c3Snir.tzachar@gmail.com case 'm': 1199692d97c3Snir.tzachar@gmail.com if (single_menu_mode) 1200692d97c3Snir.tzachar@gmail.com submenu->data = 1201692d97c3Snir.tzachar@gmail.com (void *) (long) !submenu->data; 1202692d97c3Snir.tzachar@gmail.com else 1203692d97c3Snir.tzachar@gmail.com conf(submenu); 1204692d97c3Snir.tzachar@gmail.com break; 1205692d97c3Snir.tzachar@gmail.com case 't': 1206692d97c3Snir.tzachar@gmail.com if (sym_is_choice(sym) && 1207692d97c3Snir.tzachar@gmail.com sym_get_tristate_value(sym) == yes) 1208692d97c3Snir.tzachar@gmail.com conf_choice(submenu); 1209692d97c3Snir.tzachar@gmail.com else if (submenu->prompt && 1210692d97c3Snir.tzachar@gmail.com submenu->prompt->type == P_MENU) 1211692d97c3Snir.tzachar@gmail.com conf(submenu); 1212692d97c3Snir.tzachar@gmail.com else if (res == 10) 1213692d97c3Snir.tzachar@gmail.com sym_toggle_tristate_value(sym); 1214692d97c3Snir.tzachar@gmail.com break; 1215692d97c3Snir.tzachar@gmail.com case 's': 1216692d97c3Snir.tzachar@gmail.com conf_string(submenu); 1217692d97c3Snir.tzachar@gmail.com break; 1218692d97c3Snir.tzachar@gmail.com } 1219692d97c3Snir.tzachar@gmail.com break; 1220692d97c3Snir.tzachar@gmail.com case 'y': 1221692d97c3Snir.tzachar@gmail.com if (item_is_tag('t')) { 1222692d97c3Snir.tzachar@gmail.com if (sym_set_tristate_value(sym, yes)) 1223692d97c3Snir.tzachar@gmail.com break; 1224692d97c3Snir.tzachar@gmail.com if (sym_set_tristate_value(sym, mod)) 1225692d97c3Snir.tzachar@gmail.com btn_dialog(main_window, setmod_text, 0); 1226692d97c3Snir.tzachar@gmail.com } 1227692d97c3Snir.tzachar@gmail.com break; 1228692d97c3Snir.tzachar@gmail.com case 'n': 1229692d97c3Snir.tzachar@gmail.com if (item_is_tag('t')) 1230692d97c3Snir.tzachar@gmail.com sym_set_tristate_value(sym, no); 1231692d97c3Snir.tzachar@gmail.com break; 1232692d97c3Snir.tzachar@gmail.com case 'm': 1233692d97c3Snir.tzachar@gmail.com if (item_is_tag('t')) 1234692d97c3Snir.tzachar@gmail.com sym_set_tristate_value(sym, mod); 1235692d97c3Snir.tzachar@gmail.com break; 1236692d97c3Snir.tzachar@gmail.com case '/': 1237692d97c3Snir.tzachar@gmail.com search_conf(); 1238692d97c3Snir.tzachar@gmail.com break; 1239692d97c3Snir.tzachar@gmail.com } 1240692d97c3Snir.tzachar@gmail.com } 1241692d97c3Snir.tzachar@gmail.com } 1242692d97c3Snir.tzachar@gmail.com 1243692d97c3Snir.tzachar@gmail.com static void show_help(struct menu *menu) 1244692d97c3Snir.tzachar@gmail.com { 1245692d97c3Snir.tzachar@gmail.com struct gstr help = str_new(); 1246692d97c3Snir.tzachar@gmail.com 1247692d97c3Snir.tzachar@gmail.com if (menu && menu->sym && menu_has_help(menu)) { 1248692d97c3Snir.tzachar@gmail.com if (menu->sym->name) { 1249692d97c3Snir.tzachar@gmail.com str_printf(&help, "CONFIG_%s:\n\n", menu->sym->name); 1250692d97c3Snir.tzachar@gmail.com str_append(&help, _(menu_get_help(menu))); 1251692d97c3Snir.tzachar@gmail.com str_append(&help, "\n"); 1252692d97c3Snir.tzachar@gmail.com get_symbol_str(&help, menu->sym); 1253692d97c3Snir.tzachar@gmail.com } 1254692d97c3Snir.tzachar@gmail.com } else { 1255692d97c3Snir.tzachar@gmail.com str_append(&help, nohelp_text); 1256692d97c3Snir.tzachar@gmail.com } 1257692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, _(menu_get_prompt(menu)), str_get(&help)); 1258692d97c3Snir.tzachar@gmail.com str_free(&help); 1259692d97c3Snir.tzachar@gmail.com } 1260692d97c3Snir.tzachar@gmail.com 1261692d97c3Snir.tzachar@gmail.com static void conf_choice(struct menu *menu) 1262692d97c3Snir.tzachar@gmail.com { 1263692d97c3Snir.tzachar@gmail.com const char *prompt = _(menu_get_prompt(menu)); 1264692d97c3Snir.tzachar@gmail.com struct menu *child = 0; 1265692d97c3Snir.tzachar@gmail.com struct symbol *active; 1266692d97c3Snir.tzachar@gmail.com int selected_index = 0; 1267692d97c3Snir.tzachar@gmail.com int last_top_row = 0; 1268692d97c3Snir.tzachar@gmail.com int res, i = 0; 1269692d97c3Snir.tzachar@gmail.com 1270692d97c3Snir.tzachar@gmail.com active = sym_get_choice_value(menu->sym); 1271692d97c3Snir.tzachar@gmail.com /* this is mostly duplicated from the conf() function. */ 1272692d97c3Snir.tzachar@gmail.com while (!global_exit) { 1273692d97c3Snir.tzachar@gmail.com reset_menu(); 1274692d97c3Snir.tzachar@gmail.com 1275692d97c3Snir.tzachar@gmail.com for (i = 0, child = menu->list; child; child = child->next) { 1276692d97c3Snir.tzachar@gmail.com if (!show_all_items && !menu_is_visible(child)) 1277692d97c3Snir.tzachar@gmail.com continue; 1278692d97c3Snir.tzachar@gmail.com 1279692d97c3Snir.tzachar@gmail.com if (child->sym == sym_get_choice_value(menu->sym)) 1280692d97c3Snir.tzachar@gmail.com item_make(child, ':', "<X> %s", 1281692d97c3Snir.tzachar@gmail.com _(menu_get_prompt(child))); 1282692d97c3Snir.tzachar@gmail.com else 1283692d97c3Snir.tzachar@gmail.com item_make(child, ':', " %s", 1284692d97c3Snir.tzachar@gmail.com _(menu_get_prompt(child))); 1285692d97c3Snir.tzachar@gmail.com if (child->sym == active){ 1286692d97c3Snir.tzachar@gmail.com last_top_row = top_row(curses_menu); 1287692d97c3Snir.tzachar@gmail.com selected_index = i; 1288692d97c3Snir.tzachar@gmail.com } 1289692d97c3Snir.tzachar@gmail.com i++; 1290692d97c3Snir.tzachar@gmail.com } 1291692d97c3Snir.tzachar@gmail.com show_menu(prompt ? _(prompt) : _("Choice Menu"), 1292692d97c3Snir.tzachar@gmail.com _(radiolist_instructions), 1293692d97c3Snir.tzachar@gmail.com selected_index, 1294692d97c3Snir.tzachar@gmail.com &last_top_row); 1295692d97c3Snir.tzachar@gmail.com while (!global_exit && (res = wgetch(menu_win(curses_menu)))) { 1296692d97c3Snir.tzachar@gmail.com if (process_special_keys( 1297692d97c3Snir.tzachar@gmail.com &res, 1298692d97c3Snir.tzachar@gmail.com (struct menu *) item_data())) 1299692d97c3Snir.tzachar@gmail.com break; 1300692d97c3Snir.tzachar@gmail.com switch (res) { 1301692d97c3Snir.tzachar@gmail.com case KEY_DOWN: 1302692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_DOWN_ITEM); 1303692d97c3Snir.tzachar@gmail.com break; 1304692d97c3Snir.tzachar@gmail.com case KEY_UP: 1305692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_UP_ITEM); 1306692d97c3Snir.tzachar@gmail.com break; 1307692d97c3Snir.tzachar@gmail.com case KEY_NPAGE: 1308692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_SCR_DPAGE); 1309692d97c3Snir.tzachar@gmail.com break; 1310692d97c3Snir.tzachar@gmail.com case KEY_PPAGE: 1311692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_SCR_UPAGE); 1312692d97c3Snir.tzachar@gmail.com break; 1313692d97c3Snir.tzachar@gmail.com case KEY_HOME: 1314692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_FIRST_ITEM); 1315692d97c3Snir.tzachar@gmail.com break; 1316692d97c3Snir.tzachar@gmail.com case KEY_END: 1317692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_LAST_ITEM); 1318692d97c3Snir.tzachar@gmail.com break; 1319692d97c3Snir.tzachar@gmail.com case 'h': 1320692d97c3Snir.tzachar@gmail.com case '?': 1321692d97c3Snir.tzachar@gmail.com show_help((struct menu *) item_data()); 1322692d97c3Snir.tzachar@gmail.com break; 1323692d97c3Snir.tzachar@gmail.com } 1324692d97c3Snir.tzachar@gmail.com if (res == 10 || res == 27 || res == ' ' || 1325692d97c3Snir.tzachar@gmail.com res == KEY_LEFT) 1326692d97c3Snir.tzachar@gmail.com break; 1327692d97c3Snir.tzachar@gmail.com else if (canbhot(res)) { 1328692d97c3Snir.tzachar@gmail.com /* check for hot keys: */ 1329692d97c3Snir.tzachar@gmail.com int tmp = get_next_hot(res); 1330692d97c3Snir.tzachar@gmail.com if (tmp != -1) 1331692d97c3Snir.tzachar@gmail.com center_item(tmp, &last_top_row); 1332692d97c3Snir.tzachar@gmail.com } 1333692d97c3Snir.tzachar@gmail.com refresh_all_windows(main_window); 1334692d97c3Snir.tzachar@gmail.com } 1335692d97c3Snir.tzachar@gmail.com /* if ESC or left */ 1336692d97c3Snir.tzachar@gmail.com if (res == 27 || res == KEY_LEFT) 1337692d97c3Snir.tzachar@gmail.com break; 1338692d97c3Snir.tzachar@gmail.com 1339692d97c3Snir.tzachar@gmail.com child = item_data(); 1340692d97c3Snir.tzachar@gmail.com if (!child || !menu_is_visible(child)) 1341692d97c3Snir.tzachar@gmail.com continue; 1342692d97c3Snir.tzachar@gmail.com switch (res) { 1343692d97c3Snir.tzachar@gmail.com case ' ': 1344692d97c3Snir.tzachar@gmail.com case 10: 1345692d97c3Snir.tzachar@gmail.com case KEY_RIGHT: 1346692d97c3Snir.tzachar@gmail.com sym_set_tristate_value(child->sym, yes); 1347692d97c3Snir.tzachar@gmail.com return; 1348692d97c3Snir.tzachar@gmail.com case 'h': 1349692d97c3Snir.tzachar@gmail.com case '?': 1350692d97c3Snir.tzachar@gmail.com show_help(child); 1351692d97c3Snir.tzachar@gmail.com active = child->sym; 1352692d97c3Snir.tzachar@gmail.com break; 1353692d97c3Snir.tzachar@gmail.com case KEY_EXIT: 1354692d97c3Snir.tzachar@gmail.com return; 1355692d97c3Snir.tzachar@gmail.com } 1356692d97c3Snir.tzachar@gmail.com } 1357692d97c3Snir.tzachar@gmail.com } 1358692d97c3Snir.tzachar@gmail.com 1359692d97c3Snir.tzachar@gmail.com static void conf_string(struct menu *menu) 1360692d97c3Snir.tzachar@gmail.com { 1361692d97c3Snir.tzachar@gmail.com const char *prompt = menu_get_prompt(menu); 1362692d97c3Snir.tzachar@gmail.com char dialog_input_result[256]; 1363692d97c3Snir.tzachar@gmail.com 1364692d97c3Snir.tzachar@gmail.com while (1) { 1365692d97c3Snir.tzachar@gmail.com int res; 1366692d97c3Snir.tzachar@gmail.com const char *heading; 1367692d97c3Snir.tzachar@gmail.com 1368692d97c3Snir.tzachar@gmail.com switch (sym_get_type(menu->sym)) { 1369692d97c3Snir.tzachar@gmail.com case S_INT: 1370692d97c3Snir.tzachar@gmail.com heading = _(inputbox_instructions_int); 1371692d97c3Snir.tzachar@gmail.com break; 1372692d97c3Snir.tzachar@gmail.com case S_HEX: 1373692d97c3Snir.tzachar@gmail.com heading = _(inputbox_instructions_hex); 1374692d97c3Snir.tzachar@gmail.com break; 1375692d97c3Snir.tzachar@gmail.com case S_STRING: 1376692d97c3Snir.tzachar@gmail.com heading = _(inputbox_instructions_string); 1377692d97c3Snir.tzachar@gmail.com break; 1378692d97c3Snir.tzachar@gmail.com default: 1379692d97c3Snir.tzachar@gmail.com heading = _("Internal nconf error!"); 1380692d97c3Snir.tzachar@gmail.com } 1381692d97c3Snir.tzachar@gmail.com res = dialog_inputbox(main_window, 1382692d97c3Snir.tzachar@gmail.com prompt ? _(prompt) : _("Main Menu"), 1383692d97c3Snir.tzachar@gmail.com heading, 1384692d97c3Snir.tzachar@gmail.com sym_get_string_value(menu->sym), 1385692d97c3Snir.tzachar@gmail.com dialog_input_result, 1386692d97c3Snir.tzachar@gmail.com sizeof(dialog_input_result)); 1387692d97c3Snir.tzachar@gmail.com switch (res) { 1388692d97c3Snir.tzachar@gmail.com case 0: 1389692d97c3Snir.tzachar@gmail.com if (sym_set_string_value(menu->sym, 1390692d97c3Snir.tzachar@gmail.com dialog_input_result)) 1391692d97c3Snir.tzachar@gmail.com return; 1392692d97c3Snir.tzachar@gmail.com btn_dialog(main_window, 1393692d97c3Snir.tzachar@gmail.com _("You have made an invalid entry."), 0); 1394692d97c3Snir.tzachar@gmail.com break; 1395692d97c3Snir.tzachar@gmail.com case 1: 1396692d97c3Snir.tzachar@gmail.com show_help(menu); 1397692d97c3Snir.tzachar@gmail.com break; 1398692d97c3Snir.tzachar@gmail.com case KEY_EXIT: 1399692d97c3Snir.tzachar@gmail.com return; 1400692d97c3Snir.tzachar@gmail.com } 1401692d97c3Snir.tzachar@gmail.com } 1402692d97c3Snir.tzachar@gmail.com } 1403692d97c3Snir.tzachar@gmail.com 1404692d97c3Snir.tzachar@gmail.com static void conf_load(void) 1405692d97c3Snir.tzachar@gmail.com { 1406692d97c3Snir.tzachar@gmail.com char dialog_input_result[256]; 1407692d97c3Snir.tzachar@gmail.com while (1) { 1408692d97c3Snir.tzachar@gmail.com int res; 1409692d97c3Snir.tzachar@gmail.com res = dialog_inputbox(main_window, 1410692d97c3Snir.tzachar@gmail.com NULL, load_config_text, 1411692d97c3Snir.tzachar@gmail.com filename, 1412692d97c3Snir.tzachar@gmail.com dialog_input_result, 1413692d97c3Snir.tzachar@gmail.com sizeof(dialog_input_result)); 1414692d97c3Snir.tzachar@gmail.com switch (res) { 1415692d97c3Snir.tzachar@gmail.com case 0: 1416692d97c3Snir.tzachar@gmail.com if (!dialog_input_result[0]) 1417692d97c3Snir.tzachar@gmail.com return; 1418692d97c3Snir.tzachar@gmail.com if (!conf_read(dialog_input_result)) { 1419692d97c3Snir.tzachar@gmail.com set_config_filename(dialog_input_result); 1420692d97c3Snir.tzachar@gmail.com sym_set_change_count(1); 1421692d97c3Snir.tzachar@gmail.com return; 1422692d97c3Snir.tzachar@gmail.com } 1423692d97c3Snir.tzachar@gmail.com btn_dialog(main_window, _("File does not exist!"), 0); 1424692d97c3Snir.tzachar@gmail.com break; 1425692d97c3Snir.tzachar@gmail.com case 1: 1426692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 1427692d97c3Snir.tzachar@gmail.com _("Load Alternate Configuration"), 1428692d97c3Snir.tzachar@gmail.com load_config_help); 1429692d97c3Snir.tzachar@gmail.com break; 1430692d97c3Snir.tzachar@gmail.com case KEY_EXIT: 1431692d97c3Snir.tzachar@gmail.com return; 1432692d97c3Snir.tzachar@gmail.com } 1433692d97c3Snir.tzachar@gmail.com } 1434692d97c3Snir.tzachar@gmail.com } 1435692d97c3Snir.tzachar@gmail.com 1436692d97c3Snir.tzachar@gmail.com static void conf_save(void) 1437692d97c3Snir.tzachar@gmail.com { 1438692d97c3Snir.tzachar@gmail.com char dialog_input_result[256]; 1439692d97c3Snir.tzachar@gmail.com while (1) { 1440692d97c3Snir.tzachar@gmail.com int res; 1441692d97c3Snir.tzachar@gmail.com res = dialog_inputbox(main_window, 1442692d97c3Snir.tzachar@gmail.com NULL, save_config_text, 1443692d97c3Snir.tzachar@gmail.com filename, 1444692d97c3Snir.tzachar@gmail.com dialog_input_result, 1445692d97c3Snir.tzachar@gmail.com sizeof(dialog_input_result)); 1446692d97c3Snir.tzachar@gmail.com switch (res) { 1447692d97c3Snir.tzachar@gmail.com case 0: 1448692d97c3Snir.tzachar@gmail.com if (!dialog_input_result[0]) 1449692d97c3Snir.tzachar@gmail.com return; 1450692d97c3Snir.tzachar@gmail.com supress_stdout(0); 1451692d97c3Snir.tzachar@gmail.com res = conf_write(dialog_input_result); 1452692d97c3Snir.tzachar@gmail.com supress_stdout(1); 1453692d97c3Snir.tzachar@gmail.com if (!res) { 1454692d97c3Snir.tzachar@gmail.com char buf[1024]; 1455692d97c3Snir.tzachar@gmail.com sprintf(buf, "%s %s", 1456692d97c3Snir.tzachar@gmail.com _("configuration file saved to: "), 1457692d97c3Snir.tzachar@gmail.com dialog_input_result); 1458692d97c3Snir.tzachar@gmail.com btn_dialog(main_window, 1459692d97c3Snir.tzachar@gmail.com buf, 1, "<OK>"); 1460692d97c3Snir.tzachar@gmail.com set_config_filename(dialog_input_result); 1461692d97c3Snir.tzachar@gmail.com return; 1462692d97c3Snir.tzachar@gmail.com } 1463692d97c3Snir.tzachar@gmail.com btn_dialog(main_window, _("Can't create file! " 1464692d97c3Snir.tzachar@gmail.com "Probably a nonexistent directory."), 1465692d97c3Snir.tzachar@gmail.com 1, "<OK>"); 1466692d97c3Snir.tzachar@gmail.com break; 1467692d97c3Snir.tzachar@gmail.com case 1: 1468692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 1469692d97c3Snir.tzachar@gmail.com _("Save Alternate Configuration"), 1470692d97c3Snir.tzachar@gmail.com save_config_help); 1471692d97c3Snir.tzachar@gmail.com break; 1472692d97c3Snir.tzachar@gmail.com case KEY_EXIT: 1473692d97c3Snir.tzachar@gmail.com return; 1474692d97c3Snir.tzachar@gmail.com } 1475692d97c3Snir.tzachar@gmail.com } 1476692d97c3Snir.tzachar@gmail.com } 1477692d97c3Snir.tzachar@gmail.com 1478692d97c3Snir.tzachar@gmail.com void setup_windows(void) 1479692d97c3Snir.tzachar@gmail.com { 1480692d97c3Snir.tzachar@gmail.com if (main_window != NULL) 1481692d97c3Snir.tzachar@gmail.com delwin(main_window); 1482692d97c3Snir.tzachar@gmail.com 1483692d97c3Snir.tzachar@gmail.com /* set up the menu and menu window */ 1484692d97c3Snir.tzachar@gmail.com main_window = newwin(LINES-2, COLS-2, 2, 1); 1485692d97c3Snir.tzachar@gmail.com keypad(main_window, TRUE); 1486692d97c3Snir.tzachar@gmail.com mwin_max_lines = LINES-6; 1487692d97c3Snir.tzachar@gmail.com mwin_max_cols = COLS-6; 1488692d97c3Snir.tzachar@gmail.com 1489692d97c3Snir.tzachar@gmail.com /* panels order is from bottom to top */ 1490692d97c3Snir.tzachar@gmail.com new_panel(main_window); 1491692d97c3Snir.tzachar@gmail.com } 1492692d97c3Snir.tzachar@gmail.com 1493692d97c3Snir.tzachar@gmail.com int main(int ac, char **av) 1494692d97c3Snir.tzachar@gmail.com { 1495692d97c3Snir.tzachar@gmail.com char *mode; 1496692d97c3Snir.tzachar@gmail.com 1497692d97c3Snir.tzachar@gmail.com setlocale(LC_ALL, ""); 1498692d97c3Snir.tzachar@gmail.com bindtextdomain(PACKAGE, LOCALEDIR); 1499692d97c3Snir.tzachar@gmail.com textdomain(PACKAGE); 1500692d97c3Snir.tzachar@gmail.com 1501692d97c3Snir.tzachar@gmail.com conf_parse(av[1]); 1502692d97c3Snir.tzachar@gmail.com conf_read(NULL); 1503692d97c3Snir.tzachar@gmail.com 1504692d97c3Snir.tzachar@gmail.com mode = getenv("NCONFIG_MODE"); 1505692d97c3Snir.tzachar@gmail.com if (mode) { 1506692d97c3Snir.tzachar@gmail.com if (!strcasecmp(mode, "single_menu")) 1507692d97c3Snir.tzachar@gmail.com single_menu_mode = 1; 1508692d97c3Snir.tzachar@gmail.com } 1509692d97c3Snir.tzachar@gmail.com 1510692d97c3Snir.tzachar@gmail.com /* Initialize curses */ 1511692d97c3Snir.tzachar@gmail.com initscr(); 1512692d97c3Snir.tzachar@gmail.com /* set color theme */ 1513692d97c3Snir.tzachar@gmail.com set_colors(); 1514692d97c3Snir.tzachar@gmail.com 1515692d97c3Snir.tzachar@gmail.com cbreak(); 1516692d97c3Snir.tzachar@gmail.com noecho(); 1517692d97c3Snir.tzachar@gmail.com keypad(stdscr, TRUE); 1518692d97c3Snir.tzachar@gmail.com curs_set(0); 1519692d97c3Snir.tzachar@gmail.com 1520692d97c3Snir.tzachar@gmail.com if (COLS < 75 || LINES < 20) { 1521692d97c3Snir.tzachar@gmail.com endwin(); 1522692d97c3Snir.tzachar@gmail.com printf("Your terminal should have at " 1523692d97c3Snir.tzachar@gmail.com "least 20 lines and 75 columns\n"); 1524692d97c3Snir.tzachar@gmail.com return 1; 1525692d97c3Snir.tzachar@gmail.com } 1526692d97c3Snir.tzachar@gmail.com 1527692d97c3Snir.tzachar@gmail.com notimeout(stdscr, FALSE); 1528692d97c3Snir.tzachar@gmail.com ESCDELAY = 1; 1529692d97c3Snir.tzachar@gmail.com 1530692d97c3Snir.tzachar@gmail.com /* set btns menu */ 1531692d97c3Snir.tzachar@gmail.com curses_menu = new_menu(curses_menu_items); 1532692d97c3Snir.tzachar@gmail.com menu_opts_off(curses_menu, O_SHOWDESC); 1533692d97c3Snir.tzachar@gmail.com menu_opts_off(curses_menu, O_SHOWMATCH); 1534692d97c3Snir.tzachar@gmail.com menu_opts_on(curses_menu, O_ONEVALUE); 1535692d97c3Snir.tzachar@gmail.com menu_opts_on(curses_menu, O_NONCYCLIC); 1536692d97c3Snir.tzachar@gmail.com set_menu_mark(curses_menu, " "); 1537692d97c3Snir.tzachar@gmail.com set_menu_fore(curses_menu, attributes[MAIN_MENU_FORE]); 1538692d97c3Snir.tzachar@gmail.com set_menu_back(curses_menu, attributes[MAIN_MENU_BACK]); 1539692d97c3Snir.tzachar@gmail.com set_menu_grey(curses_menu, attributes[MAIN_MENU_GREY]); 1540692d97c3Snir.tzachar@gmail.com 1541692d97c3Snir.tzachar@gmail.com set_config_filename(conf_get_configname()); 1542692d97c3Snir.tzachar@gmail.com setup_windows(); 1543692d97c3Snir.tzachar@gmail.com 1544692d97c3Snir.tzachar@gmail.com /* check for KEY_FUNC(1) */ 1545692d97c3Snir.tzachar@gmail.com if (has_key(KEY_F(1)) == FALSE) { 1546692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 1547692d97c3Snir.tzachar@gmail.com _("Instructions"), 1548692d97c3Snir.tzachar@gmail.com _(menu_no_f_instructions)); 1549692d97c3Snir.tzachar@gmail.com } 1550692d97c3Snir.tzachar@gmail.com 1551692d97c3Snir.tzachar@gmail.com 1552692d97c3Snir.tzachar@gmail.com 1553692d97c3Snir.tzachar@gmail.com /* do the work */ 1554692d97c3Snir.tzachar@gmail.com while (!global_exit) { 1555692d97c3Snir.tzachar@gmail.com conf(&rootmenu); 1556692d97c3Snir.tzachar@gmail.com if (!global_exit && do_exit() == 0) 1557692d97c3Snir.tzachar@gmail.com break; 1558692d97c3Snir.tzachar@gmail.com } 1559692d97c3Snir.tzachar@gmail.com /* ok, we are done */ 1560692d97c3Snir.tzachar@gmail.com unpost_menu(curses_menu); 1561692d97c3Snir.tzachar@gmail.com free_menu(curses_menu); 1562692d97c3Snir.tzachar@gmail.com delwin(main_window); 1563692d97c3Snir.tzachar@gmail.com clear(); 1564692d97c3Snir.tzachar@gmail.com refresh(); 1565692d97c3Snir.tzachar@gmail.com endwin(); 1566692d97c3Snir.tzachar@gmail.com return 0; 1567692d97c3Snir.tzachar@gmail.com } 1568692d97c3Snir.tzachar@gmail.com 1569