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 */ 455851190c9SMichal 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 */ 487851190c9SMichal 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 */ 506851190c9SMichal 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. */ 514851190c9SMichal 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*/ 522851190c9SMichal 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 */ 582851190c9SMichal 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 */ 626851190c9SMichal 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 */ 656851190c9SMichal 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 668851190c9SMichal 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 673851190c9SMichal 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); 679*866af407SAndrej Gelenberg if (!cur) 680*866af407SAndrej Gelenberg return NULL; 681692d97c3Snir.tzachar@gmail.com mcur = (struct mitem *) item_userptr(cur); 682692d97c3Snir.tzachar@gmail.com return mcur->usrptr; 683692d97c3Snir.tzachar@gmail.com 684692d97c3Snir.tzachar@gmail.com } 685692d97c3Snir.tzachar@gmail.com 686851190c9SMichal Marek static int item_is_tag(char tag) 687692d97c3Snir.tzachar@gmail.com { 688692d97c3Snir.tzachar@gmail.com return item_tag() == tag; 689692d97c3Snir.tzachar@gmail.com } 690692d97c3Snir.tzachar@gmail.com 691692d97c3Snir.tzachar@gmail.com static char filename[PATH_MAX+1]; 692692d97c3Snir.tzachar@gmail.com static char menu_backtitle[PATH_MAX+128]; 693851190c9SMichal Marek static const char *set_config_filename(const char *config_filename) 694692d97c3Snir.tzachar@gmail.com { 695692d97c3Snir.tzachar@gmail.com int size; 696692d97c3Snir.tzachar@gmail.com struct symbol *sym; 697692d97c3Snir.tzachar@gmail.com 698692d97c3Snir.tzachar@gmail.com sym = sym_lookup("KERNELVERSION", 0); 699692d97c3Snir.tzachar@gmail.com sym_calc_value(sym); 700692d97c3Snir.tzachar@gmail.com size = snprintf(menu_backtitle, sizeof(menu_backtitle), 701692d97c3Snir.tzachar@gmail.com _("%s - Linux Kernel v%s Configuration"), 702692d97c3Snir.tzachar@gmail.com config_filename, sym_get_string_value(sym)); 703692d97c3Snir.tzachar@gmail.com if (size >= sizeof(menu_backtitle)) 704692d97c3Snir.tzachar@gmail.com menu_backtitle[sizeof(menu_backtitle)-1] = '\0'; 705692d97c3Snir.tzachar@gmail.com 706692d97c3Snir.tzachar@gmail.com size = snprintf(filename, sizeof(filename), "%s", config_filename); 707692d97c3Snir.tzachar@gmail.com if (size >= sizeof(filename)) 708692d97c3Snir.tzachar@gmail.com filename[sizeof(filename)-1] = '\0'; 709692d97c3Snir.tzachar@gmail.com return menu_backtitle; 710692d97c3Snir.tzachar@gmail.com } 711692d97c3Snir.tzachar@gmail.com 712692d97c3Snir.tzachar@gmail.com /* command = 0 is supress, 1 is restore */ 713692d97c3Snir.tzachar@gmail.com static void supress_stdout(int command) 714692d97c3Snir.tzachar@gmail.com { 715692d97c3Snir.tzachar@gmail.com static FILE *org_stdout; 716692d97c3Snir.tzachar@gmail.com static FILE *org_stderr; 717692d97c3Snir.tzachar@gmail.com 718692d97c3Snir.tzachar@gmail.com if (command == 0) { 719692d97c3Snir.tzachar@gmail.com org_stdout = stdout; 720692d97c3Snir.tzachar@gmail.com org_stderr = stderr; 721692d97c3Snir.tzachar@gmail.com stdout = fopen("/dev/null", "a"); 722692d97c3Snir.tzachar@gmail.com stderr = fopen("/dev/null", "a"); 723692d97c3Snir.tzachar@gmail.com } else { 724692d97c3Snir.tzachar@gmail.com fclose(stdout); 725692d97c3Snir.tzachar@gmail.com fclose(stderr); 726692d97c3Snir.tzachar@gmail.com stdout = org_stdout; 727692d97c3Snir.tzachar@gmail.com stderr = org_stderr; 728692d97c3Snir.tzachar@gmail.com } 729692d97c3Snir.tzachar@gmail.com } 730692d97c3Snir.tzachar@gmail.com 731692d97c3Snir.tzachar@gmail.com /* return = 0 means we are successful. 732692d97c3Snir.tzachar@gmail.com * -1 means go on doing what you were doing 733692d97c3Snir.tzachar@gmail.com */ 734692d97c3Snir.tzachar@gmail.com static int do_exit(void) 735692d97c3Snir.tzachar@gmail.com { 736692d97c3Snir.tzachar@gmail.com int res; 737692d97c3Snir.tzachar@gmail.com if (!conf_get_changed()) { 738692d97c3Snir.tzachar@gmail.com global_exit = 1; 739692d97c3Snir.tzachar@gmail.com return 0; 740692d97c3Snir.tzachar@gmail.com } 741692d97c3Snir.tzachar@gmail.com res = btn_dialog(main_window, 742692d97c3Snir.tzachar@gmail.com _("Do you wish to save your " 743692d97c3Snir.tzachar@gmail.com "new kernel configuration?\n" 744692d97c3Snir.tzachar@gmail.com "<ESC> to cancel and resume nconfig."), 745692d97c3Snir.tzachar@gmail.com 2, 746692d97c3Snir.tzachar@gmail.com " <save> ", 747692d97c3Snir.tzachar@gmail.com "<don't save>"); 748692d97c3Snir.tzachar@gmail.com if (res == KEY_EXIT) { 749692d97c3Snir.tzachar@gmail.com global_exit = 0; 750692d97c3Snir.tzachar@gmail.com return -1; 751692d97c3Snir.tzachar@gmail.com } 752692d97c3Snir.tzachar@gmail.com 753692d97c3Snir.tzachar@gmail.com /* if we got here, the user really wants to exit */ 754692d97c3Snir.tzachar@gmail.com switch (res) { 755692d97c3Snir.tzachar@gmail.com case 0: 756692d97c3Snir.tzachar@gmail.com supress_stdout(0); 757692d97c3Snir.tzachar@gmail.com res = conf_write(filename); 758692d97c3Snir.tzachar@gmail.com supress_stdout(1); 759692d97c3Snir.tzachar@gmail.com if (res) 760692d97c3Snir.tzachar@gmail.com btn_dialog( 761692d97c3Snir.tzachar@gmail.com main_window, 762692d97c3Snir.tzachar@gmail.com _("Error during writing of the kernel " 763692d97c3Snir.tzachar@gmail.com "configuration.\n" 764692d97c3Snir.tzachar@gmail.com "Your kernel configuration " 765692d97c3Snir.tzachar@gmail.com "changes were NOT saved."), 766692d97c3Snir.tzachar@gmail.com 1, 767692d97c3Snir.tzachar@gmail.com "<OK>"); 768692d97c3Snir.tzachar@gmail.com else { 769692d97c3Snir.tzachar@gmail.com char buf[1024]; 770692d97c3Snir.tzachar@gmail.com snprintf(buf, 1024, 771692d97c3Snir.tzachar@gmail.com _("Configuration written to %s\n" 772692d97c3Snir.tzachar@gmail.com "End of Linux kernel configuration.\n" 773692d97c3Snir.tzachar@gmail.com "Execute 'make' to build the kernel or try" 774692d97c3Snir.tzachar@gmail.com " 'make help'."), filename); 775692d97c3Snir.tzachar@gmail.com btn_dialog( 776692d97c3Snir.tzachar@gmail.com main_window, 777692d97c3Snir.tzachar@gmail.com buf, 778692d97c3Snir.tzachar@gmail.com 1, 779692d97c3Snir.tzachar@gmail.com "<OK>"); 780692d97c3Snir.tzachar@gmail.com } 781692d97c3Snir.tzachar@gmail.com break; 782692d97c3Snir.tzachar@gmail.com default: 783692d97c3Snir.tzachar@gmail.com btn_dialog( 784692d97c3Snir.tzachar@gmail.com main_window, 785692d97c3Snir.tzachar@gmail.com _("Your kernel configuration changes were NOT saved."), 786692d97c3Snir.tzachar@gmail.com 1, 787692d97c3Snir.tzachar@gmail.com "<OK>"); 788692d97c3Snir.tzachar@gmail.com break; 789692d97c3Snir.tzachar@gmail.com } 790692d97c3Snir.tzachar@gmail.com global_exit = 1; 791692d97c3Snir.tzachar@gmail.com return 0; 792692d97c3Snir.tzachar@gmail.com } 793692d97c3Snir.tzachar@gmail.com 794692d97c3Snir.tzachar@gmail.com 795692d97c3Snir.tzachar@gmail.com static void search_conf(void) 796692d97c3Snir.tzachar@gmail.com { 797692d97c3Snir.tzachar@gmail.com struct symbol **sym_arr; 798692d97c3Snir.tzachar@gmail.com struct gstr res; 799692d97c3Snir.tzachar@gmail.com char dialog_input_result[100]; 800692d97c3Snir.tzachar@gmail.com char *dialog_input; 801692d97c3Snir.tzachar@gmail.com int dres; 802692d97c3Snir.tzachar@gmail.com again: 803692d97c3Snir.tzachar@gmail.com dres = dialog_inputbox(main_window, 804692d97c3Snir.tzachar@gmail.com _("Search Configuration Parameter"), 805692d97c3Snir.tzachar@gmail.com _("Enter CONFIG_ (sub)string to search for " 806692d97c3Snir.tzachar@gmail.com "(with or without \"CONFIG\")"), 807692d97c3Snir.tzachar@gmail.com "", dialog_input_result, 99); 808692d97c3Snir.tzachar@gmail.com switch (dres) { 809692d97c3Snir.tzachar@gmail.com case 0: 810692d97c3Snir.tzachar@gmail.com break; 811692d97c3Snir.tzachar@gmail.com case 1: 812692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 813692d97c3Snir.tzachar@gmail.com _("Search Configuration"), search_help); 814692d97c3Snir.tzachar@gmail.com goto again; 815692d97c3Snir.tzachar@gmail.com default: 816692d97c3Snir.tzachar@gmail.com return; 817692d97c3Snir.tzachar@gmail.com } 818692d97c3Snir.tzachar@gmail.com 819692d97c3Snir.tzachar@gmail.com /* strip CONFIG_ if necessary */ 820692d97c3Snir.tzachar@gmail.com dialog_input = dialog_input_result; 821692d97c3Snir.tzachar@gmail.com if (strncasecmp(dialog_input_result, "CONFIG_", 7) == 0) 822692d97c3Snir.tzachar@gmail.com dialog_input += 7; 823692d97c3Snir.tzachar@gmail.com 824692d97c3Snir.tzachar@gmail.com sym_arr = sym_re_search(dialog_input); 825692d97c3Snir.tzachar@gmail.com res = get_relations_str(sym_arr); 826692d97c3Snir.tzachar@gmail.com free(sym_arr); 827692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 828692d97c3Snir.tzachar@gmail.com _("Search Results"), str_get(&res)); 829692d97c3Snir.tzachar@gmail.com str_free(&res); 830692d97c3Snir.tzachar@gmail.com } 831692d97c3Snir.tzachar@gmail.com 832692d97c3Snir.tzachar@gmail.com 833692d97c3Snir.tzachar@gmail.com static void build_conf(struct menu *menu) 834692d97c3Snir.tzachar@gmail.com { 835692d97c3Snir.tzachar@gmail.com struct symbol *sym; 836692d97c3Snir.tzachar@gmail.com struct property *prop; 837692d97c3Snir.tzachar@gmail.com struct menu *child; 838692d97c3Snir.tzachar@gmail.com int type, tmp, doint = 2; 839692d97c3Snir.tzachar@gmail.com tristate val; 840692d97c3Snir.tzachar@gmail.com char ch; 841692d97c3Snir.tzachar@gmail.com 842692d97c3Snir.tzachar@gmail.com if (!menu || (!show_all_items && !menu_is_visible(menu))) 843692d97c3Snir.tzachar@gmail.com return; 844692d97c3Snir.tzachar@gmail.com 845692d97c3Snir.tzachar@gmail.com sym = menu->sym; 846692d97c3Snir.tzachar@gmail.com prop = menu->prompt; 847692d97c3Snir.tzachar@gmail.com if (!sym) { 848692d97c3Snir.tzachar@gmail.com if (prop && menu != current_menu) { 849692d97c3Snir.tzachar@gmail.com const char *prompt = menu_get_prompt(menu); 850692d97c3Snir.tzachar@gmail.com enum prop_type ptype; 851692d97c3Snir.tzachar@gmail.com ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 852692d97c3Snir.tzachar@gmail.com switch (ptype) { 853692d97c3Snir.tzachar@gmail.com case P_MENU: 854692d97c3Snir.tzachar@gmail.com child_count++; 855692d97c3Snir.tzachar@gmail.com prompt = _(prompt); 856692d97c3Snir.tzachar@gmail.com if (single_menu_mode) { 857692d97c3Snir.tzachar@gmail.com item_make(menu, 'm', 858692d97c3Snir.tzachar@gmail.com "%s%*c%s", 859692d97c3Snir.tzachar@gmail.com menu->data ? "-->" : "++>", 860692d97c3Snir.tzachar@gmail.com indent + 1, ' ', prompt); 861692d97c3Snir.tzachar@gmail.com } else 862692d97c3Snir.tzachar@gmail.com item_make(menu, 'm', 863692d97c3Snir.tzachar@gmail.com " %*c%s --->", 864692d97c3Snir.tzachar@gmail.com indent + 1, 865692d97c3Snir.tzachar@gmail.com ' ', prompt); 866692d97c3Snir.tzachar@gmail.com 867692d97c3Snir.tzachar@gmail.com if (single_menu_mode && menu->data) 868692d97c3Snir.tzachar@gmail.com goto conf_childs; 869692d97c3Snir.tzachar@gmail.com return; 870692d97c3Snir.tzachar@gmail.com case P_COMMENT: 871692d97c3Snir.tzachar@gmail.com if (prompt) { 872692d97c3Snir.tzachar@gmail.com child_count++; 873692d97c3Snir.tzachar@gmail.com item_make(menu, ':', 874692d97c3Snir.tzachar@gmail.com " %*c*** %s ***", 875692d97c3Snir.tzachar@gmail.com indent + 1, ' ', 876692d97c3Snir.tzachar@gmail.com _(prompt)); 877692d97c3Snir.tzachar@gmail.com } 878692d97c3Snir.tzachar@gmail.com break; 879692d97c3Snir.tzachar@gmail.com default: 880692d97c3Snir.tzachar@gmail.com if (prompt) { 881692d97c3Snir.tzachar@gmail.com child_count++; 882692d97c3Snir.tzachar@gmail.com item_make(menu, ':', "---%*c%s", 883692d97c3Snir.tzachar@gmail.com indent + 1, ' ', 884692d97c3Snir.tzachar@gmail.com _(prompt)); 885692d97c3Snir.tzachar@gmail.com } 886692d97c3Snir.tzachar@gmail.com } 887692d97c3Snir.tzachar@gmail.com } else 888692d97c3Snir.tzachar@gmail.com doint = 0; 889692d97c3Snir.tzachar@gmail.com goto conf_childs; 890692d97c3Snir.tzachar@gmail.com } 891692d97c3Snir.tzachar@gmail.com 892692d97c3Snir.tzachar@gmail.com type = sym_get_type(sym); 893692d97c3Snir.tzachar@gmail.com if (sym_is_choice(sym)) { 894692d97c3Snir.tzachar@gmail.com struct symbol *def_sym = sym_get_choice_value(sym); 895692d97c3Snir.tzachar@gmail.com struct menu *def_menu = NULL; 896692d97c3Snir.tzachar@gmail.com 897692d97c3Snir.tzachar@gmail.com child_count++; 898692d97c3Snir.tzachar@gmail.com for (child = menu->list; child; child = child->next) { 899692d97c3Snir.tzachar@gmail.com if (menu_is_visible(child) && child->sym == def_sym) 900692d97c3Snir.tzachar@gmail.com def_menu = child; 901692d97c3Snir.tzachar@gmail.com } 902692d97c3Snir.tzachar@gmail.com 903692d97c3Snir.tzachar@gmail.com val = sym_get_tristate_value(sym); 904692d97c3Snir.tzachar@gmail.com if (sym_is_changable(sym)) { 905692d97c3Snir.tzachar@gmail.com switch (type) { 906692d97c3Snir.tzachar@gmail.com case S_BOOLEAN: 907692d97c3Snir.tzachar@gmail.com item_make(menu, 't', "[%c]", 908692d97c3Snir.tzachar@gmail.com val == no ? ' ' : '*'); 909692d97c3Snir.tzachar@gmail.com break; 910692d97c3Snir.tzachar@gmail.com case S_TRISTATE: 911692d97c3Snir.tzachar@gmail.com switch (val) { 912692d97c3Snir.tzachar@gmail.com case yes: 913692d97c3Snir.tzachar@gmail.com ch = '*'; 914692d97c3Snir.tzachar@gmail.com break; 915692d97c3Snir.tzachar@gmail.com case mod: 916692d97c3Snir.tzachar@gmail.com ch = 'M'; 917692d97c3Snir.tzachar@gmail.com break; 918692d97c3Snir.tzachar@gmail.com default: 919692d97c3Snir.tzachar@gmail.com ch = ' '; 920692d97c3Snir.tzachar@gmail.com break; 921692d97c3Snir.tzachar@gmail.com } 922692d97c3Snir.tzachar@gmail.com item_make(menu, 't', "<%c>", ch); 923692d97c3Snir.tzachar@gmail.com break; 924692d97c3Snir.tzachar@gmail.com } 925692d97c3Snir.tzachar@gmail.com } else { 926692d97c3Snir.tzachar@gmail.com item_make(menu, def_menu ? 't' : ':', " "); 927692d97c3Snir.tzachar@gmail.com } 928692d97c3Snir.tzachar@gmail.com 929692d97c3Snir.tzachar@gmail.com item_add_str("%*c%s", indent + 1, 930692d97c3Snir.tzachar@gmail.com ' ', _(menu_get_prompt(menu))); 931692d97c3Snir.tzachar@gmail.com if (val == yes) { 932692d97c3Snir.tzachar@gmail.com if (def_menu) { 933692d97c3Snir.tzachar@gmail.com item_add_str(" (%s)", 934692d97c3Snir.tzachar@gmail.com _(menu_get_prompt(def_menu))); 935692d97c3Snir.tzachar@gmail.com item_add_str(" --->"); 936692d97c3Snir.tzachar@gmail.com if (def_menu->list) { 937692d97c3Snir.tzachar@gmail.com indent += 2; 938692d97c3Snir.tzachar@gmail.com build_conf(def_menu); 939692d97c3Snir.tzachar@gmail.com indent -= 2; 940692d97c3Snir.tzachar@gmail.com } 941692d97c3Snir.tzachar@gmail.com } 942692d97c3Snir.tzachar@gmail.com return; 943692d97c3Snir.tzachar@gmail.com } 944692d97c3Snir.tzachar@gmail.com } else { 945692d97c3Snir.tzachar@gmail.com if (menu == current_menu) { 946692d97c3Snir.tzachar@gmail.com item_make(menu, ':', 947692d97c3Snir.tzachar@gmail.com "---%*c%s", indent + 1, 948692d97c3Snir.tzachar@gmail.com ' ', _(menu_get_prompt(menu))); 949692d97c3Snir.tzachar@gmail.com goto conf_childs; 950692d97c3Snir.tzachar@gmail.com } 951692d97c3Snir.tzachar@gmail.com child_count++; 952692d97c3Snir.tzachar@gmail.com val = sym_get_tristate_value(sym); 953692d97c3Snir.tzachar@gmail.com if (sym_is_choice_value(sym) && val == yes) { 954692d97c3Snir.tzachar@gmail.com item_make(menu, ':', " "); 955692d97c3Snir.tzachar@gmail.com } else { 956692d97c3Snir.tzachar@gmail.com switch (type) { 957692d97c3Snir.tzachar@gmail.com case S_BOOLEAN: 958692d97c3Snir.tzachar@gmail.com if (sym_is_changable(sym)) 959692d97c3Snir.tzachar@gmail.com item_make(menu, 't', "[%c]", 960692d97c3Snir.tzachar@gmail.com val == no ? ' ' : '*'); 961692d97c3Snir.tzachar@gmail.com else 962692d97c3Snir.tzachar@gmail.com item_make(menu, 't', "-%c-", 963692d97c3Snir.tzachar@gmail.com val == no ? ' ' : '*'); 964692d97c3Snir.tzachar@gmail.com break; 965692d97c3Snir.tzachar@gmail.com case S_TRISTATE: 966692d97c3Snir.tzachar@gmail.com switch (val) { 967692d97c3Snir.tzachar@gmail.com case yes: 968692d97c3Snir.tzachar@gmail.com ch = '*'; 969692d97c3Snir.tzachar@gmail.com break; 970692d97c3Snir.tzachar@gmail.com case mod: 971692d97c3Snir.tzachar@gmail.com ch = 'M'; 972692d97c3Snir.tzachar@gmail.com break; 973692d97c3Snir.tzachar@gmail.com default: 974692d97c3Snir.tzachar@gmail.com ch = ' '; 975692d97c3Snir.tzachar@gmail.com break; 976692d97c3Snir.tzachar@gmail.com } 977692d97c3Snir.tzachar@gmail.com if (sym_is_changable(sym)) { 978692d97c3Snir.tzachar@gmail.com if (sym->rev_dep.tri == mod) 979692d97c3Snir.tzachar@gmail.com item_make(menu, 980692d97c3Snir.tzachar@gmail.com 't', "{%c}", ch); 981692d97c3Snir.tzachar@gmail.com else 982692d97c3Snir.tzachar@gmail.com item_make(menu, 983692d97c3Snir.tzachar@gmail.com 't', "<%c>", ch); 984692d97c3Snir.tzachar@gmail.com } else 985692d97c3Snir.tzachar@gmail.com item_make(menu, 't', "-%c-", ch); 986692d97c3Snir.tzachar@gmail.com break; 987692d97c3Snir.tzachar@gmail.com default: 988692d97c3Snir.tzachar@gmail.com tmp = 2 + strlen(sym_get_string_value(sym)); 989692d97c3Snir.tzachar@gmail.com item_make(menu, 's', " (%s)", 990692d97c3Snir.tzachar@gmail.com sym_get_string_value(sym)); 991692d97c3Snir.tzachar@gmail.com tmp = indent - tmp + 4; 992692d97c3Snir.tzachar@gmail.com if (tmp < 0) 993692d97c3Snir.tzachar@gmail.com tmp = 0; 994692d97c3Snir.tzachar@gmail.com item_add_str("%*c%s%s", tmp, ' ', 995692d97c3Snir.tzachar@gmail.com _(menu_get_prompt(menu)), 996692d97c3Snir.tzachar@gmail.com (sym_has_value(sym) || 997692d97c3Snir.tzachar@gmail.com !sym_is_changable(sym)) ? "" : 998692d97c3Snir.tzachar@gmail.com _(" (NEW)")); 999692d97c3Snir.tzachar@gmail.com goto conf_childs; 1000692d97c3Snir.tzachar@gmail.com } 1001692d97c3Snir.tzachar@gmail.com } 1002692d97c3Snir.tzachar@gmail.com item_add_str("%*c%s%s", indent + 1, ' ', 1003692d97c3Snir.tzachar@gmail.com _(menu_get_prompt(menu)), 1004692d97c3Snir.tzachar@gmail.com (sym_has_value(sym) || !sym_is_changable(sym)) ? 1005692d97c3Snir.tzachar@gmail.com "" : _(" (NEW)")); 1006692d97c3Snir.tzachar@gmail.com if (menu->prompt && menu->prompt->type == P_MENU) { 1007692d97c3Snir.tzachar@gmail.com item_add_str(" --->"); 1008692d97c3Snir.tzachar@gmail.com return; 1009692d97c3Snir.tzachar@gmail.com } 1010692d97c3Snir.tzachar@gmail.com } 1011692d97c3Snir.tzachar@gmail.com 1012692d97c3Snir.tzachar@gmail.com conf_childs: 1013692d97c3Snir.tzachar@gmail.com indent += doint; 1014692d97c3Snir.tzachar@gmail.com for (child = menu->list; child; child = child->next) 1015692d97c3Snir.tzachar@gmail.com build_conf(child); 1016692d97c3Snir.tzachar@gmail.com indent -= doint; 1017692d97c3Snir.tzachar@gmail.com } 1018692d97c3Snir.tzachar@gmail.com 1019692d97c3Snir.tzachar@gmail.com static void reset_menu(void) 1020692d97c3Snir.tzachar@gmail.com { 1021692d97c3Snir.tzachar@gmail.com unpost_menu(curses_menu); 1022692d97c3Snir.tzachar@gmail.com clean_items(); 1023692d97c3Snir.tzachar@gmail.com } 1024692d97c3Snir.tzachar@gmail.com 1025692d97c3Snir.tzachar@gmail.com /* adjust the menu to show this item. 1026692d97c3Snir.tzachar@gmail.com * prefer not to scroll the menu if possible*/ 1027692d97c3Snir.tzachar@gmail.com static void center_item(int selected_index, int *last_top_row) 1028692d97c3Snir.tzachar@gmail.com { 1029692d97c3Snir.tzachar@gmail.com int toprow; 1030692d97c3Snir.tzachar@gmail.com int maxy, maxx; 1031692d97c3Snir.tzachar@gmail.com 1032692d97c3Snir.tzachar@gmail.com scale_menu(curses_menu, &maxy, &maxx); 1033692d97c3Snir.tzachar@gmail.com set_top_row(curses_menu, *last_top_row); 1034692d97c3Snir.tzachar@gmail.com toprow = top_row(curses_menu); 1035692d97c3Snir.tzachar@gmail.com if (selected_index >= toprow && selected_index < toprow+maxy) { 1036692d97c3Snir.tzachar@gmail.com /* we can only move the selected item. no need to scroll */ 1037692d97c3Snir.tzachar@gmail.com set_current_item(curses_menu, 1038692d97c3Snir.tzachar@gmail.com curses_menu_items[selected_index]); 1039692d97c3Snir.tzachar@gmail.com } else { 1040692d97c3Snir.tzachar@gmail.com toprow = max(selected_index-maxy/2, 0); 1041692d97c3Snir.tzachar@gmail.com if (toprow >= item_count(curses_menu)-maxy) 1042692d97c3Snir.tzachar@gmail.com toprow = item_count(curses_menu)-mwin_max_lines; 1043692d97c3Snir.tzachar@gmail.com set_top_row(curses_menu, toprow); 1044692d97c3Snir.tzachar@gmail.com set_current_item(curses_menu, 1045692d97c3Snir.tzachar@gmail.com curses_menu_items[selected_index]); 1046692d97c3Snir.tzachar@gmail.com } 1047692d97c3Snir.tzachar@gmail.com *last_top_row = toprow; 1048692d97c3Snir.tzachar@gmail.com post_menu(curses_menu); 1049692d97c3Snir.tzachar@gmail.com refresh_all_windows(main_window); 1050692d97c3Snir.tzachar@gmail.com } 1051692d97c3Snir.tzachar@gmail.com 1052692d97c3Snir.tzachar@gmail.com /* this function assumes reset_menu has been called before */ 1053692d97c3Snir.tzachar@gmail.com static void show_menu(const char *prompt, const char *instructions, 1054692d97c3Snir.tzachar@gmail.com int selected_index, int *last_top_row) 1055692d97c3Snir.tzachar@gmail.com { 1056692d97c3Snir.tzachar@gmail.com int maxx, maxy; 1057692d97c3Snir.tzachar@gmail.com WINDOW *menu_window; 1058692d97c3Snir.tzachar@gmail.com 1059692d97c3Snir.tzachar@gmail.com current_instructions = instructions; 1060692d97c3Snir.tzachar@gmail.com 1061692d97c3Snir.tzachar@gmail.com clear(); 1062692d97c3Snir.tzachar@gmail.com wattrset(main_window, attributes[NORMAL]); 1063692d97c3Snir.tzachar@gmail.com print_in_middle(stdscr, 1, 0, COLS, 1064692d97c3Snir.tzachar@gmail.com menu_backtitle, 1065692d97c3Snir.tzachar@gmail.com attributes[MAIN_HEADING]); 1066692d97c3Snir.tzachar@gmail.com 1067692d97c3Snir.tzachar@gmail.com wattrset(main_window, attributes[MAIN_MENU_BOX]); 1068692d97c3Snir.tzachar@gmail.com box(main_window, 0, 0); 1069692d97c3Snir.tzachar@gmail.com wattrset(main_window, attributes[MAIN_MENU_HEADING]); 1070692d97c3Snir.tzachar@gmail.com mvwprintw(main_window, 0, 3, " %s ", prompt); 1071692d97c3Snir.tzachar@gmail.com wattrset(main_window, attributes[NORMAL]); 1072692d97c3Snir.tzachar@gmail.com 1073692d97c3Snir.tzachar@gmail.com set_menu_items(curses_menu, curses_menu_items); 1074692d97c3Snir.tzachar@gmail.com 1075692d97c3Snir.tzachar@gmail.com /* position the menu at the middle of the screen */ 1076692d97c3Snir.tzachar@gmail.com scale_menu(curses_menu, &maxy, &maxx); 107768c16eddSNir Tzachar maxx = min(maxx, mwin_max_cols-2); 107868c16eddSNir Tzachar maxy = mwin_max_lines-2; 1079692d97c3Snir.tzachar@gmail.com menu_window = derwin(main_window, 1080692d97c3Snir.tzachar@gmail.com maxy, 1081692d97c3Snir.tzachar@gmail.com maxx, 1082692d97c3Snir.tzachar@gmail.com 2, 1083692d97c3Snir.tzachar@gmail.com (mwin_max_cols-maxx)/2); 1084692d97c3Snir.tzachar@gmail.com keypad(menu_window, TRUE); 1085692d97c3Snir.tzachar@gmail.com set_menu_win(curses_menu, menu_window); 1086692d97c3Snir.tzachar@gmail.com set_menu_sub(curses_menu, menu_window); 1087692d97c3Snir.tzachar@gmail.com 1088692d97c3Snir.tzachar@gmail.com /* must reassert this after changing items, otherwise returns to a 1089692d97c3Snir.tzachar@gmail.com * default of 16 1090692d97c3Snir.tzachar@gmail.com */ 1091692d97c3Snir.tzachar@gmail.com set_menu_format(curses_menu, maxy, 1); 1092692d97c3Snir.tzachar@gmail.com center_item(selected_index, last_top_row); 1093692d97c3Snir.tzachar@gmail.com set_menu_format(curses_menu, maxy, 1); 1094692d97c3Snir.tzachar@gmail.com 1095692d97c3Snir.tzachar@gmail.com print_function_line(); 1096692d97c3Snir.tzachar@gmail.com 1097692d97c3Snir.tzachar@gmail.com /* Post the menu */ 1098692d97c3Snir.tzachar@gmail.com post_menu(curses_menu); 1099692d97c3Snir.tzachar@gmail.com refresh_all_windows(main_window); 1100692d97c3Snir.tzachar@gmail.com } 1101692d97c3Snir.tzachar@gmail.com 1102692d97c3Snir.tzachar@gmail.com 1103692d97c3Snir.tzachar@gmail.com static void conf(struct menu *menu) 1104692d97c3Snir.tzachar@gmail.com { 1105692d97c3Snir.tzachar@gmail.com char pattern[256]; 1106692d97c3Snir.tzachar@gmail.com struct menu *submenu = 0; 1107692d97c3Snir.tzachar@gmail.com const char *prompt = menu_get_prompt(menu); 1108692d97c3Snir.tzachar@gmail.com struct symbol *sym; 1109692d97c3Snir.tzachar@gmail.com struct menu *active_menu = NULL; 1110692d97c3Snir.tzachar@gmail.com int res; 1111692d97c3Snir.tzachar@gmail.com int current_index = 0; 1112692d97c3Snir.tzachar@gmail.com int last_top_row = 0; 1113692d97c3Snir.tzachar@gmail.com 1114692d97c3Snir.tzachar@gmail.com bzero(pattern, sizeof(pattern)); 1115692d97c3Snir.tzachar@gmail.com 1116692d97c3Snir.tzachar@gmail.com while (!global_exit) { 1117692d97c3Snir.tzachar@gmail.com reset_menu(); 1118692d97c3Snir.tzachar@gmail.com current_menu = menu; 1119692d97c3Snir.tzachar@gmail.com build_conf(menu); 1120692d97c3Snir.tzachar@gmail.com if (!child_count) 1121692d97c3Snir.tzachar@gmail.com break; 1122692d97c3Snir.tzachar@gmail.com 1123692d97c3Snir.tzachar@gmail.com show_menu(prompt ? _(prompt) : _("Main Menu"), 1124692d97c3Snir.tzachar@gmail.com _(menu_instructions), 1125692d97c3Snir.tzachar@gmail.com current_index, &last_top_row); 1126692d97c3Snir.tzachar@gmail.com keypad((menu_win(curses_menu)), TRUE); 1127692d97c3Snir.tzachar@gmail.com while (!global_exit && (res = wgetch(menu_win(curses_menu)))) { 1128692d97c3Snir.tzachar@gmail.com if (process_special_keys(&res, 1129692d97c3Snir.tzachar@gmail.com (struct menu *) item_data())) 1130692d97c3Snir.tzachar@gmail.com break; 1131692d97c3Snir.tzachar@gmail.com switch (res) { 1132692d97c3Snir.tzachar@gmail.com case KEY_DOWN: 1133692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_DOWN_ITEM); 1134692d97c3Snir.tzachar@gmail.com break; 1135692d97c3Snir.tzachar@gmail.com case KEY_UP: 1136692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_UP_ITEM); 1137692d97c3Snir.tzachar@gmail.com break; 1138692d97c3Snir.tzachar@gmail.com case KEY_NPAGE: 1139692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_SCR_DPAGE); 1140692d97c3Snir.tzachar@gmail.com break; 1141692d97c3Snir.tzachar@gmail.com case KEY_PPAGE: 1142692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_SCR_UPAGE); 1143692d97c3Snir.tzachar@gmail.com break; 1144692d97c3Snir.tzachar@gmail.com case KEY_HOME: 1145692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_FIRST_ITEM); 1146692d97c3Snir.tzachar@gmail.com break; 1147692d97c3Snir.tzachar@gmail.com case KEY_END: 1148692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_LAST_ITEM); 1149692d97c3Snir.tzachar@gmail.com break; 1150692d97c3Snir.tzachar@gmail.com case 'h': 1151692d97c3Snir.tzachar@gmail.com case '?': 1152692d97c3Snir.tzachar@gmail.com show_help((struct menu *) item_data()); 1153692d97c3Snir.tzachar@gmail.com break; 1154692d97c3Snir.tzachar@gmail.com } 1155692d97c3Snir.tzachar@gmail.com if (res == 10 || res == 27 || 1156692d97c3Snir.tzachar@gmail.com res == 32 || res == 'n' || res == 'y' || 1157692d97c3Snir.tzachar@gmail.com res == KEY_LEFT || res == KEY_RIGHT || 1158692d97c3Snir.tzachar@gmail.com res == 'm' || res == '/') 1159692d97c3Snir.tzachar@gmail.com break; 1160692d97c3Snir.tzachar@gmail.com else if (canbhot(res)) { 1161692d97c3Snir.tzachar@gmail.com /* check for hot keys: */ 1162692d97c3Snir.tzachar@gmail.com int tmp = get_next_hot(res); 1163692d97c3Snir.tzachar@gmail.com if (tmp != -1) 1164692d97c3Snir.tzachar@gmail.com center_item(tmp, &last_top_row); 1165692d97c3Snir.tzachar@gmail.com } 1166692d97c3Snir.tzachar@gmail.com refresh_all_windows(main_window); 1167692d97c3Snir.tzachar@gmail.com } 1168692d97c3Snir.tzachar@gmail.com 1169692d97c3Snir.tzachar@gmail.com refresh_all_windows(main_window); 1170692d97c3Snir.tzachar@gmail.com /* if ESC or left*/ 1171692d97c3Snir.tzachar@gmail.com if (res == 27 || (menu != &rootmenu && res == KEY_LEFT)) 1172692d97c3Snir.tzachar@gmail.com break; 1173692d97c3Snir.tzachar@gmail.com 1174692d97c3Snir.tzachar@gmail.com /* remember location in the menu */ 1175692d97c3Snir.tzachar@gmail.com last_top_row = top_row(curses_menu); 1176692d97c3Snir.tzachar@gmail.com current_index = curses_item_index(); 1177692d97c3Snir.tzachar@gmail.com 1178692d97c3Snir.tzachar@gmail.com if (!item_tag()) 1179692d97c3Snir.tzachar@gmail.com continue; 1180692d97c3Snir.tzachar@gmail.com 1181692d97c3Snir.tzachar@gmail.com submenu = (struct menu *) item_data(); 1182692d97c3Snir.tzachar@gmail.com active_menu = (struct menu *)item_data(); 1183692d97c3Snir.tzachar@gmail.com if (!submenu || !menu_is_visible(submenu)) 1184692d97c3Snir.tzachar@gmail.com continue; 1185692d97c3Snir.tzachar@gmail.com if (submenu) 1186692d97c3Snir.tzachar@gmail.com sym = submenu->sym; 1187692d97c3Snir.tzachar@gmail.com else 1188692d97c3Snir.tzachar@gmail.com sym = NULL; 1189692d97c3Snir.tzachar@gmail.com 1190692d97c3Snir.tzachar@gmail.com switch (res) { 1191692d97c3Snir.tzachar@gmail.com case ' ': 1192692d97c3Snir.tzachar@gmail.com if (item_is_tag('t')) 1193692d97c3Snir.tzachar@gmail.com sym_toggle_tristate_value(sym); 1194692d97c3Snir.tzachar@gmail.com else if (item_is_tag('m')) 1195692d97c3Snir.tzachar@gmail.com conf(submenu); 1196692d97c3Snir.tzachar@gmail.com break; 1197692d97c3Snir.tzachar@gmail.com case KEY_RIGHT: 1198692d97c3Snir.tzachar@gmail.com case 10: /* ENTER WAS PRESSED */ 1199692d97c3Snir.tzachar@gmail.com switch (item_tag()) { 1200692d97c3Snir.tzachar@gmail.com case 'm': 1201692d97c3Snir.tzachar@gmail.com if (single_menu_mode) 1202692d97c3Snir.tzachar@gmail.com submenu->data = 1203692d97c3Snir.tzachar@gmail.com (void *) (long) !submenu->data; 1204692d97c3Snir.tzachar@gmail.com else 1205692d97c3Snir.tzachar@gmail.com conf(submenu); 1206692d97c3Snir.tzachar@gmail.com break; 1207692d97c3Snir.tzachar@gmail.com case 't': 1208692d97c3Snir.tzachar@gmail.com if (sym_is_choice(sym) && 1209692d97c3Snir.tzachar@gmail.com sym_get_tristate_value(sym) == yes) 1210692d97c3Snir.tzachar@gmail.com conf_choice(submenu); 1211692d97c3Snir.tzachar@gmail.com else if (submenu->prompt && 1212692d97c3Snir.tzachar@gmail.com submenu->prompt->type == P_MENU) 1213692d97c3Snir.tzachar@gmail.com conf(submenu); 1214692d97c3Snir.tzachar@gmail.com else if (res == 10) 1215692d97c3Snir.tzachar@gmail.com sym_toggle_tristate_value(sym); 1216692d97c3Snir.tzachar@gmail.com break; 1217692d97c3Snir.tzachar@gmail.com case 's': 1218692d97c3Snir.tzachar@gmail.com conf_string(submenu); 1219692d97c3Snir.tzachar@gmail.com break; 1220692d97c3Snir.tzachar@gmail.com } 1221692d97c3Snir.tzachar@gmail.com break; 1222692d97c3Snir.tzachar@gmail.com case 'y': 1223692d97c3Snir.tzachar@gmail.com if (item_is_tag('t')) { 1224692d97c3Snir.tzachar@gmail.com if (sym_set_tristate_value(sym, yes)) 1225692d97c3Snir.tzachar@gmail.com break; 1226692d97c3Snir.tzachar@gmail.com if (sym_set_tristate_value(sym, mod)) 1227692d97c3Snir.tzachar@gmail.com btn_dialog(main_window, setmod_text, 0); 1228692d97c3Snir.tzachar@gmail.com } 1229692d97c3Snir.tzachar@gmail.com break; 1230692d97c3Snir.tzachar@gmail.com case 'n': 1231692d97c3Snir.tzachar@gmail.com if (item_is_tag('t')) 1232692d97c3Snir.tzachar@gmail.com sym_set_tristate_value(sym, no); 1233692d97c3Snir.tzachar@gmail.com break; 1234692d97c3Snir.tzachar@gmail.com case 'm': 1235692d97c3Snir.tzachar@gmail.com if (item_is_tag('t')) 1236692d97c3Snir.tzachar@gmail.com sym_set_tristate_value(sym, mod); 1237692d97c3Snir.tzachar@gmail.com break; 1238692d97c3Snir.tzachar@gmail.com case '/': 1239692d97c3Snir.tzachar@gmail.com search_conf(); 1240692d97c3Snir.tzachar@gmail.com break; 1241692d97c3Snir.tzachar@gmail.com } 1242692d97c3Snir.tzachar@gmail.com } 1243692d97c3Snir.tzachar@gmail.com } 1244692d97c3Snir.tzachar@gmail.com 1245692d97c3Snir.tzachar@gmail.com static void show_help(struct menu *menu) 1246692d97c3Snir.tzachar@gmail.com { 1247692d97c3Snir.tzachar@gmail.com struct gstr help = str_new(); 1248692d97c3Snir.tzachar@gmail.com 1249692d97c3Snir.tzachar@gmail.com if (menu && menu->sym && menu_has_help(menu)) { 1250692d97c3Snir.tzachar@gmail.com if (menu->sym->name) { 1251692d97c3Snir.tzachar@gmail.com str_printf(&help, "CONFIG_%s:\n\n", menu->sym->name); 1252692d97c3Snir.tzachar@gmail.com str_append(&help, _(menu_get_help(menu))); 1253692d97c3Snir.tzachar@gmail.com str_append(&help, "\n"); 1254692d97c3Snir.tzachar@gmail.com get_symbol_str(&help, menu->sym); 1255692d97c3Snir.tzachar@gmail.com } 1256692d97c3Snir.tzachar@gmail.com } else { 1257692d97c3Snir.tzachar@gmail.com str_append(&help, nohelp_text); 1258692d97c3Snir.tzachar@gmail.com } 1259692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, _(menu_get_prompt(menu)), str_get(&help)); 1260692d97c3Snir.tzachar@gmail.com str_free(&help); 1261692d97c3Snir.tzachar@gmail.com } 1262692d97c3Snir.tzachar@gmail.com 1263692d97c3Snir.tzachar@gmail.com static void conf_choice(struct menu *menu) 1264692d97c3Snir.tzachar@gmail.com { 1265692d97c3Snir.tzachar@gmail.com const char *prompt = _(menu_get_prompt(menu)); 1266692d97c3Snir.tzachar@gmail.com struct menu *child = 0; 1267692d97c3Snir.tzachar@gmail.com struct symbol *active; 1268692d97c3Snir.tzachar@gmail.com int selected_index = 0; 1269692d97c3Snir.tzachar@gmail.com int last_top_row = 0; 1270692d97c3Snir.tzachar@gmail.com int res, i = 0; 1271692d97c3Snir.tzachar@gmail.com 1272692d97c3Snir.tzachar@gmail.com active = sym_get_choice_value(menu->sym); 1273692d97c3Snir.tzachar@gmail.com /* this is mostly duplicated from the conf() function. */ 1274692d97c3Snir.tzachar@gmail.com while (!global_exit) { 1275692d97c3Snir.tzachar@gmail.com reset_menu(); 1276692d97c3Snir.tzachar@gmail.com 1277692d97c3Snir.tzachar@gmail.com for (i = 0, child = menu->list; child; child = child->next) { 1278692d97c3Snir.tzachar@gmail.com if (!show_all_items && !menu_is_visible(child)) 1279692d97c3Snir.tzachar@gmail.com continue; 1280692d97c3Snir.tzachar@gmail.com 1281692d97c3Snir.tzachar@gmail.com if (child->sym == sym_get_choice_value(menu->sym)) 1282692d97c3Snir.tzachar@gmail.com item_make(child, ':', "<X> %s", 1283692d97c3Snir.tzachar@gmail.com _(menu_get_prompt(child))); 1284692d97c3Snir.tzachar@gmail.com else 1285692d97c3Snir.tzachar@gmail.com item_make(child, ':', " %s", 1286692d97c3Snir.tzachar@gmail.com _(menu_get_prompt(child))); 1287692d97c3Snir.tzachar@gmail.com if (child->sym == active){ 1288692d97c3Snir.tzachar@gmail.com last_top_row = top_row(curses_menu); 1289692d97c3Snir.tzachar@gmail.com selected_index = i; 1290692d97c3Snir.tzachar@gmail.com } 1291692d97c3Snir.tzachar@gmail.com i++; 1292692d97c3Snir.tzachar@gmail.com } 1293692d97c3Snir.tzachar@gmail.com show_menu(prompt ? _(prompt) : _("Choice Menu"), 1294692d97c3Snir.tzachar@gmail.com _(radiolist_instructions), 1295692d97c3Snir.tzachar@gmail.com selected_index, 1296692d97c3Snir.tzachar@gmail.com &last_top_row); 1297692d97c3Snir.tzachar@gmail.com while (!global_exit && (res = wgetch(menu_win(curses_menu)))) { 1298692d97c3Snir.tzachar@gmail.com if (process_special_keys( 1299692d97c3Snir.tzachar@gmail.com &res, 1300692d97c3Snir.tzachar@gmail.com (struct menu *) item_data())) 1301692d97c3Snir.tzachar@gmail.com break; 1302692d97c3Snir.tzachar@gmail.com switch (res) { 1303692d97c3Snir.tzachar@gmail.com case KEY_DOWN: 1304692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_DOWN_ITEM); 1305692d97c3Snir.tzachar@gmail.com break; 1306692d97c3Snir.tzachar@gmail.com case KEY_UP: 1307692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_UP_ITEM); 1308692d97c3Snir.tzachar@gmail.com break; 1309692d97c3Snir.tzachar@gmail.com case KEY_NPAGE: 1310692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_SCR_DPAGE); 1311692d97c3Snir.tzachar@gmail.com break; 1312692d97c3Snir.tzachar@gmail.com case KEY_PPAGE: 1313692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_SCR_UPAGE); 1314692d97c3Snir.tzachar@gmail.com break; 1315692d97c3Snir.tzachar@gmail.com case KEY_HOME: 1316692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_FIRST_ITEM); 1317692d97c3Snir.tzachar@gmail.com break; 1318692d97c3Snir.tzachar@gmail.com case KEY_END: 1319692d97c3Snir.tzachar@gmail.com menu_driver(curses_menu, REQ_LAST_ITEM); 1320692d97c3Snir.tzachar@gmail.com break; 1321692d97c3Snir.tzachar@gmail.com case 'h': 1322692d97c3Snir.tzachar@gmail.com case '?': 1323692d97c3Snir.tzachar@gmail.com show_help((struct menu *) item_data()); 1324692d97c3Snir.tzachar@gmail.com break; 1325692d97c3Snir.tzachar@gmail.com } 1326692d97c3Snir.tzachar@gmail.com if (res == 10 || res == 27 || res == ' ' || 1327692d97c3Snir.tzachar@gmail.com res == KEY_LEFT) 1328692d97c3Snir.tzachar@gmail.com break; 1329692d97c3Snir.tzachar@gmail.com else if (canbhot(res)) { 1330692d97c3Snir.tzachar@gmail.com /* check for hot keys: */ 1331692d97c3Snir.tzachar@gmail.com int tmp = get_next_hot(res); 1332692d97c3Snir.tzachar@gmail.com if (tmp != -1) 1333692d97c3Snir.tzachar@gmail.com center_item(tmp, &last_top_row); 1334692d97c3Snir.tzachar@gmail.com } 1335692d97c3Snir.tzachar@gmail.com refresh_all_windows(main_window); 1336692d97c3Snir.tzachar@gmail.com } 1337692d97c3Snir.tzachar@gmail.com /* if ESC or left */ 1338692d97c3Snir.tzachar@gmail.com if (res == 27 || res == KEY_LEFT) 1339692d97c3Snir.tzachar@gmail.com break; 1340692d97c3Snir.tzachar@gmail.com 1341692d97c3Snir.tzachar@gmail.com child = item_data(); 1342692d97c3Snir.tzachar@gmail.com if (!child || !menu_is_visible(child)) 1343692d97c3Snir.tzachar@gmail.com continue; 1344692d97c3Snir.tzachar@gmail.com switch (res) { 1345692d97c3Snir.tzachar@gmail.com case ' ': 1346692d97c3Snir.tzachar@gmail.com case 10: 1347692d97c3Snir.tzachar@gmail.com case KEY_RIGHT: 1348692d97c3Snir.tzachar@gmail.com sym_set_tristate_value(child->sym, yes); 1349692d97c3Snir.tzachar@gmail.com return; 1350692d97c3Snir.tzachar@gmail.com case 'h': 1351692d97c3Snir.tzachar@gmail.com case '?': 1352692d97c3Snir.tzachar@gmail.com show_help(child); 1353692d97c3Snir.tzachar@gmail.com active = child->sym; 1354692d97c3Snir.tzachar@gmail.com break; 1355692d97c3Snir.tzachar@gmail.com case KEY_EXIT: 1356692d97c3Snir.tzachar@gmail.com return; 1357692d97c3Snir.tzachar@gmail.com } 1358692d97c3Snir.tzachar@gmail.com } 1359692d97c3Snir.tzachar@gmail.com } 1360692d97c3Snir.tzachar@gmail.com 1361692d97c3Snir.tzachar@gmail.com static void conf_string(struct menu *menu) 1362692d97c3Snir.tzachar@gmail.com { 1363692d97c3Snir.tzachar@gmail.com const char *prompt = menu_get_prompt(menu); 1364692d97c3Snir.tzachar@gmail.com char dialog_input_result[256]; 1365692d97c3Snir.tzachar@gmail.com 1366692d97c3Snir.tzachar@gmail.com while (1) { 1367692d97c3Snir.tzachar@gmail.com int res; 1368692d97c3Snir.tzachar@gmail.com const char *heading; 1369692d97c3Snir.tzachar@gmail.com 1370692d97c3Snir.tzachar@gmail.com switch (sym_get_type(menu->sym)) { 1371692d97c3Snir.tzachar@gmail.com case S_INT: 1372692d97c3Snir.tzachar@gmail.com heading = _(inputbox_instructions_int); 1373692d97c3Snir.tzachar@gmail.com break; 1374692d97c3Snir.tzachar@gmail.com case S_HEX: 1375692d97c3Snir.tzachar@gmail.com heading = _(inputbox_instructions_hex); 1376692d97c3Snir.tzachar@gmail.com break; 1377692d97c3Snir.tzachar@gmail.com case S_STRING: 1378692d97c3Snir.tzachar@gmail.com heading = _(inputbox_instructions_string); 1379692d97c3Snir.tzachar@gmail.com break; 1380692d97c3Snir.tzachar@gmail.com default: 1381692d97c3Snir.tzachar@gmail.com heading = _("Internal nconf error!"); 1382692d97c3Snir.tzachar@gmail.com } 1383692d97c3Snir.tzachar@gmail.com res = dialog_inputbox(main_window, 1384692d97c3Snir.tzachar@gmail.com prompt ? _(prompt) : _("Main Menu"), 1385692d97c3Snir.tzachar@gmail.com heading, 1386692d97c3Snir.tzachar@gmail.com sym_get_string_value(menu->sym), 1387692d97c3Snir.tzachar@gmail.com dialog_input_result, 1388692d97c3Snir.tzachar@gmail.com sizeof(dialog_input_result)); 1389692d97c3Snir.tzachar@gmail.com switch (res) { 1390692d97c3Snir.tzachar@gmail.com case 0: 1391692d97c3Snir.tzachar@gmail.com if (sym_set_string_value(menu->sym, 1392692d97c3Snir.tzachar@gmail.com dialog_input_result)) 1393692d97c3Snir.tzachar@gmail.com return; 1394692d97c3Snir.tzachar@gmail.com btn_dialog(main_window, 1395692d97c3Snir.tzachar@gmail.com _("You have made an invalid entry."), 0); 1396692d97c3Snir.tzachar@gmail.com break; 1397692d97c3Snir.tzachar@gmail.com case 1: 1398692d97c3Snir.tzachar@gmail.com show_help(menu); 1399692d97c3Snir.tzachar@gmail.com break; 1400692d97c3Snir.tzachar@gmail.com case KEY_EXIT: 1401692d97c3Snir.tzachar@gmail.com return; 1402692d97c3Snir.tzachar@gmail.com } 1403692d97c3Snir.tzachar@gmail.com } 1404692d97c3Snir.tzachar@gmail.com } 1405692d97c3Snir.tzachar@gmail.com 1406692d97c3Snir.tzachar@gmail.com static void conf_load(void) 1407692d97c3Snir.tzachar@gmail.com { 1408692d97c3Snir.tzachar@gmail.com char dialog_input_result[256]; 1409692d97c3Snir.tzachar@gmail.com while (1) { 1410692d97c3Snir.tzachar@gmail.com int res; 1411692d97c3Snir.tzachar@gmail.com res = dialog_inputbox(main_window, 1412692d97c3Snir.tzachar@gmail.com NULL, load_config_text, 1413692d97c3Snir.tzachar@gmail.com filename, 1414692d97c3Snir.tzachar@gmail.com dialog_input_result, 1415692d97c3Snir.tzachar@gmail.com sizeof(dialog_input_result)); 1416692d97c3Snir.tzachar@gmail.com switch (res) { 1417692d97c3Snir.tzachar@gmail.com case 0: 1418692d97c3Snir.tzachar@gmail.com if (!dialog_input_result[0]) 1419692d97c3Snir.tzachar@gmail.com return; 1420692d97c3Snir.tzachar@gmail.com if (!conf_read(dialog_input_result)) { 1421692d97c3Snir.tzachar@gmail.com set_config_filename(dialog_input_result); 1422692d97c3Snir.tzachar@gmail.com sym_set_change_count(1); 1423692d97c3Snir.tzachar@gmail.com return; 1424692d97c3Snir.tzachar@gmail.com } 1425692d97c3Snir.tzachar@gmail.com btn_dialog(main_window, _("File does not exist!"), 0); 1426692d97c3Snir.tzachar@gmail.com break; 1427692d97c3Snir.tzachar@gmail.com case 1: 1428692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 1429692d97c3Snir.tzachar@gmail.com _("Load Alternate Configuration"), 1430692d97c3Snir.tzachar@gmail.com load_config_help); 1431692d97c3Snir.tzachar@gmail.com break; 1432692d97c3Snir.tzachar@gmail.com case KEY_EXIT: 1433692d97c3Snir.tzachar@gmail.com return; 1434692d97c3Snir.tzachar@gmail.com } 1435692d97c3Snir.tzachar@gmail.com } 1436692d97c3Snir.tzachar@gmail.com } 1437692d97c3Snir.tzachar@gmail.com 1438692d97c3Snir.tzachar@gmail.com static void conf_save(void) 1439692d97c3Snir.tzachar@gmail.com { 1440692d97c3Snir.tzachar@gmail.com char dialog_input_result[256]; 1441692d97c3Snir.tzachar@gmail.com while (1) { 1442692d97c3Snir.tzachar@gmail.com int res; 1443692d97c3Snir.tzachar@gmail.com res = dialog_inputbox(main_window, 1444692d97c3Snir.tzachar@gmail.com NULL, save_config_text, 1445692d97c3Snir.tzachar@gmail.com filename, 1446692d97c3Snir.tzachar@gmail.com dialog_input_result, 1447692d97c3Snir.tzachar@gmail.com sizeof(dialog_input_result)); 1448692d97c3Snir.tzachar@gmail.com switch (res) { 1449692d97c3Snir.tzachar@gmail.com case 0: 1450692d97c3Snir.tzachar@gmail.com if (!dialog_input_result[0]) 1451692d97c3Snir.tzachar@gmail.com return; 1452692d97c3Snir.tzachar@gmail.com supress_stdout(0); 1453692d97c3Snir.tzachar@gmail.com res = conf_write(dialog_input_result); 1454692d97c3Snir.tzachar@gmail.com supress_stdout(1); 1455692d97c3Snir.tzachar@gmail.com if (!res) { 1456692d97c3Snir.tzachar@gmail.com char buf[1024]; 1457692d97c3Snir.tzachar@gmail.com sprintf(buf, "%s %s", 1458692d97c3Snir.tzachar@gmail.com _("configuration file saved to: "), 1459692d97c3Snir.tzachar@gmail.com dialog_input_result); 1460692d97c3Snir.tzachar@gmail.com btn_dialog(main_window, 1461692d97c3Snir.tzachar@gmail.com buf, 1, "<OK>"); 1462692d97c3Snir.tzachar@gmail.com set_config_filename(dialog_input_result); 1463692d97c3Snir.tzachar@gmail.com return; 1464692d97c3Snir.tzachar@gmail.com } 1465692d97c3Snir.tzachar@gmail.com btn_dialog(main_window, _("Can't create file! " 1466692d97c3Snir.tzachar@gmail.com "Probably a nonexistent directory."), 1467692d97c3Snir.tzachar@gmail.com 1, "<OK>"); 1468692d97c3Snir.tzachar@gmail.com break; 1469692d97c3Snir.tzachar@gmail.com case 1: 1470692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 1471692d97c3Snir.tzachar@gmail.com _("Save Alternate Configuration"), 1472692d97c3Snir.tzachar@gmail.com save_config_help); 1473692d97c3Snir.tzachar@gmail.com break; 1474692d97c3Snir.tzachar@gmail.com case KEY_EXIT: 1475692d97c3Snir.tzachar@gmail.com return; 1476692d97c3Snir.tzachar@gmail.com } 1477692d97c3Snir.tzachar@gmail.com } 1478692d97c3Snir.tzachar@gmail.com } 1479692d97c3Snir.tzachar@gmail.com 1480692d97c3Snir.tzachar@gmail.com void setup_windows(void) 1481692d97c3Snir.tzachar@gmail.com { 1482692d97c3Snir.tzachar@gmail.com if (main_window != NULL) 1483692d97c3Snir.tzachar@gmail.com delwin(main_window); 1484692d97c3Snir.tzachar@gmail.com 1485692d97c3Snir.tzachar@gmail.com /* set up the menu and menu window */ 1486692d97c3Snir.tzachar@gmail.com main_window = newwin(LINES-2, COLS-2, 2, 1); 1487692d97c3Snir.tzachar@gmail.com keypad(main_window, TRUE); 1488692d97c3Snir.tzachar@gmail.com mwin_max_lines = LINES-6; 1489692d97c3Snir.tzachar@gmail.com mwin_max_cols = COLS-6; 1490692d97c3Snir.tzachar@gmail.com 1491692d97c3Snir.tzachar@gmail.com /* panels order is from bottom to top */ 1492692d97c3Snir.tzachar@gmail.com new_panel(main_window); 1493692d97c3Snir.tzachar@gmail.com } 1494692d97c3Snir.tzachar@gmail.com 1495692d97c3Snir.tzachar@gmail.com int main(int ac, char **av) 1496692d97c3Snir.tzachar@gmail.com { 1497692d97c3Snir.tzachar@gmail.com char *mode; 1498692d97c3Snir.tzachar@gmail.com 1499692d97c3Snir.tzachar@gmail.com setlocale(LC_ALL, ""); 1500692d97c3Snir.tzachar@gmail.com bindtextdomain(PACKAGE, LOCALEDIR); 1501692d97c3Snir.tzachar@gmail.com textdomain(PACKAGE); 1502692d97c3Snir.tzachar@gmail.com 1503692d97c3Snir.tzachar@gmail.com conf_parse(av[1]); 1504692d97c3Snir.tzachar@gmail.com conf_read(NULL); 1505692d97c3Snir.tzachar@gmail.com 1506692d97c3Snir.tzachar@gmail.com mode = getenv("NCONFIG_MODE"); 1507692d97c3Snir.tzachar@gmail.com if (mode) { 1508692d97c3Snir.tzachar@gmail.com if (!strcasecmp(mode, "single_menu")) 1509692d97c3Snir.tzachar@gmail.com single_menu_mode = 1; 1510692d97c3Snir.tzachar@gmail.com } 1511692d97c3Snir.tzachar@gmail.com 1512692d97c3Snir.tzachar@gmail.com /* Initialize curses */ 1513692d97c3Snir.tzachar@gmail.com initscr(); 1514692d97c3Snir.tzachar@gmail.com /* set color theme */ 1515692d97c3Snir.tzachar@gmail.com set_colors(); 1516692d97c3Snir.tzachar@gmail.com 1517692d97c3Snir.tzachar@gmail.com cbreak(); 1518692d97c3Snir.tzachar@gmail.com noecho(); 1519692d97c3Snir.tzachar@gmail.com keypad(stdscr, TRUE); 1520692d97c3Snir.tzachar@gmail.com curs_set(0); 1521692d97c3Snir.tzachar@gmail.com 1522692d97c3Snir.tzachar@gmail.com if (COLS < 75 || LINES < 20) { 1523692d97c3Snir.tzachar@gmail.com endwin(); 1524692d97c3Snir.tzachar@gmail.com printf("Your terminal should have at " 1525692d97c3Snir.tzachar@gmail.com "least 20 lines and 75 columns\n"); 1526692d97c3Snir.tzachar@gmail.com return 1; 1527692d97c3Snir.tzachar@gmail.com } 1528692d97c3Snir.tzachar@gmail.com 1529692d97c3Snir.tzachar@gmail.com notimeout(stdscr, FALSE); 1530692d97c3Snir.tzachar@gmail.com ESCDELAY = 1; 1531692d97c3Snir.tzachar@gmail.com 1532692d97c3Snir.tzachar@gmail.com /* set btns menu */ 1533692d97c3Snir.tzachar@gmail.com curses_menu = new_menu(curses_menu_items); 1534692d97c3Snir.tzachar@gmail.com menu_opts_off(curses_menu, O_SHOWDESC); 1535692d97c3Snir.tzachar@gmail.com menu_opts_off(curses_menu, O_SHOWMATCH); 1536692d97c3Snir.tzachar@gmail.com menu_opts_on(curses_menu, O_ONEVALUE); 1537692d97c3Snir.tzachar@gmail.com menu_opts_on(curses_menu, O_NONCYCLIC); 1538692d97c3Snir.tzachar@gmail.com set_menu_mark(curses_menu, " "); 1539692d97c3Snir.tzachar@gmail.com set_menu_fore(curses_menu, attributes[MAIN_MENU_FORE]); 1540692d97c3Snir.tzachar@gmail.com set_menu_back(curses_menu, attributes[MAIN_MENU_BACK]); 1541692d97c3Snir.tzachar@gmail.com set_menu_grey(curses_menu, attributes[MAIN_MENU_GREY]); 1542692d97c3Snir.tzachar@gmail.com 1543692d97c3Snir.tzachar@gmail.com set_config_filename(conf_get_configname()); 1544692d97c3Snir.tzachar@gmail.com setup_windows(); 1545692d97c3Snir.tzachar@gmail.com 1546692d97c3Snir.tzachar@gmail.com /* check for KEY_FUNC(1) */ 1547692d97c3Snir.tzachar@gmail.com if (has_key(KEY_F(1)) == FALSE) { 1548692d97c3Snir.tzachar@gmail.com show_scroll_win(main_window, 1549692d97c3Snir.tzachar@gmail.com _("Instructions"), 1550692d97c3Snir.tzachar@gmail.com _(menu_no_f_instructions)); 1551692d97c3Snir.tzachar@gmail.com } 1552692d97c3Snir.tzachar@gmail.com 1553692d97c3Snir.tzachar@gmail.com 1554692d97c3Snir.tzachar@gmail.com 1555692d97c3Snir.tzachar@gmail.com /* do the work */ 1556692d97c3Snir.tzachar@gmail.com while (!global_exit) { 1557692d97c3Snir.tzachar@gmail.com conf(&rootmenu); 1558692d97c3Snir.tzachar@gmail.com if (!global_exit && do_exit() == 0) 1559692d97c3Snir.tzachar@gmail.com break; 1560692d97c3Snir.tzachar@gmail.com } 1561692d97c3Snir.tzachar@gmail.com /* ok, we are done */ 1562692d97c3Snir.tzachar@gmail.com unpost_menu(curses_menu); 1563692d97c3Snir.tzachar@gmail.com free_menu(curses_menu); 1564692d97c3Snir.tzachar@gmail.com delwin(main_window); 1565692d97c3Snir.tzachar@gmail.com clear(); 1566692d97c3Snir.tzachar@gmail.com refresh(); 1567692d97c3Snir.tzachar@gmail.com endwin(); 1568692d97c3Snir.tzachar@gmail.com return 0; 1569692d97c3Snir.tzachar@gmail.com } 1570692d97c3Snir.tzachar@gmail.com 1571