From 3d4e8889889e5e36302454225999f7e146d3219c Mon Sep 17 00:00:00 2001 From: nwhitehorn Date: Wed, 12 Jan 2011 14:55:02 +0000 Subject: Update dialog to version 20100428. This changes the license under which dialog is distributed from GPLv2 to LGPLv2 and introduces a number of new features and a new and better libdialog API. The existing libdialog will be kept temporarily as libodialog for compatibility purposes until sade, sysinstall and tzsetup have been either updated or replaced. __FreeBSD_version is now 900030. Discussed on: -current Approved by: core Obtained from: http://invisible-island.net/dialog --- gnu/lib/Makefile | 3 +- gnu/lib/libdialog/CHANGES | 9 - gnu/lib/libdialog/COPYING | 339 ---------- gnu/lib/libdialog/Makefile | 58 +- gnu/lib/libdialog/README | 8 - gnu/lib/libdialog/TESTS/Makefile | 20 - gnu/lib/libdialog/TESTS/check1.c | 83 --- gnu/lib/libdialog/TESTS/check2.c | 105 ---- gnu/lib/libdialog/TESTS/check3.c | 92 --- gnu/lib/libdialog/TESTS/dselect.c | 41 -- gnu/lib/libdialog/TESTS/fselect.c | 44 -- gnu/lib/libdialog/TESTS/ftree1.c | 45 -- gnu/lib/libdialog/TESTS/ftree1.test | 73 --- gnu/lib/libdialog/TESTS/ftree2.c | 47 -- gnu/lib/libdialog/TESTS/ftree2.test | 73 --- gnu/lib/libdialog/TESTS/gauge.c | 41 -- gnu/lib/libdialog/TESTS/input1.c | 45 -- gnu/lib/libdialog/TESTS/input2.c | 47 -- gnu/lib/libdialog/TESTS/menu1.c | 96 --- gnu/lib/libdialog/TESTS/menu2.c | 96 --- gnu/lib/libdialog/TESTS/menu3.c | 107 ---- gnu/lib/libdialog/TESTS/msg.c | 42 -- gnu/lib/libdialog/TESTS/prgbox.c | 41 -- gnu/lib/libdialog/TESTS/radio1.c | 71 --- gnu/lib/libdialog/TESTS/radio2.c | 89 --- gnu/lib/libdialog/TESTS/radio3.c | 98 --- gnu/lib/libdialog/TESTS/text.c | 41 -- gnu/lib/libdialog/TESTS/tree.c | 111 ---- gnu/lib/libdialog/TESTS/yesno.c | 45 -- gnu/lib/libdialog/TODO | 36 -- gnu/lib/libdialog/checklist.c | 661 -------------------- gnu/lib/libdialog/colors.h | 219 ------- gnu/lib/libdialog/dialog.3 | 842 ------------------------- gnu/lib/libdialog/dialog.h | 211 ------- gnu/lib/libdialog/dialog.priv.h | 183 ------ gnu/lib/libdialog/dir.c | 549 ---------------- gnu/lib/libdialog/dir.h | 38 -- gnu/lib/libdialog/dlg_config.h | 91 +++ gnu/lib/libdialog/fselect.c | 402 ------------ gnu/lib/libdialog/gauge.c | 79 --- gnu/lib/libdialog/help.c | 194 ------ gnu/lib/libdialog/inputbox.c | 190 ------ gnu/lib/libdialog/kernel.c | 536 ---------------- gnu/lib/libdialog/lineedit.c | 213 ------- gnu/lib/libdialog/menubox.c | 469 -------------- gnu/lib/libdialog/msgbox.c | 346 ----------- gnu/lib/libdialog/notify.c | 53 -- gnu/lib/libdialog/prgbox.c | 152 ----- gnu/lib/libdialog/radiolist.c | 628 ------------------- gnu/lib/libdialog/raw_popen.c | 161 ----- gnu/lib/libdialog/rc.c | 375 ----------- gnu/lib/libdialog/rc.h | 222 ------- gnu/lib/libdialog/textbox.c | 699 --------------------- gnu/lib/libdialog/tree.c | 1133 ---------------------------------- gnu/lib/libdialog/ui_objects.c | 829 ------------------------- gnu/lib/libdialog/ui_objects.h | 114 ---- gnu/lib/libdialog/yesno.c | 169 ----- gnu/lib/libodialog/CHANGES | 9 + gnu/lib/libodialog/COPYING | 339 ++++++++++ gnu/lib/libodialog/Makefile | 24 + gnu/lib/libodialog/README | 8 + gnu/lib/libodialog/TESTS/Makefile | 20 + gnu/lib/libodialog/TESTS/check1.c | 83 +++ gnu/lib/libodialog/TESTS/check2.c | 105 ++++ gnu/lib/libodialog/TESTS/check3.c | 92 +++ gnu/lib/libodialog/TESTS/dselect.c | 41 ++ gnu/lib/libodialog/TESTS/fselect.c | 44 ++ gnu/lib/libodialog/TESTS/ftree1.c | 45 ++ gnu/lib/libodialog/TESTS/ftree1.test | 73 +++ gnu/lib/libodialog/TESTS/ftree2.c | 47 ++ gnu/lib/libodialog/TESTS/ftree2.test | 73 +++ gnu/lib/libodialog/TESTS/gauge.c | 41 ++ gnu/lib/libodialog/TESTS/input1.c | 45 ++ gnu/lib/libodialog/TESTS/input2.c | 47 ++ gnu/lib/libodialog/TESTS/menu1.c | 96 +++ gnu/lib/libodialog/TESTS/menu2.c | 96 +++ gnu/lib/libodialog/TESTS/menu3.c | 107 ++++ gnu/lib/libodialog/TESTS/msg.c | 42 ++ gnu/lib/libodialog/TESTS/prgbox.c | 41 ++ gnu/lib/libodialog/TESTS/radio1.c | 71 +++ gnu/lib/libodialog/TESTS/radio2.c | 89 +++ gnu/lib/libodialog/TESTS/radio3.c | 98 +++ gnu/lib/libodialog/TESTS/text.c | 41 ++ gnu/lib/libodialog/TESTS/tree.c | 111 ++++ gnu/lib/libodialog/TESTS/yesno.c | 45 ++ gnu/lib/libodialog/TODO | 36 ++ gnu/lib/libodialog/checklist.c | 661 ++++++++++++++++++++ gnu/lib/libodialog/colors.h | 219 +++++++ gnu/lib/libodialog/dialog.3 | 842 +++++++++++++++++++++++++ gnu/lib/libodialog/dialog.h | 211 +++++++ gnu/lib/libodialog/dialog.priv.h | 183 ++++++ gnu/lib/libodialog/dir.c | 549 ++++++++++++++++ gnu/lib/libodialog/dir.h | 38 ++ gnu/lib/libodialog/fselect.c | 402 ++++++++++++ gnu/lib/libodialog/gauge.c | 79 +++ gnu/lib/libodialog/help.c | 194 ++++++ gnu/lib/libodialog/inputbox.c | 190 ++++++ gnu/lib/libodialog/kernel.c | 536 ++++++++++++++++ gnu/lib/libodialog/lineedit.c | 213 +++++++ gnu/lib/libodialog/menubox.c | 469 ++++++++++++++ gnu/lib/libodialog/msgbox.c | 346 +++++++++++ gnu/lib/libodialog/notify.c | 53 ++ gnu/lib/libodialog/prgbox.c | 152 +++++ gnu/lib/libodialog/radiolist.c | 628 +++++++++++++++++++ gnu/lib/libodialog/raw_popen.c | 161 +++++ gnu/lib/libodialog/rc.c | 375 +++++++++++ gnu/lib/libodialog/rc.h | 222 +++++++ gnu/lib/libodialog/textbox.c | 699 +++++++++++++++++++++ gnu/lib/libodialog/tree.c | 1133 ++++++++++++++++++++++++++++++++++ gnu/lib/libodialog/ui_objects.c | 829 +++++++++++++++++++++++++ gnu/lib/libodialog/ui_objects.h | 114 ++++ gnu/lib/libodialog/yesno.c | 169 +++++ gnu/usr.bin/dialog/COPYING | 339 ---------- gnu/usr.bin/dialog/Makefile | 16 +- gnu/usr.bin/dialog/README | 161 ----- gnu/usr.bin/dialog/README.lib | 3 - gnu/usr.bin/dialog/TESTS/Makefile | 8 - gnu/usr.bin/dialog/TESTS/README | 15 - gnu/usr.bin/dialog/TESTS/checklist | 33 - gnu/usr.bin/dialog/TESTS/ftreebox | 27 - gnu/usr.bin/dialog/TESTS/infobox | 15 - gnu/usr.bin/dialog/TESTS/inputbox | 28 - gnu/usr.bin/dialog/TESTS/menubox | 35 -- gnu/usr.bin/dialog/TESTS/msgbox | 14 - gnu/usr.bin/dialog/TESTS/prgbox | 12 - gnu/usr.bin/dialog/TESTS/radiolist | 33 - gnu/usr.bin/dialog/TESTS/textbox | 42 -- gnu/usr.bin/dialog/TESTS/treebox | 25 - gnu/usr.bin/dialog/TESTS/yesno | 23 - gnu/usr.bin/dialog/dialog.1 | 326 ---------- gnu/usr.bin/dialog/dialog.c | 394 ------------ 131 files changed, 11790 insertions(+), 13239 deletions(-) delete mode 100644 gnu/lib/libdialog/CHANGES delete mode 100644 gnu/lib/libdialog/COPYING delete mode 100644 gnu/lib/libdialog/README delete mode 100644 gnu/lib/libdialog/TESTS/Makefile delete mode 100644 gnu/lib/libdialog/TESTS/check1.c delete mode 100644 gnu/lib/libdialog/TESTS/check2.c delete mode 100644 gnu/lib/libdialog/TESTS/check3.c delete mode 100644 gnu/lib/libdialog/TESTS/dselect.c delete mode 100644 gnu/lib/libdialog/TESTS/fselect.c delete mode 100644 gnu/lib/libdialog/TESTS/ftree1.c delete mode 100644 gnu/lib/libdialog/TESTS/ftree1.test delete mode 100644 gnu/lib/libdialog/TESTS/ftree2.c delete mode 100644 gnu/lib/libdialog/TESTS/ftree2.test delete mode 100644 gnu/lib/libdialog/TESTS/gauge.c delete mode 100644 gnu/lib/libdialog/TESTS/input1.c delete mode 100644 gnu/lib/libdialog/TESTS/input2.c delete mode 100644 gnu/lib/libdialog/TESTS/menu1.c delete mode 100644 gnu/lib/libdialog/TESTS/menu2.c delete mode 100644 gnu/lib/libdialog/TESTS/menu3.c delete mode 100644 gnu/lib/libdialog/TESTS/msg.c delete mode 100644 gnu/lib/libdialog/TESTS/prgbox.c delete mode 100644 gnu/lib/libdialog/TESTS/radio1.c delete mode 100644 gnu/lib/libdialog/TESTS/radio2.c delete mode 100644 gnu/lib/libdialog/TESTS/radio3.c delete mode 100644 gnu/lib/libdialog/TESTS/text.c delete mode 100644 gnu/lib/libdialog/TESTS/tree.c delete mode 100644 gnu/lib/libdialog/TESTS/yesno.c delete mode 100644 gnu/lib/libdialog/TODO delete mode 100644 gnu/lib/libdialog/checklist.c delete mode 100644 gnu/lib/libdialog/colors.h delete mode 100644 gnu/lib/libdialog/dialog.3 delete mode 100644 gnu/lib/libdialog/dialog.h delete mode 100644 gnu/lib/libdialog/dialog.priv.h delete mode 100644 gnu/lib/libdialog/dir.c delete mode 100644 gnu/lib/libdialog/dir.h create mode 100644 gnu/lib/libdialog/dlg_config.h delete mode 100644 gnu/lib/libdialog/fselect.c delete mode 100644 gnu/lib/libdialog/gauge.c delete mode 100644 gnu/lib/libdialog/help.c delete mode 100644 gnu/lib/libdialog/inputbox.c delete mode 100644 gnu/lib/libdialog/kernel.c delete mode 100644 gnu/lib/libdialog/lineedit.c delete mode 100644 gnu/lib/libdialog/menubox.c delete mode 100644 gnu/lib/libdialog/msgbox.c delete mode 100644 gnu/lib/libdialog/notify.c delete mode 100644 gnu/lib/libdialog/prgbox.c delete mode 100644 gnu/lib/libdialog/radiolist.c delete mode 100644 gnu/lib/libdialog/raw_popen.c delete mode 100644 gnu/lib/libdialog/rc.c delete mode 100644 gnu/lib/libdialog/rc.h delete mode 100644 gnu/lib/libdialog/textbox.c delete mode 100644 gnu/lib/libdialog/tree.c delete mode 100644 gnu/lib/libdialog/ui_objects.c delete mode 100644 gnu/lib/libdialog/ui_objects.h delete mode 100644 gnu/lib/libdialog/yesno.c create mode 100644 gnu/lib/libodialog/CHANGES create mode 100644 gnu/lib/libodialog/COPYING create mode 100644 gnu/lib/libodialog/Makefile create mode 100644 gnu/lib/libodialog/README create mode 100644 gnu/lib/libodialog/TESTS/Makefile create mode 100644 gnu/lib/libodialog/TESTS/check1.c create mode 100644 gnu/lib/libodialog/TESTS/check2.c create mode 100644 gnu/lib/libodialog/TESTS/check3.c create mode 100644 gnu/lib/libodialog/TESTS/dselect.c create mode 100644 gnu/lib/libodialog/TESTS/fselect.c create mode 100644 gnu/lib/libodialog/TESTS/ftree1.c create mode 100644 gnu/lib/libodialog/TESTS/ftree1.test create mode 100644 gnu/lib/libodialog/TESTS/ftree2.c create mode 100644 gnu/lib/libodialog/TESTS/ftree2.test create mode 100644 gnu/lib/libodialog/TESTS/gauge.c create mode 100644 gnu/lib/libodialog/TESTS/input1.c create mode 100644 gnu/lib/libodialog/TESTS/input2.c create mode 100644 gnu/lib/libodialog/TESTS/menu1.c create mode 100644 gnu/lib/libodialog/TESTS/menu2.c create mode 100644 gnu/lib/libodialog/TESTS/menu3.c create mode 100644 gnu/lib/libodialog/TESTS/msg.c create mode 100644 gnu/lib/libodialog/TESTS/prgbox.c create mode 100644 gnu/lib/libodialog/TESTS/radio1.c create mode 100644 gnu/lib/libodialog/TESTS/radio2.c create mode 100644 gnu/lib/libodialog/TESTS/radio3.c create mode 100644 gnu/lib/libodialog/TESTS/text.c create mode 100644 gnu/lib/libodialog/TESTS/tree.c create mode 100644 gnu/lib/libodialog/TESTS/yesno.c create mode 100644 gnu/lib/libodialog/TODO create mode 100644 gnu/lib/libodialog/checklist.c create mode 100644 gnu/lib/libodialog/colors.h create mode 100644 gnu/lib/libodialog/dialog.3 create mode 100644 gnu/lib/libodialog/dialog.h create mode 100644 gnu/lib/libodialog/dialog.priv.h create mode 100644 gnu/lib/libodialog/dir.c create mode 100644 gnu/lib/libodialog/dir.h create mode 100644 gnu/lib/libodialog/fselect.c create mode 100644 gnu/lib/libodialog/gauge.c create mode 100644 gnu/lib/libodialog/help.c create mode 100644 gnu/lib/libodialog/inputbox.c create mode 100644 gnu/lib/libodialog/kernel.c create mode 100644 gnu/lib/libodialog/lineedit.c create mode 100644 gnu/lib/libodialog/menubox.c create mode 100644 gnu/lib/libodialog/msgbox.c create mode 100644 gnu/lib/libodialog/notify.c create mode 100644 gnu/lib/libodialog/prgbox.c create mode 100644 gnu/lib/libodialog/radiolist.c create mode 100644 gnu/lib/libodialog/raw_popen.c create mode 100644 gnu/lib/libodialog/rc.c create mode 100644 gnu/lib/libodialog/rc.h create mode 100644 gnu/lib/libodialog/textbox.c create mode 100644 gnu/lib/libodialog/tree.c create mode 100644 gnu/lib/libodialog/ui_objects.c create mode 100644 gnu/lib/libodialog/ui_objects.h create mode 100644 gnu/lib/libodialog/yesno.c delete mode 100644 gnu/usr.bin/dialog/COPYING delete mode 100644 gnu/usr.bin/dialog/README delete mode 100644 gnu/usr.bin/dialog/README.lib delete mode 100644 gnu/usr.bin/dialog/TESTS/Makefile delete mode 100644 gnu/usr.bin/dialog/TESTS/README delete mode 100755 gnu/usr.bin/dialog/TESTS/checklist delete mode 100755 gnu/usr.bin/dialog/TESTS/ftreebox delete mode 100755 gnu/usr.bin/dialog/TESTS/infobox delete mode 100755 gnu/usr.bin/dialog/TESTS/inputbox delete mode 100755 gnu/usr.bin/dialog/TESTS/menubox delete mode 100755 gnu/usr.bin/dialog/TESTS/msgbox delete mode 100755 gnu/usr.bin/dialog/TESTS/prgbox delete mode 100755 gnu/usr.bin/dialog/TESTS/radiolist delete mode 100755 gnu/usr.bin/dialog/TESTS/textbox delete mode 100755 gnu/usr.bin/dialog/TESTS/treebox delete mode 100755 gnu/usr.bin/dialog/TESTS/yesno delete mode 100644 gnu/usr.bin/dialog/dialog.1 delete mode 100644 gnu/usr.bin/dialog/dialog.c (limited to 'gnu') diff --git a/gnu/lib/Makefile b/gnu/lib/Makefile index 00b77e2..cae52c3 100644 --- a/gnu/lib/Makefile +++ b/gnu/lib/Makefile @@ -2,7 +2,8 @@ .include -SUBDIR= csu libgcc libgcov libdialog libgomp libregex libreadline libssp +SUBDIR= csu libgcc libgcov libdialog libgomp libodialog libregex libreadline \ + libssp # libsupc++ uses libstdc++ headers, although 'make includes' should # have taken care of that already. diff --git a/gnu/lib/libdialog/CHANGES b/gnu/lib/libdialog/CHANGES deleted file mode 100644 index 1467a0e..0000000 --- a/gnu/lib/libdialog/CHANGES +++ /dev/null @@ -1,9 +0,0 @@ -- Added two variables to call to dialog_menu() to save the position - in the menu when choosing a menu-option. - -- Added dialog_fselect(), implements a fileselector dialog -- Added ui-interface objects: Stringobject, Listobject and Buttonobject. - The fileselector dialog was built using these objects. -- changed dialog_menu to use PGUP and PGDN -- Added dialog_mesgbox, which display text given in a char buffer. -- diff --git a/gnu/lib/libdialog/COPYING b/gnu/lib/libdialog/COPYING deleted file mode 100644 index a43ea21..0000000 --- a/gnu/lib/libdialog/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/gnu/lib/libdialog/Makefile b/gnu/lib/libdialog/Makefile index 49e9d0f..5d1c84b 100644 --- a/gnu/lib/libdialog/Makefile +++ b/gnu/lib/libdialog/Makefile @@ -1,47 +1,19 @@ -# Makefile for libdialog # $FreeBSD$ -.include - -LIB= dialog -INCS= dialog.h -MAN= dialog.3 - -SHLIB_MAJOR= 7 -SRCS= kernel.c rc.c checklist.c inputbox.c menubox.c msgbox.c \ - lineedit.c radiolist.c textbox.c yesno.c prgbox.c raw_popen.c \ - fselect.c ui_objects.c dir.c notify.c help.c gauge.c tree.c - -EXAMPLES= Makefile check1.c check2.c check3.c dselect.c fselect.c \ - ftree1.c ftree1.test ftree2.c ftree2.test gauge.c input1.c \ - input2.c menu1.c menu2.c menu3.c msg.c prgbox.c radio1.c \ - radio2.c radio3.c text.c tree.c yesno.c - -CFLAGS+= -I${.CURDIR} -Wall -Wstrict-prototypes -DLOCALE - -DPADD= ${LIBNCURSES} -LDADD= -lncurses - -.if ${MK_HTML} != "no" -FILES= ${EXAMPLES:C;^;${.CURDIR}/TESTS/;} -FILESDIR= ${SHAREDIR}/examples/libdialog -.endif - -MLINKS+=dialog.3 draw_shadow.3 dialog.3 draw_box.3 \ - dialog.3 line_edit.3 dialog.3 strheight.3 \ - dialog.3 strwidth.3 dialog.3 dialog_create_rc.3 \ - dialog.3 dialog_yesno.3 dialog.3 dialog_noyes.3 \ - dialog.3 dialog_prgbox.3 \ - dialog.3 dialog_textbox.3 dialog.3 dialog_menu.3 \ - dialog.3 dialog_checklist.3 dialog.3 dialog_radiolist.3 \ - dialog.3 dialog_inputbox.3 dialog.3 dialog_clear_norefresh.3 \ - dialog.3 dialog_clear.3 dialog.3 dialog_update.3 \ - dialog.3 dialog_fselect.3 dialog.3 dialog_notify.3 \ - dialog.3 dialog_mesgbox.3 dialog.3 dialog_gauge.3 \ - dialog.3 init_dialog.3 dialog.3 end_dialog.3 \ - dialog.3 use_helpfile.3 dialog.3 use_helpline.3 \ - dialog.3 get_helpline.3 dialog.3 restore_helpline.3 \ - dialog.3 dialog_msgbox.3 dialog.3 dialog_ftree.3 \ - dialog.3 dialog_tree.3 +DIALOG= ${.CURDIR}/../../../contrib/dialog + +LIB= dialog +SHLIB_MAJOR= 7 +SRCS= arrows.c buttons.c calendar.c checklist.c columns.c dlg_keys.c \ + editbox.c fselect.c formbox.c guage.c inputbox.c inputstr.c \ + menubox.c mixedform.c mixedgauge.c mouse.c mousewget.c \ + msgbox.c pause.c progressbox.c rc.c tailbox.c textbox.c \ + timebox.c trace.c ui_getc.c util.c version.c yesno.c +INCS= dialog.h dlg_colors.h dlg_config.h dlg_keys.h +MAN= dialog.3 + +CFLAGS+= -I${.CURDIR} -I${DIALOG} +.PATH: ${DIALOG} +WARNS?= 3 .include diff --git a/gnu/lib/libdialog/README b/gnu/lib/libdialog/README deleted file mode 100644 index e5e6d56..0000000 --- a/gnu/lib/libdialog/README +++ /dev/null @@ -1,8 +0,0 @@ -This library was split out from the `dialog' program for use -in C programs. For a list of interface functions, see dialog.h. -For usage examples, see the `dialog' program sources in -/usr/src/gnu/usr.bin/dialog. - -You can additionally use any ncurses functions after init_dialog(). - - Ache. diff --git a/gnu/lib/libdialog/TESTS/Makefile b/gnu/lib/libdialog/TESTS/Makefile deleted file mode 100644 index 65e3d71..0000000 --- a/gnu/lib/libdialog/TESTS/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Really quick and evil Makefile for building all the tests. I wish that -# bmake was friendlier to the concept of multiple progs/libs in the same -# directory. -# -# $FreeBSD$ - -PROGS= msg yesno prgbox gauge dselect fselect text menu1 menu2 menu3 \ - input1 input2 check1 check2 check3 radio1 radio2 radio3 \ - ftree1 ftree2 tree - -WARNS?= 2 -CFLAGS+= -Wall -Wstrict-prototypes -LDFLAGS+= -ldialog - -all: ${PROGS} - -clean: - rm -f ${PROGS} - -.include diff --git a/gnu/lib/libdialog/TESTS/check1.c b/gnu/lib/libdialog/TESTS/check1.c deleted file mode 100644 index a2bec62..0000000 --- a/gnu/lib/libdialog/TESTS/check1.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * small test-driver for new dialog functionality - * - * Copyright (c) 1995, Jordan Hubbard - * - * All rights reserved. - * - * This source code may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of the software nor does - * the author assume any responsibility for damages incurred with - * its use. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include - -/* Hook functions */ - -static int -getBool(dialogMenuItem *self) -{ - if (self->data && *((int *)self->data)) - return TRUE; - return FALSE; -} - -static int -setBool(dialogMenuItem *self) -{ - if (self->data) { - *((int *)self->data) = !*((int *)self->data); - return DITEM_SUCCESS; - } - return DITEM_FAILURE; -} - -static int german_book, italian_book, slang_book; - -static int -clearBooks(dialogMenuItem *self) -{ - german_book = italian_book = slang_book = FALSE; - return DITEM_SUCCESS | DITEM_REDRAW; -} - -/* menu2 - A more advanced way of using checked and fire hooks to manipulate the backing-variables directly */ -/* prompt title checked fire sel data */ -static dialogMenuItem menu2[] = { - { "German", "Buy book on learning German", getBool, setBool, NULL, &german_book}, - { "Italian", "Buy book on learning Italian", getBool, setBool, NULL, &italian_book }, - { "Slang", "Buy book on commonly used insults", getBool, setBool, NULL, &slang_book }, - { "Clear", "Clear book list", NULL, clearBooks, NULL, NULL, ' ', ' ', ' ' }, -}; - -/* End of hook functions */ - -/* Kick it off, James! */ -int -main(int argc, char **argv) -{ - int retval; - - init_dialog(); - - retval = dialog_checklist("this is a dialog_checklist() in action, test #1", - "this checklist menu shows off some of the straight-forward features\n" - "of the new menu system's check & fire dispatch hooks", -1, -1, 4, -4, menu2, NULL); - dialog_clear(); - fprintf(stderr, "returned value for dialog_checklist was %d (%d %d %d)\n", retval, german_book, italian_book, slang_book); - - end_dialog(); - return 0; -} diff --git a/gnu/lib/libdialog/TESTS/check2.c b/gnu/lib/libdialog/TESTS/check2.c deleted file mode 100644 index 3608261..0000000 --- a/gnu/lib/libdialog/TESTS/check2.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - * small test-driver for new dialog functionality - * - * Copyright (c) 1995, Jordan Hubbard - * - * All rights reserved. - * - * This source code may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of the software nor does - * the author assume any responsibility for damages incurred with - * its use. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include - -/* Hook functions */ - -static int -getBool(dialogMenuItem *self) -{ - if (self->data && *((int *)self->data)) - return TRUE; - return FALSE; -} - -static int -setBool(dialogMenuItem *self) -{ - if (self->data) { - *((int *)self->data) = !*((int *)self->data); - return DITEM_SUCCESS; - } - return DITEM_FAILURE; -} - -static int german_book, italian_book, slang_book; - -static int -clearBooks(dialogMenuItem *self) -{ - german_book = italian_book = slang_book = FALSE; - return DITEM_SUCCESS | DITEM_REDRAW; -} - -static int -buyBooks(dialogMenuItem *self) -{ - char foo[256]; - - if (german_book || italian_book || slang_book) { - strcpy(foo, "Ok, you're buying books on"); - if (german_book) - strcat(foo, " german"); - if (italian_book) - strcat(foo, " italian"); - if (slang_book) - strcat(foo, " slang"); - } - else - strcpy(foo, "You're not buying any books?"); - dialog_mesgbox("This is a direct callback for the `Buy' button", foo, -1, -1); - return DITEM_SUCCESS; -} - -/* menu3 - Look mom! We can finally use our own OK and Cancel buttons! */ -/* prompt title checked fire sel data */ -static dialogMenuItem menu3[] = { - { "Buy!", NULL, NULL, buyBooks }, /* New "OK" button */ - { "No Way!", NULL, NULL, NULL }, /* New "Cancel" button */ - { "German", "Buy books on learning German", getBool, setBool, NULL, &german_book }, - { "Italian", "Buy books on learning Italian", getBool, setBool, NULL, &italian_book }, - { "Slang", "Buy books on commonly used insults", getBool, setBool, NULL, &slang_book }, - { "Clear", "Clear book list", NULL, clearBooks, NULL, NULL, ' ', ' ', ' ' }, -}; - -/* End of hook functions */ - -/* Kick it off, James! */ -int -main(int argc, char **argv) -{ - int retval; - - init_dialog(); - - retval = dialog_checklist("this is dialog_checklist() in action, test #2", - "Same as before, but now we relabel the buttons and override the OK action.", - -1, -1, 4, -4, menu3 + 2, (char *)TRUE); - dialog_clear(); - fprintf(stderr, "returned value for dialog_checklist was %d\n", retval); - - end_dialog(); - return 0; -} diff --git a/gnu/lib/libdialog/TESTS/check3.c b/gnu/lib/libdialog/TESTS/check3.c deleted file mode 100644 index f117bd6..0000000 --- a/gnu/lib/libdialog/TESTS/check3.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * small test-driver for new dialog functionality - * - * Copyright (c) 1995, Jordan Hubbard - * - * All rights reserved. - * - * This source code may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of the software nor does - * the author assume any responsibility for damages incurred with - * its use. - * - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include - -/* Hook functions */ - -static int -getBool(dialogMenuItem *self) -{ - if (self->data && *((int *)self->data)) - return TRUE; - return FALSE; -} - -static int -setBool(dialogMenuItem *self) -{ - if (self->data) { - *((int *)self->data) = !*((int *)self->data); - return DITEM_SUCCESS; - } - return DITEM_FAILURE; -} - -static int german_book, italian_book, slang_book; -static int spending; - -static int -check(dialogMenuItem *self) -{ - return ((int)(intptr_t)self->data == spending); -} - -static int -spend(dialogMenuItem *self) -{ - spending = (int)(intptr_t)self->data; - return DITEM_SUCCESS | DITEM_REDRAW; -} - -/* menu4 - Show off a simulated compound menu (group at top is checklist, group at bottom radio) */ -/* prompt title checked fire sel, data lbra mark rbra */ -static dialogMenuItem menu4[] = { - { "German", "Buy books on learning German", getBool, setBool, NULL, &german_book }, - { "Italian","Buy books on learning Italian", getBool, setBool, NULL, &italian_book }, - { "Slang", "Buy books on commonly used insults", getBool, setBool, NULL, &slang_book }, - { "-----", "----------------------------------", NULL, NULL, NULL, NULL, ' ', ' ', ' ' }, - { "1000", "Spend $1,000", check, spend, NULL, (void *)1000, '(', '*', ')' }, - { "500", "Spend $500", check, spend, NULL, (void *)500, '(', '*', ')' }, - { "100", "Spend $100", check, spend, NULL, (void *)100, '(', '*', ')' }, -}; - -/* End of hook functions */ - -/* Kick it off, James! */ -int -main(int argc, char **argv) -{ - int retval; - - init_dialog(); - - - retval = dialog_checklist("this is dialog_checklist() in action, test #3", - "Now we show off some of the button 'styles' one can create.", - -1, -1, 7, -7, menu4, NULL); - dialog_clear(); - fprintf(stderr, "spent $%d on %s%s%s books\n", spending, german_book ? " german" : "", - italian_book ? " italian" : "", slang_book ? " slang" : ""); - - end_dialog(); - return 0; -} diff --git a/gnu/lib/libdialog/TESTS/dselect.c b/gnu/lib/libdialog/TESTS/dselect.c deleted file mode 100644 index 1110379..0000000 --- a/gnu/lib/libdialog/TESTS/dselect.c +++ /dev/null @@ -1,41 +0,0 @@ -/* - * small test-driver for new dialog functionality - * - * Copyright (c) 1995, Jordan Hubbard - * - * All rights reserved. - * - * This source code may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of the software nor does - * the author assume any responsibility for damages incurred with - * its use. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include - -/* Kick it off, James! */ -int -main(int argc, char **argv) -{ - int retval; - - init_dialog(); - - retval = dialog_dselect(".", "*"); - dialog_clear(); - fprintf(stderr, "returned value for dialog_dselect was %d\n", retval); - - end_dialog(); - return 0; -} diff --git a/gnu/lib/libdialog/TESTS/fselect.c b/gnu/lib/libdialog/TESTS/fselect.c deleted file mode 100644 index 6cefaf3..0000000 --- a/gnu/lib/libdialog/TESTS/fselect.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * small test-driver for new dialog functionality - * - * Copyright (c) 1995, Jordan Hubbard - * - * All rights reserved. - * - * This source code may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of the software nor does - * the author assume any responsibility for damages incurred with - * its use. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include - -/* Kick it off, James! */ -int -main(int argc, char **argv) -{ - char *retval; - - init_dialog(); - - retval = dialog_fselect(".", "*.[ch]"); - dialog_clear(); - if (retval) - fprintf(stderr, "returned value for dialog_fselect was %s\n", retval); - else - fprintf(stderr, "returned value for dialog_fselect was NULL\n"); - - end_dialog(); - return 0; -} diff --git a/gnu/lib/libdialog/TESTS/ftree1.c b/gnu/lib/libdialog/TESTS/ftree1.c deleted file mode 100644 index f21e0e5..0000000 --- a/gnu/lib/libdialog/TESTS/ftree1.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * ftree1.c - * - * small test-driver for new dialog functionality - * - * Copyright (c) 1998, Anatoly A. Orehovsky - * - * file ./ftree1.test with xterm widget tree from - * direct editres(1) dump needed !!! - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include - -int -main(int argc, char **argv) -{ - int retval; - unsigned char *tresult; - - init_dialog(); - retval = dialog_ftree("ftree1.test", '\t', - "ftree dialog box example", - "xterm widget tree from direct editres(1) dump", - -1, -1, 15, - &tresult); - - dialog_update(); - - dialog_clear(); - - end_dialog(); - - if (!retval) - { - puts(tresult); - free(tresult); - } - - exit(retval); -} diff --git a/gnu/lib/libdialog/TESTS/ftree1.test b/gnu/lib/libdialog/TESTS/ftree1.test deleted file mode 100644 index 4a8f0fa..0000000 --- a/gnu/lib/libdialog/TESTS/ftree1.test +++ /dev/null @@ -1,73 +0,0 @@ -XTerm login - VendorShellExt shellext - VT100 vt100 - SimpleMenu fontMenu - SmeBSB menuLabel - SmeBSB fontdefault - SmeBSB font1 - SmeBSB font2 - SmeBSB font3 - SmeBSB font4 - SmeBSB font5 - SmeBSB font6 - SmeBSB fontescape - SmeBSB fontsel - SimpleMenu mainMenu - SmeBSB menuLabel - SmeBSB securekbd - SmeBSB allowsends - SmeBSB redraw - SmeLine line1 - SmeBSB 8-bit control - SmeBSB sun function-keys - SmeLine line2 - SmeBSB suspend - SmeBSB continue - SmeBSB interrupt - SmeBSB hangup - SmeBSB terminate - SmeBSB kill - SmeLine line3 - SmeBSB quit - SimpleMenu vtMenu - SmeBSB menuLabel - SmeBSB scrollbar - SmeBSB jumpscroll - SmeBSB reversevideo - SmeBSB autowrap - SmeBSB reversewrap - SmeBSB autolinefeed - SmeBSB appcursor - SmeBSB appkeypad - SmeBSB scrollkey - SmeBSB scrollttyoutput - SmeBSB allow132 - SmeBSB cursesemul - SmeBSB visualbell - SmeBSB marginbell - SmeBSB altscreen - SmeLine line1 - SmeBSB softreset - SmeBSB hardreset - SmeBSB clearsavedlines - SmeLine line2 - SmeBSB tekshow - SmeBSB tekmode - SmeBSB vthide - TopLevelShell tektronix - VendorShellExt shellext - Tek4014 tek4014 - SimpleMenu tekMenu - SmeBSB menuLabel - SmeBSB tektextlarge - SmeBSB tektext2 - SmeBSB tektext3 - SmeBSB tektextsmall - SmeLine line1 - SmeBSB tekpage - SmeBSB tekreset - SmeBSB tekcopy - SmeLine line2 - SmeBSB vtshow - SmeBSB vtmode - SmeBSB tekhide diff --git a/gnu/lib/libdialog/TESTS/ftree2.c b/gnu/lib/libdialog/TESTS/ftree2.c deleted file mode 100644 index aa4663a..0000000 --- a/gnu/lib/libdialog/TESTS/ftree2.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - * ftree2.c - * - * small test-driver for new dialog functionality - * - * Copyright (c) 1998, Anatoly A. Orehovsky - * - * file ./ftree2.test with xterm widget tree from - * preprocess editres(1) dump needed !!! - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include - -int -main(int argc, char **argv) -{ - int retval; - unsigned char *tresult; - - init_dialog(); - use_helpfile("ftree2.test"); - use_helpline("Press Arrows, Tab, Enter or F1"); - retval = dialog_ftree("ftree2.test", '\t', - "ftree dialog box example", - "xterm widget tree from preprocess editres(1) dump", - -1, -1, 15, - &tresult); - - dialog_update(); - - dialog_clear(); - - end_dialog(); - - if (!retval) - { - puts(tresult); - free(tresult); - } - - exit(retval); -} diff --git a/gnu/lib/libdialog/TESTS/ftree2.test b/gnu/lib/libdialog/TESTS/ftree2.test deleted file mode 100644 index 0850862..0000000 --- a/gnu/lib/libdialog/TESTS/ftree2.test +++ /dev/null @@ -1,73 +0,0 @@ -XTerm login -XTerm login VendorShellExt shellext -XTerm login VT100 vt100 -XTerm login SimpleMenu fontMenu -XTerm login SimpleMenu fontMenu SmeBSB menuLabel -XTerm login SimpleMenu fontMenu SmeBSB fontdefault -XTerm login SimpleMenu fontMenu SmeBSB font1 -XTerm login SimpleMenu fontMenu SmeBSB font2 -XTerm login SimpleMenu fontMenu SmeBSB font3 -XTerm login SimpleMenu fontMenu SmeBSB font4 -XTerm login SimpleMenu fontMenu SmeBSB font5 -XTerm login SimpleMenu fontMenu SmeBSB font6 -XTerm login SimpleMenu fontMenu SmeBSB fontescape -XTerm login SimpleMenu fontMenu SmeBSB fontsel -XTerm login SimpleMenu mainMenu -XTerm login SimpleMenu mainMenu SmeBSB menuLabel -XTerm login SimpleMenu mainMenu SmeBSB securekbd -XTerm login SimpleMenu mainMenu SmeBSB allowsends -XTerm login SimpleMenu mainMenu SmeBSB redraw -XTerm login SimpleMenu mainMenu SmeLine line1 -XTerm login SimpleMenu mainMenu SmeBSB 8-bit control -XTerm login SimpleMenu mainMenu SmeBSB sun function-keys -XTerm login SimpleMenu mainMenu SmeLine line2 -XTerm login SimpleMenu mainMenu SmeBSB suspend -XTerm login SimpleMenu mainMenu SmeBSB continue -XTerm login SimpleMenu mainMenu SmeBSB interrupt -XTerm login SimpleMenu mainMenu SmeBSB hangup -XTerm login SimpleMenu mainMenu SmeBSB terminate -XTerm login SimpleMenu mainMenu SmeBSB kill -XTerm login SimpleMenu mainMenu SmeLine line3 -XTerm login SimpleMenu mainMenu SmeBSB quit -XTerm login SimpleMenu vtMenu -XTerm login SimpleMenu vtMenu SmeBSB menuLabel -XTerm login SimpleMenu vtMenu SmeBSB scrollbar -XTerm login SimpleMenu vtMenu SmeBSB jumpscroll -XTerm login SimpleMenu vtMenu SmeBSB reversevideo -XTerm login SimpleMenu vtMenu SmeBSB autowrap -XTerm login SimpleMenu vtMenu SmeBSB reversewrap -XTerm login SimpleMenu vtMenu SmeBSB autolinefeed -XTerm login SimpleMenu vtMenu SmeBSB appcursor -XTerm login SimpleMenu vtMenu SmeBSB appkeypad -XTerm login SimpleMenu vtMenu SmeBSB scrollkey -XTerm login SimpleMenu vtMenu SmeBSB scrollttyoutput -XTerm login SimpleMenu vtMenu SmeBSB allow132 -XTerm login SimpleMenu vtMenu SmeBSB cursesemul -XTerm login SimpleMenu vtMenu SmeBSB visualbell -XTerm login SimpleMenu vtMenu SmeBSB marginbell -XTerm login SimpleMenu vtMenu SmeBSB altscreen -XTerm login SimpleMenu vtMenu SmeLine line1 -XTerm login SimpleMenu vtMenu SmeBSB softreset -XTerm login SimpleMenu vtMenu SmeBSB hardreset -XTerm login SimpleMenu vtMenu SmeBSB clearsavedlines -XTerm login SimpleMenu vtMenu SmeLine line2 -XTerm login SimpleMenu vtMenu SmeBSB tekshow -XTerm login SimpleMenu vtMenu SmeBSB tekmode -XTerm login SimpleMenu vtMenu SmeBSB vthide -XTerm login TopLevelShell tektronix -XTerm login TopLevelShell tektronix VendorShellExt shellext -XTerm login TopLevelShell tektronix Tek4014 tek4014 -XTerm login SimpleMenu tekMenu -XTerm login SimpleMenu tekMenu SmeBSB menuLabel -XTerm login SimpleMenu tekMenu SmeBSB tektextlarge -XTerm login SimpleMenu tekMenu SmeBSB tektext2 -XTerm login SimpleMenu tekMenu SmeBSB tektext3 -XTerm login SimpleMenu tekMenu SmeBSB tektextsmall -XTerm login SimpleMenu tekMenu SmeLine line1 -XTerm login SimpleMenu tekMenu SmeBSB tekpage -XTerm login SimpleMenu tekMenu SmeBSB tekreset -XTerm login SimpleMenu tekMenu SmeBSB tekcopy -XTerm login SimpleMenu tekMenu SmeLine line2 -XTerm login SimpleMenu tekMenu SmeBSB vtshow -XTerm login SimpleMenu tekMenu SmeBSB vtmode -XTerm login SimpleMenu tekMenu SmeBSB tekhide diff --git a/gnu/lib/libdialog/TESTS/gauge.c b/gnu/lib/libdialog/TESTS/gauge.c deleted file mode 100644 index bf0cfc9..0000000 --- a/gnu/lib/libdialog/TESTS/gauge.c +++ /dev/null @@ -1,41 +0,0 @@ -/* - * small test-driver for new dialog functionality - * - * Copyright (c) 1995, Jordan Hubbard - * - * All rights reserved. - * - * This source code may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of the software nor does - * the author assume any responsibility for damages incurred with - * its use. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include - -/* Kick it off, James! */ -int -main(int argc, char **argv) -{ - int i; - - init_dialog(); - - for (i = 0; i <= 100; i++) { - dialog_gauge("Gas tank", "When this gets 100% full, you'd better yank out the nozzle!", 10, 1, 7, 70, i); - usleep(30000); - } - end_dialog(); - return 0; -} diff --git a/gnu/lib/libdialog/TESTS/input1.c b/gnu/lib/libdialog/TESTS/input1.c deleted file mode 100644 index 3751071..0000000 --- a/gnu/lib/libdialog/TESTS/input1.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * small test-driver for new dialog functionality - * - * Copyright (c) 1995, Jordan Hubbard - * - * All rights reserved. - * - * This source code may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of the software nor does - * the author assume any responsibility for damages incurred with - * its use. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include - -/* Kick it off, James! */ -int -main(int argc, char **argv) -{ - int retval; - unsigned char result[128]; - - init_dialog(); - - strcpy(result, "not this!"); - retval = dialog_inputbox("this is dialog_inputbox() in action, test #1", - "Enter something really profound below, please.", - -1, -1, result); - dialog_clear(); - fprintf(stderr, "returned value for dialog_inputbox was %d (%s)\n", retval, result); - - end_dialog(); - return 0; -} diff --git a/gnu/lib/libdialog/TESTS/input2.c b/gnu/lib/libdialog/TESTS/input2.c deleted file mode 100644 index 827c052..0000000 --- a/gnu/lib/libdialog/TESTS/input2.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - * small test-driver for new dialog functionality - * - * Copyright (c) 1995, Jordan Hubbard - * - * All rights reserved. - * - * This source code may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of the software nor does - * the author assume any responsibility for damages incurred with - * its use. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include - -/* Kick it off, James! */ -int -main(int argc, char **argv) -{ - int retval; - unsigned char result[128]; - - init_dialog(); - - result[0]='\0'; - DialogInputAttrs |= DITEM_NO_ECHO; - retval = dialog_inputbox("this is dialog_inputbox() in action, test #2 (no echo)", - "Enter something really secret below, please.", - -1, -1, result); - DialogInputAttrs &= DITEM_NO_ECHO; - dialog_clear(); - fprintf(stderr, "returned value for dialog_inputbox was %d (%s)\n", retval, result); - - end_dialog(); - return 0; -} diff --git a/gnu/lib/libdialog/TESTS/menu1.c b/gnu/lib/libdialog/TESTS/menu1.c deleted file mode 100644 index 640157a..0000000 --- a/gnu/lib/libdialog/TESTS/menu1.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * small test-driver for new dialog functionality - * - * Copyright (c) 1995, Jordan Hubbard - * - * All rights reserved. - * - * This source code may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of the software nor does - * the author assume any responsibility for damages incurred with - * its use. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include - -/* Start of hook functions */ -static enum { nowhere, berlin, rome, ny } where; - -static int -_menu1_berlin_action(dialogMenuItem *self) -{ - if (where == berlin) { - dialog_mesgbox("excuse me?", "But you're already *in* Berlin!", -1, -1); - } - else { - where = berlin; - dialog_mesgbox("whoosh!", "Welcome to Berlin! Have a beer!", -1, -1); - } - return DITEM_SUCCESS | DITEM_RESTORE | DITEM_CONTINUE; -} - -static int -_menu1_rome_action(dialogMenuItem *self) -{ - if (where == rome) { - dialog_mesgbox("The wine must be getting to you..", "You're already in Rome!", -1, -1); - } - else { - where = rome; - dialog_mesgbox("whoosh!", "Welcome to Rome! Have a coffee!", -1, -1); - } - return DITEM_SUCCESS | DITEM_RESTORE | DITEM_CONTINUE; -} - -static int -_menu1_ny_action(dialogMenuItem *self) -{ - if (where == ny) { - dialog_mesgbox("Say what?", "You're already there!", -1, -1); - } - else { - where = ny; - dialog_mesgbox("whoosh!", "Welcome to New York! Now go someplace else!", -1, -1); - } - return DITEM_SUCCESS | DITEM_RESTORE | DITEM_CONTINUE; -} - -/* menu1 - show off the "fire" action hook */ -/* prompt title checked fire */ -static dialogMenuItem menu1[] = { - { "Berlin", "Go visit Germany's new capitol", NULL, _menu1_berlin_action }, - { "Rome", "Go visit the Roman ruins", NULL, _menu1_rome_action }, - { "New York", "Go visit the streets of New York", NULL, _menu1_ny_action }, -}; - -/* End of hook functions */ - -/* Kick it off, James! */ -int -main(int argc, char **argv) -{ - int retval; - - init_dialog(); - - retval = dialog_menu("this is dialog_menu() in action, test #1", - "this simple menu shows off some of the straight-forward features\n" - "of the new menu system's action dispatch hooks. Select Cancel to leave", - -1, -1, 3, -3, menu1, NULL, NULL, NULL); - dialog_clear(); - fprintf(stderr, "returned value for dialog_menu was %d\n", retval); - - end_dialog(); - return 0; -} diff --git a/gnu/lib/libdialog/TESTS/menu2.c b/gnu/lib/libdialog/TESTS/menu2.c deleted file mode 100644 index 1545cd8..0000000 --- a/gnu/lib/libdialog/TESTS/menu2.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * small test-driver for new dialog functionality - * - * Copyright (c) 1995, Jordan Hubbard - * - * All rights reserved. - * - * This source code may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of the software nor does - * the author assume any responsibility for damages incurred with - * its use. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include - -/* Start of hook functions */ -static enum { nowhere, berlin, rome, ny } where; - -static int -_menu1_berlin_action(dialogMenuItem *self) -{ - if (where == berlin) - dialog_mesgbox("excuse me?", "But you're already *in* Berlin!", -1, -1); - else { - where = berlin; - dialog_mesgbox("whoosh!", "Welcome to Berlin! Have a beer!", -1, -1); - } - return DITEM_SUCCESS | DITEM_RESTORE | DITEM_CONTINUE; -} - -static int -_menu1_rome_action(dialogMenuItem *self) -{ - if (where == rome) - dialog_mesgbox("The wine must be getting to you..", "You're already in Rome!", -1, -1); - else { - where = rome; - dialog_mesgbox("whoosh!", "Welcome to Rome! Have a coffee!", -1, -1); - } - return DITEM_SUCCESS | DITEM_RESTORE | DITEM_CONTINUE; -} - -static int -_menu1_ny_action(dialogMenuItem *self) -{ - if (where == ny) - dialog_mesgbox("Say what?", "You're already there!", -1, -1); - else { - where = ny; - dialog_mesgbox("whoosh!", "Welcome to New York! Now go someplace else!", -1, -1); - } - return DITEM_SUCCESS | DITEM_RESTORE | DITEM_CONTINUE; -} - -/* menu1 - show off the "fire" action hook */ -/* prompt title checked fire */ -static dialogMenuItem menu1[] = { - { "Berlin", "Go visit Germany's new capitol", NULL, _menu1_berlin_action }, - { "Rome", "Go visit the Roman ruins", NULL, _menu1_rome_action }, - { "New York", "Go visit the streets of New York", NULL, _menu1_ny_action }, -}; - -/* End of hook functions */ - -/* Kick it off, James! */ -int -main(int argc, char **argv) -{ - int retval; - - init_dialog(); - - use_helpfile("menu2.c"); - use_helpline("Type F1 to view the source for this demo"); - retval = dialog_menu("this is dialog_menu() in action, test #2", - "this simple menu shows off some of the straight-forward features\n" - "of the new menu system's action dispatch hooks as well as a helpline\n" - "and a helpfile. Select Cancel to leave", - -1, -1, 3, -3, menu1, NULL, NULL, NULL); - dialog_clear(); - fprintf(stderr, "returned value for dialog_menu was %d\n", retval); - - end_dialog(); - return 0; -} diff --git a/gnu/lib/libdialog/TESTS/menu3.c b/gnu/lib/libdialog/TESTS/menu3.c deleted file mode 100644 index 3a7a137..0000000 --- a/gnu/lib/libdialog/TESTS/menu3.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - * small test-driver for new dialog functionality - * - * Copyright (c) 1995, Jordan Hubbard - * - * All rights reserved. - * - * This source code may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of the software nor does - * the author assume any responsibility for damages incurred with - * its use. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include - -/* Hook functions */ - -static int -stop(dialogMenuItem *self) -{ - dialog_mesgbox("!", "I'm no idiot!", -1, -1); - return DITEM_SUCCESS; -} - -static int -maybe(dialogMenuItem *self) -{ - dialog_mesgbox("!", "I said don't rush me! I'm THINKING!", -1, -1); - return DITEM_SUCCESS | DITEM_RESTORE | DITEM_CONTINUE; -} - -/* Dummy menu just to show of the ability */ -static char *insurance[] = { - "1,000,000", "Mondo insurance policy", "Off", - "5,000,000", "Mega insurance policy", "Off", - "10,000,000", "Friend! Most Favored customer!", "On" -}; - -static void -preinsure(dialogMenuItem *self, int is_selected) -{ - if (is_selected) { - static WINDOW *w; - - /* This has to be here first if you want to see selection traverse properly in the invoking menu */ - refresh(); - - w = dupwin(newscr); - DialogX = 1; - DialogY = 13; - dialog_radiolist("How much insurance would you like to take out?", - "If you're really going to do this, we recommend some insurance\n" - "first! What kind of life insurance policy would you like?", - -1, -1, 3, 3, insurance, NULL); - touchwin(w); - wrefresh(w); - delwin(w); - } -} - -/* - * Show a simple menu that puts up a sub menu when a certain item is traversed to - */ - -/* prompt title checked fire sel */ -static dialogMenuItem doit[] = { - { "Rah!" }, - { "No way!" }, - { "Stop", "No, I'm not going to do that!", NULL, stop, NULL }, - { "Maybe", "I'm still thinking about it, don't rush me!", NULL, maybe, NULL, }, - { "Go", "Yes! Yes! I want to do it!", NULL, NULL, preinsure }, -}; - -/* End of hook functions */ - -/* Kick it off, James! */ -int -main(int argc, char **argv) -{ - int retval; - - init_dialog(); - - - DialogX = 5; - DialogY = 1; - retval = dialog_menu("Do you have the GUTS?", - "C'mon, macho man! Do you have what it takes to do something REALLY\n" - "dangerous and stupid? WHAT ARE YOU WAITING FOR?!", - -1, -1, 3, -3, doit + 2, (char *)TRUE, NULL, NULL); - dialog_clear(); - fprintf(stderr, "returned value for dialog_menu was %d\n", retval); - - end_dialog(); - return 0; -} diff --git a/gnu/lib/libdialog/TESTS/msg.c b/gnu/lib/libdialog/TESTS/msg.c deleted file mode 100644 index c6f590f..0000000 --- a/gnu/lib/libdialog/TESTS/msg.c +++ /dev/null @@ -1,42 +0,0 @@ -/* - * small test-driver for new dialog functionality - * - * Copyright (c) 1995, Jordan Hubbard - * - * All rights reserved. - * - * This source code may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of the software nor does - * the author assume any responsibility for damages incurred with - * its use. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include - -/* Kick it off, James! */ -int -main(int argc, char **argv) -{ - int retval; - - init_dialog(); - - retval = dialog_msgbox("This is dialog_msgbox() in action with pause on", "Hi there. Please press return now.", - -1, -1, 1); - dialog_clear(); - fprintf(stderr, "returned value for dialog_msgbox was %d\n", retval); - - end_dialog(); - return 0; -} diff --git a/gnu/lib/libdialog/TESTS/prgbox.c b/gnu/lib/libdialog/TESTS/prgbox.c deleted file mode 100644 index 2da4611..0000000 --- a/gnu/lib/libdialog/TESTS/prgbox.c +++ /dev/null @@ -1,41 +0,0 @@ -/* - * small test-driver for new dialog functionality - * - * Copyright (c) 1995, Jordan Hubbard - * - * All rights reserved. - * - * This source code may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of the software nor does - * the author assume any responsibility for damages incurred with - * its use. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include - -/* Kick it off, James! */ -int -main(int argc, char **argv) -{ - int retval; - - init_dialog(); - - retval = dialog_prgbox("This is dialog_prgbox() in action with cal(1)", "cal", 14, 50, TRUE, TRUE); - dialog_clear(); - fprintf(stderr, "returned value for dialog_prgbox was %d\n", retval); - - end_dialog(); - return 0; -} diff --git a/gnu/lib/libdialog/TESTS/radio1.c b/gnu/lib/libdialog/TESTS/radio1.c deleted file mode 100644 index c4eeffd..0000000 --- a/gnu/lib/libdialog/TESTS/radio1.c +++ /dev/null @@ -1,71 +0,0 @@ -/* - * small test-driver for new dialog functionality - * - * Copyright (c) 1995, Jordan Hubbard - * - * All rights reserved. - * - * This source code may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of the software nor does - * the author assume any responsibility for damages incurred with - * its use. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include - -/* Hook functions */ - -static int spending; - -static int -check(dialogMenuItem *self) -{ - return ((int)(intptr_t)self->data == spending); -} - -static int -spend(dialogMenuItem *self) -{ - spending = (int)(intptr_t)self->data; - return DITEM_SUCCESS | DITEM_REDRAW; -} - -/* menu5 - Show a simple radiolist menu that inherits the radio appearance by default */ -/* prompt title checked fire sel data */ -static dialogMenuItem menu5[] = { - { "1000", "Spend $1,000", check, spend, NULL, (void *)1000 }, - { "500", "Spend $500", check, spend, NULL, (void *)500 }, - { "100", "Spend $100", check, spend, NULL, (void *)100 }, -}; - -/* End of hook functions */ - -/* Kick it off, James! */ -int -main(int argc, char **argv) -{ - int retval; - - init_dialog(); - - - retval = dialog_radiolist("this is dialog_radiolist() in action, test #1", - "this radio menu shows off some of the straight-forward features\n" - "of the new menu system's check & fire dispatch hooks", -1, -1, 3, -3, menu5, NULL); - dialog_clear(); - fprintf(stderr, "returned value for dialog_radiolist was %d (money set to %d)\n", retval, spending); - - end_dialog(); - return 0; -} diff --git a/gnu/lib/libdialog/TESTS/radio2.c b/gnu/lib/libdialog/TESTS/radio2.c deleted file mode 100644 index 15e353c..0000000 --- a/gnu/lib/libdialog/TESTS/radio2.c +++ /dev/null @@ -1,89 +0,0 @@ -/* - * small test-driver for new dialog functionality - * - * Copyright (c) 1995, Jordan Hubbard - * - * All rights reserved. - * - * This source code may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of the software nor does - * the author assume any responsibility for damages incurred with - * its use. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include - -/* Hook functions */ - -static char bachelor[10], bachelette[10]; - -static int -getBachelor(dialogMenuItem *self) -{ - return !strcmp(bachelor, self->prompt); -} - -static int -setBachelor(dialogMenuItem *self) -{ - strcpy(bachelor, self->prompt); - return DITEM_SUCCESS | DITEM_REDRAW; -} - -static int -getBachelette(dialogMenuItem *self) -{ - return !strcmp(bachelette, self->prompt); -} - -static int -setBachelette(dialogMenuItem *self) -{ - strcpy(bachelette, self->prompt); - return DITEM_SUCCESS | DITEM_REDRAW; -} - -/* menu6- More complex radiolist menu that creates two groups in a single menu */ -/* prompt title checked fire */ -static dialogMenuItem menu6[] = { - { "Tom", "Tom's a dynamic shoe salesman from Tulsa, OK!", getBachelor, setBachelor }, - { "Dick", "Dick's a retired engine inspector from McDonnell-Douglas!", getBachelor, setBachelor }, - { "Harry", "Harry's a professional female impersonator from Las Vegas!", getBachelor, setBachelor }, - { "-----", "----------------------------------", NULL, NULL, NULL, NULL, ' ', ' ', ' ' }, - { "Jane", "Jane's a twice-divorced housewife from Moose, Oregon!", getBachelette, setBachelette }, - { "Sally", "Sally's a shy Human Resources Manager for IBM!", getBachelette, setBachelette }, - { "Mary", "Mary's an energetic serial killer on the lam!", getBachelette, setBachelette }, -}; - -/* End of hook functions */ - -/* Kick it off, James! */ -int -main(int argc, char **argv) -{ - int retval; - - init_dialog(); - - retval = dialog_radiolist("this is dialog_radiolist() in action, test #2", - "Welcome to \"The Love Blender!\" - America's favorite game show\n" - "where YOU, the contestant, get to choose which of these two\n" - "fine specimens of humanity will go home together, whether they\n" - "like it or not!", -1, -1, 7, -7, menu6, NULL); - dialog_clear(); - fprintf(stderr, "I'm sure that %s and %s will be very happy together!\n", bachelor, bachelette); - - end_dialog(); - return 0; -} diff --git a/gnu/lib/libdialog/TESTS/radio3.c b/gnu/lib/libdialog/TESTS/radio3.c deleted file mode 100644 index 2175358..0000000 --- a/gnu/lib/libdialog/TESTS/radio3.c +++ /dev/null @@ -1,98 +0,0 @@ -/* - * small test-driver for new dialog functionality - * - * Copyright (c) 1995, Jordan Hubbard - * - * All rights reserved. - * - * This source code may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of the software nor does - * the author assume any responsibility for damages incurred with - * its use. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include - -/* Hook functions */ - -static int spending; - -static int -check(dialogMenuItem *self) -{ - return ((int)(intptr_t)self->data == spending); -} - -static int -spend(dialogMenuItem *self) -{ - spending = (int)(intptr_t)self->data; - return DITEM_SUCCESS | DITEM_REDRAW; -} - -static void -ask(dialogMenuItem *self, int is_selected) -{ - if (is_selected) { - char *str; - - if (!strcmp(self->prompt, "1000")) - str = "You'd better ask both your parents first! "; - else if (!strcmp(self->prompt, "500")) - str = "You'd better at least ask your Dad! "; - else - str = "Yes, being frugal is probably a good idea!"; - DialogX = 15; - DialogY = 17; - dialog_msgbox("Free Advice", str, -1, -1, 0); - } -} - -/* - * menu5 - Show a simple radiolist menu that inherits the radio appearance by default and appears at - * a different location, leaving room for a msg box below it. This shows off the DialogX/DialogY extensions. - */ - -/* prompt title checked fire sel data */ -static dialogMenuItem menu5[] = { - { "1000", "Spend $1,000", check, spend, ask, (void *)1000 }, - { "500", "Spend $500", check, spend, ask, (void *)500 }, - { "100", "Spend $100", check, spend, ask, (void *)100 }, -}; - -/* End of hook functions */ - -/* Kick it off, James! */ -int -main(int argc, char **argv) -{ - int retval; - - init_dialog(); - - - DialogX = 5; - DialogY = 1; - retval = dialog_radiolist("this is dialog_radiolist() in action, test #3", - "This radio menu shows off the ability to put dialog menus and other\n" - "controls at different locations, as well as the `selected' hook which\n" - "lets you follow the traversal of the selection bar as well as what's\n" - "selected.", - -1, -1, 3, -3, menu5, NULL); - dialog_clear(); - fprintf(stderr, "returned value for dialog_radiolist was %d (money set to %d)\n", retval, spending); - - end_dialog(); - return 0; -} diff --git a/gnu/lib/libdialog/TESTS/text.c b/gnu/lib/libdialog/TESTS/text.c deleted file mode 100644 index e071937..0000000 --- a/gnu/lib/libdialog/TESTS/text.c +++ /dev/null @@ -1,41 +0,0 @@ -/* - * small test-driver for new dialog functionality - * - * Copyright (c) 1995, Jordan Hubbard - * - * All rights reserved. - * - * This source code may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of the software nor does - * the author assume any responsibility for damages incurred with - * its use. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include - -/* Kick it off, James! */ -int -main(int argc, char **argv) -{ - int retval; - - init_dialog(); - - retval = dialog_textbox("This is dialog_textbox() in action with /etc/passwd", "/etc/passwd", 10, 60); - dialog_clear(); - fprintf(stderr, "returned value for dialog_textbox was %d\n", retval); - - end_dialog(); - return 0; -} diff --git a/gnu/lib/libdialog/TESTS/tree.c b/gnu/lib/libdialog/TESTS/tree.c deleted file mode 100644 index c69b52e..0000000 --- a/gnu/lib/libdialog/TESTS/tree.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * tree.c - * - * small test-driver for new dialog functionality - * - * Copyright (c) 1998, Anatoly A. Orehovsky - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include - -unsigned char *names[] = { - "/", - "/dev", - "/dev/fd", - "/tmp", - "/usr", - "/var", - "/home", - "/stand", - "/stand/etc", - "/stand/en_US.ISO8859-1", - "/stand/info", - "/stand/info/bin", - "/stand/info/des", - "/stand/info/games", - "/stand/info/manpages", - "/stand/info/proflibs", - "/stand/info/dict", - "/stand/info/info", - "/stand/info/src", - "/etc", - "/etc/gnats", - "/etc/kerberosIV", - "/etc/mtree", - "/etc/namedb", - "/etc/ppp", - "/etc/uucp", - "/etc/sliphome", - "/proc", - "/lkm", - "/mnt", - "/root", - "/sbin", - "/bin", - 0 -}; - -unsigned char *names1[] = { - "a", - "a:b", - "a:b:c", - "a:d" -}; - -int -main(int argc, char **argv) -{ - int retval; - unsigned char *tresult; - char comstr[BUFSIZ]; - - init_dialog(); - do { - use_helpline("Press OK for listing directory"); - retval = dialog_tree(names, - sizeof(names)/sizeof(unsigned char *) - 1, - '/', - "tree dialog box example", - "Typical find -x / -type d output", - -1, -1, 15, - &tresult); - - if (retval) - break; - - use_helpline(NULL); - (void)snprintf(comstr, sizeof(comstr), - "ls -CF %s", tresult); - - retval = dialog_prgbox( - comstr, - comstr, 20, 60, TRUE, TRUE); - - dialog_clear(); - - retval = dialog_tree(names1, - sizeof(names1)/sizeof(unsigned char *), - ':', - "tree dialog box example", - "Other tree", - -1, -1, 5, - &tresult); - if (!retval) - { - dialog_clear(); - } - } while (!retval); - - dialog_update(); - - dialog_clear(); - - end_dialog(); - - exit(retval); -} diff --git a/gnu/lib/libdialog/TESTS/yesno.c b/gnu/lib/libdialog/TESTS/yesno.c deleted file mode 100644 index 647b51c..0000000 --- a/gnu/lib/libdialog/TESTS/yesno.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * small test-driver for new dialog functionality - * - * Copyright (c) 1995, Jordan Hubbard - * - * All rights reserved. - * - * This source code may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of the software nor does - * the author assume any responsibility for damages incurred with - * its use. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include - -/* Kick it off, James! */ -int -main(int argc, char **argv) -{ - int rval1, rval2; - - init_dialog(); - - rval1 = dialog_yesno("This is dialog_yesno() in action", - "Have you stopped deliberately putting bugs into your code?", -1, -1); - dialog_clear(); - rval2 = dialog_noyes("This is dialog_noyes() in action", - "Have you stopped beating your wife?", -1, -1); - dialog_clear(); - end_dialog(); - fprintf(stderr, "returned value for dialog_yesno was %d\n", rval1); - fprintf(stderr, "returned value for dialog_noyes was %d\n", rval2); - return 0; -} diff --git a/gnu/lib/libdialog/TODO b/gnu/lib/libdialog/TODO deleted file mode 100644 index 132a4a4..0000000 --- a/gnu/lib/libdialog/TODO +++ /dev/null @@ -1,36 +0,0 @@ -- cut off names in the listbox that are to long -done 27Jan95 - The current behaviour may not be desirable. When browsing through - long names these, when highlighted, will be shown with the first - characters cut off, when not highlighted the last characters will - be cut off. - -- look at behaviour of TAB key when browsing through directories. -done 28Jan95 - -- make sure the full name of the directory is written to the - "Directory:"-box -done 28Jan95 - -- mark current selections in listbox when initializing the listobject -Idontknow -- test and use Notify() when checking for error conditions -ok -- test overall -- adapt color of buttons when changing focus to the button. -done 28Jan95 -- add shade to dialog_fselect()-window -done 29Jan95 -- add (nn%) indication to lists. -done 30Jan95 -- add use_helpfile() -done 13Feb95 -- add use_helpline() - -NOTE: apparently there is a bug (or a strange interaction between pkg_manage -and dialog_textbox) in dialog_textbox. When I use this routine to display -the helpfile in display_helpfile() the program gets mysterious segmentation -faults and bus errors. -I now use dialog_mesgbox, after I have read the file into a buffer. - - diff --git a/gnu/lib/libdialog/checklist.c b/gnu/lib/libdialog/checklist.c deleted file mode 100644 index e349ca6..0000000 --- a/gnu/lib/libdialog/checklist.c +++ /dev/null @@ -1,661 +0,0 @@ -/* - * checklist.c -- implements the checklist box - * - * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) - * - * Substantial rennovation: 12/18/95, Jordan K. Hubbard - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include "dialog.priv.h" - - -static void print_item(WINDOW *win, unsigned char *tag, unsigned char *item, int status, int choice, int selected, dialogMenuItem *me, int list_width, int item_x, int check_x); - -#define DREF(di, item) ((di) ? &((di)[(item)]) : NULL) - -/* - * Display a dialog box with a list of options that can be turned on or off - */ -int -dialog_checklist(unsigned char *title, unsigned char *prompt, int height, int width, - int list_height, int cnt, void *it, unsigned char *result) -{ - int i, j, x, y, cur_x, cur_y, old_x, old_y, box_x, box_y, key = 0, button, - choice, l, k, scroll, max_choice, item_no = 0, *status; - int redraw_menu = FALSE, cursor_reset = FALSE; - int rval = 0, onlist = 1, ok_space, cancel_space; - char okButton, cancelButton; - WINDOW *dialog, *list; - unsigned char **items = NULL; - dialogMenuItem *ditems; - int list_width, check_x, item_x; - - /* Allocate space for storing item on/off status */ - if ((status = alloca(sizeof(int) * abs(cnt))) == NULL) { - endwin(); - fprintf(stderr, "\nCan't allocate memory in dialog_checklist().\n"); - exit(-1); - } - -draw: - choice = scroll = button = 0; - /* Previous calling syntax, e.g. just a list of strings? */ - if (cnt >= 0) { - items = it; - ditems = NULL; - item_no = cnt; - /* Initializes status */ - for (i = 0; i < item_no; i++) - status[i] = !strcasecmp(items[i*3 + 2], "on"); - } - /* It's the new specification format - fake the rest of the code out */ - else { - item_no = abs(cnt); - ditems = it; - if (!items) - items = (unsigned char **)alloca((item_no * 3) * sizeof(unsigned char *)); - - /* Initializes status */ - for (i = 0; i < item_no; i++) { - status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE; - items[i*3] = ditems[i].prompt; - items[i*3 + 1] = ditems[i].title; - items[i*3 + 2] = status[i] ? "on" : "off"; - } - } - max_choice = MIN(list_height, item_no); - - check_x = 0; - item_x = 0; - /* Find length of longest item in order to center checklist */ - for (i = 0; i < item_no; i++) { - l = strlen(items[i*3]); - for (j = 0; j < item_no; j++) { - k = strlen(items[j*3 + 1]); - check_x = MAX(check_x, l + k + 6); - } - item_x = MAX(item_x, l); - } - if (height < 0) - height = strheight(prompt)+list_height+4+2; - if (width < 0) { - i = strwidth(prompt); - j = ((title != NULL) ? strwidth(title) : 0); - width = MAX(i,j); - width = MAX(width,check_x+4)+4; - } - width = MAX(width,24); - - if (width > COLS) - width = COLS; - if (height > LINES) - height = LINES; - /* center dialog box on screen */ - x = (COLS - width)/2; - y = (LINES - height)/2; - -#ifdef HAVE_NCURSES - if (use_shadow) - draw_shadow(stdscr, y, x, height, width); -#endif - dialog = newwin(height, width, y, x); - if (dialog == NULL) { - endwin(); - fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width, y, x); - return -1; - } - keypad(dialog, TRUE); - - draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); - wattrset(dialog, border_attr); - wmove(dialog, height-3, 0); - waddch(dialog, ACS_LTEE); - for (i = 0; i < width-2; i++) - waddch(dialog, ACS_HLINE); - wattrset(dialog, dialog_attr); - waddch(dialog, ACS_RTEE); - wmove(dialog, height-2, 1); - for (i = 0; i < width-2; i++) - waddch(dialog, ' '); - - if (title != NULL) { - wattrset(dialog, title_attr); - wmove(dialog, 0, (width - strlen(title))/2 - 1); - waddch(dialog, ' '); - waddstr(dialog, title); - waddch(dialog, ' '); - } - wattrset(dialog, dialog_attr); - wmove(dialog, 1, 2); - print_autowrap(dialog, prompt, height - 1, width - 2, width, 1, 2, TRUE, FALSE); - - list_width = width - 6; - getyx(dialog, cur_y, cur_x); - box_y = cur_y + 1; - box_x = (width - list_width) / 2 - 1; - - /* create new window for the list */ - list = subwin(dialog, list_height, list_width, y + box_y + 1, x + box_x + 1); - if (list == NULL) { - delwin(dialog); - endwin(); - fprintf(stderr, "\nsubwin(dialog,%d,%d,%d,%d) failed, maybe wrong dims\n", list_height, list_width, - y + box_y + 1, x + box_x + 1); - return -1; - } - keypad(list, TRUE); - - /* draw a box around the list items */ - draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2, menubox_border_attr, menubox_attr); - - check_x = (list_width - check_x) / 2; - item_x = check_x + item_x + 6; - - /* Print the list */ - for (i = 0; i < max_choice; i++) - print_item(list, items[i * 3], items[i * 3 + 1], status[i], i, i == choice, DREF(ditems, i), list_width, item_x, check_x); - wnoutrefresh(list); - print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); - - display_helpline(dialog, height - 1, width); - - x = width / 2 - 11; - y = height - 2; - /* Is this a fancy new style argument string where we get to override - * the buttons, or an old style one where they're fixed? - */ - if (ditems && result) { - cancelButton = toupper(ditems[CANCEL_BUTTON].prompt[0]); - print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : FALSE); - okButton = toupper(ditems[OK_BUTTON].prompt[0]); - print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : TRUE); - } - else { - cancelButton = 'C'; - print_button(dialog, "Cancel", y, x + 14, FALSE); - okButton = 'O'; - print_button(dialog, " OK ", y, x, TRUE); - } - wnoutrefresh(dialog); - wmove(list, choice, check_x+1); - wrefresh(list); - - /* - * XXX Black magic voodoo that allows printing to the checklist - * window. For some reason, if this "refresh" code is not in - * place, printing to the window from the selected callback - * prints "behind" the checklist window. There is probably a - * better way to do this. - */ - draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2, menubox_border_attr, menubox_attr); - - for (i = 0; i < max_choice; i++) - print_item(list, items[i * 3], items[i * 3 + 1], status[i], i, i == choice, DREF(ditems, i), list_width, item_x, check_x); - print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); - - wmove(list, choice, check_x+1); - wnoutrefresh(dialog); - wrefresh(list); - /* XXX Black magic XXX */ - - while (key != ESC) { - key = wgetch(dialog); - - /* Shortcut to OK? */ - if (toupper(key) == okButton) { - if (ditems) { - if (result && ditems[OK_BUTTON].fire) { - int st; - WINDOW *save; - - save = dupwin(newscr); - st = ditems[OK_BUTTON].fire(&ditems[OK_BUTTON]); - if (st & DITEM_RESTORE) { - touchwin(save); - wrefresh(save); - } - delwin(save); - } - } - else if (result) { - *result = '\0'; - for (i = 0; i < item_no; i++) { - if (status[i]) { - strcat(result, items[i*3]); - strcat(result, "\n"); - } - } - } - rval = 0; - key = ESC; /* Lemme out! */ - break; - } - - /* Shortcut to cancel? */ - if (toupper(key) == cancelButton) { - if (ditems && result && ditems[CANCEL_BUTTON].fire) { - int st; - WINDOW *save; - - save = dupwin(newscr); - st = ditems[CANCEL_BUTTON].fire(&ditems[CANCEL_BUTTON]); - if (st & DITEM_RESTORE) { - touchwin(save); - wrefresh(save); - wmove(dialog, cur_y, cur_x); - } - delwin(save); - } - rval = 1; - key = ESC; /* I gotta go! */ - break; - } - - /* Check if key pressed matches first character of any item tag in list */ - for (i = 0; i < max_choice; i++) - if (key != ' ' && key < 0x100 && toupper(key) == toupper(items[(scroll+i)*3][0])) - break; - - if (i < max_choice || (key >= '1' && key <= MIN('9', '0'+max_choice)) || - KEY_IS_UP(key) || KEY_IS_DOWN(key) || ((key == ' ' || key == '\n' || - key == '\r') && onlist)) { - - /* if moving from buttons to the list, reset and redraw buttons */ - if (!onlist) { - onlist = 1; - button = 0; - - if (ditems && result) { - print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); - print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); - } - else { - print_button(dialog, "Cancel", y, x + 14, button); - print_button(dialog, " OK ", y, x, !button); - } - wmove(list, choice, check_x+1); - wnoutrefresh(dialog); - wrefresh(list); - } - - if (key >= '1' && key <= MIN('9', '0'+max_choice)) - i = key - '1'; - - else if (KEY_IS_UP(key)) { - if (!choice) { - if (scroll) { - /* Scroll list down */ - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - if (list_height > 1) { - /* De-highlight current first item before scrolling down */ - print_item(list, items[scroll * 3], items[scroll * 3 + 1], status[scroll], 0, - FALSE, DREF(ditems, scroll), list_width, item_x, check_x); - scrollok(list, TRUE); - wscrl(list, -1); - scrollok(list, FALSE); - } - scroll--; - print_item(list, items[scroll*3], items[scroll*3 + 1], status[scroll], 0, - TRUE, DREF(ditems, scroll), list_width, item_x, check_x); - print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); - wmove(list, choice, check_x+1); - wnoutrefresh(dialog); - wrefresh(list); - } - continue; /* wait for another key press */ - } - else - i = choice - 1; - } - else if (KEY_IS_DOWN(key)) { - if (choice == max_choice - 1) { - if (scroll + choice < item_no - 1) { - /* Scroll list up */ - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - if (list_height > 1) { - /* De-highlight current last item before scrolling up */ - print_item(list, items[(scroll + max_choice - 1) * 3], - items[(scroll + max_choice - 1) * 3 + 1], - status[scroll + max_choice - 1], max_choice - 1, - FALSE, DREF(ditems, scroll + max_choice - 1), list_width, item_x, check_x); - scrollok(list, TRUE); - scroll(list); - scrollok(list, FALSE); - } - scroll++; - print_item(list, items[(scroll + max_choice - 1) * 3], - items[(scroll + max_choice - 1) * 3 + 1], - status[scroll + max_choice - 1], max_choice - 1, TRUE, - DREF(ditems, scroll + max_choice - 1), list_width, item_x, check_x); - print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); - wmove(list, choice, check_x+1); - wnoutrefresh(dialog); - wrefresh(list); - } - continue; /* wait for another key press */ - } - else - i = choice + 1; - } - else if ((key == ' ' || key == '\n' || key == '\r') && onlist) { /* Toggle item status */ - char lbra = 0, rbra = 0, mark = 0; - - getyx(list, old_y, old_x); /* Save cursor position */ - - if (ditems) { - if (ditems[scroll + choice].fire) { - int st; - WINDOW *save; - - save = dupwin(newscr); - st = ditems[scroll + choice].fire(&ditems[scroll + choice]); /* Call "fire" action */ - if (st & DITEM_RESTORE) { - touchwin(save); - wrefresh(save); - } - delwin(save); - if (st & DITEM_REDRAW) { - wclear(list); - for (i = 0; i < item_no; i++) - status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE; - for (i = 0; i < max_choice; i++) { - print_item(list, items[(scroll + i) * 3], items[(scroll + i) * 3 + 1], - status[scroll + i], i, i == choice, DREF(ditems, scroll + i), list_width, item_x, check_x); - } - wnoutrefresh(list); - print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, - cur_x, cur_y); - wrefresh(dialog); - } - if (st & DITEM_LEAVE_MENU) { - /* Allow a fire action to take us out of the menu */ - key = ESC; - rval = 0; - break; - } - else if (st & DITEM_RECREATE) { - delwin(list); - delwin(dialog); - dialog_clear(); - goto draw; - } - } - status[scroll + choice] = ditems[scroll + choice].checked ? - ditems[scroll + choice].checked(&ditems[scroll + choice]) : FALSE; - lbra = ditems[scroll + choice].lbra; - rbra = ditems[scroll + choice].rbra; - mark = ditems[scroll + choice].mark; - } - else - status[scroll + choice] = !status[scroll + choice]; - wmove(list, choice, check_x); - wattrset(list, check_selected_attr); - if (!lbra) - lbra = '['; - if (!rbra) - rbra = ']'; - if (!mark) - mark = 'X'; - wprintw(list, "%c%c%c", lbra, status[scroll + choice] ? mark : ' ', rbra); - wmove(list, old_y, old_x); /* Restore cursor to previous position */ - wrefresh(list); - continue; /* wait for another key press */ - } - - if (i != choice) { - /* De-highlight current item */ - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - print_item(list, items[(scroll + choice) * 3], items[(scroll + choice) * 3 + 1], - status[scroll + choice], choice, FALSE, DREF(ditems, scroll + choice), list_width, item_x, check_x); - - /* Highlight new item */ - choice = i; - print_item(list, items[(scroll + choice) * 3], items[(scroll + choice) * 3 + 1], status[scroll + choice], choice, TRUE, DREF(ditems, scroll + choice), list_width, item_x, check_x); - wmove(list, choice, check_x+1); /* Restore cursor to previous position */ - wrefresh(list); - } - continue; /* wait for another key press */ - } - - switch (key) { - case KEY_PPAGE: /* can we go up? */ - if (scroll > height - 4) - scroll -= (height-4); - else - scroll = 0; - redraw_menu = TRUE; - if (!onlist) { - onlist = 1; - button = 0; - } - break; - - case KEY_NPAGE: /* can we go down a full page? */ - if (scroll + list_height >= item_no-1 - list_height) { - scroll = item_no - list_height; - if (scroll < 0) - scroll = 0; - } - else - scroll += list_height; - redraw_menu = TRUE; - if (!onlist) { - onlist = 1; - button = 0; - } - break; - - case KEY_HOME: /* go to the top */ - scroll = 0; - choice = 0; - redraw_menu = TRUE; - cursor_reset = TRUE; - onlist = 1; - break; - - case KEY_END: /* Go to the bottom */ - scroll = item_no - list_height; - if (scroll < 0) - scroll = 0; - choice = max_choice - 1; - redraw_menu = TRUE; - cursor_reset = TRUE; - onlist = 1; - break; - - case TAB: - case KEY_BTAB: - /* move to next component */ - if (onlist) { /* on list, next is ok button */ - onlist = 0; - if (ditems && result) { - print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); - print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); - ok_space = 1; - cancel_space = strlen(ditems[OK_BUTTON].prompt) + 6; - } - else { - print_button(dialog, "Cancel", y, x + 14, button); - print_button(dialog, " OK ", y, x, !button); - ok_space = 3; - cancel_space = 15; - } - if (button) - wmove(dialog, y, x + cancel_space); - else - wmove(dialog, y, x + ok_space); - wrefresh(dialog); - break; - } - else if (button) { /* on cancel button, next is list */ - button = 0; - onlist = 1; - redraw_menu = TRUE; - break; - } - /* on ok button, next is cancel button, same as left/right case */ - - case KEY_LEFT: - case KEY_RIGHT: - onlist = 0; - button = !button; - if (ditems && result) { - print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); - print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); - ok_space = 1; - cancel_space = strlen(ditems[OK_BUTTON].prompt) + 6; - } - else { - print_button(dialog, "Cancel", y, x + 14, button); - print_button(dialog, " OK ", y, x, !button); - ok_space = 3; - cancel_space = 15; - } - if (button) - wmove(dialog, y, x + cancel_space); - else - wmove(dialog, y, x + ok_space); - wrefresh(dialog); - break; - - case ' ': - case '\n': - case '\r': - if (!onlist) { - if (ditems) { - if (result && ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire) { - int st; - WINDOW *save = dupwin(newscr); - - st = ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire(&ditems[button ? CANCEL_BUTTON : OK_BUTTON]); - if (st & DITEM_RESTORE) { - touchwin(save); - wrefresh(save); - } - delwin(save); - if (st == DITEM_FAILURE) - continue; - } - } - else if (result) { - *result = '\0'; - for (i = 0; i < item_no; i++) { - if (status[i]) { - strcat(result, items[i*3]); - strcat(result, "\n"); - } - } - } - rval = button; - key = ESC; /* Bail out! */ - break; - } - - /* Let me outta here! */ - case ESC: - rval = -1; - break; - - /* Help! */ - case KEY_F(1): - case '?': - display_helpfile(); - break; - } - - if (redraw_menu) { - getyx(list, old_y, old_x); - wclear(list); - - /* - * Re-draw a box around the list items. It is required - * if amount of list items is smaller than height of listbox. - * Otherwise un-redrawn field will be filled with default - * screen attributes instead of dialog attributes. - */ - draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2, menubox_border_attr, menubox_attr); - - for (i = 0; i < max_choice; i++) - print_item(list, items[(scroll + i) * 3], items[(scroll + i) * 3 + 1], status[scroll + i], i, i == choice, DREF(ditems, scroll + i), list_width, item_x, check_x); - print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); - - /* redraw buttons to fix highlighting */ - if (ditems && result) { - print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); - print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); - } - else { - print_button(dialog, "Cancel", y, x + 14, button); - print_button(dialog, " OK ", y, x, !button); - } - wnoutrefresh(dialog); - if (cursor_reset) { - wmove(list, choice, check_x+1); - cursor_reset = FALSE; - } - else { - wmove(list, old_y, old_x); - } - wrefresh(list); - redraw_menu = FALSE; - } - } - delwin(list); - delwin(dialog); - return rval; -} - - -/* - * Print list item - */ -static void -print_item(WINDOW *win, unsigned char *tag, unsigned char *item, int status, int choice, int selected, dialogMenuItem *me, int list_width, int item_x, int check_x) -{ - int i; - - /* Clear 'residue' of last item */ - wattrset(win, menubox_attr); - wmove(win, choice, 0); - for (i = 0; i < list_width; i++) - waddch(win, ' '); - wmove(win, choice, check_x); - wattrset(win, selected ? check_selected_attr : check_attr); - wprintw(win, "%c%c%c", me && me->lbra ? me->lbra : '[', - status ? me && me->mark ? me->mark : 'X' : ' ', - me && me->rbra ? me->rbra : ']'); - wattrset(win, menubox_attr); - waddch(win, ' '); - wattrset(win, selected ? tag_key_selected_attr : tag_key_attr); - waddch(win, tag[0]); - wattrset(win, selected ? tag_selected_attr : tag_attr); - waddstr(win, tag + 1); - wmove(win, choice, item_x); - wattrset(win, selected ? item_selected_attr : item_attr); - waddstr(win, item); - /* If have a selection handler for this, call it */ - if (me && me->selected) { - wrefresh(win); - me->selected(me, selected); - } -} -/* End of print_item() */ diff --git a/gnu/lib/libdialog/colors.h b/gnu/lib/libdialog/colors.h deleted file mode 100644 index 7cea0a0..0000000 --- a/gnu/lib/libdialog/colors.h +++ /dev/null @@ -1,219 +0,0 @@ -/* - * colors.h -- color attribute definitions - * - * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - -/* - * Default color definitions - * - * *_FG = foreground - * *_BG = background - * *_HL = highlight? - */ -#define SCREEN_FG COLOR_CYAN -#define SCREEN_BG COLOR_BLUE -#define SCREEN_HL TRUE - -#define SHADOW_FG COLOR_BLACK -#define SHADOW_BG COLOR_BLACK -#define SHADOW_HL TRUE - -#define DIALOG_FG COLOR_BLACK -#define DIALOG_BG COLOR_WHITE -#define DIALOG_HL FALSE - -#define TITLE_FG COLOR_YELLOW -#define TITLE_BG COLOR_WHITE -#define TITLE_HL TRUE - -#define BORDER_FG COLOR_WHITE -#define BORDER_BG COLOR_WHITE -#define BORDER_HL TRUE - -#define BUTTON_ACTIVE_FG COLOR_WHITE -#define BUTTON_ACTIVE_BG COLOR_BLUE -#define BUTTON_ACTIVE_HL TRUE - -#define BUTTON_INACTIVE_FG COLOR_BLACK -#define BUTTON_INACTIVE_BG COLOR_WHITE -#define BUTTON_INACTIVE_HL FALSE - -#define BUTTON_KEY_ACTIVE_FG COLOR_WHITE -#define BUTTON_KEY_ACTIVE_BG COLOR_BLUE -#define BUTTON_KEY_ACTIVE_HL TRUE - -#define BUTTON_KEY_INACTIVE_FG COLOR_RED -#define BUTTON_KEY_INACTIVE_BG COLOR_WHITE -#define BUTTON_KEY_INACTIVE_HL FALSE - -#define BUTTON_LABEL_ACTIVE_FG COLOR_YELLOW -#define BUTTON_LABEL_ACTIVE_BG COLOR_BLUE -#define BUTTON_LABEL_ACTIVE_HL TRUE - -#define BUTTON_LABEL_INACTIVE_FG COLOR_BLACK -#define BUTTON_LABEL_INACTIVE_BG COLOR_WHITE -#define BUTTON_LABEL_INACTIVE_HL TRUE - -#define INPUTBOX_FG COLOR_BLACK -#define INPUTBOX_BG COLOR_WHITE -#define INPUTBOX_HL FALSE - -#define INPUTBOX_BORDER_FG COLOR_BLACK -#define INPUTBOX_BORDER_BG COLOR_WHITE -#define INPUTBOX_BORDER_HL FALSE - -#define SEARCHBOX_FG COLOR_BLACK -#define SEARCHBOX_BG COLOR_WHITE -#define SEARCHBOX_HL FALSE - -#define SEARCHBOX_TITLE_FG COLOR_YELLOW -#define SEARCHBOX_TITLE_BG COLOR_WHITE -#define SEARCHBOX_TITLE_HL TRUE - -#define SEARCHBOX_BORDER_FG COLOR_WHITE -#define SEARCHBOX_BORDER_BG COLOR_WHITE -#define SEARCHBOX_BORDER_HL TRUE - -#define POSITION_INDICATOR_FG COLOR_YELLOW -#define POSITION_INDICATOR_BG COLOR_WHITE -#define POSITION_INDICATOR_HL TRUE - -#define MENUBOX_FG COLOR_BLACK -#define MENUBOX_BG COLOR_WHITE -#define MENUBOX_HL FALSE - -#define MENUBOX_BORDER_FG COLOR_WHITE -#define MENUBOX_BORDER_BG COLOR_WHITE -#define MENUBOX_BORDER_HL TRUE - -#define ITEM_FG COLOR_BLACK -#define ITEM_BG COLOR_WHITE -#define ITEM_HL FALSE - -#define ITEM_SELECTED_FG COLOR_WHITE -#define ITEM_SELECTED_BG COLOR_BLUE -#define ITEM_SELECTED_HL TRUE - -#define TAG_FG COLOR_YELLOW -#define TAG_BG COLOR_WHITE -#define TAG_HL TRUE - -#define TAG_SELECTED_FG COLOR_YELLOW -#define TAG_SELECTED_BG COLOR_BLUE -#define TAG_SELECTED_HL TRUE - -#define TAG_KEY_FG COLOR_RED -#define TAG_KEY_BG COLOR_WHITE -#define TAG_KEY_HL TRUE - -#define TAG_KEY_SELECTED_FG COLOR_RED -#define TAG_KEY_SELECTED_BG COLOR_BLUE -#define TAG_KEY_SELECTED_HL TRUE - -#define CHECK_FG COLOR_BLACK -#define CHECK_BG COLOR_WHITE -#define CHECK_HL FALSE - -#define CHECK_SELECTED_FG COLOR_WHITE -#define CHECK_SELECTED_BG COLOR_BLUE -#define CHECK_SELECTED_HL TRUE - -#define UARROW_FG COLOR_GREEN -#define UARROW_BG COLOR_WHITE -#define UARROW_HL TRUE - -#define DARROW_FG COLOR_GREEN -#define DARROW_BG COLOR_WHITE -#define DARROW_HL TRUE - -/* End of default color definitions */ - -#define C_ATTR(x,y) ((x ? A_BOLD : 0) | COLOR_PAIR((y))) -#define COLOR_NAME_LEN 10 -#define COLOR_COUNT 8 - - -/* - * Global variables - */ - -typedef struct { - unsigned char name[COLOR_NAME_LEN]; - int value; -} color_names_st; - - -#ifdef __DIALOG_MAIN__ - -/* - * For matching color names with color values - */ -color_names_st color_names[] = { - {"BLACK", COLOR_BLACK}, - {"RED", COLOR_RED}, - {"GREEN", COLOR_GREEN}, - {"YELLOW", COLOR_YELLOW}, - {"BLUE", COLOR_BLUE}, - {"MAGENTA", COLOR_MAGENTA}, - {"CYAN", COLOR_CYAN}, - {"WHITE", COLOR_WHITE}, -}; /* color names */ - - -/* - * Table of color values - */ -int color_table[][3] = { - {SCREEN_FG, SCREEN_BG, SCREEN_HL }, - {SHADOW_FG, SHADOW_BG, SHADOW_HL }, - {DIALOG_FG, DIALOG_BG, DIALOG_HL }, - {TITLE_FG, TITLE_BG, TITLE_HL }, - {BORDER_FG, BORDER_BG, BORDER_HL }, - {BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL }, - {BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL }, - {BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL }, - {BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG, BUTTON_KEY_INACTIVE_HL }, - {BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG, BUTTON_LABEL_ACTIVE_HL }, - {BUTTON_LABEL_INACTIVE_FG,BUTTON_LABEL_INACTIVE_BG,BUTTON_LABEL_INACTIVE_HL}, - {INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL }, - {INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL }, - {SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL }, - {SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL }, - {SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL }, - {POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL }, - {MENUBOX_FG, MENUBOX_BG, MENUBOX_HL }, - {MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL }, - {ITEM_FG, ITEM_BG, ITEM_HL }, - {ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL }, - {TAG_FG, TAG_BG, TAG_HL }, - {TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL }, - {TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL }, - {TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL }, - {CHECK_FG, CHECK_BG, CHECK_HL }, - {CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL }, - {UARROW_FG, UARROW_BG, UARROW_HL }, - {DARROW_FG, DARROW_BG, DARROW_HL }, -}; /* color_table */ - -#else - -extern color_names_st color_names[]; -extern int color_table[][3]; - -#endif /* __DIALOG_MAIN__ */ diff --git a/gnu/lib/libdialog/dialog.3 b/gnu/lib/libdialog/dialog.3 deleted file mode 100644 index 2e4b8fb..0000000 --- a/gnu/lib/libdialog/dialog.3 +++ /dev/null @@ -1,842 +0,0 @@ -.\" -.\" Copyright (c) 1995, Jordan Hubbard -.\" -.\" All rights reserved. -.\" -.\" This manual page may be used, modified, copied, distributed, and -.\" sold, in both source and binary form provided that the above -.\" copyright and these terms are retained, verbatim, as the first -.\" lines of this file. Under no circumstances is the author -.\" responsible for the proper functioning of the software described herein -.\" nor does the author assume any responsibility for damages incurred with -.\" its use. -.\" -.\" $FreeBSD$ -.\" -.Dd January 1, 2000 -.Dt DIALOG 3 -.Os -.Sh NAME -.Nm draw_shadow , -.Nm draw_box , -.Nm line_edit , -.Nm strheight , -.Nm strwidth , -.Nm dialog_create_rc , -.Nm dialog_yesno , -.Nm dialog_noyes , -.Nm dialog_prgbox , -.Nm dialog_msgbox , -.Nm dialog_textbox , -.Nm dialog_menu , -.Nm dialog_checklist , -.Nm dialog_radiolist , -.Nm dialog_inputbox , -.Nm dialog_clear_norefresh , -.Nm dialog_clear , -.Nm dialog_update , -.Nm dialog_fselect , -.Nm dialog_notify , -.Nm dialog_mesgbox , -.Nm dialog_gauge , -.Nm init_dialog , -.Nm end_dialog , -.Nm use_helpfile , -.Nm use_helpline , -.Nm get_helpline , -.Nm restore_helpline , -.Nm dialog_ftree , -.Nm dialog_tree -.Nd provide a simple ncurses-based GUI interface -.Sh SYNOPSIS -.In dialog.h -.Ft "void" -.Fn draw_shadow "WINDOW *win" "int y" "int x" "int height" "int width" -.Ft "void" -.Fn draw_box "WINDOW *win" "int y" "int x" "int height" "int width" "chtype box" "chtype border" -.Ft "int" -.Fo line_edit -.Fa "WINDOW *dialog" -.Fa "int box_y" -.Fa "int box_x" -.Fa "int flen" -.Fa "int box_width" -.Fa "chtype attr" -.Fa "int first" -.Fa "unsigned char *result" -.Fa "int attr_mask" -.Fc -.Ft "int" -.Fn strheight "const char *p" -.Ft "int" -.Fn strwidth "const char *p" -.Ft "void" -.Fn dialog_create_rc "unsigned char *filename" -.Ft "int" -.Fn dialog_yesno "unsigned char *title" "unsigned char *prompt" "int height" "int width" -.Ft "int" -.Fn dialog_noyes "unsigned char *title" "unsigned char *prompt" "int height" "int width" -.Ft "int" -.Fn dialog_prgbox "unsigned char *title" "const unsigned char *line" "int height" "int width" "int pause" "int use_shell" -.Ft "int" -.Fn dialog_textbox "unsigned char *title" "unsigned char *file" "int height" "int width" -.Ft "int" -.Fo dialog_menu -.Fa "unsigned char *title" -.Fa "unsigned char *prompt" -.Fa "int height" -.Fa "int width" -.Fa "int menu_height" -.Fa "int cnt" -.Fa "void *it" -.Fa "unsigned char *result" -.Fa "int *ch" -.Fa "int *sc" -.Fc -.Ft "int" -.Fn dialog_checklist "unsigned char *title" "unsigned char *prompt" "int height" "int width" "int list_height" "int cnt" "void *it" "unsigned char *result" -.Ft "int" -.Fn dialog_radiolist "unsigned char *title" "unsigned char *prompt" "int height" "int width" "int list_height" "int cnt" "void *it" "unsigned char *result" -.Ft "int" -.Fn dialog_inputbox "unsigned char *title" "unsigned char *prompt" "int height" "int width" "unsigned char *result" -.Ft "char *" -.Fn dialog_fselect "char *dir" "char *fmask" -.Ft "int" -.Fn dialog_dselect "char *dir" "char *fmask" -.Ft "void" -.Fn dialog_notify "char *msg" -.Ft "int" -.Fn dialog_mesgbox "unsigned char *title" "unsigned char *prompt" "int height" "int width" -.Ft "void" -.Fn dialog_gauge "char *title" "char *prompt" "int y" "int x" "int height" "int width" "int perc" -.Ft "void" -.Fn use_helpfile "char *hfile" -.Ft "void" -.Fn use_helpline "char *hline" -.Ft "char *" -.Fn get_helpline "void" -.Ft "void" -.Fn dialog_clear_norefresh "void" -.Ft "void" -.Fn dialog_clear "void" -.Ft "void" -.Fn dialog_update "void" -.Ft "void" -.Fn init_dialog "void" -.Ft "void" -.Fn end_dialog "void" -.Ft "int" -.Fn dialog_ftree "unsigned char *filename" "unsigned char FS" "unsigned char *title" "unsigned char *prompt" "int height" "int width" "int menu_height" "unsigned char **result" -.Ft "int" -.Fo dialog_tree -.Fa "unsigned char **names" -.Fa "int size" -.Fa "unsigned char FS" -.Fa "unsigned char *title" -.Fa "unsigned char *prompt" -.Fa "int height" -.Fa "int width" -.Fa "int menu_height" -.Fa "unsigned char **result" -.Fc -.Sh DESCRIPTION -The dialog library attempts to provide a fairly simplistic set of -fixed-presentation menus, input boxes, gauges, file requestors and -other general purpose GUI (a bit of a stretch, since it uses -ncurses) objects. -Since the library also had its roots in a -shell-script writer's utility (see the -.Xr dialog 1 -command), the -early API was somewhat primitively based on strings being passed in or -out and parsed. -This API was later extended to take either the -original arguments or arrays of -.Va dialogMenuItem -structures, -giving the user much more control over the internal behavior of each -control. -The -.Va dialogMenuItem -structure internals are public: -.Bd -literal -offset indent -typedef struct _dmenu_item { - char *prompt; - char *title; - int (*checked)(struct _dmenu_item *self); - int (*fire)(struct _dmenu_item *self); - int (*selected)(struct _dmenu_item *self, int is_selected); - void *data; - char lbra, mark, rbra; - long aux; -} dialogMenuItem; -.Ed -.Pp -The -.Dv prompt -and -.Dv title -strings are pretty much self-explanatory, -and the -.Va checked -and -.Va fire -function pointers provide optional -display and action hooks (the -.Dv data -variable being available for -the convenience of those hooks) when more tightly coupled feedback between -a menu object and user code is required. -The -.Va selected -hook also -allows you to verify whether or not a given item is selected (the cursor is -over it) for implementing pretty much any possible context-sensitive -behavior. -A number of clever tricks for simulating various kinds of item -types can also be done by adjusting the values of -.Va lbra -(default: '['), -.Va mark -(default: '*' for radio menus, 'X' for check menus) -and -.Va rbra -(default: ']') and declaring a reasonable -.Va checked -hook, -which should return TRUE for the -.Dq marked -state and FALSE for -.Dq unmarked . -The -.Va aux -field is not used internally, and is available for miscellaneous usage. -If an item has a -.Va fire -hook associated with it, it will also be called -whenever the item is "toggled" in some way and should return one of the -following codes: -.Bd -literal -offset 4n -#define DITEM_SUCCESS 0 /* Successful completion */ -#define DITEM_FAILURE 1 /* Failed to "fire" */ -.Ed -.Pp -The following flags are in the upper 16 bits of return status: -.Bd -literal -offset 4n -#define DITEM_LEAVE_MENU (1 << 16) -#define DITEM_REDRAW (1 << 17) -#define DITEM_RECREATE (1 << 18) -#define DITEM_RESTORE (1 << 19) -#define DITEM_CONTINUE (1 << 20) -.Ed -.Pp -Two special globals also exist for putting a dialog at any arbitrary -X,Y location (the early designers rather short-sightedly made no provisions -for this). -If set to zero, the default centering behavior will be in -effect. -.Pp -Below is a short description of the various functions: -.Pp -The -.Fn draw_shadow -function draws a shadow in curses window -.Va win -using the dimensions of -.Va x , y , width -and -.Va height . -.Pp -The -.Fn draw_box -function draws a bordered box using the dimensions of -.Va x , y , width -and -.Va height . -The attributes from -.Va box -and -.Va border -are used, if specified, while painting the box and border regions of the -object. -.Pp -The -.Fn line_edit -function invokes a simple line editor with an edit box of dimensions -.Va box_x , box_y -and -.Va box_width . -The field length is constrained by -.Va flen , -starting at the -.Va first -character specified and -optionally displayed with character attributes -.Va attr . -The string being edited is stored in -.Va result . -Returns 0 on success, 1 on Cancel, and -1 on failure or ESC. -.Pp -The -.Fn strheight -function returns the height of string in -.Va p , -counting newlines. -.Pp -The -.Fn strwidth -function returns the width of string in -.Va p , -counting newlines. -.Pp -The -.Fn dialog_create_rc -function dumps dialog library settings into -.Pa filename -for later retrieval as defaults. -Returns 0 on success, -1 on failure. -.Pp -The -.Fn dialog_yesno -function displays a text box using -.Va title -and -.Va prompt -strings of dimensions -.Va height -and -.Va width . -Also paint a pair of -.Em Yes -and -.Em \&No -buttons at the bottom. -The default selection is -.Em Yes . -If the -.Em Yes -button is chosen, return FALSE. -If -.Em \&No , -return TRUE. -.Pp -The -.Fn dialog_noyes -function is the same as -.Fn dialog_yesno , -except the default selection is -.Em \&No . -.Pp -The -.Fn dialog_prgbox -function displays a text box of dimensions -.Va height -and -.Va width -containing the output of command -.Va line . -If -.Va use_shell -is TRUE, -.Va line -is passed as an argument to -.Xr sh 1 , -otherwise it is simply passed to -.Xr exec 3 . -If -.Va pause -is TRUE, a final confirmation requestor will be put up when execution -terminates. -Returns 0 on success, -1 on failure. -.Pp -The -.Fn dialog_textbox -function displays a text box containing the contents of -.Va file -with dimensions of -.Va height -and -.Va width . -.Pp -The -.Fn dialog_menu -function displays a menu of dimensions -.Va height -and -.Va width -with an optional internal menu height of -.Va menu_height . -The -.Va cnt -and -.Va it -arguments are of particular importance since they, -together, determine which of the 2 available APIs to use. -To use the -older and traditional interface, -.Va cnt -should be a positive -integer representing the number of string pointer pairs to find in -.Va it -(which should be of type -.Ft char "**" ) , -the strings are -expected to be in prompt and title order for each item and the -.Va result -parameter is expected to point to an array where the -prompt string of the item selected will be copied. -To use the newer -interface, -.Va cnt -should be a -.Va negative -integer representing the number of -.Va dialogMenuItem -structures pointed to by -.Va it -(which should be of type -.Vt dialogMenuItem "*" ) , -one structure per item. -In the new interface, the -.Va result -variable is used as a simple boolean (not a pointer) and should be NULL if -.Va it -only points to menu items and the default OK and Cancel buttons are desired. -If -.Va result -is non-NULL, then -.Va it -is actually expected to point 2 locations -.Va past -the start of the menu item list. -.Va it -is then expected to -point to an item representing the Cancel button, from which the -.Va prompt -and -.Va fire -actions are used to override the default behavior, and -.Va it -to the same for the OK button. -.Pp -Using either API behavior, the -.Va ch -and -.Va sc -values may be passed in to preserve current -item selection and scroll position values across calls. -.Pp -The -.Fn dialog_checklist -function displays a menu of dimensions -.Va height -and -.Va width -with an -optional internal menu height of -.Va list_height . -The -.Va cnt -and -.Va it -arguments are of particular importance since they, -together, determine which of the 2 available APIs to use. -To use the -older and traditional interface, -.Va cnt -should be a positive -integer representing the number of string pointer tuples to find in -.Va it -(which should be of type -.Ft "char **" ) , -the strings are -expected to be in prompt, title and state ("on" or "off") order for -each item and the -.Va result -parameter is expected to point to an -array where the prompt string of the item(s) selected will be -copied. -To use the newer interface, -.Va cnt -should be a -.Em negative -integer representing the number of -.Ft dialogMenuItem -structures pointed to by -.Va it -(which should be of type -.Ft "dialogMenuItem *" ) , -one structure per item. -In the new interface, -the -.Va result -variable is used as a simple boolean (not a pointer) -and should be NULL if -.Va it -only points to menu items and the default OK and Cancel -buttons are desired. -If -.Va result -is non-NULL, then -.Va it -is actually expected to -point 2 locations -.Va past -the start of the menu item list. -.Va it -is then expected to point to an item representing the Cancel -button, from which the -.Va prompt -and -.Va fire -actions are used to override the default behavior, and -.Va it -to the same for the OK button. -.Pp -In the standard API model, the menu supports the selection of multiple items, -each of which is marked with an `X' character to denote selection. -When -the OK button is selected, the prompt values for all items selected are -concatenated into the -.Va result -string. -.Pp -In the new API model, it is not actually necessary to preserve -"checklist" semantics at all since practically everything about how -each item is displayed or marked as "selected" is fully configurable. -You could have a single checklist menu that actually contained a group -of items with "radio" behavior, "checklist" behavior and standard menu -item behavior. -The only reason to call -.Fn dialog_checklist -over -.Fn dialog_radiolist -in the new API model is to inherit the base -behavior, you are no longer constrained by it. -.Pp -Returns 0 on success, 1 on Cancel, and -1 on failure or ESC. -.Pp -The -.Fn dialog_radiolist -function displays a menu of dimensions -.Va height -and -.Va width -with an -optional internal menu height of -.Va list_height . -The -.Va cnt -and -.Va it -arguments are of particular importance since they, -together, determine which of the 2 available APIs to use. -To use the -older and traditional interface, -.Va cnt -should be a positive -integer representing the number of string pointer tuples to find in -.Va it -(which should be of type -.Ft "char **" ) , -the strings are -expected to be in prompt, title and state ("on" or "off") order for -each item and the -.Va result -parameter is expected to point to an -array where the prompt string of the item(s) selected will be -copied. -To use the newer interface, -.Va cnt -should be a -.Dv negative -integer representing the number of -.Ft dialogMenuItem -structures pointed to by -.Va it -(which should be of type -.Ft "dialogMenuItem *" , -one structure per item. -In the new interface, -the -.Va result -variable is used as a simple boolean (not a pointer) -and should be NULL if -.Va it -only points to menu items and the default OK and Cancel -buttons are desired. -If -.Va result -is non-NULL, then -.Va it -is actually expected to point 2 locations -.Va past -the start of the menu item list. -.Va it -is then expected to point to an item representing the Cancel -button, from which the -.Va prompt -and -.Va fire -actions are used to override the default behavior, and -.Va it -does the same for the traditional OK button. -.Pp -In the standard API model, the menu supports the selection of only one -of multiple items, the currently active item marked with an `*' -character to denote selection. -When the OK button is selected, the -prompt value for this item is copied into the -.Va result -string. -.Pp -In the new API model, it is not actually necessary to preserve -"radio button" semantics at all since practically everything about how -each item is displayed or marked as "selected" is fully configurable. -You could have a single radio menu that actually contained a group -of items with "checklist" behavior, "radio" behavior and standard menu -item behavior. -The only reason to call -.Fn dialog_radiolist -over -.Fn dialog_checklistlist -in the new API model is to inherit the base -behavior. -.Pp -Returns 0 on success, 1 on Cancel and -1 on failure or ESC. -.Pp -The -.Fn dialog_inputbox -function displays a single-line text input field in a box displaying -.Va title -and -.Va prompt -of dimensions -.Va height -and -.Va width . -The field entered is stored in -.Va result . -.Pp -Returns 0 on success, -1 on failure or ESC. -.Pp -The -.Fn dialog_fselect -function brings up a file selector dialog starting at -.Va dir -and showing only those file names -matching -.Va fmask . -.Pp -Returns filename selected or NULL. -.Pp -The -.Fn dialog_dselect -function brings up a directory selector dialog starting at -.Va dir -and showing only those directory names -matching -.Va fmask . -.Pp -Returns directory name selected or NULL. -.Pp -The -.Fn dialog_notify -function brings up a generic "hey, you!" notifier dialog containing -.Va msg . -.Pp -The -.Fn dialog_mesgbox -function displays a notifier dialog, but with more control over -.Va title , -.Va prompt , -.Va width -and -.Va height . -This object will also wait for user confirmation, unlike -.Fn dialog_notify . -.Pp -Returns 0 on success, -1 on failure. -.Pp -The -.Fn dialog_gauge -function displays a horizontal bar-graph style gauge. -A value of -.Em 100 -for -.Em perc -constitutes a full gauge, a value of -.Em 0 -an empty one. -.Pp -The -.Fn use_helpfile -function for any menu supporting context sensitive help, invokes the text box -object on this file whenever the -.Em F1 -key is pressed. -.Pp -The -.Fn use_helpline -function displays this line of helpful text below any menu being displayed. -.Pp -The -.Fn get_helpline -function gets the current value of the helpful text line. -.Pp -The -.Fn dialog_clear_norefresh -function clears the screen back to the dialog background color, but do not -refresh the contents just yet. -.Pp -The -.Fn dialog_clear -function clears the screen back to the dialog background color immediately. -.Pp -The -.Fn dialog_update -function does any pending screen refreshes now. -.Pp -The -.Fn init_dialog -function initializes the dialog library (call this routine before any other -dialog API calls). -.Pp -The -.Fn end_dialog -function shuts down the dialog library (call this if you need to get back to -sanity). -.Pp -The -.Fn dialog_ftree -function shows a tree described by the data from the file -.Pa filename . -The data in the file should look like -.Xr find 1 -output. -For the -.Xr find 1 -output, the field separator -.Va FS -will be -.Dq \&/ . -If -.Va height -and -.Va width -are positive numbers, they set the absolute -size of the whole -.Fn dialog_ftree -box. -If -.Va height -and -.Va width -are negative numbers, the size of the -.Fn dialog_ftree -box will be calculated automatically. -.Va menu_height -sets the height of the tree subwindow inside the -.Fn dialog_ftree -box and must be set. -.Va title -is shown centered on the upper border of the -.Fn dialog_ftree -box. -.Va prompt -is shown inside the -.Fn dialog_ftree -box above the tree subwindow and can contain -.Ql \e\&n -to split lines. -One can navigate in -the tree by pressing UP/DOWN or -.Sm off -.So \&+ Sc \&/ So \&- Sc , -.Sm on -PG_UP/PG_DOWN or -.Sm off -.So b Sc \&/SPACE -.Sm on -and -HOME/END or -.Sm off -.So g Sc \&/ So G Sc . -.Sm on -A leaf of the -tree is selected by pressing TAB or LEFT/RIGHT the OK -button and pressing ENTER. -filename may contain data like -.Xr find 1 -output, as well as like the output of -.Xr find 1 -with -.Fl d -option. -Some of the transient paths to the leaves of the tree may -be absent. -Such data is corrected when fed from filename. -.Pp -The function returns 0 and a pointer to the selected leaf (to the path to -the leaf from the root of the tree) into result, if the OK button was -selected. -The memory allocated for the building of the tree is freed on -exiting -.Fn dialog_ftree . -The memory for the result line should be freed -later manually, if necessary. -If the Cancel button was selected, the -function returns 1. -In case of exiting -.Fn dialog_ftree -on ESC, the function returns -1. -.Pp -The -.Fn dialog_tree -function returns the same results as -.Fn dialog_ftree . -If 0 is returned, result will contain a pointer from the array -.Va names . -.\" \fBdialog_tree\fR displays the tree very much like \fBdialog_ftree\fR does, -.\" with some exceptions. The source data for the building of the tree is an -.\" array \fBnames\fR of paths to the leaves (should be similar to \fBfind(1)\fR -.\" output) of the size \fBsize\fR. However, there is no correction of data like -.\" in \fBdialog_ftree\fR. Thus, to display a correct tree, the array must -.\" already contain correct data. Besides, in each session every unique use of -.\" \fBdialog_tree\fR is kept in memory, and later, when calling -.\" \fBdialog_tree\fR with the same \fBnames\fR, \fBsize\fR, \fBFS\fR, -.\" \fBheight\fR, \fBwidth\fR and \fBmenu_height\fR the position of the cursor -.\" in the tree subwindow is restored. -.Sh SEE ALSO -.Xr dialog 1 , -.Xr ncurses 3 -.Sh HISTORY -These functions appeared in -.Fx 2.0 -as the -.Xr dialog 1 -command and were soon split into a separate library -and command by -.An Andrey Chernov . -.An Marc van Kempen -implemented most of the extra controls and objects, -.An Jordan Hubbard -added the dialogMenuItem renovations and this man page and -.An Anatoly A. Orehovsky -implemented -.Fn dialog_ftree -and -.Fn dialog_tree . -.Sh AUTHORS -.An -nosplit -The primary author would appear to be -.An Savio Lam Aq lam836@cs.cuhk.hk -with contributions over the years by -.An Stuart Herbert Aq S.Herbert@sheffield.ac.uk , -.An Marc van Kempen Aq wmbfmk@urc.tue.nl , -.An Andrey Chernov Aq ache@FreeBSD.org , -.An Jordan Hubbard Aq jkh@FreeBSD.org -and -.An Anatoly A. Orehovsky Aq tolik@mpeks.tomsk.su . -.Sh BUGS -Sure! diff --git a/gnu/lib/libdialog/dialog.h b/gnu/lib/libdialog/dialog.h deleted file mode 100644 index 369b139..0000000 --- a/gnu/lib/libdialog/dialog.h +++ /dev/null @@ -1,211 +0,0 @@ -#ifndef _DIALOG_H_INCLUDE -#define _DIALOG_H_INCLUDE - -/* - * dialog.h -- common declarations for all dialog modules - * - * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) - * - * Substantial rennovation: 12/18/95, Jordan K. Hubbard - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $FreeBSD$ - * - */ - -#define HAVE_NCURSES - -#ifdef HAVE_NCURSES -#include - -#else - -#ifdef ultrix -#include -#else -#include -#endif - -#endif - -/* special return codes for `fire' actions */ -#define DITEM_STATUS(flag) ((flag) & 0x0000FFFF) -#define DITEM_SUCCESS 0 -#define DITEM_FAILURE 1 - -/* Flags - returned in upper 16 bits of return status */ -#define DITEM_LEAVE_MENU (1 << 16) -#define DITEM_REDRAW (1 << 17) -#define DITEM_RECREATE (1 << 18) -#define DITEM_RESTORE (1 << 19) -#define DITEM_CONTINUE (1 << 20) - -/* Attributes as used by entry fields right now */ -#define DITEM_NO_ECHO 0x0001 - - -/* negative offsets for buttons in item lists, if specified */ -#define OK_BUTTON -2 -#define CANCEL_BUTTON -1 - -/* for use in describing more exotic behaviors */ -typedef struct _dmenu_item { - char *prompt; - char *title; - int (*checked)(struct _dmenu_item *self); - int (*fire)(struct _dmenu_item *self); - void (*selected)(struct _dmenu_item *self, int is_selected); - void *data; - char lbra, mark, rbra; - long aux; -} dialogMenuItem; - -#define VERSION "0.4" -#define MAX_LEN 4096 - -#ifndef TRUE -#define TRUE (1) -#endif -#ifndef FALSE -#define FALSE (0) -#endif - -extern int DialogX, DialogY, DialogInputAttrs; - -/* - * Attribute names - */ -#define screen_attr attributes[0] -#define shadow_attr attributes[1] -#define dialog_attr attributes[2] -#define title_attr attributes[3] -#define border_attr attributes[4] -#define button_active_attr attributes[5] -#define button_inactive_attr attributes[6] -#define button_key_active_attr attributes[7] -#define button_key_inactive_attr attributes[8] -#define button_label_active_attr attributes[9] -#define button_label_inactive_attr attributes[10] -#define inputbox_attr attributes[11] -#define inputbox_border_attr attributes[12] -#define searchbox_attr attributes[13] -#define searchbox_title_attr attributes[14] -#define searchbox_border_attr attributes[15] -#define position_indicator_attr attributes[16] -#define menubox_attr attributes[17] -#define menubox_border_attr attributes[18] -#define item_attr attributes[19] -#define item_selected_attr attributes[20] -#define tag_attr attributes[21] -#define tag_selected_attr attributes[22] -#define tag_key_attr attributes[23] -#define tag_key_selected_attr attributes[24] -#define check_attr attributes[25] -#define check_selected_attr attributes[26] -#define uarrow_attr attributes[27] -#define darrow_attr attributes[28] - -/* number of attributes */ -#define ATTRIBUTE_COUNT 29 - -extern chtype attributes[]; - -#ifdef HAVE_NCURSES -extern bool use_shadow; -void draw_shadow(WINDOW *win, int y, int x, int height, int width); -#endif -void draw_box(WINDOW *win, int y, int x, int height, int width, chtype box, chtype border); -int line_edit(WINDOW *dialog, int box_y, int box_x, int flen, int box_width, chtype attrs, int first, unsigned char *result, int attr_mask); -int strheight(const char *p); -int strwidth(const char *p); - -void dialog_create_rc(unsigned char *filename); -int dialog_yesno(unsigned char *title, unsigned char *prompt, int height, int width); -int dialog_noyes(unsigned char *title, unsigned char *prompt, int height, int width); -int dialog_prgbox(unsigned char *title, const unsigned char *line, int height, int width, int pause, int use_shell); -int dialog_msgbox(unsigned char *title, unsigned char *prompt, int height, int width, int pause); -int dialog_textbox(unsigned char *title, unsigned char *file, int height, int width); -int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int width, int menu_height, - int item_no, void *itptr, unsigned char *result, int *ch, int *sc); -int dialog_checklist(unsigned char *title, unsigned char *prompt, int height, int width, int list_height, - int item_no, void *itptr, unsigned char *result); -int dialog_radiolist(unsigned char *title, unsigned char *prompt, int height, int width, int list_height, - int item_no, void *itptr, unsigned char *result); -int dialog_inputbox(unsigned char *title, unsigned char *prompt, int height, int width, unsigned char *result); -void dialog_clear_norefresh(void); -void dialog_clear(void); -void dialog_update(void); -void init_dialog(void); -void end_dialog(void); - -/* Additions to libdialog */ -char *dialog_fselect(char *dir, char *fmask); -int dialog_dselect(char *dir, char *fmask); -void dialog_notify(char *msg); -int dialog_mesgbox(unsigned char *title, unsigned char *prompt, int height, int width); -void use_helpfile(char *helpfile); -void use_helpline(char *helpline); -char *get_helpline(void); -void restore_helpline(char *helpline); -void dialog_gauge(char *title, char *prompt, int y, int x, int height, int width, int perc); - -/* - * Display a tree menu from file - * - * filename - file with like find(1) output - * FS - fields separator - * title - title of dialog box - * prompt - prompt text into dialog box - * height - height of dialog box - * width - width of dialog box - * menu_height - height of menu box - * result - pointer to char array - * - * return values: - * -1 - ESC pressed - * 0 - Ok, result set (must be freed later) - * 1 - Cancel - */ -int dialog_ftree(unsigned char *filename, unsigned char FS, - unsigned char *title, unsigned char *prompt, - int height, int width, int menu_height, - unsigned char **result); - -/* - * Display a tree menu from array - * - * names - array with like find(1) output - * size - size of array - * FS - fields separator - * title - title of dialog box - * prompt - prompt text into dialog box - * height - height of dialog box - * width - width of dialog box - * menu_height - height of menu box - * result - pointer to char array - * - * return values: - * -1 - ESC pressed - * 0 - Ok, result set - * 1 - Cancel - */ - -int dialog_tree(unsigned char **names, int size, unsigned char FS, - unsigned char *title, unsigned char *prompt, - int height, int width, int menu_height, - unsigned char **result); - -#endif /* _DIALOG_H_INCLUDE */ diff --git a/gnu/lib/libdialog/dialog.priv.h b/gnu/lib/libdialog/dialog.priv.h deleted file mode 100644 index 06c01a5..0000000 --- a/gnu/lib/libdialog/dialog.priv.h +++ /dev/null @@ -1,183 +0,0 @@ -/* - * dialog.h -- common declarations for all dialog modules - * - * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - -#include -#include -#include -#include -#include -#include -#include - -#if defined(LOCALE) -#include -#endif - - -/* - * Change these if you want - */ -#define USE_SHADOW TRUE -#define USE_COLORS TRUE - -#define ESC 27 -#define TAB 9 -#define BUF_SIZE (10*1024) - -#ifndef MIN -#define MIN(x,y) (x < y ? x : y) -#endif -#ifndef MAX -#define MAX(x,y) (x > y ? x : y) -#endif - -#ifndef ctrl -#define ctrl(a) ((a) - 'a' + 1) -#endif - -#ifndef HAVE_NCURSES -#ifndef ACS_ULCORNER -#define ACS_ULCORNER '+' -#endif -#ifndef ACS_LLCORNER -#define ACS_LLCORNER '+' -#endif -#ifndef ACS_URCORNER -#define ACS_URCORNER '+' -#endif -#ifndef ACS_LRCORNER -#define ACS_LRCORNER '+' -#endif -#ifndef ACS_HLINE -#define ACS_HLINE '-' -#endif -#ifndef ACS_VLINE -#define ACS_VLINE '|' -#endif -#ifndef ACS_LTEE -#define ACS_LTEE '+' -#endif -#ifndef ACS_RTEE -#define ACS_RTEE '+' -#endif -#ifndef ACS_UARROW -#define ACS_UARROW '^' -#endif -#ifndef ACS_DARROW -#define ACS_DARROW 'v' -#endif -#endif /* HAVE_NCURSES */ - -/* Travel key conventions */ -#define KEY_IS_UP(key) ((key) == KEY_UP || (key) == '-' || key == '\020' /* ^P */) -#define KEY_IS_DOWN(key) ((key) == KEY_DOWN || (key) == '+' || key == '\016' /* ^N */) - -/* - * Global variables - */ -#ifdef __DIALOG_MAIN__ - -#ifdef HAVE_NCURSES - -/* use colors by default? */ -bool use_colors = USE_COLORS; - -/* shadow dialog boxes by default? - Note that 'use_shadow' implies 'use_colors' */ -bool use_shadow = USE_SHADOW; - -#endif - - -/* - * Attribute values, default is for mono display - */ -chtype attributes[] = { - A_NORMAL, /* screen_attr */ - A_NORMAL, /* shadow_attr */ - A_REVERSE, /* dialog_attr */ - A_REVERSE, /* title_attr */ - A_REVERSE, /* border_attr */ - A_BOLD, /* button_active_attr */ - A_DIM, /* button_inactive_attr */ - A_UNDERLINE, /* button_key_active_attr */ - A_UNDERLINE, /* button_key_inactive_attr */ - A_NORMAL, /* button_label_active_attr */ - A_NORMAL, /* button_label_inactive_attr */ - A_REVERSE, /* inputbox_attr */ - A_REVERSE, /* inputbox_border_attr */ - A_REVERSE, /* searchbox_attr */ - A_REVERSE, /* searchbox_title_attr */ - A_REVERSE, /* searchbox_border_attr */ - A_REVERSE, /* position_indicator_attr */ - A_REVERSE, /* menubox_attr */ - A_REVERSE, /* menubox_border_attr */ - A_REVERSE, /* item_attr */ - A_NORMAL, /* item_selected_attr */ - A_REVERSE, /* tag_attr */ - A_REVERSE, /* tag_selected_attr */ - A_NORMAL, /* tag_key_attr */ - A_BOLD, /* tag_key_selected_attr */ - A_REVERSE, /* check_attr */ - A_REVERSE, /* check_selected_attr */ - A_REVERSE, /* uarrow_attr */ - A_REVERSE /* darrow_attr */ -}; - -#else - -#ifdef HAVE_NCURSES -extern bool use_colors; -#endif - -#endif /* __DIALOG_MAIN__ */ - - - -#ifdef HAVE_NCURSES - -/* - * Function prototypes - */ -#ifdef __DIALOG_MAIN__ - -extern int parse_rc(void); - -#endif /* __DIALOG_MAIN__ */ - -#endif - - -#ifdef HAVE_NCURSES -void color_setup(void); -#endif - -void attr_clear(WINDOW *win, int height, int width, chtype attr); -void print_autowrap(WINDOW *win, unsigned char *prompt, int height, int width, int maxwidth, - int y, int x, int center, int rawmode); -void print_button(WINDOW *win, unsigned char *label, int y, int x, int selected); -FILE *raw_popen(const char *program, char * const *argv, const char *type); -int raw_pclose(FILE *iop); -void display_helpfile(void); -void display_helpline(WINDOW *w, int y, int width); -void print_arrows(WINDOW *dialog, int scroll, int menu_height, int item_no, int box_x, - int box_y, int tag_x, int cur_x, int cur_y); - diff --git a/gnu/lib/libdialog/dir.c b/gnu/lib/libdialog/dir.c deleted file mode 100644 index 5348c2f..0000000 --- a/gnu/lib/libdialog/dir.c +++ /dev/null @@ -1,549 +0,0 @@ -/**************************************************************************** - * - * Program: dir.c - * Author: Marc van Kempen - * desc: Directory routines, sorting and reading - * - * Copyright (c) 1995, Marc van Kempen - * - * All rights reserved. - * - * This software may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of this software, nor does - * the author assume any responsibility for damages incurred with - * its use. - * - ****************************************************************************/ - -#include -#include - -#include /* XXX for _POSIX_VERSION ifdefs */ - -#if !defined sgi && !defined _POSIX_VERSION -#include -#endif -#if defined __sun__ -#include -#endif -#if defined sgi || defined _POSIX_VERSION -#include -#endif - -#include -#include -#include -#include -#include -#include "dir.h" - -/**************************************************************************** - * - * local prototypes - * - ****************************************************************************/ - -void toggle_dotfiles(void); -int show_dotfiles(void); -int dir_alphasort(const void *d1, const void *d2); -int dir_sizesort(const void *d1, const void *d2); -int dir_datesort(const void *d1, const void *d2); -int dir_extsort(const void *d1, const void *d2); - -/**************************************************************************** - * - * global variables - * - ****************************************************************************/ - - -/* This is user-selectable, I've set them fixed for now however */ - -void *_sort_func = dir_alphasort; -static int _showdotfiles = TRUE; - -/**************************************************************************** - * - * Functions - * - ****************************************************************************/ - -int -dir_select_nd( -#if defined __linux__ - const struct dirent *d -#else - struct dirent *d -#endif -) -/* - * desc: allways include a directory entry , except - * for the current directory and other dot-files - * keep '..' however. - * pre: points to a dirent - * post: returns TRUE if d->d_name != "." else FALSE - */ -{ - if (strcmp(d->d_name, ".")==0 || - (d->d_name[0] == '.' && strlen(d->d_name) > 1 && d->d_name[1] != '.')) { - return(FALSE); - } else { - return(TRUE); - } -}/* dir_select_nd() */ - - -int -dir_select( -#ifdef __linux__ - const struct dirent *d -#else - struct dirent *d -#endif -) -/* - * desc: allways include a directory entry , except - * for the current directory - * pre: points to a dirent - * post: returns TRUE if d->d_name != "." else FALSE - */ -{ - if (strcmp(d->d_name, ".")==0) { /* don't include the current directory */ - return(FALSE); - } else { - return(TRUE); - } -} /* dir_select() */ - -int -dir_select_root_nd( -#ifdef __linux__ - const struct dirent *d -#else - struct dirent *d -#endif -) -/* - * desc: allways include a directory entry , except - * for the current directory and the parent directory. - * Also skip any other dot-files. - * pre: points to a dirent - * post: returns TRUE if d->d_name[0] != "." else FALSE - */ -{ - if (d->d_name[0] == '.') { /* don't include the current directory */ - return(FALSE); /* nor the parent directory */ - } else { - return(TRUE); - } -} /* dir_select_root_nd() */ - - -int -dir_select_root( -#ifdef __linux__ - const struct dirent *d -#else - struct dirent *d -#endif -) -/* - * desc: allways include a directory entry , except - * for the current directory and the parent directory - * pre: points to a dirent - * post: returns TRUE if d->d_name[0] != "." else FALSE - */ -{ - if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) { - return(FALSE); - } else { - return(TRUE); - } -}/* dir_select_root() */ - - -#ifdef NO_ALPHA_SORT -int -alphasort(const void *d1, const void *d2) -/* - * desc: a replacement for what should be in the library - */ -{ - return(strcmp(((struct dirent *) d1)->d_name, - ((struct dirent *) d2)->d_name)); -} /* alphasort() */ -#endif - -int -dir_alphasort(const void *d1, const void *d2) -/* - * desc: compare d1 and d2, but put directories always first - * put '..' always on top - * - */ -{ - DirList *f1 = ((DirList *) d1), - *f2 = ((DirList *) d2); - struct stat *s1 = &(f1->filestatus); - struct stat *s2 = &(f2->filestatus); - - /* check for '..' */ - if (strcmp(((DirList *) d1)->filename, "..") == 0) { - return(-1); - } - if (strcmp(((DirList *) d2)->filename, "..") == 0) { - return(1); - } - - /* put directories first */ - if ((s1->st_mode & S_IFDIR) && (s2->st_mode & S_IFDIR)) { - return(strcmp(f1->filename, f2->filename)); - }; - if (s1->st_mode & S_IFDIR) { - return(-1); - } - if (s2->st_mode & S_IFDIR) { - return(1); - } - return(strcmp(f1->filename, f2->filename)); - -} /* dir_alphasort() */ - - -int -dir_sizesort(const void *d1, const void *d2) -/* - * desc: compare d1 and d2, but put directories always first - * - */ -{ - DirList *f1 = ((DirList *) d1), - *f2 = ((DirList *) d2); - struct stat *s1 = &(f1->filestatus); - struct stat *s2 = &(f2->filestatus); - - /* check for '..' */ - if (strcmp(((DirList *) d1)->filename, "..") == 0) { - return(-1); - } - if (strcmp(((DirList *) d2)->filename, "..") == 0) { - return(1); - } - - /* put directories first */ - if ((s1->st_mode & S_IFDIR) && (s2->st_mode & S_IFDIR)) { - return(s1->st_size < s2->st_size ? - -1 - : - s1->st_size >= s2->st_size); - }; - if (s1->st_mode & S_IFDIR) { - return(-1); - } - if (s2->st_mode & S_IFDIR) { - return(1); - } - return(s1->st_size < s2->st_size ? - -1 - : - s1->st_size >= s2->st_size); - -} /* dir_sizesort() */ - -int -dir_datesort(const void *d1, const void *d2) -/* - * desc: compare d1 and d2 on date, but put directories always first - */ -{ - DirList *f1 = ((DirList *) d1), - *f2 = ((DirList *) d2); - struct stat *s1 = &(f1->filestatus); - struct stat *s2 = &(f2->filestatus); - - - /* check for '..' */ - if (strcmp(((DirList *) d1)->filename, "..") == 0) { - return(-1); - } - if (strcmp(((DirList *) d2)->filename, "..") == 0) { - return(1); - } - - /* put directories first */ - if ((s1->st_mode & S_IFDIR) && (s2->st_mode & S_IFDIR)) { - return(s1->st_mtime < s2->st_mtime ? - -1 - : - s1->st_mtime >= s2->st_mtime); - }; - if (s1->st_mode & S_IFDIR) { - return(-1); - } - if (s2->st_mode & S_IFDIR) { - return(1); - } - return(s1->st_mtime < s2->st_mtime ? - -1 - : - s1->st_mtime >= s2->st_mtime); - -} /* dir_datesort() */ - - -int -null_strcmp(char *s1, char *s2) -/* - * desc: compare strings allowing NULL pointers - */ -{ - if ((s1 == NULL) && (s2 == NULL)) { - return(0); - } - if (s1 == NULL) { - return(-1); - } - if (s2 == NULL) { - return(1); - } - return(strcmp(s1, s2)); -} /* null_strcmp() */ - - -int -dir_extsort(const void *d1, const void *d2) -/* - * desc: compare d1 and d2 on extension, but put directories always first - * extension = "the characters after the last dot in the filename" - * pre: d1 and d2 are pointers to DirList type records - * post: see code - */ -{ - DirList *f1 = ((DirList *) d1), - *f2 = ((DirList *) d2); - struct stat *s1 = &(f1->filestatus); - struct stat *s2 = &(f2->filestatus); - char *ext1, *ext2; - int extf, ret; - - - /* check for '..' */ - if (strcmp(((DirList *) d1)->filename, "..") == 0) { - return(-1); - } - if (strcmp(((DirList *) d2)->filename, "..") == 0) { - return(1); - } - - - /* find the first extension */ - - ext1 = f1->filename + strlen(f1->filename); - extf = FALSE; - while (!extf && (ext1 > f1->filename)) { - extf = (*--ext1 == '.'); - } - if (!extf) { - ext1 = NULL; - } else { - ext1++; - } - /* ext1 == NULL if there's no "extension" else ext1 points */ - /* to the first character of the extension string */ - - /* find the second extension */ - - ext2 = f2->filename + strlen(f2->filename); - extf = FALSE; - while (!extf && (ext2 > f2->filename)) { - extf = (*--ext2 == '.'); - } - if (!extf) { - ext2 = NULL; - } else { - ext2++; - } - /* idem as for ext1 */ - - if ((s1->st_mode & S_IFDIR) && (s2->st_mode & S_IFDIR)) { - ret = null_strcmp(ext1, ext2); - if (ret == 0) { - return(strcmp(f1->filename, f2->filename)); - } else { - return(ret); - } - }; - if (s1->st_mode & S_IFDIR) { - return(-1); - } - if (s2->st_mode & S_IFDIR) { - return(1); - } - ret = null_strcmp(ext1, ext2); - if (ret == 0) { - return(strcmp(f1->filename, f2->filename)); - } else { - return(ret); - } - -} /* dir_extsort() */ - - -void -get_dir(char *dirname, char *fmask, DirList **dir, int *n) -/* - * desc: get the files in the current directory - * pre: == NULL - * post: contains dir-entries - */ -{ - char cwd[MAXPATHLEN]; - char buf[256]; - struct dirent **dire; - struct stat status; - int i, j, nb; - long d; - - - getcwd(cwd, MAXPATHLEN); - if (strcmp(cwd, "/") == 0) { /* we are in the root directory */ - if (show_dotfiles()) { - *n = scandir(dirname, &dire, dir_select_root, alphasort); - } else { - *n = scandir(dirname, &dire, dir_select_root_nd, alphasort); - } - } else { - if (show_dotfiles()) { - *n = scandir(dirname, &dire, dir_select, alphasort); - } else { - *n = scandir(dirname, &dire, dir_select_nd, alphasort); - } - } - - /* There is the possibility that we have entered a directory */ - /* which we are not allowed to read, scandir thus returning */ - /* -1 for *n. */ - /* Actually I should also check for lack of memory, but I'll */ - /* let my application happily crash if this is the case */ - /* Solution: */ - /* manually insert the parent directory as the only */ - /* directory entry, and return. */ - - if (*n == -1) { - *n = 1; - *dir = (DirList *) malloc(sizeof(DirList)); - strcpy((*dir)[0].filename, ".."); - lstat("..", &status); - (*dir)[0].filestatus = status; - (*dir)[0].link = FALSE; - return; - } - - *dir = (DirList *) malloc( *n * sizeof(DirList) ); - d = 0; - i = 0; - j = 0; - while (j<*n) { - lstat(dire[j]->d_name, &status); - /* check if this file is to be included */ - /* always include directories, the rest is subject to fmask */ - if (S_ISDIR(status.st_mode) - || fnmatch(fmask, dire[j]->d_name, FNM_NOESCAPE) != FNM_NOMATCH) { - strcpy((*dir)[i].filename, dire[j]->d_name); - (*dir)[i].filestatus = status; - if ((S_IFMT & status.st_mode) == S_IFLNK) { /* handle links */ - (*dir)[i].link = TRUE; - stat(dire[j]->d_name, &status); - nb = readlink(dire[j]->d_name, buf, sizeof(buf) - 1); - if (nb == -1) { - printf("get_dir(): Error reading link: %s\n", dire[j]->d_name); - exit(-1); - } else { - (*dir)[i].linkname = malloc(sizeof(char) * nb + 1); - strncpy((*dir)[i].linkname, buf, nb); - (*dir)[i].linkname[nb] = 0; - } - (*dir)[i].filestatus = status; - } else { - (*dir)[i].link = FALSE; - (*dir)[i].linkname = NULL; - } - i++; - } else { - /* skip this entry */ - } - j++; - } - *n = i; - - /* sort the directory with the directory names on top */ - qsort((*dir), *n, sizeof(DirList), _sort_func); - - /* Free the allocated memory */ - for (i=0; i<*n; i++) { - free(dire[i]); - } - free(dire); - - return; -}/* get_dir() */ - - -void -FreeDir(DirList *d, int n) -/* - * desc: free the dirlist d - * pre: d != NULL - * post: memory allocated to d has been released - */ -{ - int i; - - if (d) { - for (i=0; i -#include -#include - -typedef struct DirList { /* structure to hold the directory entries */ - char filename[MAXNAMLEN]; /* together with the stat-info per file */ - struct stat filestatus; /* filename, or the name to which it points */ - int link; /* is it a link ? */ - char *linkname; /* the name of the file the link points to */ -} DirList; - -#ifndef TRUE -#define TRUE (1) -#endif -#ifndef FALSE -#define FALSE (0) -#endif - -void get_dir(char *dirname, char *fmask, DirList **dir, int *n); -void get_filenames(DirList *d, int n, char ***names, int *nf); -void FreeDir(DirList *d, int n); diff --git a/gnu/lib/libdialog/dlg_config.h b/gnu/lib/libdialog/dlg_config.h new file mode 100644 index 0000000..ffe205b --- /dev/null +++ b/gnu/lib/libdialog/dlg_config.h @@ -0,0 +1,91 @@ +/* dlg_config.h. Generated automatically by configure. */ +/* + * The configure script expands this as a set of definitions + * + * $FreeBSD$ + */ + + +#define DIALOG_PATCHDATE 20100428 +#define DIALOG_VERSION "1.1" +#define HAVE_ALLOCA 1 +#define HAVE_COLOR 1 +#define HAVE_CURSES_H 1 +#define HAVE_DIRENT_H 1 +#define HAVE_DLG_FORMBOX 1 +#define HAVE_DLG_GAUGE 1 +#define HAVE_DLG_MIXEDFORM 1 +#define HAVE_DLG_TAILBOX 1 +#define HAVE_DLG_TRACE 1 +#define HAVE_FEOF_UNLOCKED 1 +#define HAVE_FLUSHINP 1 +#define HAVE_FSEEKO 1 +#define HAVE_GETBEGX 1 +#define HAVE_GETBEGY 1 +#define HAVE_GETBEGYX 1 +#define HAVE_GETCURX 1 +#define HAVE_GETCURY 1 +#define HAVE_GETCWD 1 +#define HAVE_GETEGID 1 +#define HAVE_GETEUID 1 +#define HAVE_GETGID 1 +#define HAVE_GETMAXX 1 +#define HAVE_GETMAXY 1 +#define HAVE_GETMAXYX 1 +#define HAVE_GETPAGESIZE 1 +#define HAVE_GETPARX 1 +#define HAVE_GETPARY 1 +#define HAVE_GETPARYX 1 +#define HAVE_GETUID 1 +#define HAVE_ICONV 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_LANGINFO_CODESET 1 +#define HAVE_LC_MESSAGES 1 +#define HAVE_LIMITS_H 1 +#define HAVE_LOCALE_H 1 +#define HAVE_MBSTATE_T 1 +#define HAVE_MEMORY_H 1 +#define HAVE_MIXEDGAUGE 1 +#define HAVE_MMAP 1 +#define HAVE_MUNMAP 1 +#define HAVE_NL_TYPES_H 1 +#define HAVE_PUTENV 1 +#define HAVE_RC_FILE 1 +#define HAVE_SEARCH_H 1 +#define HAVE_SETENV 1 +#define HAVE_SETLOCALE 1 +#define HAVE_STDDEF_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STPCPY 1 +#define HAVE_STRCASECMP 1 +#define HAVE_STRCHR 1 +#define HAVE_STRDUP 1 +#define HAVE_STRFTIME 1 +#define HAVE_STRINGS_H 1 +#define HAVE_STRING_H 1 +#define HAVE_STRTOUL 1 +#define HAVE_SYS_PARAM_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_SYS_WAIT_H 1 +#define HAVE_TERM_H 1 +#define HAVE_TSEARCH 1 +#define HAVE_TYPE_CHTYPE 1 +#define HAVE_UNCTRL_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_USE_DEFAULT_COLORS 1 +#define HAVE_WAITPID 1 +#define HAVE_WGET_WCH 1 +#define HAVE_XDIALOG 1 +#define HAVE__NC_FREE_AND_EXIT 1 +#define ICONV_CONST const +#define MIXEDCASE_FILENAMES 1 +#define NCURSES 1 +#define NEED_WCHAR_H 1 +#define PACKAGE "dialog" +#define RETSIGTYPE void +#define STDC_HEADERS 1 +#define SYSTEM_NAME "freebsd9.0" +#define TIME_WITH_SYS_TIME 1 +#define TYPE_CHTYPE_IS_SCALAR 1 diff --git a/gnu/lib/libdialog/fselect.c b/gnu/lib/libdialog/fselect.c deleted file mode 100644 index 6669edc..0000000 --- a/gnu/lib/libdialog/fselect.c +++ /dev/null @@ -1,402 +0,0 @@ -/* - * program: fselect.c - * author: Marc van Kempen (wmbfmk@urc.tue.nl) - * Desc: File selection routine - * - * Copyright (c) 1995, Marc van Kempen - * - * All rights reserved. - * - * This software may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of this software, nor does - * the author assume any responsibility for damages incurred with - * its use. - * - */ - -#include -#include -#include -#include -#include "ui_objects.h" -#include "dir.h" -#include "dialog.priv.h" - -/* - * Local prototypes - */ - -char *dialog_dfselect(char *dir, char *fmask, int is_fselect); - -/* - * Functions - */ - -void -get_directories(DirList *d, int n, char ***names, int *nd) -/* - * Desc: return the directorienames in as an array in - * , the # of entries in , memory allocated - * to *names should be freed when done with it. - */ -{ - int i; - - /* count the directories, which are in front */ - *nd = 0; - while ((*nd < n) && (S_ISDIR(d[*nd].filestatus.st_mode))) (*nd)++; - *names = (char **) malloc( *nd * sizeof(char *) ); - for (i=0; i<*nd; i++) { - (*names)[i] = (char *) malloc( strlen(d[i].filename) + 1); - strcpy((*names)[i], d[i].filename); - } - - return; -} /* get_directories() */ - -void -get_filenames(DirList *d, int n, char ***names, int *nf) -/* - * Desc: return the filenames in as an arry in - * , the # of entries in , memory allocated - * to *names should be freed when done. - */ -{ - int nd, i; - - /* the # of regular files is the total # of files - # of directories */ - /* count the # of directories */ - nd = 0; - while ((nd < n) && (S_ISDIR(d[nd].filestatus.st_mode))) nd++; - - *names = (char **) malloc( (n-nd) * sizeof(char *) ); - *nf = n - nd; - for (i=0; i<*nf; i++) { - (*names)[i] = (char *) malloc( strlen(d[i+nd].filename) + 1); - strcpy((*names)[i], d[i+nd].filename); - } - - return; -} /* get_filenames() */ - -void -FreeNames(char **names, int n) -/* - * Desc: free the space occupied by names - */ -{ - int i; - - /* free the space occupied by names */ - for (i=0; iprev)->obj == (void *) dirs_obj)) { - obj=obj->prev; - } - break; - case SEL_ESC: - quit = TRUE; - cancel = TRUE; - break; - case KEY_F(1): - display_helpfile(); - break; - } - } - - FreeNames(names, nd); - DelObj(obj); - delwin(ds_win); - - return(cancel); - -} /* dialog_dselect() */ - -int -dialog_dselect(char *dir, char *fmask) -/* - * Desc: Choose a directory - */ -{ - if (dialog_dfselect(dir, fmask, FALSE)) { - return(FALSE); /* esc or cancel was pressed */ - } else { - return(TRUE); /* directory was selected */ - } -} /* dialog_dselect() */ - -char * -dialog_fselect(char *dir, char *fmask) -/* - * Desc: Choose a file from a directory - */ -{ - return(dialog_dfselect(dir, fmask, TRUE)); -} /* dialog_fselect() */ - -char * -dialog_dfselect(char *dir, char *fmask, int is_fselect) -/* - * Desc: choose a file from the directory , which - * initially display files with the mask - * pre: is the initial directory - * only files corresponding to the mask are displayed - * post: returns NULL if no file was selected - * else returns pointer to filename, space is allocated, should - * be freed after use. - */ -{ - DirList *d = NULL; - char msg[512]; - char **fnames, **dnames, *ret_name; - WINDOW *fs_win; - int n, nd, nf, ret; - StringObj *fm_obj, *dir_obj, *sel_obj; - char o_fm[255], o_dir[MAXPATHLEN], o_sel[MAXPATHLEN]; - char old_fmask[255], old_dir[MAXPATHLEN]; - ListObj *dirs_obj, *files_obj; - struct ComposeObj *obj = NULL, *o; - int quit, cancel; - ButtonObj *okbut_obj, *canbut_obj; - int ok_button, cancel_button; - - if (chdir(dir)) { - sprintf(msg, "Could not move into specified directory: %s", dir); - dialog_notify(msg); - return(NULL); - } - getcwd(o_dir, MAXPATHLEN); - - /* setup the fileselect-window and initialize its components */ - fs_win = newwin(LINES-2, COLS-20, 1, 10); - if (fs_win == NULL) { - endwin(); - fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", - LINES-2, COLS-20, 2, 10); - exit(1); - } - draw_box(fs_win, 0, 0, LINES-2, COLS-20, dialog_attr, border_attr); - wattrset(fs_win, dialog_attr); - if (is_fselect) { - mvwaddstr(fs_win, 0, (COLS-20)/2 - 7, " File Select "); - } else { - mvwaddstr(fs_win, 0, (COLS-20)/2 - 9, " Directory Select "); - } - draw_shadow(stdscr, 1, 10, LINES-2, COLS-20); - display_helpline(fs_win, LINES-3, COLS-20); - - /* Filemask entry */ - strcpy(o_fm, fmask); - fm_obj = NewStringObj(fs_win, "Filemask:", o_fm, 1, 2, 19, 255); - AddObj(&obj, STRINGOBJ, (void *) fm_obj); - - /* Directory entry */ - dir_obj = NewStringObj(fs_win, "Directory:", o_dir, 1, 22, COLS-44, 255); - AddObj(&obj, STRINGOBJ, (void *) dir_obj); - - /* Directory list */ - get_dir(".", fmask, &d, &n); /* read the entire directory */ - get_directories(d, n, &dnames, &nd); /* extract the dir-entries */ - if (is_fselect) { - dirs_obj = NewListObj(fs_win, "Directories:", dnames, o_dir, 5, 2, - LINES-16, (COLS-20)/2-2, nd); - } else { - dirs_obj = NewListObj(fs_win, "Directories:", dnames, o_dir, 5, 2, - LINES-12, (COLS-20)/2-2, nd); - } - AddObj(&obj, LISTOBJ, (void *) dirs_obj); - - /* Filenames list */ - get_filenames(d, n, &fnames, &nf); /* extract the filenames */ - if (is_fselect) { - files_obj = NewListObj(fs_win, "Files:", fnames, o_sel, 5, (COLS-20)/2+1, - LINES-16, (COLS-20)/2-3, nf); - } else { - files_obj = NewListObj(fs_win, "Files:", fnames, o_sel, 5, (COLS-20)/2+1, - LINES-12, (COLS-20)/2-3, nf); - } - AddObj(&obj, LISTOBJ, (void *) files_obj); - - if (is_fselect) { - /* Selection entry */ - o_sel[0] = '\0'; - sel_obj = NewStringObj(fs_win, "Selection:", o_sel, LINES-10, 2, COLS-24, 255); - AddObj(&obj, STRINGOBJ, (void *) sel_obj); - } - - /* Ok button */ - ok_button = FALSE; - okbut_obj = NewButtonObj(fs_win, "Ok", &ok_button, LINES-6, 20); - AddObj(&obj, BUTTONOBJ, (void *) okbut_obj); - - /* Cancel button */ - cancel_button = FALSE; - canbut_obj = NewButtonObj(fs_win, "Cancel", &cancel_button, LINES-6, 30); - AddObj(&obj, BUTTONOBJ, (void *) canbut_obj); - - /* Make sure all objects on the window are drawn */ - wrefresh(fs_win); - keypad(fs_win, TRUE); - - /* Start the reading */ - o = obj; - strcpy(old_fmask, o_fm); - strcpy(old_dir, o_dir); - quit = FALSE; - cancel = FALSE; - while (!quit) { - ret = PollObj(&o); - switch(ret) { - case SEL_CR: - if (strcmp(old_fmask, o_fm) || strcmp(old_dir, o_dir)) { - /* reread directory and update the listobjects */ - if (strcmp(old_dir, o_dir)) { /* dir entry was changed */ - if (chdir(o_dir)) { - dialog_notify("Could not change into directory"); - strcpy(o_dir, old_dir); - } else { - getcwd(o_dir, MAXPATHLEN); - strcpy(old_dir, o_dir); - } - RefreshStringObj(dir_obj); - } else { /* fmask entry was changed */ - strcpy(old_fmask, o_fm); - } - get_dir(".", o_fm, &d, &n); - FreeNames(dnames, nd); - get_directories(d, n, &dnames, &nd); - UpdateListObj(dirs_obj, dnames, nd); - FreeNames(fnames, nf); - get_filenames(d, n, &fnames, &nf); - UpdateListObj(files_obj, fnames, nf); - if (((o->prev)->obj == (void *) dirs_obj)) { - o=o->prev; - } - } - break; - case SEL_BUTTON: - /* check which button was pressed */ - if (ok_button) { - quit = TRUE; - } - if (cancel_button) { - quit = TRUE; - cancel = TRUE; - } - break; - case SEL_ESC: - quit = TRUE; - cancel = TRUE; - break; - case KEY_F(1): - case '?': - display_helpfile(); - break; - } - } - DelObj(obj); - FreeNames(dnames, nd); - FreeNames(fnames, nf); - delwin(fs_win); - - if (cancel || (strlen(o_sel) == 0)) { - return(NULL); - } else { - ret_name = (char *) malloc( strlen(o_sel) + 1 ); - strcpy(ret_name, o_sel); - return(ret_name); - } -} /* dialog_fselect() */ - diff --git a/gnu/lib/libdialog/gauge.c b/gnu/lib/libdialog/gauge.c deleted file mode 100644 index d8138f6..0000000 --- a/gnu/lib/libdialog/gauge.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * gauge.c - * - * progress indicator for libdialog - * - * - * Copyright (c) 1995, Marc van Kempen - * - * All rights reserved. - * - * This software may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of this software, nor does - * the author assume any responsibility for damages incurred with - * its use. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include - -#include "dialog.h" - -void -dialog_gauge(char *title, char *prompt, int y, int x, - int height, int width, int perc) -/* - * Desc: display a progress bar, progress indicated by - */ -{ - WINDOW *gw; - int glen, i; - char percs[5]; - - gw = newwin(height, width, y, x); - if (!gw) { - fprintf(stderr, "dialog_gauge: Error creating window (%d, %d, %d, %d)", - height, width, y, x); - exit(-1); - } - - draw_box(gw, 0, 0, height, width, dialog_attr, border_attr); - draw_shadow(stdscr, y, x, height, width); - - wattrset(gw, title_attr); - if (title) { - wmove(gw, 0, (width - strlen(title))/2 - 1); - waddstr(gw, "[ "); - waddstr(gw, title); - waddstr(gw, " ]"); - } - wattrset(gw, dialog_attr); - if (prompt) { - wmove(gw, 1, (width - strlen(prompt))/2 - 1); - waddstr(gw, prompt); - } - - draw_box(gw, 2, 2, 3, width-4, dialog_attr, border_attr); - glen = (int) ((float) perc/100 * (width-6)); - - wattrset(gw, dialog_attr); - sprintf(percs, "%3d%%", perc); - wmove(gw, 5, width/2 - 2); - waddstr(gw, percs); - - wattrset(gw, A_BOLD); - wmove(gw, 3, 3); - for (i=0; i -#include -#include -#include -#include -#include - -static char _helpfilebuf[MAXPATHLEN]; -static char _helplinebuf[77]; /* limit the helpline to 76 characters */ -static char *_helpfile = NULL; -static char *_helpline = NULL; - -/****************************************************************** - * - * helpfile routines - * - ******************************************************************/ - -void -use_helpfile(char *hfile) -/* - * desc: set the helpfile to be opened on pressing F1 to - */ -{ - if (hfile != NULL) { - _helpfile = _helpfilebuf; - strcpy(_helpfile, hfile); - } else { - _helpfile = NULL; - } - - return; -} /* use_helpfile() */ - -void -display_helpfile(void) -/* - * desc: display the current helpfile in a window - */ -{ - WINDOW *w; - FILE *f; - struct stat sb; - char msg[80], *buf; - static int in_help = FALSE; - char *savehline = NULL; - - if (in_help) return; /* dont call help when you're in help */ - - if (_helpfile != NULL) { - if ((w = dupwin(newscr)) == NULL) { - dialog_notify("No memory to dup previous screen\n"); - return; - } - if ((f = fopen(_helpfile, "r")) == NULL) { - sprintf(msg, "Can't open helpfile : %s\n", _helpfile); - dialog_notify(msg); - return; - } - if (fstat(fileno(f), &sb)) { - sprintf(msg, "Can't stat helpfile : %s\n", _helpfile); - dialog_notify(msg); - return; - } - if ((buf = (char *) malloc( sb.st_size )) == NULL) { - sprintf(msg, "Could not malloc space for helpfile : %s\n", _helpfile); - dialog_notify(msg); - return; - } - if (fread(buf, 1, sb.st_size, f) != sb.st_size) { - sprintf(msg, "Could not read entire help file : %s", _helpfile); - dialog_notify(msg); - free(buf); - return; - } - buf[sb.st_size] = 0; - in_help = TRUE; - savehline = get_helpline(); - use_helpline("Use arrowkeys, PgUp, PgDn, Home and End to move through text"); - dialog_mesgbox("Online help", buf, LINES-4, COLS-4); - restore_helpline(savehline); - in_help = FALSE; - touchwin(w); - wrefresh(w); - delwin(w); - free(buf); - } else { - /* do nothing */ - } - - return; -} /* display_helpfile() */ - - -/****************************************************************** - * - * helpline routines - * - ******************************************************************/ - -void -use_helpline(char *hline) -/* - * desc: set the helpline to printed in dialogs - */ -{ - if (hline) { - _helpline = _helplinebuf; - if (strlen(hline) > 76) { - /* only display the first 76 characters in the helpline */ - strncpy(_helpline, hline, 76); - _helpline[76] = 0; - } else { - strcpy(_helpline, hline); - } - } else { - _helpline = NULL; - } - - return; -} /* use_helpline() */ - -void -display_helpline(WINDOW *w, int y, int width) -/* - * desc: display the helpline at the given coordinates in the window - */ -{ - if (_helpline != NULL) { - if (strlen(_helpline) > width - 6) { - _helpline[width - 6] = 0; - } - wmove(w, y, (int) (width - strlen(_helpline)- 4) / 2); - wattrset(w, title_attr); - waddstr(w, "[ "); - waddstr(w, _helpline); - waddstr(w, " ]"); - } else { - /* do nothing */ - } - - return; -} - -char * -get_helpline(void) -/* - * desc: allocate new space, copy the helpline to it and return a pointer to it - */ -{ - char *hlp; - - if (_helpline) { - hlp = (char *) malloc( strlen(_helpline) + 1 ); - strcpy(hlp, _helpline); - } else { - hlp = NULL; - } - - return(hlp); -} /* get_helpline() */ - -void -restore_helpline(char *helpline) -/* - * Desc: set the helpline to and free the space allocated to it - */ -{ - use_helpline(helpline); - free(helpline); - - return; -} /* restore_helpline() */ diff --git a/gnu/lib/libdialog/inputbox.c b/gnu/lib/libdialog/inputbox.c deleted file mode 100644 index 1f61ed5..0000000 --- a/gnu/lib/libdialog/inputbox.c +++ /dev/null @@ -1,190 +0,0 @@ -/* - * inputbox.c -- implements the input box - * - * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - -#include -#include "dialog.priv.h" - - -/* - * Display a dialog box for inputing a string - */ -int dialog_inputbox(unsigned char *title, unsigned char *prompt, int height, int width, unsigned char *result) -{ - int i, j, x, y, box_y, box_x, box_width, first, - key = 0, button = -1; - unsigned char instr[MAX_LEN+1]; - WINDOW *dialog; - - if (height < 0) - height = strheight(prompt)+2+4; - if (width < 0) { - i = strwidth(prompt); - j = ((title != NULL) ? strwidth(title) : 0); - width = MAX(i,j) + 4; - } - width = MAX(width,24); - - if (width > COLS) - width = COLS; - if (height > LINES) - height = LINES; - /* center dialog box on screen */ - x = DialogX ? DialogX : (COLS - width)/2; - y = DialogY ? DialogY : (LINES - height)/2; - -#ifdef HAVE_NCURSES - if (use_shadow) - draw_shadow(stdscr, y, x, height, width); -#endif - dialog = newwin(height, width, y, x); - if (dialog == NULL) { - endwin(); - fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x); - exit(1); - } - keypad(dialog, TRUE); - - draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); - wattrset(dialog, border_attr); - wmove(dialog, height-3, 0); - waddch(dialog, ACS_LTEE); - for (i = 0; i < width-2; i++) - waddch(dialog, ACS_HLINE); - wattrset(dialog, dialog_attr); - waddch(dialog, ACS_RTEE); - wmove(dialog, height-2, 1); - for (i = 0; i < width-2; i++) - waddch(dialog, ' '); - - if (title != NULL) { - wattrset(dialog, title_attr); - wmove(dialog, 0, (width - strlen(title))/2 - 1); - waddch(dialog, ' '); - waddstr(dialog, title); - waddch(dialog, ' '); - } - wattrset(dialog, dialog_attr); - wmove(dialog, 1, 2); - print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE); - - /* Draw the input field box */ - box_width = width-6; - getyx(dialog, y, x); - box_y = y + 2; - box_x = (width - box_width)/2; - draw_box(dialog, y+1, box_x-1, 3, box_width+2, border_attr, dialog_attr); - - display_helpline(dialog, height-1, width); - - x = width/2-11; - y = height-2; - print_button(dialog, "Cancel", y, x+14, FALSE); - print_button(dialog, " OK ", y, x, TRUE); - - first = 1; - strcpy(instr, result); - wattrset(dialog, dialog_attr); - - while (key != ESC) { - - if (button == -1) { /* Input box selected */ - key = line_edit(dialog, box_y, box_x, -1, box_width, inputbox_attr, first, instr, DialogInputAttrs); - first = 0; - } - else - key = wgetch(dialog); - - switch (key) { - case 'O': - case 'o': - delwin(dialog); - strcpy(result, instr); - return 0; - case 'C': - case 'c': - delwin(dialog); - return 1; - case KEY_UP: - case KEY_LEFT: - case KEY_BTAB: - switch (button) { - case -1: - button = 1; /* Indicates "Cancel" button is selected */ - print_button(dialog, " OK ", y, x, FALSE); - print_button(dialog, "Cancel", y, x+14, TRUE); - wrefresh(dialog); - break; - case 0: - button = -1; /* Indicates input box is selected */ - print_button(dialog, "Cancel", y, x+14, FALSE); - print_button(dialog, " OK ", y, x, TRUE); - break; - case 1: - button = 0; /* Indicates "OK" button is selected */ - print_button(dialog, "Cancel", y, x+14, FALSE); - print_button(dialog, " OK ", y, x, TRUE); - wrefresh(dialog); - break; - } - break; - case TAB: - case KEY_DOWN: - case KEY_RIGHT: - switch (button) { - case -1: - button = 0; /* Indicates "OK" button is selected */ - print_button(dialog, "Cancel", y, x+14, FALSE); - print_button(dialog, " OK ", y, x, TRUE); - wrefresh(dialog); - break; - case 0: - button = 1; /* Indicates "Cancel" button is selected */ - print_button(dialog, " OK ", y, x, FALSE); - print_button(dialog, "Cancel", y, x+14, TRUE); - wrefresh(dialog); - break; - case 1: - button = -1; /* Indicates input box is selected */ - print_button(dialog, "Cancel", y, x+14, FALSE); - print_button(dialog, " OK ", y, x, TRUE); - break; - } - break; - case ' ': - case '\n': - case '\r': - delwin(dialog); - if (button < 1) - strcpy(result, instr); - return (button == -1 ? 0 : button); - case ESC: - break; - case KEY_F(1): - case '?': - display_helpfile(); - break; - } - } - - delwin(dialog); - return -1; /* ESC pressed */ -} -/* End of dialog_inputbox() */ diff --git a/gnu/lib/libdialog/kernel.c b/gnu/lib/libdialog/kernel.c deleted file mode 100644 index 9ed5eac..0000000 --- a/gnu/lib/libdialog/kernel.c +++ /dev/null @@ -1,536 +0,0 @@ -/* - * dialog - Display simple dialog boxes from shell scripts - * - * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * - * HISTORY: - * - * 17/12/93 - Version 0.1 released. - * - * 19/12/93 - menu will now scroll if there are more items than can fit - * on the screen. - * - added 'checklist', a dialog box with a list of options that - * can be turned on or off. A list of options that are on is - * returned on exit. - * - * 20/12/93 - Version 0.15 released. - * - * 29/12/93 - Incorporated patch from Patrick J. Volkerding - * (volkerdi@mhd1.moorhead.msus.edu) that made these changes: - * - increased MAX_LEN to 2048 - * - added 'infobox', equivalent to a message box without pausing - * - added option '--clear' that will clear the screen - * - Explicit line breaking when printing prompt text can be - * invoked by real newline '\n' besides the string "\n" - * - an optional parameter '--title ' can be used to - * specify a title string for the dialog box - * - * 03/01/94 - added 'textbox', a dialog box for displaying text from a file. - * - Version 0.2 released. - * - * 04/01/94 - some fixes and improvements for 'textbox': - * - fixed a bug that will cause a segmentation violation when a - * line is longer than MAX_LEN characters. Lines will now be - * truncated if they are longer than MAX_LEN characters. - * - removed wrefresh() from print_line(). This will increase - * efficiency of print_page() which calls print_line(). - * - display current position in the form of percentage into file. - * - Version 0.21 released. - * - * 05/01/94 - some changes for faster screen update. - * - * 07/01/94 - much more flexible color settings. Can use all 16 colors - * (8 normal, 8 highlight) of the Linux console. - * - * 08/01/94 - added run-time configuration using configuration file. - * - * 09/01/94 - some minor bug fixes and cleanups for menubox, checklist and - * textbox. - * - * 11/01/94 - added a man page. - * - * 13/01/94 - some changes for easier porting to other Unix systems (tested - * on Ultrix, SunOS and HPUX) - * - Version 0.3 released. - * - * 08/06/94 - Patches by Stuart Herbert - S.Herbert@shef.ac.uk - * Fixed attr_clear and the textbox stuff to work with ncurses 1.8.5 - * Fixed the wordwrap routine - it'll actually wrap properly now - * Added a more 3D look to everything - having your own rc file could - * prove 'interesting' to say the least :-) - * Added radiolist option - * - Version 0.4 released. - */ - -#include -__FBSDID("$FreeBSD$"); - -#define __DIALOG_MAIN__ - -#include -#include -#include "dialog.priv.h" -#ifdef HAVE_NCURSES -#include "colors.h" -#endif - -/* These are two "secret" globals that can be fiddled to make a dialog - * come up someplace other than a "centered" calculation for X,Y - */ -int DialogX, DialogY; - -/* This "secret" global allows you to change the behavior of an input field */ -int DialogInputAttrs; - -/* - * Do some initialization for dialog - */ -void init_dialog(void) -{ - - if (issetugid()) { - errx(1, "libdialog is unsafe to use in setugid applications"); - } - -#if defined(LOCALE) - (void) setlocale(LC_ALL, ""); -#endif - -#ifdef HAVE_NCURSES - if (parse_rc() == -1) /* Read the configuration file */ - exit(-1); -#endif - - if (initscr() == NULL) { /* Init curses */ - fprintf(stderr, "\nCurses initialization error.\n"); - exit(-1); - } - keypad(stdscr, TRUE); - cbreak(); - noecho(); - -#ifdef HAVE_NCURSES - if (use_colors || use_shadow) /* Set up colors */ - color_setup(); -#endif - - /* Set screen to screen attribute */ - dialog_clear_norefresh(); - DialogX = DialogY = 0; -} -/* End of init_dialog() */ - - -#ifdef HAVE_NCURSES -/* - * Setup for color display - */ -void color_setup(void) -{ - int i; - - if (has_colors()) { /* Terminal supports color? */ - start_color(); - - /* Initialize color pairs */ - for (i = 0; i < ATTRIBUTE_COUNT; i++) - init_pair(i+1, color_table[i][0], color_table[i][1]); - - /* Setup color attributes */ - for (i = 0; i < ATTRIBUTE_COUNT; i++) - attributes[i] = C_ATTR(color_table[i][2], i+1); - } -} -/* End of color_setup() */ -#endif - - -/* - * Set window to attribute 'attr' - */ -void attr_clear(WINDOW *win, int height, int width, chtype attr) -{ - int i, j; - - wattrset(win, attr); /* Set window to attribute 'attr' */ - for (i = 0; i < height; i++) { - wmove(win, i, 0); - for (j = 0; j < width; j++) - waddch(win, ' '); - } -} -/* End of attr_clear() */ - - -/* - * Print a string of text in a window, automatically wrap around to the - * next line if the string is too long to fit on one line. Note that the - * string may contain "\n" to represent a newline character or the real - * newline '\n', but in that case, auto wrap around will be disabled. - */ -void print_autowrap(WINDOW *win, unsigned char *prompt, int height, int width, int maxwidth, int y, int x, int center, int rawmode) -{ - int cur_x, cur_y, i; - unsigned char tempstr[MAX_LEN+1], *word, *tempptr, *tempptr1; - chtype ostuff[132], attrs = 0, init_bottom = 0; - - wsetscrreg(win, y, height); - getyx(win, cur_y, cur_x); - - strncpy(tempstr, prompt, MAX_LEN); - tempstr[MAX_LEN] = '\0'; - if ((!rawmode && strstr(tempstr, "\\n") != NULL) || - (strchr(tempstr, '\n') != NULL)) { /* Prompt contains "\n" or '\n' */ - word = tempstr; - while (1) { - tempptr = rawmode ? NULL : strstr(word, "\\n"); - tempptr1 = strchr(word, '\n'); - if (tempptr == NULL && tempptr1 == NULL) - break; - else if (tempptr == NULL) { /* No more "\n" */ - tempptr = tempptr1; - tempptr[0] = '\0'; - } - else if (tempptr1 == NULL) { /* No more '\n' */ - tempptr[0] = '\0'; - tempptr++; - } - else { /* Prompt contains both "\n" and '\n' */ - if (strlen(tempptr)-2 < strlen(tempptr1)-1) { - tempptr = tempptr1; - tempptr[0] = '\0'; - } - else { - tempptr[0] = '\0'; - tempptr++; - } - } - - waddstr(win, word); - word = tempptr + 1; - if (++cur_y > height) { - cur_y--; - if (!init_bottom) { - for (i = 0; i < x; i++) - ostuff[i] = mvwinch(win, cur_y, i); - for (i = width; i < maxwidth; i++) - ostuff[i] = mvwinch(win, cur_y, i); - attrs = getattrs(win); - init_bottom = 1; - } - scrollok(win, TRUE); - scroll(win); - scrollok(win, FALSE); - wmove(win, cur_y, 0); - for (i = 0; i < x; i++) { - wattrset(win, ostuff[i]&A_ATTRIBUTES); - waddch(win, ostuff[i]); - } - wattrset(win, attrs); - for ( ; i < width; i++) - waddch(win, ' '); - for ( ; i < maxwidth; i++) { - wattrset(win, ostuff[i]&A_ATTRIBUTES); - waddch(win, ostuff[i]); - } - wattrset(win, attrs); - wrefresh(win); - } - wmove(win, cur_y, cur_x = x); - } - waddstr(win, word); - } - else if (center && strlen(tempstr) <= width-x*2) { /* If prompt is short */ - wmove(win, cur_y, (width - strlen(tempstr)) / 2); - waddstr(win, tempstr); - } - else if (!center && strlen(tempstr) <= width-cur_x) { /* If prompt is short */ - waddstr(win, tempstr); - } - else { - char *p = tempstr; - - /* Print prompt word by word, wrap around if necessary */ - while ((word = strsep(&p, "\t\n ")) != NULL) { - int loop; - unsigned char sc; - - if (*word == '\0') - continue; - do { - loop = 0; - if (cur_x+strlen(word) >= width+1) { /* wrap around to next line */ - if (x+strlen(word) >= width+1) { - sc = word[width-cur_x-1]; - word[width-cur_x-1] = '\0'; - wmove(win, cur_y, cur_x); - waddstr(win, word); - word[width-cur_x-1] = sc; - word += width-cur_x-1; - getyx(win, cur_y, cur_x); - loop = 1; - } - cur_y++; - cur_x = x; - if (cur_y > height) { - cur_y--; - if (!init_bottom) { - for (i = 0; i < x; i++) - ostuff[i] = mvwinch(win, cur_y, i); - for (i = width; i < maxwidth; i++) - ostuff[i] = mvwinch(win, cur_y, i); - attrs = getattrs(win); - init_bottom = 1; - } - scrollok(win, TRUE); - scroll(win); - scrollok(win, FALSE); - wmove(win, cur_y, 0); - for (i = 0; i < x; i++) { - wattrset(win, ostuff[i]&A_ATTRIBUTES); - waddch(win, ostuff[i]); - } - wattrset(win, attrs); - for ( ; i < width; i++) - waddch(win, ' '); - for ( ; i < maxwidth; i++) { - wattrset(win, ostuff[i]&A_ATTRIBUTES); - waddch(win, ostuff[i]); - } - wattrset(win, attrs); - wrefresh(win); - } - } - } - while(loop); - wmove(win, cur_y, cur_x); - waddstr(win, word); - getyx(win, cur_y, cur_x); - cur_x++; - } - } -} -/* End of print_autowrap() */ - - -/* - * Print a button - */ -void print_button(WINDOW *win, unsigned char *label, int y, int x, int selected) -{ - int i, temp; - - wmove(win, y, x); - wattrset(win, selected ? button_active_attr : button_inactive_attr); - waddstr(win, selected ? "[" : " "); - temp = strspn(label, " "); - label += temp; - for (i = 0; i < temp; i++) - waddch(win, ' '); - wattrset(win, selected ? button_key_active_attr : button_key_inactive_attr); - waddch(win, label[0]); - wattrset(win, selected ? button_active_attr : button_inactive_attr); - waddstr(win, label+1); - waddstr(win, selected ? "]" : " "); - wmove(win, y, x+temp+1); -} -/* End of print_button() */ - - -/* - * Draw a rectangular box with line drawing characters - */ -void draw_box(WINDOW *win, int y, int x, int height, int width, chtype box, chtype border) -{ - int i, j; - - wattrset(win, 0); - for (i = 0; i < height; i++) { - wmove(win, y + i, x); - for (j = 0; j < width; j++) - if (!i && !j) - waddch(win, border | ACS_ULCORNER); - else if (i == height-1 && !j) - waddch(win, border | ACS_LLCORNER); - else if (!i && j == width-1) - waddch(win, box | ACS_URCORNER); - else if (i == height-1 && j == width-1) - waddch(win, box | ACS_LRCORNER); - else if (!i) - waddch(win, border | ACS_HLINE); - else if (i == height-1) - waddch(win, box | ACS_HLINE); - else if (!j) - waddch(win, border | ACS_VLINE); - else if (j == width-1) - waddch(win, box | ACS_VLINE); - else - waddch(win, box | ' '); - } -} -/* End of draw_box() */ - - -#ifdef HAVE_NCURSES -/* - * Draw shadows along the right and bottom edge to give a more 3D look - * to the boxes - */ -void draw_shadow(WINDOW *win, int y, int x, int height, int width) -{ - int i,sx,sy; - chtype attrs; - - if (has_colors()) { /* Whether terminal supports color? */ - getbegyx(win,sy,sx); - attrs = getattrs(win); - if (y+height < getmaxy(win)) { - /* small touch */ - wattrset(win, A_INVIS); - wmove(win, y + height, x + 2); - for (i = 0; i < width; i++) - if (i+x+2 < getmaxx(win)) - waddch(win, ' '); - /* end touch */ - wattrset(win, shadow_attr); - wmove(win, y + height, x + 2); - for (i = 0; i < width; i++) - if (i+x+2 < getmaxx(win)) - waddch(win, mvwinch(newscr, sy+y+height, sx+x+2+i) & A_CHARTEXT); - } - if (x+width < getmaxx(win)) { - for (i = y + 1; i < y + height + 1; i++) { - if (i < getmaxy(win)) { - /* small touch */ - wattrset(win, A_INVIS); - wmove(win, i, x + width); - waddch(win, ' '); - if (x+width+1 < getmaxx(win)) - waddch(win, ' '); - /* end touch */ - wattrset(win, shadow_attr); - wmove(win, i, x + width); - waddch(win, mvwinch(newscr, sy+i, sx+x+width) & A_CHARTEXT); - if (x+width+1 < getmaxx(win)) - waddch(win, mvwinch(newscr, sy+i, sx+x+width+1) & A_CHARTEXT); - } - } - } - wattrset(win, attrs); - wnoutrefresh(win); - } -} -/* End of draw_shadow() */ -#endif - -void dialog_clear_norefresh(void) -{ - attr_clear(stdscr, LINES, COLS, screen_attr); - touchwin(stdscr); - wnoutrefresh(stdscr); -} - -void dialog_clear(void) -{ - dialog_clear_norefresh(); - doupdate(); -} - -void dialog_update(void) -{ - refresh(); -} - -void end_dialog(void) -{ - endwin(); -} - -int strwidth(const char *p) -{ - int i = 0, len, incr; - const char *start, *s, *s1, *s2; - - for (start = s = p; ; start = (s += incr)) { - s1 = strchr(s, '\n'); - s2 = strstr(s, "\\n"); - if (s2 == NULL) - s = s1; - else if (s1 == NULL) - s = s2; - else - s = MIN(s1, s2); - if (s == NULL) - break; - incr = 1 + (s == s2); - len = s - start; - if (len > i) - i = len; - } - len = strlen(start); - if (len > i) - i = len; - return i; -} - -int strheight(const char *p) -{ - int i = 1, incr; - const char *s, *s1, *s2; - - for (s = p; ; s += incr) { - s1 = strchr(s, '\n'); - s2 = strstr(s, "\\n"); - if (s2 == NULL) - s = s1; - else if (s1 == NULL) - s = s2; - else - s = MIN(s1, s2); - if (s == NULL) - break; - incr = 1 + (s == s2); - i++; - } - return i; -} - -void print_arrows(WINDOW *dialog, int scroll, int menu_height, int item_no, - int box_x, int box_y, int tag_x, int cur_x, int cur_y) -{ - wmove(dialog, box_y, box_x + tag_x + 1); - wattrset(dialog, scroll ? uarrow_attr : menubox_attr); - waddch(dialog, scroll ? ACS_UARROW : ACS_HLINE); - wmove(dialog, box_y, box_x + tag_x + 2); - waddch(dialog, scroll ? '(' : ACS_HLINE); - wmove(dialog, box_y, box_x + tag_x + 3); - waddch(dialog, scroll ? '-' : ACS_HLINE); - wmove(dialog, box_y, box_x + tag_x + 4); - waddch(dialog, scroll ? ')' : ACS_HLINE); - wmove(dialog, box_y + menu_height + 1, box_x + tag_x + 1); - wattrset(dialog, scroll+menu_height < item_no ? darrow_attr : menubox_border_attr); - waddch(dialog, scroll+menu_height < item_no ? ACS_DARROW : ACS_HLINE); - wmove(dialog, box_y + menu_height + 1, box_x + tag_x + 2); - waddch(dialog, scroll+menu_height < item_no ? '(' : ACS_HLINE); - wmove(dialog, box_y + menu_height + 1, box_x + tag_x + 3); - waddch(dialog, scroll+menu_height < item_no ? '+' : ACS_HLINE); - wmove(dialog, box_y + menu_height + 1, box_x + tag_x + 4); - waddch(dialog, scroll+menu_height < item_no ? ')' : ACS_HLINE); - wmove(dialog, cur_y, cur_x); /* Restore cursor position */ -} - diff --git a/gnu/lib/libdialog/lineedit.c b/gnu/lib/libdialog/lineedit.c deleted file mode 100644 index 7bfe0e0..0000000 --- a/gnu/lib/libdialog/lineedit.c +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Changes Copyright (C) 1995 by Andrey A. Chernov, Moscow - * - * Original Copyright: - * - * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - -#include -#include "dialog.priv.h" - -static void redraw_field(WINDOW *dialog, int box_y, int box_x, int flen, int box_width, unsigned char instr[], int input_x, int scroll, chtype attr, chtype old_attr, int fexit, int attr_mask); - -/* - * Line editor - */ -int line_edit(WINDOW* dialog, int box_y, int box_x, int flen, int box_width, chtype attr, int first, unsigned char *result, int attr_mask) -{ - int i, key; - chtype old_attr; - static int input_x, scroll; - static unsigned char instr[MAX_LEN+1]; - unsigned char erase_char = erasechar(); - unsigned char kill_char = killchar(); -#ifdef notyet - unsignec char werase_char = cur_term->Ottyb.c_cc[VWERASE]; -#endif - - old_attr = getattrs(dialog); - keypad(dialog, TRUE); - - if (first) { - memset(instr, 0, sizeof(instr)); - strcpy(instr, result); - i = strlen(instr); -/* input_x = i % box_width;*/ - input_x = (i > box_width) ? box_width - 1 : i; -/* scroll = i - input_x;*/ - scroll = (i > box_width) ? i - box_width + 1: 0; - } - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); - - for (;;) { - wattrset(dialog, attr); - wrefresh(dialog); - key = wgetch(dialog); - switch (key) { - case ctrl('q'): - goto ret; - break; - case KEY_F(1): - display_helpfile(); - break; - case TAB: - case KEY_BTAB: - case KEY_UP: - case KEY_DOWN: - case ESC: - case '\r': - case '\n': - for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--) - instr[i] = '\0'; - if (key == '\r') - key = '\n'; - goto ret; - case '\025': - case '\030': - kill_it: - input_x = scroll = 0; - /* fall through */ - case '\013': - case KEY_EOL: - memset(instr + scroll + input_x, '\0', sizeof(instr) - scroll - input_x); - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); - continue; - case '\001': - case KEY_HOME: - input_x = scroll = 0; - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); - continue; - case '\005': - case KEY_END: - for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--) - instr[i] = '\0'; - i++; - input_x = i % box_width; - scroll = i - input_x; - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); - continue; - case '\002': - case KEY_LEFT: - if (input_x || scroll) { - if (!input_x) { - int oldscroll = scroll; - scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1); - input_x = oldscroll - 1 - scroll; - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); - } else { - input_x--; - wmove(dialog, box_y, input_x + box_x); - } - } else - beep(); - continue; - case '\006': - case KEY_RIGHT: - if ( scroll+input_x < MAX_LEN - && (flen < 0 || scroll+input_x < flen) - ) { - if (!instr[scroll+input_x]) - instr[scroll+input_x] = ' '; - if (input_x == box_width-1) { - scroll++; - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); - } - else { - wmove(dialog, box_y, input_x + box_x); - waddch(dialog, instr[scroll+input_x]); - input_x++; - } - } else - beep(); /* Alarm user about overflow */ - continue; - case '\b': - case '\177': - case KEY_BACKSPACE: - erase_it: - if (input_x || scroll) { - i = strlen(instr); - memmove(instr+scroll+input_x-1, instr+scroll+input_x, i-(scroll+input_x)+1); - if (!input_x) { - int oldscroll = scroll; - scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1); - input_x = oldscroll - 1 - scroll; - } else - input_x--; - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); - } else - beep(); - continue; - case '\004': - case KEY_DC: - for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--) - instr[i] = '\0'; - i++; - if (i == 0) { - beep(); - continue; - } - memmove(instr+scroll+input_x, instr+scroll+input_x+1, i-(scroll+input_x)); - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); - continue; - default: - if (CCEQ(key, erase_char)) - goto erase_it; - if (CCEQ(key, kill_char)) - goto kill_it; - if (key < 0x100 && isprint(key)) { - for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--) - instr[i] = '\0'; - i++; - if (i < MAX_LEN && (flen < 0 || scroll+input_x < flen)) { - if (flen < 0 || i < flen) - memmove(instr+scroll+input_x+1, instr+scroll+input_x, i-(scroll+input_x)); - instr[scroll+input_x] = key; - if (input_x == box_width-1 && (flen < 0 || i < flen)) - scroll++; - else - input_x++; - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); - } else - beep(); /* Alarm user about overflow */ - continue; - } - } - } -ret: - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, TRUE, attr_mask); - wrefresh(dialog); - strcpy(result, instr); - return key; -} - -static void -redraw_field(WINDOW *dialog, int box_y, int box_x, int flen, int box_width, unsigned char instr[], int input_x, int scroll, chtype attr, chtype old_attr, int fexit, int attr_mask) -{ - int i, fix_len; - - wattrset(dialog, fexit ? old_attr : attr); - wmove(dialog, box_y, box_x); - fix_len = flen >= 0 ? MIN(flen-scroll,box_width) : box_width; - for (i = 0; i < fix_len; i++) - waddch(dialog, instr[scroll+i] ? ((attr_mask & DITEM_NO_ECHO) ? '*' : instr[scroll+i]) : ' '); - wattrset(dialog, old_attr); - for ( ; i < box_width; i++) - waddch(dialog, instr[scroll+i] ? ((attr_mask & DITEM_NO_ECHO) ? '*' : instr[scroll+i]) : ' '); - wmove(dialog, box_y, input_x + box_x); -} diff --git a/gnu/lib/libdialog/menubox.c b/gnu/lib/libdialog/menubox.c deleted file mode 100644 index a01acd5..0000000 --- a/gnu/lib/libdialog/menubox.c +++ /dev/null @@ -1,469 +0,0 @@ -/* - * menubox.c -- implements the menu box - * - * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) - * - * Substantial rennovation: 12/18/95, Jordan K. Hubbard - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include "dialog.priv.h" -#include -#include - -static void print_item(WINDOW *win, unsigned char *tag, unsigned char *item, int choice, int selected, dialogMenuItem *me, int menu_width, int tag_x, int item_x); - -#define DREF(di, item) ((di) ? &((di)[(item)]) : NULL) - -/* - * Display a menu for choosing among a number of options - */ -int -dialog_menu(unsigned char *title, unsigned char *prompt, int height, int width, int menu_height, int cnt, void *it, unsigned char *result, int *ch, int *sc) -{ - int i, j, x, y, cur_x, cur_y, box_x, box_y, key = 0, button, choice, - l, k, scroll, max_choice, item_no, redraw_menu = FALSE; - char okButton, cancelButton; - int rval = 0, ok_space, cancel_space; - WINDOW *dialog, *menu; - unsigned char **items = NULL; - dialogMenuItem *ditems; - int menu_width, tag_x, item_x; - -draw: - choice = ch ? *ch : 0; - scroll = sc ? *sc : 0; - button = 0; - - /* If item_no is a positive integer, use old item specification format */ - if (cnt >= 0) { - items = it; - ditems = NULL; - item_no = cnt; - } - /* It's the new specification format - fake the rest of the code out */ - else { - item_no = abs(cnt); - ditems = it; - if (!items) - items = (unsigned char **)alloca((item_no * 2) * sizeof(unsigned char *)); - - /* Initializes status */ - for (i = 0; i < item_no; i++) { - items[i*2] = ditems[i].prompt; - items[i*2 + 1] = ditems[i].title; - } - } - max_choice = MIN(menu_height, item_no); - - tag_x = 0; - item_x = 0; - /* Find length of longest item in order to center menu */ - for (i = 0; i < item_no; i++) { - l = strlen(items[i * 2]); - for (j = 0; j < item_no; j++) { - k = strlen(items[j * 2 + 1]); - tag_x = MAX(tag_x, l + k + 2); - } - item_x = MAX(item_x, l); - } - if (height < 0) - height = strheight(prompt) + menu_height + 4 + 2; - if (width < 0) { - i = strwidth(prompt); - j = ((title != NULL) ? strwidth(title) : 0); - width = MAX(i, j); - width = MAX(width, tag_x + 4) + 4; - } - width = MAX(width, 24); - - if (width > COLS) - width = COLS; - if (height > LINES) - height = LINES; - /* center dialog box on screen */ - x = DialogX ? DialogX : (COLS - width) / 2; - y = DialogY ? DialogY : (LINES - height) / 2; - -#ifdef HAVE_NCURSES - if (use_shadow) - draw_shadow(stdscr, y, x, height, width); -#endif - dialog = newwin(height, width, y, x); - if (dialog == NULL) { - endwin(); - fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height, width, y, x); - return -1; - } - keypad(dialog, TRUE); - - draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); - wattrset(dialog, border_attr); - wmove(dialog, height - 3, 0); - waddch(dialog, ACS_LTEE); - for (i = 0; i < width - 2; i++) - waddch(dialog, ACS_HLINE); - wattrset(dialog, dialog_attr); - waddch(dialog, ACS_RTEE); - wmove(dialog, height - 2, 1); - for (i = 0; i < width - 2; i++) - waddch(dialog, ' '); - - if (title != NULL) { - wattrset(dialog, title_attr); - wmove(dialog, 0, (width - strlen(title)) / 2 - 1); - waddch(dialog, ' '); - waddstr(dialog, title); - waddch(dialog, ' '); - } - wattrset(dialog, dialog_attr); - wmove(dialog, 1, 2); - print_autowrap(dialog, prompt, height - 1, width - 2, width, 1, 2, TRUE, FALSE); - - menu_width = width - 6; - getyx(dialog, cur_y, cur_x); - box_y = cur_y + 1; - box_x = (width - menu_width) / 2 - 1; - - /* create new window for the menu */ - menu = subwin(dialog, menu_height, menu_width, y + box_y + 1, x + box_x + 1); - if (menu == NULL) { - delwin(dialog); - endwin(); - fprintf(stderr, "\nsubwin(dialog,%d,%d,%d,%d) failed, maybe wrong dims\n", menu_height, menu_width, - y + box_y + 1, x + box_x + 1); - return -1; - } - keypad(menu, TRUE); - - /* draw a box around the menu items */ - draw_box(dialog, box_y, box_x, menu_height+2, menu_width+2, menubox_border_attr, menubox_attr); - - tag_x = menu_width > tag_x + 1 ? (menu_width - tag_x) / 2 : 1; - item_x = menu_width > item_x + 4 ? tag_x + item_x + 2 : menu_width - 3; - - /* Print the menu */ - for (i = 0; i < max_choice; i++) - print_item(menu, items[(scroll + i) * 2], items[(scroll + i) * 2 + 1], i, i == choice, DREF(ditems, scroll + i), menu_width, tag_x, item_x); - wnoutrefresh(menu); - print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y); - - display_helpline(dialog, height - 1, width); - - x = width / 2 - 11; - y = height - 2; - - if (ditems && result) { - cancelButton = toupper(ditems[CANCEL_BUTTON].prompt[0]); - print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : FALSE); - okButton = toupper(ditems[OK_BUTTON].prompt[0]); - print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : TRUE); - } - else { - cancelButton = 'C'; - print_button(dialog, "Cancel", y, x + 14, FALSE); - okButton = 'O'; - print_button(dialog, " OK ", y, x, TRUE); - } - - wrefresh(dialog); - while (key != ESC) { - key = wgetch(dialog); - - /* Shortcut to OK? */ - if (toupper(key) == okButton) { - if (ditems) { - if (result && ditems[OK_BUTTON].fire) { - int status; - WINDOW *save; - - save = dupwin(newscr); - status = ditems[OK_BUTTON].fire(&ditems[OK_BUTTON]); - if (status & DITEM_RESTORE) { - touchwin(save); - wrefresh(save); - } - delwin(save); - } - } - else if (result) - strcpy(result, items[(scroll + choice) * 2]); - rval = 0; - key = ESC; /* Punt! */ - break; - } - - /* Shortcut to cancel? */ - if (toupper(key) == cancelButton) { - if (ditems && result && ditems[CANCEL_BUTTON].fire) { - int status; - WINDOW *save; - - save = dupwin(newscr); - status = ditems[CANCEL_BUTTON].fire(&ditems[CANCEL_BUTTON]); - if (status & DITEM_RESTORE) { - touchwin(save); - wrefresh(save); - } - delwin(save); - } - rval = 1; - key = ESC; /* Run away! */ - break; - } - - /* Check if key pressed matches first character of any item tag in menu */ - for (i = 0; i < max_choice; i++) - if (key < 0x100 && key != ' ' && toupper(key) == toupper(items[(scroll + i) * 2][0])) - break; - - if (i < max_choice || (key >= '1' && key <= MIN('9', '0'+max_choice)) || KEY_IS_UP(key) || KEY_IS_DOWN(key)) { - if (key >= '1' && key <= MIN('9', '0'+max_choice)) - i = key - '1'; - else if (KEY_IS_UP(key)) { - if (!choice) { - if (scroll) { - /* Scroll menu down */ - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - if (menu_height > 1) { - /* De-highlight current first item before scrolling down */ - print_item(menu, items[scroll * 2], items[scroll * 2 + 1], 0, FALSE, DREF(ditems, scroll), menu_width, tag_x, item_x); - scrollok(menu, TRUE); - wscrl(menu, -1); - scrollok(menu, FALSE); - } - scroll--; - print_item(menu, items[scroll * 2], items[scroll * 2 + 1], 0, TRUE, DREF(ditems, scroll), menu_width, tag_x, item_x); - wnoutrefresh(menu); - print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y); - wrefresh(dialog); - } - continue; /* wait for another key press */ - } - else - i = choice - 1; - } - else if (KEY_IS_DOWN(key)) { - if (choice == max_choice - 1) { - if (scroll + choice < item_no - 1) { - /* Scroll menu up */ - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - if (menu_height > 1) { - /* De-highlight current last item before scrolling up */ - print_item(menu, items[(scroll + max_choice - 1) * 2], - items[(scroll + max_choice - 1) * 2 + 1], - max_choice-1, FALSE, DREF(ditems, scroll + max_choice - 1), menu_width, tag_x, item_x); - scrollok(menu, TRUE); - scroll(menu); - scrollok(menu, FALSE); - } - scroll++; - print_item(menu, items[(scroll + max_choice - 1) * 2], - items[(scroll + max_choice - 1) * 2 + 1], - max_choice - 1, TRUE, DREF(ditems, scroll + max_choice - 1), menu_width, tag_x, item_x); - wnoutrefresh(menu); - print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y); - wrefresh(dialog); - } - continue; /* wait for another key press */ - } - else - i = choice + 1; - } - - if (i != choice) { - /* De-highlight current item */ - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - print_item(menu, items[(scroll + choice) * 2], items[(scroll + choice) * 2 + 1], choice, FALSE, DREF(ditems, scroll + choice), menu_width, tag_x, item_x); - - /* Highlight new item */ - choice = i; - print_item(menu, items[(scroll + choice) * 2], items[(scroll + choice) * 2 + 1], choice, TRUE, DREF(ditems, scroll + choice), menu_width, tag_x, item_x); - wnoutrefresh(menu); - wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */ - wrefresh(dialog); - } - continue; /* wait for another key press */ - } - - switch (key) { - case KEY_PPAGE: - if (scroll > height - 4) { /* can we go up? */ - scroll -= (height - 4); - } else { - scroll = 0; - } - redraw_menu = TRUE; - break; - - case KEY_NPAGE: - if (scroll + menu_height >= item_no-1 - menu_height) { /* can we go down a full page? */ - scroll = item_no - menu_height; - if (scroll < 0) - scroll = 0; - } else { - scroll += menu_height; - } - redraw_menu = TRUE; - break; - - case KEY_HOME: - scroll = 0; - choice = 0; - redraw_menu = TRUE; - break; - - case KEY_END: - scroll = item_no - menu_height; - if (scroll < 0) - scroll = 0; - choice = max_choice - 1; - redraw_menu = TRUE; - break; - - case KEY_BTAB: - case TAB: - case KEY_LEFT: - case KEY_RIGHT: - button = !button; - if (ditems && result) { - print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); - print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); - ok_space = 1; - cancel_space = strlen(ditems[OK_BUTTON].prompt) + 6; - } - else { - print_button(dialog, "Cancel", y, x + 14, button); - print_button(dialog, " OK ", y, x, !button); - ok_space = 3; - cancel_space = 15; - } - if (button) - wmove(dialog, y, x+cancel_space); - else - wmove(dialog, y, x+ok_space); - wrefresh(dialog); - break; - - case ' ': - case '\r': - case '\n': - if (!button) { - /* A fire routine can do just about anything to the screen, so be prepared - to accept some hints as to what to do in the aftermath. */ - if (ditems) { - if (ditems[scroll + choice].fire) { - int status; - WINDOW *save; - - save = dupwin(newscr); - status = ditems[scroll + choice].fire(&ditems[scroll + choice]); - if (status & DITEM_RESTORE) { - touchwin(save); - wrefresh(save); - } - delwin(save); - if (status & DITEM_CONTINUE) - continue; - else if (status & DITEM_LEAVE_MENU) { - /* Allow a fire action to take us out of the menu */ - key = ESC; - break; - } - else if (status & DITEM_RECREATE) { - delwin(menu); - delwin(dialog); - dialog_clear(); - goto draw; - } - } - } - else if (result) - strcpy(result, items[(scroll+choice)*2]); - } - rval = button; - key = ESC; - break; - - case ESC: - rval = -1; - break; - - case KEY_F(1): - case '?': - display_helpfile(); - break; - } - - /* save info about menu item position */ - if (ch) - *ch = choice; - if (sc) - *sc = scroll; - - if (redraw_menu) { - for (i = 0; i < max_choice; i++) { - print_item(menu, items[(scroll + i) * 2], items[(scroll + i) * 2 + 1], i, i == choice, DREF(ditems, scroll + i), menu_width, tag_x, item_x); - } - wnoutrefresh(menu); - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y); - wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */ - wrefresh(dialog); - redraw_menu = FALSE; - } - } - delwin(menu); - delwin(dialog); - return rval; -} - - -/* - * Print menu item - */ -static void -print_item(WINDOW *win, unsigned char *tag, unsigned char *item, int choice, int selected, dialogMenuItem *me, int menu_width, int tag_x, int item_x) -{ - int i; - - if (tag == NULL) - errx(1, "bad parameter to print_item()\n"); - - /* Clear 'residue' of last item */ - wattrset(win, menubox_attr); - wmove(win, choice, 0); - for (i = 0; i < menu_width; i++) - waddch(win, ' '); - wmove(win, choice, tag_x); - wattrset(win, selected ? tag_key_selected_attr : tag_key_attr); - waddch(win, tag[0]); - wattrset(win, selected ? tag_selected_attr : tag_attr); - waddnstr(win, tag + 1, item_x - tag_x - 3); - wmove(win, choice, item_x); - wattrset(win, selected ? item_selected_attr : item_attr); - waddnstr(win, item, menu_width - item_x - 1); - /* If have a selection handler for this, call it */ - if (me && me->selected) { - wrefresh(win); - me->selected(me, selected); - } -} -/* End of print_item() */ diff --git a/gnu/lib/libdialog/msgbox.c b/gnu/lib/libdialog/msgbox.c deleted file mode 100644 index 41d78c8..0000000 --- a/gnu/lib/libdialog/msgbox.c +++ /dev/null @@ -1,346 +0,0 @@ -/* - * msgbox.c -- implements the message box and info box - * - * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include "dialog.priv.h" - - -/* local prototypes */ -static int getnlines(unsigned char *buf); -static void print_page(WINDOW *win, int height, int width, unsigned char *buf, int startline, int hscroll); -static void print_perc(WINDOW *win, int y, int x, float p); - - -/* - * Display a message box. Program will pause and display an "OK" button - * if the parameter 'pause' is non-zero. - */ -int dialog_msgbox(unsigned char *title, unsigned char *prompt, int height, int width, int pause) -{ - int i, j, x, y, key = 0; - WINDOW *dialog; - - if (height < 0) - height = strheight(prompt)+2+2*(!!pause); - if (width < 0) { - i = strwidth(prompt); - j = ((title != NULL) ? strwidth(title) : 0); - width = MAX(i,j)+4; - } - if (pause) - width = MAX(width,10); - - if (width > COLS) - width = COLS; - if (height > LINES) - height = LINES; - /* center dialog box on screen */ - x = DialogX ? DialogX : (COLS - width)/2; - y = DialogY ? DialogY : (LINES - height)/2; - -#ifdef HAVE_NCURSES - if (use_shadow) - draw_shadow(stdscr, y, x, height, width); -#endif - dialog = newwin(height, width, y, x); - if (dialog == NULL) { - endwin(); - fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x); - exit(1); - } - keypad(dialog, TRUE); - - draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); - - if (title != NULL) { - wattrset(dialog, title_attr); - wmove(dialog, 0, (width - strlen(title))/2 - 1); - waddch(dialog, ' '); - waddstr(dialog, title); - waddch(dialog, ' '); - } - wattrset(dialog, dialog_attr); - wmove(dialog, 1, 2); - print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE); - - if (pause) { - wattrset(dialog, border_attr); - wmove(dialog, height-3, 0); - waddch(dialog, ACS_LTEE); - for (i = 0; i < width-2; i++) - waddch(dialog, ACS_HLINE); - wattrset(dialog, dialog_attr); - waddch(dialog, ACS_RTEE); - wmove(dialog, height-2, 1); - for (i = 0; i < width-2; i++) - waddch(dialog, ' '); - display_helpline(dialog, height-1, width); - print_button(dialog, " OK ", height-2, width/2-6, TRUE); - wrefresh(dialog); - while (key != ESC && key != '\n' && key != ' ' && key != '\r') - key = wgetch(dialog); - if (key == '\r') - key = '\n'; - } - else { - key = '\n'; - wrefresh(dialog); - } - - delwin(dialog); - return (key == ESC ? -1 : 0); -} -/* End of dialog_msgbox() */ - -int -dialog_mesgbox(unsigned char *title, unsigned char *prompt, int height, int width) -/* - * Desc: basically the same as dialog_msgbox, but ... can use PGUP, PGDN and - * arrowkeys to move around the text and pause is always enabled - */ -{ - int i, j, x, y, key=0; - int theight, startline, hscroll, max_lines; - WINDOW *dialog; - - if (height < 0) - height = strheight(prompt)+2+2; - if (width < 0) { - i = strwidth(prompt); - j = ((title != NULL) ? strwidth(title) : 0); - width = MAX(i,j)+4; - } - width = MAX(width,10); - - if (width > COLS) - width = COLS; - if (height > LINES) - height = LINES; - /* center dialog box on screen */ - x = (COLS - width)/2; - y = (LINES - height)/2; - -#ifdef HAVE_NCURSES - if (use_shadow) - draw_shadow(stdscr, y, x, height, width); -#endif - dialog = newwin(height, width, y, x); - if (dialog == NULL) { - endwin(); - fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x); - exit(1); - } - keypad(dialog, TRUE); - - draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); - - if (title != NULL) { - wattrset(dialog, title_attr); - wmove(dialog, 0, (width - strlen(title))/2 - 1); - waddch(dialog, ' '); - waddstr(dialog, title); - waddch(dialog, ' '); - } - - wattrset(dialog, border_attr); - wmove(dialog, height-3, 0); - waddch(dialog, ACS_LTEE); - for (i = 0; i < width-2; i++) - waddch(dialog, ACS_HLINE); - wattrset(dialog, dialog_attr); - waddch(dialog, ACS_RTEE); - wmove(dialog, height-2, 1); - for (i = 0; i < width-2; i++) - waddch(dialog, ' '); - display_helpline(dialog, height-1, width); - print_button(dialog, " OK ", height-2, width/2-6, TRUE); - wattrset(dialog, dialog_attr); - - theight = height - 4; - startline = 0; - hscroll = 0; - max_lines = getnlines(prompt); - print_page(dialog, theight, width, prompt, startline, hscroll); - print_perc(dialog, height-3, width-9, (float) (startline+theight)/max_lines); - wmove(dialog, height-2, width/2-3); - wrefresh(dialog); - while ((key != ESC) && (key != '\n') && (key != '\r') && (key != ' ')) { - key = wgetch(dialog); - switch(key) { - case KEY_HOME: - startline=0; - hscroll=0; - break; - case KEY_END: - startline = max_lines - theight; - if (startline < 0) startline = 0; - break; - case '\020': /* ^P */ - case KEY_UP: - if (startline > 0) startline--; - break; - case '\016': /* ^N */ - case KEY_DOWN: - if (startline < max_lines - theight) startline++; - break; - case KEY_RIGHT: - hscroll+=5; - break; - case KEY_LEFT: - if (hscroll > 0) hscroll-=5; - if (hscroll < 0) hscroll =0; - break; - case KEY_PPAGE: - if (startline - height > 0) { - startline -= theight; - } else { - startline = 0; - } - break; - case KEY_NPAGE: - if (startline + theight < max_lines - theight) { - startline += theight; - } else { - startline = max_lines - theight; - if (startline < 0) startline = 0; - } - break; - case KEY_F(1): - case '?': - display_helpfile(); - break; - } - print_page(dialog, theight, width, prompt, startline, hscroll); - print_perc(dialog, height-3, width-9, (float) (startline+theight)/max_lines); - wmove(dialog, height-2, width/2-3); - wrefresh(dialog); - } - - delwin(dialog); - return (key == ESC ? -1 : 0); - -} /* dialog_mesgbox() */ - -static void -print_perc(WINDOW *win, int y, int x, float p) -/* - * Desc: print p as a percentage at the coordinates (y,x) - */ -{ - char ps[10]; - - if (p>1.0) p=1.0; - sprintf(ps, "(%3d%%)", (int) (p*100)); - wmove(win, y, x); - waddstr(win, ps); - - return; -} /* print_perc() */ - -static int -getnlines(unsigned char *buf) -/* - * Desc: count the # of lines in - */ -{ - int i = 0; - - if (*buf) - i++; - while (*buf) { - if (*buf == '\n' || *buf == '\r') - i++; - buf++; - } - return(i); -} /* getlines() */ - - -unsigned char * -getline(unsigned char *buf, int n) -/* - * Desc: return a pointer to the n'th line in or NULL if its - * not there - */ -{ - int i; - - if (n<0) { - return(NULL); - } - - i=0; - while (*buf && i - * with a scroll of hscroll from buffer - */ -{ - int i, j; - unsigned char *b; - - b = getline(buf, startline); - for (i=0; i -__FBSDID("$FreeBSD$"); - -#include -#include -#include - -void -dialog_notify(char *msg) -/* - * Desc: display an error message - */ -{ - char *tmphlp; - WINDOW *w; - - w = dupwin(newscr); - if (w == NULL) { - endwin(); - fprintf(stderr, "\ndupwin(newscr) failed, malloc memory corrupted\n"); - exit(1); - } - tmphlp = get_helpline(); - use_helpline("Press enter or space"); - dialog_mesgbox("Message", msg, -1, -1); - restore_helpline(tmphlp); - touchwin(w); - wrefresh(w); - delwin(w); - - return; - -} /* dialog_notify() */ - diff --git a/gnu/lib/libdialog/prgbox.c b/gnu/lib/libdialog/prgbox.c deleted file mode 100644 index bcafacf..0000000 --- a/gnu/lib/libdialog/prgbox.c +++ /dev/null @@ -1,152 +0,0 @@ -/* - * prgbox.c -- implements the message box and info box - * - * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include - -#include -#include -#include -#include "dialog.priv.h" - -/* - * Display a message box. Program will pause and display an "OK" button - * if the parameter 'pause' is non-zero. - */ -int dialog_prgbox(unsigned char *title, const unsigned char *line, int height, int width, int pause, int use_shell) -{ - int i, x, y, key = 0; - WINDOW *dialog; - FILE *f; - const unsigned char *name; - unsigned char *s, buf[MAX_LEN]; - int status; - - if (height < 0 || width < 0) { - endwin(); - fprintf(stderr, "\nAutosizing is impossible in dialog_prgbox().\n"); - exit(-1); - } - width = MAX(width,10); - - if (width > COLS) - width = COLS; - if (height > LINES) - height = LINES; - /* center dialog box on screen */ - x = DialogX ? DialogX : (COLS - width)/2; - y = DialogY ? DialogY : (LINES - height)/2; - -#ifdef HAVE_NCURSES - if (use_shadow) - draw_shadow(stdscr, y, x, height, width); -#endif - dialog = newwin(height, width, y, x); - if (dialog == NULL) { - endwin(); - fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x); - exit(1); - } - keypad(dialog, TRUE); - - draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); - - if (title != NULL) { - wattrset(dialog, title_attr); - wmove(dialog, 0, (width - strlen(title))/2 - 1); - waddch(dialog, ' '); - waddstr(dialog, title); - waddch(dialog, ' '); - } - wattrset(dialog, dialog_attr); - wmove(dialog, 1, 2); - - if (!use_shell) { - char cmdline[MAX_LEN]; - char *av[51], **ap = av, *val, *p; - - strcpy(cmdline, line); - p = cmdline; - while ((val = strsep(&p," \t")) != NULL) { - if (*val != '\0') - *ap++ = val; - } - *ap = NULL; - f = raw_popen(name = av[0], av, "r"); - } else - f = raw_popen(name = line, NULL, "r"); - - status = -1; - if (f == NULL) { - err: - sprintf(buf, "%s: %s\n", name, strerror(errno)); - prr: - print_autowrap(dialog, buf, height-(pause?3:1), width-2, width, 1, 2, FALSE, TRUE); - wrefresh(dialog); - } else { - while (fgets(buf, sizeof(buf), f) != NULL) { - i = strlen(buf); - if (buf[i-1] == '\n') - buf[i-1] = '\0'; - s = buf; - while ((s = strchr(s, '\t')) != NULL) - *s++ = ' '; - print_autowrap(dialog, buf, height-(pause?3:1), width-2, width, 1, 2, FALSE, TRUE); - print_autowrap(dialog, "\n", height-(pause?3:1), width-2, width, 1, 2, FALSE, FALSE); - wrefresh(dialog); - } - if ((status = raw_pclose(f)) == -1) - goto err; - if (WIFEXITED(status) && WEXITSTATUS(status) == 127) { - sprintf(buf, "%s: program not found\n", name); - goto prr; - } - } - - if (pause) { - wattrset(dialog, border_attr); - wmove(dialog, height-3, 0); - waddch(dialog, ACS_LTEE); - for (i = 0; i < width-2; i++) - waddch(dialog, ACS_HLINE); - wattrset(dialog, dialog_attr); - waddch(dialog, ACS_RTEE); - wmove(dialog, height-2, 1); - for (i = 0; i < width-2; i++) - waddch(dialog, ' '); - display_helpline(dialog, height-1, width); - print_button(dialog, " OK ", height-2, width/2-6, TRUE); - wrefresh(dialog); - while (key != ESC && key != '\n' && key != ' ' && key != '\r') - key = wgetch(dialog); - if (key == '\r') - key = '\n'; - } - else { - key = '\n'; - wrefresh(dialog); - } - - delwin(dialog); - return (status); -} -/* End of dialog_msgbox() */ diff --git a/gnu/lib/libdialog/radiolist.c b/gnu/lib/libdialog/radiolist.c deleted file mode 100644 index 4b865a6..0000000 --- a/gnu/lib/libdialog/radiolist.c +++ /dev/null @@ -1,628 +0,0 @@ -/* - * radiolist.c -- implements the radiolist box - * - * AUTHOR: Stuart Herbert - S.Herbert@sheffield.ac.uk - * (from checklist.c by Savio Lam (lam836@cs.cuhk.hk)) - * - * Substantial rennovation: 12/18/95, Jordan K. Hubbard - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include "dialog.priv.h" - - -static void print_item(WINDOW *win, char *tag, char *item, int status, int choice, int selected, dialogMenuItem *me); - -#define DREF(di, item) ((di) ? &((di)[(item)]) : NULL) - -static int list_width, check_x, item_x; - - -/* - * Display a dialog box with a list of options that can be turned on or off - */ -int -dialog_radiolist(unsigned char *title, unsigned char *prompt, int height, int width, int list_height, - int cnt, void *it, unsigned char *result) -{ - int i, j, x, y, cur_x, cur_y, old_x, old_y, box_x, box_y, key = 0, button, - choice, l, k, scroll, max_choice, *status, item_no = 0, was_on = 0; - int redraw_menu = FALSE, cursor_reset = FALSE; - int rval = 0, onlist = 1, ok_space, cancel_space; - char okButton, cancelButton; - WINDOW *dialog, *list; - unsigned char **items = NULL; - dialogMenuItem *ditems; - - /* Allocate space for storing item on/off status */ - if ((status = alloca(sizeof(int) * abs(cnt))) == NULL) { - endwin(); - fprintf(stderr, "\nCan't allocate memory in dialog_radiolist().\n"); - exit(-1); - } - -draw: - button = choice = scroll = 0; - /* Previous calling syntax, e.g. just a list of strings? */ - if (cnt >= 0) { - items = it; - ditems = NULL; - item_no = cnt; - /* Initializes status */ - for (i = 0; i < item_no; i++) { - status[i] = !strcasecmp(items[i*3 + 2], "on"); - if (status[i]) { - if (was_on) - status[i] = FALSE; - else - was_on = 1; - } - } - } - /* It's the new specification format - fake the rest of the code out */ - else { - item_no = abs(cnt); - ditems = it; - if (!items) - items = (unsigned char **)alloca((item_no * 3) * sizeof(unsigned char *)); - /* Initializes status */ - for (i = 0; i < item_no; i++) { - status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE; - if (status[i]) { - if (was_on) - status[i] = FALSE; - else - was_on = 1; - } - items[i*3] = ditems[i].prompt; - items[i*3 + 1] = ditems[i].title; - items[i*3 + 2] = status[i] ? "on" : "off"; - } - } - max_choice = MIN(list_height, item_no); - - check_x = 0; - item_x = 0; - /* Find length of longest item in order to center radiolist */ - for (i = 0; i < item_no; i++) { - l = strlen(items[i * 3]); - for (j = 0; j < item_no; j++) { - k = strlen(items[j * 3 + 1]); - check_x = MAX(check_x, l + k + 6); - } - item_x = MAX(item_x, l); - } - if (height < 0) - height = strheight(prompt) + list_height + 4 + 2; - if (width < 0) { - i = strwidth(prompt); - j = ((title != NULL) ? strwidth(title) : 0); - width = MAX(i, j); - width = MAX(width, check_x + 4) + 4; - } - width = MAX(width, 24); - - if (width > COLS) - width = COLS; - if (height > LINES) - height = LINES; - /* center dialog box on screen */ - x = DialogX ? DialogX : (COLS - width) / 2; - y = DialogY ? DialogY : (LINES - height) / 2; - -#ifdef HAVE_NCURSES - if (use_shadow) - draw_shadow(stdscr, y, x, height, width); -#endif - dialog = newwin(height, width, y, x); - if (dialog == NULL) { - endwin(); - fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height, width, y, x); - return -1; - } - keypad(dialog, TRUE); - - draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); - wattrset(dialog, border_attr); - wmove(dialog, height - 3, 0); - waddch(dialog, ACS_LTEE); - for (i = 0; i < width - 2; i++) - waddch(dialog, ACS_HLINE); - wattrset(dialog, dialog_attr); - waddch(dialog, ACS_RTEE); - wmove(dialog, height - 2, 1); - for (i = 0; i < width - 2; i++) - waddch(dialog, ' '); - - if (title != NULL) { - wattrset(dialog, title_attr); - wmove(dialog, 0, (width - strlen(title)) / 2 - 1); - waddch(dialog, ' '); - waddstr(dialog, title); - waddch(dialog, ' '); - } - wattrset(dialog, dialog_attr); - wmove(dialog, 1, 2); - print_autowrap(dialog, prompt, height - 1, width - 2, width, 1, 2, TRUE, FALSE); - - list_width = width - 6; - getyx(dialog, cur_y, cur_x); - box_y = cur_y + 1; - box_x = (width - list_width) / 2 - 1; - - /* create new window for the list */ - list = subwin(dialog, list_height, list_width, y + box_y + 1, x + box_x + 1); - if (list == NULL) { - delwin(dialog); - endwin(); - fprintf(stderr, "\nsubwin(dialog,%d,%d,%d,%d) failed, maybe wrong dims\n", list_height, list_width, - y + box_y + 1,x + box_x + 1); - return -1; - } - keypad(list, TRUE); - - /* draw a box around the list items */ - draw_box(dialog, box_y, box_x, list_height+2, list_width+2, menubox_border_attr, menubox_attr); - - check_x = (list_width - check_x) / 2; - item_x = check_x + item_x + 6; - - /* Print the list */ - for (i = 0; i < max_choice; i++) - print_item(list, items[i * 3], items[i * 3 + 1], status[i], i, i == choice, DREF(ditems, i)); - wnoutrefresh(list); - print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); - - display_helpline(dialog, height-1, width); - - x = width/ 2 - 11; - y = height - 2; - if (ditems && result) { - cancelButton = toupper(ditems[CANCEL_BUTTON].prompt[0]); - print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, - ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : FALSE); - okButton = toupper(ditems[OK_BUTTON].prompt[0]); - print_button(dialog, ditems[OK_BUTTON].prompt, y, x, - ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : TRUE); - } - else { - cancelButton = 'C'; - print_button(dialog, "Cancel", y, x + 14, FALSE); - okButton = 'O'; - print_button(dialog, " OK ", y, x, TRUE); - } - wnoutrefresh(dialog); - wmove(list, choice, check_x+1); - wrefresh(list); - - while (key != ESC) { - key = wgetch(dialog); - - /* See if its the short-cut to "OK" */ - if (toupper(key) == okButton) { - if (ditems) { - if (result && ditems[OK_BUTTON].fire) { - int st; - WINDOW *save; - - save = dupwin(newscr); - st = ditems[OK_BUTTON].fire(&ditems[OK_BUTTON]); - if (st & DITEM_RESTORE) { - touchwin(save); - wrefresh(save); - } - delwin(save); - } - } - else if (result) { - *result = '\0'; - for (i = 0; i < item_no; i++) { - if (status[i]) { - strcat(result, items[i*3]); - break; - } - } - } - rval = 0; - key = ESC; - break; - } - - /* Shortcut to cancel */ - if (toupper(key) == cancelButton) { - if (ditems && result && ditems[CANCEL_BUTTON].fire) { - int st; - WINDOW *save; - - save = dupwin(newscr); - st = ditems[CANCEL_BUTTON].fire(&ditems[CANCEL_BUTTON]); - if (st & DITEM_RESTORE) { - touchwin(save); - wrefresh(save); - } - delwin(save); - } - rval = 1; - key = ESC; - break; - } - - /* Check if key pressed matches first character of any item tag in list */ - for (i = 0; i < max_choice; i++) - if (key != ' ' && toupper(key) == toupper(items[(scroll + i) * 3][0])) - break; - - if (i < max_choice || (key >= '1' && key <= MIN('9', '0' + max_choice)) || - KEY_IS_UP(key) || KEY_IS_DOWN(key) || ((key == ' ' || key == '\r' || key == '\n') && onlist == 1)) { - - /* if moving from buttons to the list, reset and redraw buttons */ - if (!onlist) { - onlist = 1; - button = 0; - - if (ditems && result ) { - print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, - ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); - print_button(dialog, ditems[OK_BUTTON].prompt, y, x, - ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); - } - else { - print_button(dialog, "Cancel", y, x + 14, button); - print_button(dialog, " OK ", y, x, !button); - } - } - wmove(list, choice, check_x+1); - wnoutrefresh(dialog); - wrefresh(list); - - if (key >= '1' && key <= MIN('9', '0' + max_choice)) - i = key - '1'; - else if (KEY_IS_UP(key)) { - if (!choice) { - if (scroll) { - /* Scroll list down */ - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - if (list_height > 1) { - /* De-highlight current first item before scrolling down */ - print_item(list, items[scroll*3], items[scroll*3 + 1], status[scroll], 0, - FALSE, DREF(ditems, scroll)); - scrollok(list, TRUE); - wscrl(list, -1); - scrollok(list, FALSE); - } - scroll--; - print_item(list, items[scroll*3], items[scroll*3 + 1], status[scroll], 0, - TRUE, DREF(ditems, scroll)); - print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); - wmove(list, choice, check_x+1); - wnoutrefresh(dialog); - wrefresh(list); - } - continue; /* wait for another key press */ - } - else - i = choice - 1; - } - else if (KEY_IS_DOWN(key)) { - if (choice == max_choice - 1) { - if (scroll + choice < item_no - 1) { - /* Scroll list up */ - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - if (list_height > 1) { - /* De-highlight current last item before scrolling up */ - print_item(list, items[(scroll + max_choice - 1) * 3], - items[(scroll + max_choice - 1) * 3 + 1], - status[scroll + max_choice - 1], max_choice - 1, - FALSE, DREF(ditems, scroll + max_choice - 1)); - scrollok(list, TRUE); - scroll(list); - scrollok(list, FALSE); - } - scroll++; - print_item(list, items[(scroll + max_choice - 1) * 3], - items[(scroll + max_choice - 1) * 3 + 1], - status[scroll + max_choice - 1], max_choice - 1, - TRUE, DREF(ditems, scroll + max_choice - 1)); - print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); - wmove(list, choice, check_x+1); - wnoutrefresh(dialog); - wrefresh(list); - } - continue; /* wait for another key press */ - } - else - i = choice + 1; - } - else if ((key == ' ' || key == '\r' || key == '\n') && onlist) { /* Toggle item status */ - getyx(list, old_y, old_x); /* Save cursor position */ - if (status[scroll + choice]) - continue; - else if (ditems) { - if (ditems[scroll + choice].fire) { - int st; - WINDOW *save; - - save = dupwin(newscr); - st = ditems[scroll + choice].fire(&ditems[scroll + choice]); - if (st & DITEM_RESTORE) { - touchwin(save); - wrefresh(save); - } - delwin(save); - if (st & DITEM_REDRAW) { - wclear(list); - for (i = 0; i < item_no; i++) - status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE; - - for (i = 0; i < max_choice; i++) { - print_item(list, items[(scroll + i) * 3], items[(scroll + i) * 3 + 1], - status[scroll + i], i, i == choice, - DREF(ditems, scroll + i)); - } -/* wmove(list, old_y, old_x);*/ /* Restore cursor to previous position */ -/* wrefresh(list); */ - } - if (st & DITEM_LEAVE_MENU) { - /* Allow a fire action to take us out of the menu */ - key = ESC; - break; - } - else if (st & DITEM_RECREATE) { - delwin(list); - delwin(dialog); - dialog_clear(); - goto draw; - } - } - for (i = 0; i < item_no; i++) - status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE; - } - else { - for (i = 0; i < item_no; i++) - status[i] = 0; - status[scroll + choice] = TRUE; - } - for (i = 0; i < max_choice; i++) - print_item(list, items[(scroll + i) * 3], items[(scroll + i) * 3 + 1], - status[scroll + i], i, i == choice, DREF(ditems, scroll + i)); - wmove(list, choice, check_x+1); /* Restore cursor position */ - wrefresh(list); - continue; /* wait for another key press */ - } - - if (i != choice) { - /* De-highlight current item */ - print_item(list, items[(scroll + choice) * 3], items[(scroll + choice) * 3 +1], - status[scroll + choice], choice, FALSE, DREF(ditems, scroll + choice)); - /* Highlight new item */ - choice = i; - print_item(list, items[(scroll + choice) * 3], items[(scroll + choice) * 3 + 1], - status[scroll + choice], choice, TRUE, DREF(ditems, scroll + choice)); - wmove(list, choice, check_x+1); /* Restore cursor position */ - wrefresh(list); - } - continue; /* wait for another key press */ - } - - switch (key) { - case KEY_PPAGE: - if (scroll > height-4) /* can we go up? */ - scroll -= (height-4); - else - scroll = 0; - redraw_menu = TRUE; - if (!onlist) { - onlist = 1; - button = 0; - } - break; - - case KEY_NPAGE: - if (scroll + list_height >= item_no-1 - list_height) { /* can we go down a full page? */ - scroll = item_no - list_height; - if (scroll < 0) - scroll = 0; - } - else - scroll += list_height; - redraw_menu = TRUE; - if (!onlist) { - onlist = 1; - button = 0; - } - break; - - case KEY_HOME: - scroll = 0; - choice = 0; - redraw_menu = TRUE; - cursor_reset = TRUE; - onlist = 1; - break; - - case KEY_END: - scroll = item_no - list_height; - if (scroll < 0) - scroll = 0; - choice = max_choice - 1; - redraw_menu = TRUE; - cursor_reset = TRUE; - onlist = 1; - break; - - case TAB: - case KEY_BTAB: - /* move to next component */ - if (onlist) { /* on list, next is ok button */ - onlist = 0; - if (ditems && result) - ok_space = 1; - else - ok_space = 3; - wmove(dialog, y, x + ok_space); - wrefresh(dialog); - break; - } - else if (button) { /* on cancel button, next is list */ - button = 0; - onlist = 1; - redraw_menu = TRUE; - break; - } - /* on ok button, next is cancel button, same as left/right case */ - - case KEY_LEFT: - case KEY_RIGHT: - onlist = 0; - button = !button; - if (ditems && result) { - print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, - ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); - print_button(dialog, ditems[OK_BUTTON].prompt, y, x, - ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); - ok_space = 1; - cancel_space = strlen(ditems[OK_BUTTON].prompt) + 6; - } - else { - print_button(dialog, "Cancel", y, x + 14, button); - print_button(dialog, " OK ", y, x, !button); - ok_space = 3; - cancel_space = 15; - } - if (button) - wmove(dialog, y, x + cancel_space); - else - wmove(dialog, y, x + ok_space); - wrefresh(dialog); - break; - - case ' ': - case '\r': - case '\n': - if (!onlist) { - if (ditems) { - if (result && ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire) { - int st; - WINDOW *save; - - save = dupwin(newscr); - st = ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire(&ditems[button ? CANCEL_BUTTON : OK_BUTTON]); - if (st & DITEM_RESTORE) { - touchwin(save); - wrefresh(save); - } - delwin(save); - } - } - else if (result) { - *result = '\0'; - for (i = 0; i < item_no; i++) { - if (status[i]) { - strcpy(result, items[i*3]); - break; - } - } - } - rval = button; - key = ESC; - break; - } - - case ESC: - rval = -1; - break; - - case KEY_F(1): - case '?': - display_helpfile(); - break; - } - - if (redraw_menu) { - getyx(list, old_y, old_x); - wclear(list); - for (i = 0; i < max_choice; i++) - print_item(list, items[(scroll + i) * 3], items[(scroll + i) * 3 + 1], status[scroll + i], - i, i == choice, DREF(ditems, scroll + i)); - print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); - - /* redraw buttons to fix highlighting */ - if (ditems && result) { - print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, - ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); - print_button(dialog, ditems[OK_BUTTON].prompt, y, x, - ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); - } - else { - print_button(dialog, "Cancel", y, x + 14, button); - print_button(dialog, " OK ", y, x, !button); - } - wnoutrefresh(dialog); - if (cursor_reset) { - wmove(list, choice, check_x+1); - cursor_reset = FALSE; - } - else { - wmove(list, old_y, old_x); - } - wrefresh(list); - redraw_menu = FALSE; - } - } - - delwin(list); - delwin(dialog); - return rval; /* ESC pressed */ -} - -/* - * Print list item - */ -static void -print_item(WINDOW *win, char *tag, char *item, int status, int choice, int selected, dialogMenuItem *me) -{ - int i; - - /* Clear 'residue' of last item */ - wattrset(win, menubox_attr); - wmove(win, choice, 0); - for (i = 0; i < list_width; i++) - waddch(win, ' '); - wmove(win, choice, check_x); - wattrset(win, selected ? check_selected_attr : check_attr); - wprintw(win, "%c%c%c", me && me->lbra ? me->lbra : '(', - status ? me && me->mark ? me->mark : '*' : ' ', - me && me->rbra ? me->rbra : ')'); - wattrset(win, menubox_attr); - waddch(win, ' '); - wattrset(win, selected ? tag_key_selected_attr : tag_key_attr); - waddch(win, tag[0]); - wattrset(win, selected ? tag_selected_attr : tag_attr); - waddstr(win, tag + 1); - wmove(win, choice, item_x); - wattrset(win, selected ? item_selected_attr : item_attr); - waddstr(win, item); - /* If have a selection handler for this, call it */ - if (me && me->selected) { - wrefresh(win); - me->selected(me, selected); - } -} -/* End of print_item() */ diff --git a/gnu/lib/libdialog/raw_popen.c b/gnu/lib/libdialog/raw_popen.c deleted file mode 100644 index 163c09a..0000000 --- a/gnu/lib/libdialog/raw_popen.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software written by Ken Arnold and - * published in UNIX Review, Vol. 6, No. 8. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)popen.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ -#include -__FBSDID("$FreeBSD$"); - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -static struct pid { - struct pid *next; - FILE *fp; - pid_t pid; -} *pidlist; - -FILE * -raw_popen(const char *program, char * const *argv, const char *type) -{ - struct pid *cur; - FILE *iop; - int pdes[2], pid; - - if ((*type != 'r' && *type != 'w') || type[1]) - return (NULL); - - if ((cur = malloc(sizeof(struct pid))) == NULL) - return (NULL); - - if (pipe(pdes) < 0) { - (void)free(cur); - return (NULL); - } - - switch (pid = vfork()) { - case -1: /* Error. */ - (void)close(pdes[0]); - (void)close(pdes[1]); - (void)free(cur); - return (NULL); - /* NOTREACHED */ - case 0: /* Child. */ - if (*type == 'r') { - if (pdes[1] != STDOUT_FILENO) { - (void)dup2(pdes[1], STDOUT_FILENO); - (void)close(pdes[1]); - } - (void) close(pdes[0]); - } else { - if (pdes[0] != STDIN_FILENO) { - (void)dup2(pdes[0], STDIN_FILENO); - (void)close(pdes[0]); - } - (void)close(pdes[1]); - } - if (argv == NULL) - execl(_PATH_BSHELL, "sh", "-c", program, (char *)NULL); - else - execvp(program, argv); - _exit(127); - /* NOTREACHED */ - } - - /* Parent; assume fdopen can't fail. */ - if (*type == 'r') { - iop = fdopen(pdes[0], type); - (void)close(pdes[1]); - } else { - iop = fdopen(pdes[1], type); - (void)close(pdes[0]); - } - - /* Link into list of file descriptors. */ - cur->fp = iop; - cur->pid = pid; - cur->next = pidlist; - pidlist = cur; - - return (iop); -} - -/* - * pclose -- - * Pclose returns -1 if stream is not associated with a `popened' command, - * if already `pclosed', or waitpid returns an error. - */ -int -raw_pclose(FILE *iop) -{ - register struct pid *cur, *last; - int omask, pstat; - pid_t pid; - - (void)fclose(iop); - - /* Find the appropriate file pointer. */ - for (last = NULL, cur = pidlist; cur; last = cur, cur = cur->next) - if (cur->fp == iop) - break; - if (cur == NULL) - return (-1); - - /* Get the status of the process. */ - omask = sigblock(sigmask(SIGINT)|sigmask(SIGQUIT)|sigmask(SIGHUP)); - do { - pid = waitpid(cur->pid, (int *) &pstat, 0); - } while (pid == -1 && errno == EINTR); - (void)sigsetmask(omask); - - /* Remove the entry from the linked list. */ - if (last == NULL) - pidlist = cur->next; - else - last->next = cur->next; - free(cur); - - return (pid == -1 ? -1 : pstat); -} diff --git a/gnu/lib/libdialog/rc.c b/gnu/lib/libdialog/rc.c deleted file mode 100644 index 36631a6..0000000 --- a/gnu/lib/libdialog/rc.c +++ /dev/null @@ -1,375 +0,0 @@ -/* - * rc.c -- routines for processing the configuration file - * - * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include "dialog.priv.h" -#include "colors.h" -#include "rc.h" - - -static unsigned char *attr_to_str(int fg, int bg, int hl); -static int str_to_attr(unsigned char *str, int *fg, int *bg, int *hl); -static int parse_line(unsigned char *line, unsigned char **var, unsigned char **value); - - -/* - * Create the configuration file - */ -void dialog_create_rc(unsigned char *filename) -{ - int i; - FILE *rc_file; - - if ((rc_file = fopen(filename, "wt")) == NULL) { - fprintf(stderr, "\nError opening file for writing in create_rc().\n"); - exit(-1); - } - - fprintf(rc_file, "#\ -\n# Run-time configuration file for dialog\ -\n#\ -\n# Automatically generated by \"dialog --create-rc \"\ -\n#\ -\n#\ -\n# Types of values:\ -\n#\ -\n# Number - \ -\n# String - \"string\"\ -\n# Boolean - \ -\n# Attribute - (foreground,background,highlight?)\ -\n#\n\n"); - - /* Print an entry for each configuration variable */ - for (i = 0; i < VAR_COUNT; i++) { - fprintf(rc_file, "\n# %s\n", vars[i].comment); /* print comment */ - switch (vars[i].type) { - case VAL_INT: - fprintf(rc_file, "%s = %d\n", vars[i].name, *((int *) vars[i].var)); - break; - case VAL_STR: - fprintf(rc_file, "%s = \"%s\"\n", vars[i].name, (unsigned char *) vars[i].var); - break; - case VAL_BOOL: - fprintf(rc_file, "%s = %s\n", vars[i].name, *((bool *) vars[i].var) ? "ON" : "OFF"); - break; - case VAL_ATTR: - fprintf(rc_file, "%s = %s\n", vars[i].name, attr_to_str(((int *) vars[i].var)[0], ((int *) vars[i].var)[1], ((int *) vars[i].var)[2])); - break; - } - } - - fclose(rc_file); -} -/* End of create_rc() */ - - -/* - * Parse the configuration file and set up variables - */ -int parse_rc(void) -{ - int i, l = 1, parse, fg, bg, hl; - unsigned char str[MAX_LEN+1], *var, *value, *tempptr; - FILE *rc_file; - - /* - * - * At start, 'dialog' determines the settings to use as follows: - * - * a) if environment variable DIALOGRC is set, it's value determines the - * name of the configuration file. - * - * b) if the file in (a) can't be found, use the file $HOME/.dialogrc - * as the configuration file. - * - * c) if the file in (b) can't be found, use compiled in defaults. - * - */ - - if ((tempptr = getenv("DIALOGRC")) != NULL) - rc_file = fopen(tempptr, "rt"); - - if (tempptr == NULL || rc_file == NULL) { /* step (a) failed? */ - /* try step (b) */ - if ((tempptr = getenv("HOME")) == NULL) - return 0; /* step (b) failed, use default values */ - - if (tempptr[0] == '\0' || lastch(tempptr) == '/') - sprintf(str, "%s%s", tempptr, DIALOGRC); - else - sprintf(str, "%s/%s", tempptr, DIALOGRC); - - if ((rc_file = fopen(str, "rt")) == NULL) - return 0; /* step (b) failed, use default values */ - } - - /* Scan each line and set variables */ - while (fgets(str, MAX_LEN, rc_file) != NULL) { - if (lastch(str) != '\n') { /* ignore rest of file if line too long */ - fprintf(stderr, "\nParse error: line %d of configuration file too long.\n", l); - fclose(rc_file); - return -1; /* parse aborted */ - } - else { - lastch(str) = '\0'; - parse = parse_line(str, &var, &value); /* parse current line */ - - switch (parse) { - case LINE_BLANK: /* ignore blank lines and comments */ - case LINE_COMMENT: - break; - case LINE_OK: - /* search table for matching config variable name */ - for (i = 0; i < VAR_COUNT && strcmp(vars[i].name, var); i++); - - if (i == VAR_COUNT) { /* no match */ - fprintf(stderr, "\nParse error: unknown variable at line %d of configuration file.\n", l); - return -1; /* parse aborted */ - } - else { /* variable found in table, set run time variables */ - switch (vars[i].type) { - case VAL_INT: - *((int *) vars[i].var) = atoi(value); - break; - case VAL_STR: - if (!isquote(value[0]) || !isquote(lastch(value)) || strlen(value) < 2) { - fprintf(stderr, "\nParse error: string value expected at line %d of configuration file.\n", l); - return -1; /* parse aborted */ - } - else { - /* remove the (") quotes */ - value++; - lastch(value) = '\0'; - strcpy((unsigned char *) vars[i].var, value); - } - break; - case VAL_BOOL: - if (!strcasecmp(value, "ON")) - *((bool *) vars[i].var) = TRUE; - else if (!strcasecmp(value, "OFF")) - *((bool *) vars[i].var) = FALSE; - else { - fprintf(stderr, "\nParse error: boolean value expected at line %d of configuration file.\n", l); - return -1; /* parse aborted */ - } - break; - case VAL_ATTR: - if (str_to_attr(value, &fg, &bg, &hl) == -1) { - fprintf(stderr, "\nParse error: attribute value expected at line %d of configuration file.\n", l); - return -1; /* parse aborted */ - } - ((int *) vars[i].var)[0] = fg; - ((int *) vars[i].var)[1] = bg; - ((int *) vars[i].var)[2] = hl; - break; - } - } - break; - case LINE_ERROR: - fprintf(stderr, "\nParse error: syntax error at line %d of configuration file.\n", l); - return -1; /* parse aborted */ - } - } - - l++; /* next line */ - } - - fclose(rc_file); - return 0; /* parse successful */ -} -/* End of parse_rc() */ - - -/* - * Convert an attribute to a string representation like this: - * - * "(foreground,background,highlight)" - */ -static unsigned char *attr_to_str(int fg, int bg, int hl) -{ - int i; - static unsigned char str[MAX_LEN+1]; - - strcpy(str, "("); - /* foreground */ - for (i = 0; fg != color_names[i].value; i++); - strcat(str, color_names[i].name); - strcat(str, ","); - - /* background */ - for (i = 0; bg != color_names[i].value; i++); - strcat(str, color_names[i].name); - - /* highlight */ - strcat(str, hl ? ",ON)" : ",OFF)"); - - return str; -} -/* End of attr_to_str() */ - - -/* - * Extract the foreground, background and highlight values from an attribute - * represented as a string in this form: - * - * "(foreground,background,highlight)" - */ -static int str_to_attr(unsigned char *str, int *fg, int *bg, int *hl) -{ - int i = 0, j, get_fg = 1; - unsigned char tempstr[MAX_LEN+1], *part; - - if (str[0] != '(' || lastch(str) != ')') - return -1; /* invalid representation */ - - /* remove the parenthesis */ - strcpy(tempstr, str + 1); - lastch(tempstr) = '\0'; - - - /* get foreground and background */ - - while (1) { - /* skip white space before fg/bg string */ - while (whitespace(tempstr[i]) && tempstr[i] != '\0') i++; - if (tempstr[i] == '\0') - return -1; /* invalid representation */ - part = tempstr + i; /* set 'part' to start of fg/bg string */ - - /* find end of fg/bg string */ - while(!whitespace(tempstr[i]) && tempstr[i] != ',' && tempstr[i] != '\0') i++; - - if (tempstr[i] == '\0') - return -1; /* invalid representation */ - else if (whitespace(tempstr[i])) { /* not yet ',' */ - tempstr[i++] = '\0'; - - /* skip white space before ',' */ - while(whitespace(tempstr[i]) && tempstr[i] != '\0') i++; - - if (tempstr[i] != ',') - return -1; /* invalid representation */ - } - - tempstr[i++] = '\0'; /* skip the ',' */ - for (j = 0; j < COLOR_COUNT && strcasecmp(part, color_names[j].name); j++); - if (j == COLOR_COUNT) /* invalid color name */ - return -1; - if (get_fg) { - *fg = color_names[j].value; - get_fg = 0; /* next we have to get the background */ - } - else { - *bg = color_names[j].value; - break; - } - } /* got foreground and background */ - - - /* get highlight */ - - /* skip white space before highlight string */ - while (whitespace(tempstr[i]) && tempstr[i] != '\0') i++; - if (tempstr[i] == '\0') - return -1; /* invalid representation */ - part = tempstr + i; /* set 'part' to start of highlight string */ - - /* trim trailing white space from highlight string */ - i = strlen(part) - 1; - while(whitespace(part[i])) i--; - part[i+1] = '\0'; - - if (!strcasecmp(part, "ON")) - *hl = TRUE; - else if (!strcasecmp(part, "OFF")) - *hl = FALSE; - else - return -1; /* invalid highlight value */ - - return 0; -} -/* End of str_to_attr() */ - - -/* - * Parse a line in the configuration file - * - * Each line is of the form: "variable = value". On exit, 'var' will contain - * the variable name, and 'value' will contain the value string. - * - * Return values: - * - * LINE_BLANK - line is blank - * LINE_COMMENT - line is comment - * LINE_OK - line is ok - * LINE_ERROR - syntax error in line - */ -static int parse_line(unsigned char *line, unsigned char **var, unsigned char **value) -{ - int i = 0; - - /* ignore white space at beginning of line */ - while(whitespace(line[i]) && line[i] != '\0') i++; - - if (line[i] == '\0') /* line is blank */ - return LINE_BLANK; - else if (line[i] == '#') /* line is comment */ - return LINE_COMMENT; - else if (line[i] == '=') /* variables names can't strart with a '=' */ - return LINE_ERROR; - - /* set 'var' to variable name */ - *var = line + i++; /* skip to next character */ - - /* find end of variable name */ - while(!whitespace(line[i]) && line[i] != '=' && line[i] != '\0') i++; - - if (line[i] == '\0') /* syntax error */ - return LINE_ERROR; - else if (line[i] == '=') - line[i++] = '\0'; - else { - line[i++] = '\0'; - - /* skip white space before '=' */ - while(whitespace(line[i]) && line[i] != '\0') i++; - - if (line[i] != '=') /* syntax error */ - return LINE_ERROR; - else - i++; /* skip the '=' */ - } - - /* skip white space after '=' */ - while(whitespace(line[i]) && line[i] != '\0') i++; - - if (line[i] == '\0') - return LINE_ERROR; - else - *value = line + i; /* set 'value' to value string */ - - /* trim trailing white space from 'value' */ - i = strlen(*value) - 1; - while(whitespace((*value)[i])) i--; - (*value)[i+1] = '\0'; - - return LINE_OK; /* no syntax error in line */ -} -/* End of parse_line() */ diff --git a/gnu/lib/libdialog/rc.h b/gnu/lib/libdialog/rc.h deleted file mode 100644 index fc19d03..0000000 --- a/gnu/lib/libdialog/rc.h +++ /dev/null @@ -1,222 +0,0 @@ -/* - * rc.h -- declarations for configuration file processing - * - * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - -#define DIALOGRC ".dialogrc" -#define VAR_LEN 30 -#define COMMENT_LEN 70 - -/* Types of values */ -#define VAL_INT 0 -#define VAL_STR 1 -#define VAL_BOOL 2 -#define VAL_ATTR 3 - -/* Type of line in configuration file */ -#define LINE_BLANK 2 -#define LINE_COMMENT 1 -#define LINE_OK 0 -#define LINE_ERROR -1 - -/* number of configuration variables */ -#define VAR_COUNT (sizeof(vars) / sizeof(vars_st)) - -/* check if character is white space */ -#define whitespace(c) (c == ' ' || c == '\t') - -/* check if character is string quoting characters */ -#define isquote(c) (c == '"' || c == '\'') - -/* get last character of string */ -#define lastch(str) str[strlen(str)-1] - -/* - * Configuration variables - */ -typedef struct { - unsigned char name[VAR_LEN]; /* name of configuration variable as in DIALOGRC */ - void *var; /* address of actually variable to change */ - int type; /* type of value */ - unsigned char comment[COMMENT_LEN]; /* comment to put in "rc" file */ -} vars_st; - -vars_st vars[] = { - { "use_shadow", - &use_shadow, - VAL_BOOL, - "Shadow dialog boxes? This also turns on color." }, - - { "use_colors", - &use_colors, - VAL_BOOL, - "Turn color support ON or OFF" }, - - { "screen_color", - color_table[0], - VAL_ATTR, - "Screen color" }, - - { "shadow_color", - color_table[1], - VAL_ATTR, - "Shadow color" }, - - { "dialog_color", - color_table[2], - VAL_ATTR, - "Dialog box color" }, - - { "title_color", - color_table[3], - VAL_ATTR, - "Dialog box title color" }, - - { "border_color", - color_table[4], - VAL_ATTR, - "Dialog box border color" }, - - { "button_active_color", - color_table[5], - VAL_ATTR, - "Active button color" }, - - { "button_inactive_color", - color_table[6], - VAL_ATTR, - "Inactive button color" }, - - { "button_key_active_color", - color_table[7], - VAL_ATTR, - "Active button key color" }, - - { "button_key_inactive_color", - color_table[8], - VAL_ATTR, - "Inactive button key color" }, - - { "button_label_active_color", - color_table[9], - VAL_ATTR, - "Active button label color" }, - - { "button_label_inactive_color", - color_table[10], - VAL_ATTR, - "Inactive button label color" }, - - { "inputbox_color", - color_table[11], - VAL_ATTR, - "Input box color" }, - - { "inputbox_border_color", - color_table[12], - VAL_ATTR, - "Input box border color" }, - - { "searchbox_color", - color_table[13], - VAL_ATTR, - "Search box color" }, - - { "searchbox_title_color", - color_table[14], - VAL_ATTR, - "Search box title color" }, - - { "searchbox_border_color", - color_table[15], - VAL_ATTR, - "Search box border color" }, - - { "position_indicator_color", - color_table[16], - VAL_ATTR, - "File position indicator color" }, - - { "menubox_color", - color_table[17], - VAL_ATTR, - "Menu box color" }, - - { "menubox_border_color", - color_table[18], - VAL_ATTR, - "Menu box border color" }, - - { "item_color", - color_table[19], - VAL_ATTR, - "Item color" }, - - { "item_selected_color", - color_table[20], - VAL_ATTR, - "Selected item color" }, - - { "tag_color", - color_table[21], - VAL_ATTR, - "Tag color" }, - - { "tag_selected_color", - color_table[22], - VAL_ATTR, - "Selected tag color" }, - - { "tag_key_color", - color_table[23], - VAL_ATTR, - "Tag key color" }, - - { "tag_key_selected_color", - color_table[24], - VAL_ATTR, - "Selected tag key color" }, - - { "check_color", - color_table[25], - VAL_ATTR, - "Check box color" }, - - { "check_selected_color", - color_table[26], - VAL_ATTR, - "Selected check box color" }, - - { "uarrow_color", - color_table[27], - VAL_ATTR, - "Up arrow color" }, - - { "darrow_color", - color_table[28], - VAL_ATTR, - "Down arrow color" } -}; /* vars */ - - - -/* - * Routines to process configuration file - */ -int parse_rc(void); diff --git a/gnu/lib/libdialog/textbox.c b/gnu/lib/libdialog/textbox.c deleted file mode 100644 index 19a13bb..0000000 --- a/gnu/lib/libdialog/textbox.c +++ /dev/null @@ -1,699 +0,0 @@ -/* - * textbox.c -- implements the text box - * - * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include "dialog.priv.h" - - -static void back_lines(int n); -static void print_page(WINDOW *win, int height, int width); -static void print_line(WINDOW *win, int row, int width); -static unsigned char *get_line(void); -static int get_search_term(WINDOW *win, unsigned char *search_term, int height, int width); -static void print_position(WINDOW *win, int height, int width); - - -static int hscroll = 0, fd, file_size, bytes_read, begin_reached = 1, - end_reached = 0, page_length; -static unsigned char *buf, *page; - - -/* - * Display text from a file in a dialog box. - */ -int dialog_textbox(unsigned char *title, unsigned char *file, int height, int width) -{ - int i, x, y, cur_x, cur_y, fpos, key = 0, dir, temp, temp1; -#ifdef HAVE_NCURSES - int passed_end; -#endif - unsigned char search_term[MAX_LEN+1], *tempptr, *found; - WINDOW *dialog, *text; - - if (height < 0 || width < 0) { - fprintf(stderr, "\nAutosizing is impossible in dialog_textbox().\n"); - return(-1); - } - - search_term[0] = '\0'; /* no search term entered yet */ - - /* Open input file for reading */ - if ((fd = open(file, O_RDONLY)) == -1) { - fprintf(stderr, "\nCan't open input file <%s>in dialog_textbox().\n", file); - return(-1); - } - /* Get file size. Actually, 'file_size' is the real file size - 1, - since it's only the last byte offset from the beginning */ - if ((file_size = lseek(fd, 0, SEEK_END)) == -1) { - fprintf(stderr, "\nError getting file size in dialog_textbox().\n"); - return(-1); - } - /* Restore file pointer to beginning of file after getting file size */ - if (lseek(fd, 0, SEEK_SET) == -1) { - fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n"); - return(-1); - } - /* Allocate space for read buffer */ - if ((buf = malloc(BUF_SIZE+1)) == NULL) { - endwin(); - fprintf(stderr, "\nCan't allocate memory in dialog_textbox().\n"); - exit(-1); - } - if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) { - fprintf(stderr, "\nError reading file in dialog_textbox().\n"); - return(-1); - } - buf[bytes_read] = '\0'; /* mark end of valid data */ - page = buf; /* page is pointer to start of page to be displayed */ - - if (width > COLS) - width = COLS; - if (height > LINES) - height = LINES; - /* center dialog box on screen */ - x = DialogX ? DialogX : (COLS - width)/2; - y = DialogY ? DialogY : (LINES - height)/2; - -#ifdef HAVE_NCURSES - if (use_shadow) - draw_shadow(stdscr, y, x, height, width); -#endif - dialog = newwin(height, width, y, x); - if (dialog == NULL) { - endwin(); - fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x); - exit(1); - } - keypad(dialog, TRUE); - - /* Create window for text region, used for scrolling text */ -/* text = newwin(height-4, width-2, y+1, x+1); */ - text = subwin(dialog, height-4, width-2, y+1, x+1); - if (text == NULL) { - endwin(); - fprintf(stderr, "\nsubwin(dialog,%d,%d,%d,%d) failed, maybe wrong dims\n", height-4,width-2,y+1,x+1); - exit(1); - } - keypad(text, TRUE); - - draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); - - wattrset(dialog, border_attr); - wmove(dialog, height-3, 0); - waddch(dialog, ACS_LTEE); - for (i = 0; i < width-2; i++) - waddch(dialog, ACS_HLINE); - wattrset(dialog, dialog_attr); - waddch(dialog, ACS_RTEE); - wmove(dialog, height-2, 1); - for (i = 0; i < width-2; i++) - waddch(dialog, ' '); - - if (title != NULL) { - wattrset(dialog, title_attr); - wmove(dialog, 0, (width - strlen(title))/2 - 1); - waddch(dialog, ' '); - waddstr(dialog, title); - waddch(dialog, ' '); - } - display_helpline(dialog, height-1, width); - - print_button(dialog, " OK ", height-2, width/2-6, TRUE); - wnoutrefresh(dialog); - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - - /* Print first page of text */ - attr_clear(text, height-4, width-2, dialog_attr); - print_page(text, height-4, width-2); - print_position(dialog, height, width); - wmove(dialog, cur_y, cur_x); /* Restore cursor position */ - wrefresh(dialog); - - while ((key != ESC) && (key != '\n') && (key != '\r') && (key != ' ')) { - key = wgetch(dialog); - switch (key) { - case 'E': /* Exit */ - case 'e': - delwin(dialog); - free(buf); - close(fd); - return 0; - case 'g': /* First page */ - case KEY_HOME: - if (!begin_reached) { - begin_reached = 1; - /* First page not in buffer? */ - if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) { - endwin(); - fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n"); - exit(-1); - } - if (fpos > bytes_read) { /* Yes, we have to read it in */ - if (lseek(fd, 0, SEEK_SET) == -1) { - endwin(); - fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n"); - exit(-1); - } - if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) { - endwin(); - fprintf(stderr, "\nError reading file in dialog_textbox().\n"); - exit(-1); - } - buf[bytes_read] = '\0'; - } - page = buf; - print_page(text, height-4, width-2); - print_position(dialog, height, width); - wmove(dialog, cur_y, cur_x); /* Restore cursor position */ - wrefresh(dialog); - } - break; - case 'G': /* Last page */ -#ifdef HAVE_NCURSES - case KEY_END: -#endif - end_reached = 1; - /* Last page not in buffer? */ - if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) { - endwin(); - fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n"); - exit(-1); - } - if (fpos < file_size) { /* Yes, we have to read it in */ - if (lseek(fd, -BUF_SIZE, SEEK_END) == -1) { - endwin(); - fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n"); - exit(-1); - } - if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) { - endwin(); - fprintf(stderr, "\nError reading file in dialog_textbox().\n"); - exit(-1); - } - buf[bytes_read] = '\0'; - } - page = buf + bytes_read; - back_lines(height-4); - print_page(text, height-4, width-2); - print_position(dialog, height, width); - wmove(dialog, cur_y, cur_x); /* Restore cursor position */ - wrefresh(dialog); - break; - case 'K': /* Previous line */ - case 'k': - case '\020': /* ^P */ - case KEY_UP: - if (!begin_reached) { - back_lines(page_length+1); -#ifdef HAVE_NCURSES - /* We don't call print_page() here but use scrolling to ensure - faster screen update. However, 'end_reached' and 'page_length' - should still be updated, and 'page' should point to start of - next page. This is done by calling get_line() in the following - 'for' loop. */ - scrollok(text, TRUE); - wscrl(text, -1); /* Scroll text region down one line */ - scrollok(text, FALSE); - page_length = 0; - passed_end = 0; - for (i = 0; i < height-4; i++) { - if (!i) { - print_line(text, 0, width-2); /* print first line of page */ - wnoutrefresh(text); - } - else - get_line(); /* Called to update 'end_reached' and 'page' */ - if (!passed_end) - page_length++; - if (end_reached && !passed_end) - passed_end = 1; - } -#else - print_page(text, height-4, width-2); -#endif - print_position(dialog, height, width); - wmove(dialog, cur_y, cur_x); /* Restore cursor position */ - wrefresh(dialog); - } - break; - case 'B': /* Previous page */ - case 'b': - case KEY_PPAGE: - if (!begin_reached) { - back_lines(page_length + height-4); - print_page(text, height-4, width-2); - print_position(dialog, height, width); - wmove(dialog, cur_y, cur_x); /* Restore cursor position */ - wrefresh(dialog); - } - break; - case 'J': /* Next line */ - case 'j': - case '\016': /* ^N */ - case KEY_DOWN: - if (!end_reached) { - begin_reached = 0; - scrollok(text, TRUE); - scroll(text); /* Scroll text region up one line */ - scrollok(text, FALSE); - print_line(text, height-5, width-2); -#ifndef HAVE_NCURSES - wmove(text, height-5, 0); - waddch(text, ' '); - wmove(text, height-5, width-3); - waddch(text, ' '); -#endif - wnoutrefresh(text); - print_position(dialog, height, width); - wmove(dialog, cur_y, cur_x); /* Restore cursor position */ - wrefresh(dialog); - } - break; - case 'F': /* Next page */ - case 'f': - case KEY_NPAGE: - if (!end_reached) { - begin_reached = 0; - print_page(text, height-4, width-2); - print_position(dialog, height, width); - wmove(dialog, cur_y, cur_x); /* Restore cursor position */ - wrefresh(dialog); - } - break; - case '0': /* Beginning of line */ - case 'H': /* Scroll left */ - case 'h': - case KEY_LEFT: - if (hscroll > 0) { - if (key == '0') - hscroll = 0; - else - hscroll--; - /* Reprint current page to scroll horizontally */ - back_lines(page_length); - print_page(text, height-4, width-2); - wmove(dialog, cur_y, cur_x); /* Restore cursor position */ - wrefresh(dialog); - } - break; - case 'L': /* Scroll right */ - case 'l': - case KEY_RIGHT: - if (hscroll < MAX_LEN) { - hscroll++; - /* Reprint current page to scroll horizontally */ - back_lines(page_length); - print_page(text, height-4, width-2); - wmove(dialog, cur_y, cur_x); /* Restore cursor position */ - wrefresh(dialog); - } - break; - case '/': /* Forward search */ - case 'n': /* Repeat forward search */ - case '?': /* Backward search */ - case 'N': /* Repeat backward search */ - /* set search direction */ - dir = (key == '/' || key == 'n') ? 1 : 0; - if (dir ? !end_reached : !begin_reached) { - if (key == 'n' || key == 'N') { - if (search_term[0] == '\0') { /* No search term yet */ - fprintf(stderr, "\a"); /* beep */ - break; - } - } - else /* Get search term from user */ - if (get_search_term(text, search_term, height-4, width-2) == -1) { - /* ESC pressed in get_search_term(). Reprint page to clear box */ - wattrset(text, dialog_attr); - back_lines(page_length); - print_page(text, height-4, width-2); - wmove(dialog, cur_y, cur_x); /* Restore cursor position */ - wrefresh(dialog); - break; - } - /* Save variables for restoring in case search term can't be found */ - tempptr = page; - temp = begin_reached; - temp1 = end_reached; - if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) { - endwin(); - fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n"); - exit(-1); - } - fpos -= bytes_read; - /* update 'page' to point to next (previous) line before - forward (backward) searching */ - back_lines(dir ? page_length-1 : page_length+1); - found = NULL; - if (dir) /* Forward search */ - while((found = strstr(get_line(), search_term)) == NULL) { - if (end_reached) - break; - } - else /* Backward search */ - while((found = strstr(get_line(), search_term)) == NULL) { - if (begin_reached) - break; - back_lines(2); - } - if (found == NULL) { /* not found */ - fprintf(stderr, "\a"); /* beep */ - /* Restore program state to that before searching */ - if (lseek(fd, fpos, SEEK_SET) == -1) { - endwin(); - fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n"); - exit(-1); - } - if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) { - endwin(); - fprintf(stderr, "\nError reading file in dialog_textbox().\n"); - exit(-1); - } - buf[bytes_read] = '\0'; - page = tempptr; - begin_reached = temp; - end_reached = temp1; - /* move 'page' to point to start of current page in order to - re-print current page. Note that 'page' always points to - start of next page, so this is necessary */ - back_lines(page_length); - } - else /* Search term found */ - back_lines(1); - /* Reprint page */ - wattrset(text, dialog_attr); - print_page(text, height-4, width-2); - if (found != NULL) - print_position(dialog, height, width); - wmove(dialog, cur_y, cur_x); /* Restore cursor position */ - wrefresh(dialog); - } - else /* no need to find */ - fprintf(stderr, "\a"); /* beep */ - break; - case ESC: - break; - case KEY_F(1): - display_helpfile(); - break; - } - } - - delwin(dialog); - free(buf); - close(fd); - return (key == ESC ? -1 : 0); -} -/* End of dialog_textbox() */ - - -/* - * Go back 'n' lines in text file. Called by dialog_textbox(). - * 'page' will be updated to point to the desired line in 'buf'. - */ -static void back_lines(int n) -{ - int i, fpos; - - begin_reached = 0; - /* We have to distinguish between end_reached and !end_reached since at end - of file, the line is not ended by a '\n'. The code inside 'if' basically - does a '--page' to move one character backward so as to skip '\n' of the - previous line */ - if (!end_reached) { - /* Either beginning of buffer or beginning of file reached? */ - if (page == buf) { - if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) { - endwin(); - fprintf(stderr, "\nError moving file pointer in back_lines().\n"); - exit(-1); - } - if (fpos > bytes_read) { /* Not beginning of file yet */ - /* We've reached beginning of buffer, but not beginning of file yet, - so read previous part of file into buffer. Note that we only - move backward for BUF_SIZE/2 bytes, but not BUF_SIZE bytes to - avoid re-reading again in print_page() later */ - /* Really possible to move backward BUF_SIZE/2 bytes? */ - if (fpos < BUF_SIZE/2 + bytes_read) { - /* No, move less then */ - if (lseek(fd, 0, SEEK_SET) == -1) { - endwin(); - fprintf(stderr, "\nError moving file pointer in back_lines().\n"); - exit(-1); - } - page = buf + fpos - bytes_read; - } - else { /* Move backward BUF_SIZE/2 bytes */ - if (lseek(fd, -(BUF_SIZE/2 + bytes_read), SEEK_CUR) == -1) { - endwin(); - fprintf(stderr, "\nError moving file pointer in back_lines().\n"); - exit(-1); - } - page = buf + BUF_SIZE/2; - } - if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) { - endwin(); - fprintf(stderr, "\nError reading file in back_lines().\n"); - exit(-1); - } - buf[bytes_read] = '\0'; - } - else { /* Beginning of file reached */ - begin_reached = 1; - return; - } - } - if (*(--page) != '\n') { /* '--page' here */ - /* Something's wrong... */ - endwin(); - fprintf(stderr, "\nInternal error in back_lines().\n"); - exit(-1); - } - } - - /* Go back 'n' lines */ - for (i = 0; i < n; i++) - do { - if (page == buf) { - if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) { - endwin(); - fprintf(stderr, "\nError moving file pointer in back_lines().\n"); - exit(-1); - } - if (fpos > bytes_read) { - /* Really possible to move backward BUF_SIZE/2 bytes? */ - if (fpos < BUF_SIZE/2 + bytes_read) { - /* No, move less then */ - if (lseek(fd, 0, SEEK_SET) == -1) { - endwin(); - fprintf(stderr, "\nError moving file pointer in back_lines().\n"); - exit(-1); - } - page = buf + fpos - bytes_read; - } - else { /* Move backward BUF_SIZE/2 bytes */ - if (lseek(fd, -(BUF_SIZE/2 + bytes_read), SEEK_CUR) == -1) { - endwin(); - fprintf(stderr, "\nError moving file pointer in back_lines().\n"); - exit(-1); - } - page = buf + BUF_SIZE/2; - } - if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) { - endwin(); - fprintf(stderr, "\nError reading file in back_lines().\n"); - exit(-1); - } - buf[bytes_read] = '\0'; - } - else { /* Beginning of file reached */ - begin_reached = 1; - return; - } - } - } while (*(--page) != '\n'); - page++; -} -/* End of back_lines() */ - - -/* - * Print a new page of text. Called by dialog_textbox(). - */ -static void print_page(WINDOW *win, int height, int width) -{ - int i, passed_end = 0; - - page_length = 0; - for (i = 0; i < height; i++) { - print_line(win, i, width); - if (!passed_end) - page_length++; - if (end_reached && !passed_end) - passed_end = 1; - } - wnoutrefresh(win); -} -/* End of print_page() */ - - -/* - * Print a new line of text. Called by dialog_textbox() and print_page(). - */ -static void print_line(WINDOW *win, int row, int width) -{ - int i, y, x; - unsigned char *line; - - line = get_line(); - line += MIN(strlen(line),hscroll); /* Scroll horizontally */ - wmove(win, row, 0); /* move cursor to correct line */ - waddch(win,' '); -#ifdef HAVE_NCURSES - waddnstr(win, line, MIN(strlen(line),width-2)); -#else - line[MIN(strlen(line),width-2)] = '\0'; - waddstr(win, line); -#endif - - getyx(win, y, x); - /* Clear 'residue' of previous line */ - for (i = 0; i < width-x; i++) - waddch(win, ' '); -} -/* End of print_line() */ - - -/* - * Return current line of text. Called by dialog_textbox() and print_line(). - * 'page' should point to start of current line before calling, and will be - * updated to point to start of next line. - */ -static unsigned char *get_line(void) -{ - int i = 0, fpos; - static unsigned char line[MAX_LEN+1]; - - end_reached = 0; - while (*page != '\n') { - if (*page == '\0') { /* Either end of file or end of buffer reached */ - if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) { - endwin(); - fprintf(stderr, "\nError moving file pointer in get_line().\n"); - exit(-1); - } - if (fpos < file_size) { /* Not end of file yet */ - /* We've reached end of buffer, but not end of file yet, so read next - part of file into buffer */ - if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) { - endwin(); - fprintf(stderr, "\nError reading file in get_line().\n"); - exit(-1); - } - buf[bytes_read] = '\0'; - page = buf; - } - else { - if (!end_reached) - end_reached = 1; - break; - } - } - else - if (i < MAX_LEN) - line[i++] = *(page++); - else { - if (i == MAX_LEN) /* Truncate lines longer than MAX_LEN characters */ - line[i++] = '\0'; - page++; - } - } - if (i <= MAX_LEN) - line[i] = '\0'; - if (!end_reached) - page++; /* move pass '\n' */ - - return line; -} -/* End of get_line() */ - - -/* - * Display a dialog box and get the search term from user - */ -static int get_search_term(WINDOW *win, unsigned char *search_term, int height, int width) -{ - int x, y, key = 0, first, - box_height = 3, box_width = 30; - - x = (width - box_width)/2; - y = (height - box_height)/2; -#ifdef HAVE_NCURSES - if (use_shadow) - draw_shadow(win, y, x, box_height, box_width); -#endif - draw_box(win, y, x, box_height, box_width, dialog_attr, searchbox_border_attr); - wattrset(win, searchbox_title_attr); - wmove(win, y, x+box_width/2-4); - waddstr(win, " Search "); - wattrset(win, dialog_attr); - - search_term[0] = '\0'; - - first = 1; - while (key != ESC) { - key = line_edit(win, y+1, x+1, -1, box_width-2, searchbox_attr, first, search_term, 0); - first = 0; - switch (key) { - case '\n': - if (search_term[0] != '\0') - return 0; - break; - case ESC: - break; - } - } - - return -1; /* ESC pressed */ -} -/* End of get_search_term() */ - - -/* - * Print current position - */ -static void print_position(WINDOW *win, int height, int width) -{ - int fpos, percent; - - if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) { - endwin(); - fprintf(stderr, "\nError moving file pointer in print_position().\n"); - exit(-1); - } - wattrset(win, position_indicator_attr); - percent = !file_size ? 100 : ((fpos-bytes_read+page-buf)*100)/file_size; - wmove(win, height-3, width-9); - wprintw(win, "(%3d%%)", percent); -} -/* End of print_position() */ diff --git a/gnu/lib/libdialog/tree.c b/gnu/lib/libdialog/tree.c deleted file mode 100644 index ceacf05..0000000 --- a/gnu/lib/libdialog/tree.c +++ /dev/null @@ -1,1133 +0,0 @@ -/* - * tree.c -- implements the 'tree' interface element for libdialog - * - * Author: Anatoly A. Orehovsky (tolik@mpeks.tomsk.su) - * - * Copyright (c) 1997, Anatoly A. Orehovsky - * 09/28/98 - patched by Anatoly A. Orehovsky (smart_tree()) - * - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include "dialog.priv.h" -#include - -/* static utils for make tree */ -struct leaf { - unsigned char *name; /* name of leaf */ - unsigned char *branches; /* branches that going by leaf */ - unsigned char slip; /* slip of leaf*/ - int shift; /* shift relative root of tree */ -}; - -static int mk_slip(struct leaf array[], int arr_size, - int number, int shift); - -/* make tree from file - * - * filename - name of file with like find(1) output - * p_names - pointer to array of strings - * p_size - pointer to size of array - * FS - fields separator - * p_array - pointer to array of leafs - * - * return values: - * 0 - ok and names by p_names, size by p_size, array by p_array set - * -1 - memory allocation error (errno set) - */ - -static int mk_ftree(char *filename, - unsigned char ***p_names, int *p_size, unsigned char FS, - struct leaf **p_array); - -/* make tree from array - * - * names - array of strings - * size - size of array - * FS - fields separator - * p_array - pointer to array of leafs - * - * return values: - * 0 - ok and array by p_array set - * -1 - memory allocation error (errno set) - */ - -static int mk_tree(unsigned char **names, int size, unsigned char FS, - struct leaf **p_array); - -/* free memory from tree (leafs) - * - * return values: - * nothing - */ - -static void free_leafs(struct leaf *array, int size); - -/* free memory from source data for tree (names) - * - * return values: - * if 0 <= choice <= size - pointer to name from names, - * and memory for name not released (must be freed later) - * else - NULL (recomended choice -1 for it) - */ - -static unsigned char *free_names(unsigned char **names, - int size, int choice); - -/* end of static utils for make tree */ - -/* static utils for ftree */ - -/* control struct for queue */ -struct queue { - int size; /* size of queue */ - struct m_queue *first; /* begin of queue */ - struct m_queue *last; /* end of queue */ -}; - -/* queue member */ -struct m_queue { - void *pointer; /* queue member */ - struct m_queue *next; /* next queue member */ -}; - -/* init struct queue by zeros */ -static void init_queue(struct queue *queue); - -/* add pointer to queue */ -/* return - pointer or NULL if error */ -static void *p2_queue(struct queue *queue, void *pointer); - -/* get first from queue */ -/* return - pointer or NULL if queue is empty */ -static void *first_queue(struct queue *queue); - -/* make zero terminated array from queue */ -/* return - pointer to array or NULL if error */ -static void **q2arr(struct queue *queue, int depth); - -/* smart_tree (for like find(1) with -d flag output compliance) */ -/* return - not NULL or NULL if malloc error */ -static unsigned char *smart_tree(struct queue *queue, unsigned char FS, - unsigned char *current, - unsigned char *prev); - -/* end of static utils for ftree */ - -/* static utils for saved_tree */ - -/* saved values for unique tree */ -struct saved_tree { - unsigned char **names; /* names + */ - int size; /* size + */ - unsigned char FS; /* FS + */ - int height; /* height + */ - int width; /* width + */ - int menu_height; /* menu_height - unique for treebox ? */ - int ch; /* saved ch - choice */ - int sc; /* saved sc - scroll */ -}; - -/* search saved tree within queue */ -/* return - struct saved_tree * or NULL if not found */ -static struct saved_tree *search_saved_tree(struct queue *queue, - unsigned char **names, - int size, - unsigned char FS, - int height, - int width, - int menu_height); - -/* end of static utils for saved_tree */ - -static void print_item(WINDOW *win, struct leaf item, int choice, int selected); - -static void print_position(WINDOW *win, int x, int y, - int cur_pos, int size); - -static int menu_width, item_x; - -static int dialog_treemenu(unsigned char *title, unsigned char *prompt, - int height, int width, int menu_height, - int item_no, struct leaf items[], - int *result, - int *ch, int *sc); - -/* - * Display a menu for choosing among a number of options - */ -static -int dialog_treemenu(unsigned char *title, unsigned char *prompt, - int height, int width, int menu_height, - int item_no, struct leaf items[], - int *result, - int *ch, int *sc) -{ - int i, j, x, y, cur_x, cur_y, box_x, box_y, key = 0, button = 0, choice = 0, - l, scroll = 0, max_choice, redraw_menu = FALSE; - WINDOW *dialog, *menu; - - if (ch) /* restore menu item info */ - choice = *ch; - if (sc) - scroll = *sc; - - max_choice = MIN(menu_height, item_no); - - item_x = 0; - /* Find length of longest item in order to center menu */ - for (i = 0; i < item_no; i++) { - l = strlen(items[i].name) + strlen(items[i].branches) * 4 + 4; - item_x = MAX(item_x, l); - } - - if (height < 0) - height = strheight(prompt)+menu_height+4+2; - if (width < 0) { - i = strwidth(prompt); - j = ((title != NULL) ? strwidth(title) : 0); - width = MAX(i,j); - width = MAX(width,item_x+4)+4; - } - width = MAX(width,24); - - if (width > COLS) - width = COLS; - if (height > LINES) - height = LINES; - /* center dialog box on screen */ - x = (COLS - width)/2; - y = (LINES - height)/2; - -#ifdef HAVE_NCURSES - if (use_shadow) - draw_shadow(stdscr, y, x, height, width); -#endif - dialog = newwin(height, width, y, x); - if (dialog == NULL) { - endwin(); - fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x); - exit(1); - } - keypad(dialog, TRUE); - - draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); - wattrset(dialog, border_attr); - wmove(dialog, height-3, 0); - waddch(dialog, ACS_LTEE); - for (i = 0; i < width-2; i++) - waddch(dialog, ACS_HLINE); - wattrset(dialog, dialog_attr); - waddch(dialog, ACS_RTEE); - wmove(dialog, height-2, 1); - for (i = 0; i < width-2; i++) - waddch(dialog, ' '); - - if (title != NULL) { - wattrset(dialog, title_attr); - wmove(dialog, 0, (width - strlen(title))/2 - 1); - waddch(dialog, ' '); - waddstr(dialog, title); - waddch(dialog, ' '); - } - wattrset(dialog, dialog_attr); - wmove(dialog, 1, 2); - print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE); - - menu_width = width-6; - getyx(dialog, cur_y, cur_x); - box_y = cur_y + 1; - box_x = (width - menu_width)/2 - 1; - - /* create new window for the menu */ - menu = subwin(dialog, menu_height, menu_width, y + box_y + 1, x + box_x + 1); - if (menu == NULL) { - endwin(); - fprintf(stderr, "\nsubwin(dialog,%d,%d,%d,%d) failed, maybe wrong dims\n", menu_height,menu_width,y+box_y+1,x+box_x+1); - exit(1); - } - keypad(menu, TRUE); - - /* draw a box around the menu items */ - draw_box(dialog, box_y, box_x, menu_height+2, menu_width+2, menubox_border_attr, menubox_attr); - - item_x = 1; - - /* Print the menu */ - for (i = 0; i < max_choice; i++) - print_item(menu, items[(scroll+i)], i, i == choice); - wnoutrefresh(menu); - print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, item_x, cur_x, cur_y); - print_position(dialog, box_x+menu_width, box_y+menu_height, scroll+choice, item_no); - - display_helpline(dialog, height-1, width); - - x = width/2-11; - y = height-2; - print_button(dialog, "Cancel", y, x+14, FALSE); - print_button(dialog, " OK ", y, x, TRUE); - - wrefresh(dialog); - - while (key != ESC) { - key = wgetch(dialog); - /* Check if key pressed matches first character of any item tag in menu */ - - if (key == KEY_UP || key == KEY_DOWN || key == '-' || key == '+') { - if (key == KEY_UP || key == '-') { - if (!choice) { - if (scroll) { -#ifdef BROKEN_WSCRL - /* wscrl() in ncurses 1.8.1 seems to be broken, causing a segmentation - violation when scrolling windows of height = 4, so scrolling is not - used for now */ - scroll--; - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - /* Reprint menu to scroll down */ - for (i = 0; i < max_choice; i++) - print_item(menu, items[(scroll+i)], i, i == choice); - -#else - - /* Scroll menu down */ - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - if (menu_height > 1) { - /* De-highlight current first item before scrolling down */ - print_item(menu, items[scroll], 0, FALSE); - scrollok(menu, TRUE); - wscrl(menu, -1); - scrollok(menu, FALSE); - } - scroll--; - print_item(menu, items[scroll], 0, TRUE); -#endif - wnoutrefresh(menu); - print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, item_x, cur_x, cur_y); - print_position(dialog, box_x+menu_width, box_y+menu_height, scroll+choice, item_no); - wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */ - wrefresh(dialog); - } - continue; /* wait for another key press */ - } - else - i = choice - 1; - } - else if (key == KEY_DOWN || key == '+') { - if (choice == max_choice - 1) { - if (scroll+choice < item_no-1) { -#ifdef BROKEN_WSCRL - /* wscrl() in ncurses 1.8.1 seems to be broken, causing a segmentation - violation when scrolling windows of height = 4, so scrolling is not - used for now */ - scroll++; - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - /* Reprint menu to scroll up */ - for (i = 0; i < max_choice; i++) - print_item(menu, items[(scroll+i)], i, i == choice); - -#else - - /* Scroll menu up */ - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - if (menu_height > 1) { - /* De-highlight current last item before scrolling up */ - print_item(menu, items[(scroll+max_choice-1)], max_choice-1, FALSE); - scrollok(menu, TRUE); - scroll(menu); - scrollok(menu, FALSE); - } - scroll++; - print_item(menu, items[(scroll+max_choice-1)], max_choice-1, TRUE); -#endif - wnoutrefresh(menu); - print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, item_x, cur_x, cur_y); - print_position(dialog, box_x+menu_width, box_y+menu_height, scroll+choice, item_no); - wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */ - wrefresh(dialog); - } - continue; /* wait for another key press */ - } - else - i = choice + 1; - } - - if (i != choice) { - /* De-highlight current item */ - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - print_item(menu, items[(scroll+choice)], choice, FALSE); - - /* Highlight new item */ - choice = i; - print_item(menu, items[(scroll+choice)], choice, TRUE); - wnoutrefresh(menu); - print_position(dialog, box_x+menu_width, box_y+menu_height, scroll+choice, item_no); - wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */ - wrefresh(dialog); - } - continue; /* wait for another key press */ - } - - /* save info about menu item position */ - if (ch) - *ch = choice; - if (sc) - *sc = scroll; - - switch (key) { - case KEY_PPAGE: - case 'B' : - case 'b' : - if (scroll > menu_height) { /* can we go up? */ - scroll -= (menu_height); - } else { - scroll = 0; - } - redraw_menu = TRUE; - break; - case KEY_NPAGE: - case 'F' : - case 'f' : - if (scroll + menu_height >= item_no-1 - menu_height) { /* can we go down a full page? */ - scroll = item_no - menu_height; - if (scroll < 0) scroll = 0; - } else { - scroll += menu_height; - } - redraw_menu = TRUE; - break; - case KEY_HOME: - case 'g' : - scroll = 0; - choice = 0; - redraw_menu = TRUE; - break; - case KEY_END: - case 'G' : - scroll = item_no - menu_height; - if (scroll < 0) scroll = 0; - choice = max_choice - 1; - redraw_menu = TRUE; - break; - case 'O': - case 'o': - delwin(dialog); - *result = scroll+choice; - return 0; - case 'C': - case 'c': - delwin(dialog); - return 1; - case KEY_BTAB: - case TAB: - case KEY_LEFT: - case KEY_RIGHT: - if (!button) { - button = 1; /* Indicates "Cancel" button is selected */ - print_button(dialog, " OK ", y, x, FALSE); - print_button(dialog, "Cancel", y, x+14, TRUE); - } - else { - button = 0; /* Indicates "OK" button is selected */ - print_button(dialog, "Cancel", y, x+14, FALSE); - print_button(dialog, " OK ", y, x, TRUE); - } - wrefresh(dialog); - break; - case ' ': - case '\r': - case '\n': - delwin(dialog); - if (!button) - *result = scroll+choice; - return button; - case ESC: - break; - case KEY_F(1): - case '?': - display_helpfile(); - break; - } - if (redraw_menu) { - for (i = 0; i < max_choice; i++) { - print_item(menu, items[(scroll+i)], - i, i == choice); - } - wnoutrefresh(menu); - getyx(dialog, cur_y, cur_x); /* Save cursor position */ - print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, item_x, cur_x, cur_y); - print_position(dialog, box_x+menu_width, box_y+menu_height, scroll+choice, item_no); - wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */ - wrefresh(dialog); - redraw_menu = FALSE; - } - } - - delwin(dialog); - return -1; /* ESC pressed */ -} -/* End of dialog_treemenu() */ - - -/* - * Print menu item - */ -static void print_item(WINDOW *win, struct leaf item, int choice, int selected) -{ - int i, j = menu_width - 2; - char *branches = item.branches; - - /* Clear 'residue' of last item */ - wattrset(win, menubox_attr); - wmove(win, choice, 0); - for (i = 0; i < menu_width; i++) - waddch(win, ' '); - wmove(win, choice, item_x); - - while(*branches && j) - { - switch (*branches++) { - case ' ' : waddch(win, ' '); - break; - case '|' : waddch(win, ACS_VLINE); - } - - j--; - i = 3; - while(i-- && j) - { - waddch(win, ' '); - j--; - } - } - - if (j) - { - switch (item.slip) { - case '+' : waddch(win, ACS_LTEE); - break; - case '`' : waddch(win, ACS_LLCORNER); - } - j--; - } - - i = 3; - while(i-- && j) - { - waddch(win, ACS_HLINE); - j--; - } - - wattrset(win, selected ? item_selected_attr : item_attr); - if (j) - waddnstr(win, item.name, j); -} -/* End of print_item() */ - -/* - * Print current position - */ -static void print_position(WINDOW *win, int x, int y, - int cur_pos, int size) -{ - int percent; - - wattrset(win, position_indicator_attr); - percent = cur_pos == size - 1 ? 100 : (cur_pos * 100)/(size - 1); - wmove(win, y + 1, x - 6); - wprintw(win, "(%3d%%)", percent); -} -/* End of print_position() */ - -/* - * Display a tree menu from file - * - * filename - file with like find(1) output - * FS - fields separator - * title - title of dialog box - * prompt - prompt text into dialog box - * height - height of dialog box - * width - width of dialog box - * menu_height - height of menu box - * result - pointer to char array - * - * return values: - * -1 - ESC pressed - * 0 - Ok, result set (must be freed later) - * 1 - Cancel - */ - -int dialog_ftree(unsigned char *filename, unsigned char FS, - unsigned char *title, unsigned char *prompt, - int height, int width, int menu_height, - unsigned char **result) -{ - int retcode, choice, size; - struct leaf *items; - unsigned char **names; - - if (mk_ftree(filename, &names, &size, FS, &items)) - { - perror("dialog_ftree"); - end_dialog(); - exit(-1); - } - - if (!size) - { - fprintf(stderr, "\ndialog_ftree: file %s is empty\n", filename); - end_dialog(); - exit(-1); - } - - retcode = dialog_treemenu(title, prompt, height, width, menu_height, - size, items, &choice, NULL, NULL); - - free_leafs(items, size); - - if (!retcode) - *result = free_names(names, size, choice); - else - (void)free_names(names, size, -1); - - return retcode; -} -/* End of dialog_ftree() */ - -/* - * Display a tree menu from array - * - * names - array with like find(1) output - * size - size of array - * FS - fields separator - * title - title of dialog box - * prompt - prompt text into dialog box - * height - height of dialog box - * width - width of dialog box - * menu_height - height of menu box - * result - pointer to char array - * - * return values: - * -1 - ESC pressed - * 0 - Ok, result set - * 1 - Cancel - */ - -int dialog_tree(unsigned char **names, int size, unsigned char FS, - unsigned char *title, unsigned char *prompt, - int height, int width, int menu_height, - unsigned char **result) -{ - int retcode, choice; - struct leaf *items; - struct saved_tree *st; - static struct queue *q_saved_tree = NULL; - - if (!size) - { - fprintf(stderr, "\ndialog_tree: source array is empty\n"); - end_dialog(); - exit(-1); - } - - if (mk_tree(names, size, FS, &items)) - { - perror("dialog_tree"); - end_dialog(); - exit(-1); - } - -/* is tree saved ? */ - if (!(st = search_saved_tree(q_saved_tree, names, - size, FS, - height, width, menu_height))) { - if (!q_saved_tree) { - if (!(q_saved_tree = - calloc(sizeof (struct queue), 1))) { - perror("dialog_tree"); - end_dialog(); - exit(-1); - } - } - - if (!(st = calloc(sizeof (struct saved_tree), 1))) { - perror("dialog_tree"); - end_dialog(); - exit(-1); - } - - st->names = names; - st->size = size; - st->FS = FS; - st->height = height; - st->width = width; - st->menu_height = menu_height; - - if (!p2_queue(q_saved_tree, st)) { - perror("dialog_tree"); - end_dialog(); - exit(-1); - } - } - - retcode = dialog_treemenu(title, prompt, height, width, menu_height, - size, items, &choice, - &(st->ch), &(st->sc)); - - free_leafs(items, size); - - if (!retcode) - *result = names[choice]; - - return retcode; -} -/* End of dialog_tree() */ - -/* utils for ftree */ - -/* init struct queue by zeros */ -static void -init_queue(struct queue *queue) -{ - bzero((void *)queue, sizeof(struct queue)); -} - -/* add pointer to queue */ -/* return - pointer or NULL if error */ -static void * -p2_queue(struct queue *queue, void *pointer) -{ - if (!queue) - return NULL; - - if (!queue->first) - { - if (!(queue->first = queue->last = - calloc(1, sizeof(struct m_queue)))) - return NULL; - - } - else - { - if (!(queue->last->next = - calloc(1, sizeof(struct m_queue)))) - return NULL; - - queue->last = queue->last->next; - } - - queue->size++; - return queue->last->pointer = pointer; -} - -/* get first from queue */ -/* return - pointer or NULL if queue is empty */ -static void * -first_queue(struct queue *queue) -{ - void *retval; - struct m_queue *new_first; - - if (!queue || - !queue->first || - !queue->size) - return NULL; - - retval = queue->first->pointer; - new_first = queue->first->next; - free(queue->first); - queue->first = new_first; - queue->size--; - - return retval; - -} - -/* make zero terminated array from queue */ -/* return - pointer to array or NULL if error */ -static void ** -q2arr(struct queue *queue, int depth) -{ - void **mono, **end; - - if (!queue || - !queue->first || - !queue->size) - return NULL; - - /* memory allocation for array */ - if (!(mono = end = malloc(depth * sizeof(void *) + 1))) - return NULL; - - while(depth--) - { - if (!(*end++ = first_queue(queue))) - break; - } - - *end = NULL; - - return mono; - -} - -/* - * smart_tree (for like find(1) with -d flag output compliance) - * - * return values: - * NULL - malloc error - * not NULL - ok - * - */ -static -unsigned char * -smart_tree(struct queue *queue, - unsigned char FS, - unsigned char *current, - unsigned char *prev) { - unsigned char *pcurrent = current, *pprev = prev, *toqueue; - register char break_flag = 0; - - while(*pcurrent && *pprev) { - if (*pcurrent == *pprev) { - pcurrent++; - pprev++; - } - else { - break_flag = 1; - break; - } - } - - if (!*pprev || break_flag) { - if (*pcurrent == FS) { - pcurrent++; - - if ((!*prev) && (*pcurrent)) { - unsigned char tchar = *pcurrent; - - *pcurrent = '\0'; - if (!(toqueue = strdup(current))) { - *pcurrent = tchar; - return NULL; - } - if (!p2_queue(queue, toqueue)) { - *pcurrent = tchar; - return NULL; - } - *pcurrent = tchar; - } - } - - while(*pcurrent) { - if (*pcurrent == FS) { - *pcurrent = '\0'; - if (!(toqueue = strdup(current))) { - *pcurrent = FS; - return NULL; - } - if (!p2_queue(queue, toqueue)) { - *pcurrent = FS; - return NULL; - } - *pcurrent = FS; - } - pcurrent++; - } - if (!p2_queue(queue, current)) - return NULL; - } - return current; -} - -/* end of utils for ftree */ - -/* utils for make tree */ - -/* if error - return -1 */ -static -int -mk_slip(struct leaf array[], int arr_size, int number, int shift) -{ - int t_number; - int t_shift; - - if (number > arr_size - 1) - return number - 1; - - t_shift = shift; - - if (!(array[number].branches = calloc(1, t_shift + 1))) - return -1; - - (void)memset(array[number].branches, ' ', t_shift); - - t_number = number; - - while (array[number].shift < array[t_number + 1].shift) - { - t_number = mk_slip(array, arr_size, t_number + 1, t_shift + 1); - if (t_number < 0) - return -1; - if (t_number == arr_size - 1) - break; - } - - if (array[number].shift == array[t_number + 1].shift) - array[number].slip = '+'; - - if ((array[number].shift > array[t_number + 1].shift) || - t_number == arr_size - 1) - array[number].slip = '`'; - - return t_number; - -} /* mk_slip() */ - -/* make tree from file - * - * filename - name of file with like find(1) output - * p_names - pointer to array of strings - * p_size - pointer to size of array - * FS - fields separator - * p_array - pointer to array of leafs - * - * return values: - * 0 - ok and names by p_names, size by p_size, array by p_array set - * -1 - memory allocation error (errno set) - */ - -static -int -mk_ftree(char *filename, - unsigned char ***p_names, int *p_size, unsigned char FS, - struct leaf **p_array) -{ - int NR; /* number of input records */ - struct queue queue; - unsigned char *string, *sstring = ""; - unsigned char **names; - - FILE *input_file; - - if (!(input_file = fopen(filename, "r"))) - return -1; - - init_queue(&queue); - - if (!(string = malloc(BUFSIZ))) - return -1; - - /* read input file into queue */ - while(fgets(string, BUFSIZ, input_file)) - { - if (strchr(string, '\n')) - *strchr(string, '\n') = '\0'; - - if (!(string = realloc(string, strlen(string) + 1))) - return -1; - - if (!smart_tree(&queue, FS, string, sstring)) - return -1; - sstring = string; - - if (!(string = malloc(BUFSIZ))) - return -1; - } /* read input file into queue */ - - if (fclose(input_file) == EOF) - return -1; - - if (!(NR = queue.size)) - { - *p_size = 0; - return 0; - } - - /* make array from queue */ - if (!(names = (unsigned char **)q2arr(&queue, NR))) - return -1; - - *p_names = names; - *p_size = NR; - - /* make tree from array */ - return mk_tree(names, NR, FS, p_array); - -} /* mk_ftree */ - -/* make tree from array - * - * names - array of strings - * size - size of array - * FS - fields separator - * p_array - pointer to array of leafs - * - * return values: - * 0 - ok and array by p_array set - * -1 - memory allocation error (errno set) - */ - -static -int -mk_tree(unsigned char **names, int size, unsigned char FS, - struct leaf **p_array) -{ - int i; - struct leaf *array; - - /* make array of leafs */ - if (!(array = calloc(size, sizeof(struct leaf)))) - return -1; - - /* init leafs */ - for (i = 0; i < size; i++) - { - unsigned char *in_string, *name; - int shift = 0; - - in_string = name = names[i]; - while(*in_string) - { - if (*in_string == FS) { - if (!i && !*(in_string + 1)) - name = in_string; - else - { - shift++; - name = in_string + 1; - } - } - in_string++; - } - array[i].name = name; - array[i].shift = shift; - array[i].slip = '\0'; - array[i].branches = NULL; - } /* init leafs */ - - /* make slips */ - for (i = 0;i < size; i++) - { - i = mk_slip(array, size, i, 0); - if (i < 0) - return -1; - } /* make slips */ - - /* make branches */ - for (i = 1;i < size; i++) - { - unsigned char *src = array[i - 1].branches; - unsigned char *dst = array[i].branches; - - while(*src && *dst) - *dst++ = *src++; - - if (*dst) - switch (array[i - 1].slip) { - case '+' : *dst = '|'; - break; - case '`' : *dst = ' '; - } - } /* make branches */ - - *p_array = array; - return 0; - -} /* mk_tree() */ - -/* free memory from tree (leafs) - * - * return values: - * nothing - */ - -static -void -free_leafs(struct leaf *array, int size) -{ - struct leaf *p_array = array; - - while (size--) - free(array++->branches); - - free(p_array); -} /* free_leafs() */ - -/* free memory from source data for tree (names) - * - * return values: - * if 0 <= choice <= size - pointer to name from names, - * and memory for name not released (must be freed later) - * else - NULL (recomended choice -1 for it) - */ - -static -unsigned char * -free_names(unsigned char **names, int size, int choice) -{ - unsigned char *retval = NULL; - unsigned char **p_names = names; - - while (size--) - { - if (!choice--) - retval = *names++; - else - free(*names++); - } - free(p_names); - return retval; -} /* free_names() */ - -/* end of utils for make tree */ - -/* static utils for saved_tree */ - -/* search saved tree within queue */ -/* return - struct *saved_tree or NULL if not found */ -static -struct saved_tree * -search_saved_tree(struct queue *queue, unsigned char **names, int size, - unsigned char FS, - int height, int width, - int menu_height) -{ - struct m_queue *member; - struct saved_tree *retval; - - if (!queue || !names || !FS || - !height || !width || !menu_height) - return NULL; - - if (!(member = queue->first)) - return NULL; - - while (member->next) { - retval = member->pointer; - if ((names == retval->names) && - (size == retval->size) && - (FS == retval->FS) && - (height == retval->height) && - (width == retval->width) && - (menu_height == retval->menu_height)) - return retval; - member = member->next; - } - retval = member->pointer; - if ((names == retval->names) && - (size == retval->size) && - (FS == retval->FS) && - (height == retval->height) && - (width == retval->width) && - (menu_height == retval->menu_height)) - return retval; - return NULL; -} - -/* end of static utils for saved_tree */ diff --git a/gnu/lib/libdialog/ui_objects.c b/gnu/lib/libdialog/ui_objects.c deleted file mode 100644 index dde1513..0000000 --- a/gnu/lib/libdialog/ui_objects.c +++ /dev/null @@ -1,829 +0,0 @@ -/* - * Program: objects.c - * Author: Marc van Kempen - * Desc: Implementation of UI-objects: - * - String input fields - * - List selection - * - Buttons - * - * Copyright (c) 1995, Marc van Kempen - * - * All rights reserved. - * - * This software may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of this software, nor does - * the author assume any responsibility for damages incurred with - * its use. - * - */ - -#include -#include -#include -#include -#include "dialog.priv.h" -#include "ui_objects.h" - -#define ESC 27 - -/*********************************************************************** - * - * Obj routines - * - ***********************************************************************/ - -void -AddObj(ComposeObj **Obj, int objtype, void *obj) -/* - * Desc: Add the object to the list of objects - */ -{ - if (*Obj == NULL) { - /* Create the root object */ - *Obj = (ComposeObj *) malloc( sizeof(ComposeObj) ); - if (!Obj) { - printf("AddObj: Error malloc'ing ComposeObj\n"); - exit(-1); - } - (*Obj)->objtype = objtype; - (*Obj)->obj = obj; - (*Obj)->next = NULL; - (*Obj)->prev = NULL; - } else { - ComposeObj *o = *Obj; - - /* create the next object */ - while (o->next) o = (ComposeObj *) o->next; - o->next = (struct ComposeObj *) malloc( sizeof(ComposeObj) ); - if (!o->next) { - printf("AddObj: Error malloc'ing o->next\n"); - exit(-1); - } - o->next->objtype = objtype; - o->next->obj = obj; - o->next->next = NULL; - o->next->prev = o; - } - - return; -} /* AddObj() */ - -void -FreeObj(ComposeObj *Obj) -/* - * Desc: free the memory occupied by *Obj - */ -{ - ComposeObj *o = Obj; - - o = Obj; - while (o) { - o = Obj->next; - free(Obj); - Obj = o; - } - - return; -} /* FreeObj() */ - - -int -ReadObj(ComposeObj *Obj) -/* - * Desc: navigate through the different objects calling their - * respective navigation routines as necessary - * Pre: Obj != NULL - */ -{ - ComposeObj *o; - ComposeObj *last; /* the last object in the list */ - int ret; /* the return value from the selection routine */ - - /* find the last object in the list */ - last = Obj; - while (last->next) last = last->next; - - ret = 0; - o = Obj; - while ((ret != SEL_BUTTON) && (ret != SEL_ESC)) { - switch(o->objtype) { - case STRINGOBJ: - ret = SelectStringObj((StringObj *) o->obj); - break; - case LISTOBJ: - ret = SelectListObj((ListObj *) o->obj); - break; - case BUTTONOBJ: - ret = SelectButtonObj((ButtonObj *) o->obj); - break; - } - switch(ret) { - case KEY_DOWN: - case SEL_CR: - case SEL_TAB: /* move to the next object in the list */ - if (o->next != NULL) { - o = o->next; /* next object */ - } else { - o = Obj; /* beginning of the list */ - } - break; - - case KEY_UP: - case SEL_BACKTAB: /* move to the previous object in the list */ - if (o->prev != NULL) { - o = o->prev; /* previous object */ - } else { - o = last; /* end of the list */ - } - break; - - case KEY_F(1): /* display help_file */ - case '?': - display_helpfile(); - break; - } - } - - return(ret); - -} /* ReadObj() */ - - -int -PollObj(ComposeObj **Obj) -{ - ComposeObj *last; /* the last object in the list */ - ComposeObj *first; /* the first object in the list */ - int ret; /* the return value from the selection routine */ - - /* find the last object in the list */ - last = *Obj; - while (last->next) last = last->next; - - /* find the first object in the list */ - first = *Obj; - while (first->prev) first = first->prev; - - ret = 0; - switch((*Obj)->objtype) { - case STRINGOBJ: - ret = SelectStringObj((StringObj *) (*Obj)->obj); - break; - case LISTOBJ: - ret = SelectListObj((ListObj *) (*Obj)->obj); - break; - case BUTTONOBJ: - ret = SelectButtonObj((ButtonObj *) (*Obj)->obj); - break; - } - switch(ret) { - case KEY_DOWN: - case SEL_CR: - case SEL_TAB: /* move to the next object in the list */ - if ((*Obj)->next != NULL) { - *Obj = (*Obj)->next; /* next object */ - } else { - *Obj = first; /* beginning of the list */ - } - break; - - case KEY_UP: - case SEL_BACKTAB: /* move to the previous object in the list */ - if ((*Obj)->prev != NULL) { - *Obj = (*Obj)->prev; /* previous object */ - } else { - *Obj = last; /* end of the list */ - } - break; - } - - return(ret); - -} /* PollObj() */ - - -void -DelObj(ComposeObj *Obj) -/* - * Desc: Free all objects - */ -{ - ComposeObj *o; - - o = Obj; - while (Obj != NULL) { - switch(Obj->objtype) { - case STRINGOBJ: - DelStringObj((StringObj *) Obj->obj); - break; - case LISTOBJ: - DelListObj((ListObj *) Obj->obj); - break; - case BUTTONOBJ: - DelButtonObj((ButtonObj *) Obj->obj); - break; - } - Obj = Obj->next; - } - - FreeObj(o); -} /* DelObj() */ - -/*********************************************************************** - * - * StringObj routines - * - ***********************************************************************/ - -static void -outstr(WINDOW *win, char *str, int attrs) -{ - if (attrs & DITEM_NO_ECHO) { - char *cpy; - int n = strlen(str); - - cpy = alloca(n + 1); - memset(cpy, '*', n); - cpy[n] = '\0'; - waddstr(win, cpy); - } - else - waddstr(win, str); -} - -void -RefreshStringObj(StringObj *so) -/* - * Desc: redraw the object - */ -{ - char tmp[512]; - - wmove(so->win, so->y, so->x+1); - wattrset(so->win, dialog_attr); - waddstr(so->win, so->title); - - draw_box(so->win, so->y+1, so->x, 3, so->w, dialog_attr, border_attr); - wattrset(so->win, item_attr); - wmove(so->win, so->y+2, so->x+1); - if (strlen(so->s) > so->w-2) { - strncpy(tmp, (char *) so->s + strlen(so->s) - so->w + 2, so->w - 1); - outstr(so->win, tmp, so->attr_mask); - } else { - outstr(so->win, so->s, so->attr_mask); - } - - return; -} /* RefreshStringObj() */ - -StringObj * -NewStringObj(WINDOW *win, char *title, char *s, int y, int x, int w, int len) -/* - * Desc: Initialize a new stringobj and return a pointer to it. - * Draw the object on the screen at the specified coordinates - */ -{ - StringObj *so; - - /* Initialize a new object */ - so = (StringObj *) malloc( sizeof(StringObj) ); - if (!so) { - printf("NewStringObj: Error malloc'ing StringObj\n"); - exit(-1); - } - so->title = (char *) malloc( strlen(title) + 1); - if (!so->title) { - printf("NewStringObj: Error malloc'ing so->title\n"); - exit(-1); - } - strcpy(so->title, title); - so->s = s; - strcpy(so->s, s); - so->x = x; - so->y = y; - so->w = w; - so->len = len; - so->win = win; - so->attr_mask = DialogInputAttrs; /* Grossly use a global to avoid changing API */ - - /* Draw it on the screen */ - RefreshStringObj(so); - - return(so); -} /* NewStringObj() */ - -int -SelectStringObj(StringObj *so) -/* - * Desc: get input using the info in - */ -{ - int key; - char tmp[so->len+1]; - - strcpy(tmp, so->s); - key = line_edit(so->win, so->y+2, so->x+1, - so->len, so->w-2, inputbox_attr, TRUE, tmp, so->attr_mask); - if ((key == '\n') || (key == '\r') || (key == '\t') || key == (KEY_BTAB) ) { - strcpy(so->s, tmp); - } - RefreshStringObj(so); - if (key == ESC) { - return(SEL_ESC); - } - if (key == '\t') { - return(SEL_TAB); - } - if ( (key == KEY_BTAB) || (key == KEY_F(2)) ) { - return(SEL_BACKTAB); - } - if ((key == '\n') || (key == '\r')) { - return(SEL_CR); - } - return(key); -} /* SelectStringObj() */ - - -void -DelStringObj(StringObj *so) -/* - * Desc: Free the space occupied by - */ -{ - free(so->title); - free(so); - - return; -} - -/*********************************************************************** - * - * ListObj routines - * - ***********************************************************************/ - -void -DrawNames(ListObj *lo) -/* - * Desc: Just refresh the names, not the surrounding box and title - */ -{ - int i, j, h, x, y; - char tmp[MAXPATHLEN]; - - x = lo->x + 1; - y = lo->y + 2; - h = lo->h - 2; - for (i=lo->scroll; in && iscroll+h; i++) { - wmove(lo->win, y+i-lo->scroll, x); - if (lo->seld[i]) { - wattrset(lo->win, A_BOLD); - } else { - wattrset(lo->win, item_attr); - } - if (strlen(lo->name[i]) > lo->w-2) { - strncpy(tmp, lo->name[i], lo->w-2); - tmp[lo->w - 2] = 0; - waddstr(lo->win, tmp); - } else { - waddstr(lo->win, lo->name[i]); - for (j=strlen(lo->name[i]); jw-2; j++) waddstr(lo->win, " "); - } - } - wattrset(lo->win, item_attr); - while (iscroll+h) { - wmove(lo->win, y+i-lo->scroll, x); - for (j=0; jw-2; j++) waddstr(lo->win, " "); - i++; - } - - return; -} /* DrawNames() */ - -void -RefreshListObj(ListObj *lo) -/* - * Desc: redraw the list object - */ -{ - char perc[7]; - - /* setup the box */ - wmove(lo->win, lo->y, lo->x+1); - wattrset(lo->win, dialog_attr); - waddstr(lo->win, lo->title); - draw_box(lo->win, lo->y+1, lo->x, lo->h, lo->w, dialog_attr, border_attr); - - /* draw the names */ - DrawNames(lo); - - /* Draw % indication */ - sprintf(perc, "(%3d%%)", MIN(100, (int) (100 * (lo->sel+lo->h-2) / MAX(1, lo->n)))); - wmove(lo->win, lo->y + lo->h, lo->x + lo->w - 8); - wattrset(lo->win, dialog_attr); - waddstr(lo->win, perc); - - - return; -} /* RefreshListObj() */ - -ListObj * -NewListObj(WINDOW *win, char *title, char **list, char *listelt, int y, int x, - int h, int w, int n) -/* - * Desc: create a listobj, draw it on the screen and return a pointer to it. - */ -{ - ListObj *lo; - int i; - - /* Initialize a new object */ - lo = (ListObj *) malloc( sizeof(ListObj) ); - if (!lo) { - fprintf(stderr, "NewListObj: Error malloc'ing ListObj\n"); - exit(-1); - } - lo->title = (char *) malloc( strlen(title) + 1); - if (!lo->title) { - fprintf(stderr, "NewListObj: Error malloc'ing lo->title\n"); - exit(-1); - } - strcpy(lo->title, title); - lo->name = list; - if (n>0) { - lo->seld = (int *) malloc( n * sizeof(int) ); - if (!lo->seld) { - fprintf(stderr, "NewListObj: Error malloc'ing lo->seld\n"); - exit(-1); - } - for (i=0; iseld[i] = FALSE; - } - } else { - lo->seld = NULL; - } - lo->y = y; - lo->x = x; - lo->w = w; - lo->h = h; - lo->n = n; - lo->scroll = 0; - lo->sel = 0; - lo->elt = listelt; - lo->win = win; - - /* Draw the object on the screen */ - RefreshListObj(lo); - - return(lo); -} /* NewListObj() */ - -void -UpdateListObj(ListObj *lo, char **list, int n) -/* - * Desc: Update the list in the listobject with the provided list - * Pre: lo->name "has been freed" - * "(A i: 0<=in: "lo->name[i] has been freed")" - */ -{ - int i; - - if (lo->seld) { - free(lo->seld); - } - - /* Rewrite the list in the object */ - lo->name = list; - if (n>0) { - lo->seld = (int *) malloc( n * sizeof(int) ); - if (!lo->seld) { - fprintf(stderr, "UpdateListObj: Error malloc'ing lo->seld\n"); - exit(-1); - } - for (i=0; iseld[i] = FALSE; - } - } else { - lo->seld = NULL; - } - lo->n = n; - lo->scroll = 0; - lo->sel = 0; - - /* Draw the object on the screen */ - RefreshListObj(lo); - - return; -} /* UpdateListObj() */ - -int -SelectListObj(ListObj *lo) -/* - * Desc: get a listname (or listnames), TAB to move on, or ESC ESC to exit - * Pre: lo->n >= 1 - */ -{ - int key, sel_x, sel_y, quit; - char tmp[MAXPATHLEN]; - char perc[4]; - - sel_x = lo->x+1; - sel_y = lo->y + 2 + lo->sel - lo->scroll; - - if (lo->n == 0) return(SEL_TAB); - - keypad(lo->win, TRUE); - - /* Draw current selection in inverse video */ - wmove(lo->win, sel_y, sel_x); - wattrset(lo->win, item_selected_attr); - waddstr(lo->win, lo->name[lo->sel]); - - key = wgetch(lo->win); - quit = FALSE; - while ((key != '\t') && (key != '\n') && (key != '\r') - && (key != ESC) && (key != KEY_F(1)) && (key != '?') && !quit) { - /* first draw current item in normal video */ - wmove(lo->win, sel_y, sel_x); - if (lo->seld[lo->sel]) { - wattrset(lo->win, A_BOLD); - } else { - wattrset(lo->win, item_attr); - } - if (strlen(lo->name[lo->sel]) > lo->w - 2) { - strncpy(tmp, lo->name[lo->sel], lo->w - 2); - tmp[lo->w - 2] = 0; - waddstr(lo->win, tmp); - } else { - waddstr(lo->win, lo->name[lo->sel]); - } - - switch (key) { - case KEY_DOWN: - case ctrl('n'): - if (sel_y < lo->y + lo->h-1) { - if (lo->sel < lo->n-1) { - sel_y++; - lo->sel++; - } - } else { - if (lo->sel < lo->n-1) { - lo->sel++; - lo->scroll++; - DrawNames(lo); - wrefresh(lo->win); - } - } - break; - case KEY_UP: - case ctrl('p'): - if (sel_y > lo->y+2) { - if (lo->sel > 0) { - sel_y--; - lo->sel--; - } - } else { - if (lo->sel > 0) { - lo->sel--; - lo->scroll--; - DrawNames(lo); - wrefresh(lo->win); - } - } - break; - case KEY_HOME: - case ctrl('a'): - lo->sel = 0; - lo->scroll = 0; - sel_y = lo->y + 2; - DrawNames(lo); - wrefresh(lo->win); - break; - case KEY_END: - case ctrl('e'): - if (lo->n < lo->h - 3) { - lo->sel = lo->n-1; - lo->scroll = 0; - sel_y = lo->y + 2 + lo->sel - lo->scroll; - } else { - /* more than one page of list */ - lo->sel = lo->n-1; - lo->scroll = lo->n-1 - (lo->h-3); - sel_y = lo->y + 2 + lo->sel - lo->scroll; - DrawNames(lo); - wrefresh(lo->win); - } - break; - case KEY_NPAGE: - case ctrl('f'): - lo->sel += lo->h - 2; - if (lo->sel >= lo->n) lo->sel = lo->n - 1; - lo->scroll += lo->h - 2; - if (lo->scroll >= lo->n - 1) lo->scroll = lo->n - 1; - if (lo->scroll < 0) lo->scroll = 0; - sel_y = lo->y + 2 + lo->sel - lo->scroll; - DrawNames(lo); - wrefresh(lo->win); - break; - case KEY_PPAGE: - case ctrl('b'): - lo->sel -= lo->h - 2; - if (lo->sel < 0) lo->sel = 0; - lo->scroll -= lo->h - 2; - if (lo->scroll < 0) lo->scroll = 0; - sel_y = lo->y + 2 + lo->sel - lo->scroll; - DrawNames(lo); - wrefresh(lo->win); - break; - default: - quit = TRUE; - break; - } - /* Draw % indication */ - sprintf(perc, "(%3d%%)", MIN(100, (int) - (100 * (lo->sel+lo->h - 2) / MAX(1, lo->n)))); - wmove(lo->win, lo->y + lo->h, lo->x + lo->w - 8); - wattrset(lo->win, dialog_attr); - waddstr(lo->win, perc); - - /* draw current item in inverse */ - wmove(lo->win, sel_y, sel_x); - wattrset(lo->win, item_selected_attr); - if (strlen(lo->name[lo->sel]) > lo->w - 2) { - /* when printing in inverse video show the last characters in the */ - /* name that will fit in the window */ - strncpy(tmp, - lo->name[lo->sel] + strlen(lo->name[lo->sel]) - (lo->w - 2), - lo->w - 2); - tmp[lo->w - 2] = 0; - waddstr(lo->win, tmp); - } else { - waddstr(lo->win, lo->name[lo->sel]); - } - if (!quit) key = wgetch(lo->win); - } - - if (key == ESC) { - return(SEL_ESC); - } - if (key == '\t') { - return(SEL_TAB); - } - if ((key == KEY_BTAB) || (key == ctrl('b'))) { - return(SEL_BACKTAB); - } - if ((key == '\n') || (key == '\r')) { - strcpy(lo->elt, lo->name[lo->sel]); - return(SEL_CR); - } - return(key); -} /* SelectListObj() */ - -void -DelListObj(ListObj *lo) -/* - * Desc: Free the space occupied by the listobject - */ -{ - free(lo->title); - if (lo->seld != NULL) free(lo->seld); - free(lo); - - return; -} /* DelListObj() */ - -void -MarkCurrentListObj(ListObj *lo) -/* - * Desc: mark the current item for the selection list - */ -{ - lo->seld[lo->sel] = !(lo->seld[lo->sel]); - DrawNames(lo); - - return; -} /* MarkCurrentListObj() */ - -void -MarkAllListObj(ListObj *lo) -/* - * Desc: mark all items - */ -{ - int i; - - for (i=0; in; i++) { - lo->seld[i] = TRUE; - } - DrawNames(lo); - - return; -} /* MarkAllListObj() */ - -void -UnMarkAllListObj(ListObj *lo) -/* - * Desc: unmark all items - */ -{ - int i; - - for (i=0; in; i++) { - lo->seld[i] = FALSE; - } - DrawNames(lo); - - return; -} /* UnMarkAllListObj() */ - - -/*********************************************************************** - * - * ButtonObj routines - * - ***********************************************************************/ - - -void -RefreshButtonObj(ButtonObj *bo) -/* - * Desc: redraw the button - */ -{ - draw_box(bo->win, bo->y, bo->x, 3, bo->w, dialog_attr, border_attr); - print_button(bo->win, bo->title, bo->y+1, bo->x+2, FALSE); - - return; -} /* RefreshButtonObj() */ - -ButtonObj * -NewButtonObj(WINDOW *win, char *title, int *pushed, int y, int x) -/* - * Desc: Create a new button object - */ -{ - ButtonObj *bo; - - bo = (ButtonObj *) malloc( sizeof(ButtonObj) ); - - bo->win = win; - bo->title = (char *) malloc( strlen(title) + 1); - strcpy(bo->title, title); - bo->x = x; - bo->y = y; - bo->w = strlen(title) + 6; - bo->h = 3; - bo->pushed = pushed; - - RefreshButtonObj(bo); - - return(bo); -} /* NewButtonObj() */ - -int -SelectButtonObj(ButtonObj *bo) -/* - * Desc: Wait for buttonpresses or TAB's to move on, or ESC ESC - */ -{ - int key; - - print_button(bo->win, bo->title, bo->y+1, bo->x+2, TRUE); - wmove(bo->win, bo->y+1, bo->x+(bo->w/2)-1); - key = wgetch(bo->win); - print_button(bo->win, bo->title, bo->y+1, bo->x+2, FALSE); - switch(key) { - case '\t': - return(SEL_TAB); - break; - case KEY_BTAB: - case ctrl('b'): - return(SEL_BACKTAB); - case '\n': - case '\r': - *(bo->pushed) = TRUE; - return(SEL_BUTTON); - break; - case ESC: - return(SEL_ESC); - break; - default: - return(key); - break; - } -} /* SelectButtonObj() */ - -void -DelButtonObj(ButtonObj *bo) -/* - * Desc: Free the space occupied by - */ -{ - free(bo->title); - free(bo); - - return; -} /* DelButtonObj() */ diff --git a/gnu/lib/libdialog/ui_objects.h b/gnu/lib/libdialog/ui_objects.h deleted file mode 100644 index b30feb8..0000000 --- a/gnu/lib/libdialog/ui_objects.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Author: Marc van Kempen - * Desc: include file for UI-objects - * - * Copyright (c) 1995, Marc van Kempen - * - * All rights reserved. - * - * This software may be used, modified, copied, distributed, and - * sold, in both source and binary form provided that the above - * copyright and these terms are retained, verbatim, as the first - * lines of this file. Under no circumstances is the author - * responsible for the proper functioning of this software, nor does - * the author assume any responsibility for damages incurred with - * its use. - * - */ - -#include "dialog.h" -#include - -/*********************************************************************** - * - * Defines - * - ***********************************************************************/ - -#define ctrl(a) ((a) - 'a' + 1) - -/* the Object types */ -#define STRINGOBJ 1 -#define LISTOBJ 2 -#define BUTTONOBJ 3 - -/* the return signals from the selection routines */ -/* 1000 and higher should avoid conflicts with keys pressed */ -#define SEL_CR 1001 /* return was pressed */ -#define SEL_ESC 1002 /* ESC pressed */ -#define SEL_TAB 1003 /* TAB pressed */ -#define SEL_BACKTAB 1004 /* SHIFT-TAB pressed */ -#define SEL_BUTTON 1005 /* a button was pressed */ - -/*********************************************************************** - * - * Typedefs - * - ***********************************************************************/ - -typedef struct { - WINDOW *win; /* the window it's contained in */ - char *title; /* the prompt for the input field */ - char *s; /* initial value of the input field */ - int x, y, w, len; /* the (y, x) position of the upperleft */ - /* corner and the width of the display */ - /* and length of the field */ - int attr_mask; /* special attributes */ -} StringObj; - -typedef struct { - WINDOW *win; /* the windows it's contained in */ - char *title; /* the title of the list */ - char **name; /* the names of the list */ - int *seld; /* the currently selected names */ - char *elt; /* the current element in the list list[sel] */ - int x, y, w, h, n; /* dimensions of list and # of elements (n) */ - int scroll, sel; /* current position in the list */ -} ListObj; - -typedef struct { - WINDOW *win; /* the window it's contained in */ - char *title; /* title for the button */ - int x, y, w, h; /* its dimensions */ - int *pushed; /* boolean that determines wether button was pushed */ -} ButtonObj; - -typedef struct ComposeObj { - int objtype; - void *obj; - struct ComposeObj *next, *prev; -} ComposeObj; - -/********************************************************************** - * - * Prototypes - * - **********************************************************************/ - -void RefreshStringObj(StringObj *so); -StringObj *NewStringObj(WINDOW *win, char *title, char *s, - int y, int x, int w, int len); -int SelectStringObj(StringObj *so); -void DelStringObj(StringObj *so); - -void RefreshListObj(ListObj *lo); -ListObj *NewListObj(WINDOW *win, char *title, char **list, - char *listelt, int y, int x, int h, int w, int n); -void UpdateListObj(ListObj *lo, char **list, int n); -int SelectListObj(ListObj *lo); -void DelListObj(ListObj *obj); -void MarkCurrentListObj(ListObj *lo); -void MarkAllListObj(ListObj *lo); -void UnMarkAllListObj(ListObj *lo); - -void RefreshButtonObj(ButtonObj *bo); -ButtonObj *NewButtonObj(WINDOW *win, char *title, int *pushed, - int y, int x); -int SelectButtonObj(ButtonObj *bo); -void DelButtonObj(ButtonObj *bo); -void AddObj(ComposeObj **Obj, int objtype, void *obj); -void FreeObj(ComposeObj *Obj); -int ReadObj(ComposeObj *Obj); -int PollObj(ComposeObj **Obj); -void DelObj(ComposeObj *Obj); - diff --git a/gnu/lib/libdialog/yesno.c b/gnu/lib/libdialog/yesno.c deleted file mode 100644 index 24eb41a..0000000 --- a/gnu/lib/libdialog/yesno.c +++ /dev/null @@ -1,169 +0,0 @@ -/* - * yesno.c -- implements the yes/no box - * - * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include "dialog.priv.h" - -/* Actual work function */ -static int dialog_yesno_proc(unsigned char *title, unsigned char *prompt, - int height, int width, int yesdefault); - -/* - * Display a dialog box with two buttons - Yes and No - */ -int -dialog_yesno(unsigned char *title, unsigned char *prompt, int height, int width) -{ - return dialog_yesno_proc(title, prompt, height, width, TRUE); -} - -/* - * Display a dialog box with two buttons - No and Yes - */ -int -dialog_noyes(unsigned char *title, unsigned char *prompt, int height, int width) -{ - return dialog_yesno_proc(title, prompt, height, width, FALSE); -} - -static int -dialog_yesno_proc(unsigned char *title, unsigned char *prompt, int height, int width, int yesdefault) -{ - int i, j, x, y, key, button; - WINDOW *dialog; - char *tmphlp; - - /* disable helpline */ - tmphlp = get_helpline(); - use_helpline(NULL); - - if (height < 0) - height = strheight(prompt)+4; - if (width < 0) { - i = strwidth(prompt); - j = ((title != NULL) ? strwidth(title) : 0); - width = MAX(i,j)+4; - } - width = MAX(width,23); - - if (width > COLS) - width = COLS; - if (height > LINES) - height = LINES; - /* center dialog box on screen */ - x = DialogX ? DialogX : (COLS - width)/2; - y = DialogY ? DialogY : (LINES - height)/2; - -#ifdef HAVE_NCURSES - if (use_shadow) - draw_shadow(stdscr, y, x, height, width); -#endif - dialog = newwin(height, width, y, x); - if (dialog == NULL) { - endwin(); - fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x); - exit(1); - } - keypad(dialog, TRUE); - - draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); - wattrset(dialog, border_attr); - wmove(dialog, height-3, 0); - waddch(dialog, ACS_LTEE); - for (i = 0; i < width-2; i++) - waddch(dialog, ACS_HLINE); - wattrset(dialog, dialog_attr); - waddch(dialog, ACS_RTEE); - wmove(dialog, height-2, 1); - for (i = 0; i < width-2; i++) - waddch(dialog, ' '); - - if (title != NULL) { - wattrset(dialog, title_attr); - wmove(dialog, 0, (width - strlen(title))/2 - 1); - waddch(dialog, ' '); - waddstr(dialog, title); - waddch(dialog, ' '); - } - wattrset(dialog, dialog_attr); - wmove(dialog, 1, 2); - print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE); - - display_helpline(dialog, height-1, width); - - x = width/2-10; - y = height-2; - - /* preset button 0 or 1 for YES or NO as the default */ - key = 0; - button = !yesdefault; - while (key != ESC) { - print_button(dialog, " No ", y, x+13, button); - print_button(dialog, " Yes " , y, x, !button); - if (button) - wmove(dialog, y, x+16); - else - wmove(dialog, y, x+2); - wrefresh(dialog); - - key = wgetch(dialog); - switch (key) { - case 'Y': - case 'y': - delwin(dialog); - restore_helpline(tmphlp); - return 0; - case 'N': - case 'n': - delwin(dialog); - restore_helpline(tmphlp); - return 1; - case KEY_BTAB: - case TAB: - case KEY_UP: - case KEY_DOWN: - case KEY_LEFT: - case KEY_RIGHT: - button = !button; - /* redrawn at the loop's entry */ - break; - case ' ': - case '\r': - case '\n': - delwin(dialog); - restore_helpline(tmphlp); - return button; - case ESC: - break; - case KEY_F(1): - case '?': - display_helpfile(); - break; - } - } - - delwin(dialog); - restore_helpline(tmphlp); - return -1; /* ESC pressed */ -} -/* End of dialog_yesno() */ diff --git a/gnu/lib/libodialog/CHANGES b/gnu/lib/libodialog/CHANGES new file mode 100644 index 0000000..1467a0e --- /dev/null +++ b/gnu/lib/libodialog/CHANGES @@ -0,0 +1,9 @@ +- Added two variables to call to dialog_menu() to save the position + in the menu when choosing a menu-option. + +- Added dialog_fselect(), implements a fileselector dialog +- Added ui-interface objects: Stringobject, Listobject and Buttonobject. + The fileselector dialog was built using these objects. +- changed dialog_menu to use PGUP and PGDN +- Added dialog_mesgbox, which display text given in a char buffer. +- diff --git a/gnu/lib/libodialog/COPYING b/gnu/lib/libodialog/COPYING new file mode 100644 index 0000000..a43ea21 --- /dev/null +++ b/gnu/lib/libodialog/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/gnu/lib/libodialog/Makefile b/gnu/lib/libodialog/Makefile new file mode 100644 index 0000000..b03bb4a --- /dev/null +++ b/gnu/lib/libodialog/Makefile @@ -0,0 +1,24 @@ +# Makefile for libdialog +# $FreeBSD$ + +.include + +LIB= odialog +#MAN= NOMAN + +SHLIB_MAJOR= 7 +SRCS= kernel.c rc.c checklist.c inputbox.c menubox.c msgbox.c \ + lineedit.c radiolist.c textbox.c yesno.c prgbox.c raw_popen.c \ + fselect.c ui_objects.c dir.c notify.c help.c gauge.c tree.c + +CFLAGS+= -I${.CURDIR} -Wall -Wstrict-prototypes -DLOCALE + +DPADD= ${LIBNCURSES} +LDADD= -lncurses + +.if ${MK_HTML} != "no" +FILES= ${EXAMPLES:C;^;${.CURDIR}/TESTS/;} +FILESDIR= ${SHAREDIR}/examples/libdialog +.endif + +.include diff --git a/gnu/lib/libodialog/README b/gnu/lib/libodialog/README new file mode 100644 index 0000000..e5e6d56 --- /dev/null +++ b/gnu/lib/libodialog/README @@ -0,0 +1,8 @@ +This library was split out from the `dialog' program for use +in C programs. For a list of interface functions, see dialog.h. +For usage examples, see the `dialog' program sources in +/usr/src/gnu/usr.bin/dialog. + +You can additionally use any ncurses functions after init_dialog(). + + Ache. diff --git a/gnu/lib/libodialog/TESTS/Makefile b/gnu/lib/libodialog/TESTS/Makefile new file mode 100644 index 0000000..65e3d71 --- /dev/null +++ b/gnu/lib/libodialog/TESTS/Makefile @@ -0,0 +1,20 @@ +# Really quick and evil Makefile for building all the tests. I wish that +# bmake was friendlier to the concept of multiple progs/libs in the same +# directory. +# +# $FreeBSD$ + +PROGS= msg yesno prgbox gauge dselect fselect text menu1 menu2 menu3 \ + input1 input2 check1 check2 check3 radio1 radio2 radio3 \ + ftree1 ftree2 tree + +WARNS?= 2 +CFLAGS+= -Wall -Wstrict-prototypes +LDFLAGS+= -ldialog + +all: ${PROGS} + +clean: + rm -f ${PROGS} + +.include diff --git a/gnu/lib/libodialog/TESTS/check1.c b/gnu/lib/libodialog/TESTS/check1.c new file mode 100644 index 0000000..a2bec62 --- /dev/null +++ b/gnu/lib/libodialog/TESTS/check1.c @@ -0,0 +1,83 @@ +/* + * small test-driver for new dialog functionality + * + * Copyright (c) 1995, Jordan Hubbard + * + * All rights reserved. + * + * This source code may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of the software nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Hook functions */ + +static int +getBool(dialogMenuItem *self) +{ + if (self->data && *((int *)self->data)) + return TRUE; + return FALSE; +} + +static int +setBool(dialogMenuItem *self) +{ + if (self->data) { + *((int *)self->data) = !*((int *)self->data); + return DITEM_SUCCESS; + } + return DITEM_FAILURE; +} + +static int german_book, italian_book, slang_book; + +static int +clearBooks(dialogMenuItem *self) +{ + german_book = italian_book = slang_book = FALSE; + return DITEM_SUCCESS | DITEM_REDRAW; +} + +/* menu2 - A more advanced way of using checked and fire hooks to manipulate the backing-variables directly */ +/* prompt title checked fire sel data */ +static dialogMenuItem menu2[] = { + { "German", "Buy book on learning German", getBool, setBool, NULL, &german_book}, + { "Italian", "Buy book on learning Italian", getBool, setBool, NULL, &italian_book }, + { "Slang", "Buy book on commonly used insults", getBool, setBool, NULL, &slang_book }, + { "Clear", "Clear book list", NULL, clearBooks, NULL, NULL, ' ', ' ', ' ' }, +}; + +/* End of hook functions */ + +/* Kick it off, James! */ +int +main(int argc, char **argv) +{ + int retval; + + init_dialog(); + + retval = dialog_checklist("this is a dialog_checklist() in action, test #1", + "this checklist menu shows off some of the straight-forward features\n" + "of the new menu system's check & fire dispatch hooks", -1, -1, 4, -4, menu2, NULL); + dialog_clear(); + fprintf(stderr, "returned value for dialog_checklist was %d (%d %d %d)\n", retval, german_book, italian_book, slang_book); + + end_dialog(); + return 0; +} diff --git a/gnu/lib/libodialog/TESTS/check2.c b/gnu/lib/libodialog/TESTS/check2.c new file mode 100644 index 0000000..3608261 --- /dev/null +++ b/gnu/lib/libodialog/TESTS/check2.c @@ -0,0 +1,105 @@ +/* + * small test-driver for new dialog functionality + * + * Copyright (c) 1995, Jordan Hubbard + * + * All rights reserved. + * + * This source code may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of the software nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Hook functions */ + +static int +getBool(dialogMenuItem *self) +{ + if (self->data && *((int *)self->data)) + return TRUE; + return FALSE; +} + +static int +setBool(dialogMenuItem *self) +{ + if (self->data) { + *((int *)self->data) = !*((int *)self->data); + return DITEM_SUCCESS; + } + return DITEM_FAILURE; +} + +static int german_book, italian_book, slang_book; + +static int +clearBooks(dialogMenuItem *self) +{ + german_book = italian_book = slang_book = FALSE; + return DITEM_SUCCESS | DITEM_REDRAW; +} + +static int +buyBooks(dialogMenuItem *self) +{ + char foo[256]; + + if (german_book || italian_book || slang_book) { + strcpy(foo, "Ok, you're buying books on"); + if (german_book) + strcat(foo, " german"); + if (italian_book) + strcat(foo, " italian"); + if (slang_book) + strcat(foo, " slang"); + } + else + strcpy(foo, "You're not buying any books?"); + dialog_mesgbox("This is a direct callback for the `Buy' button", foo, -1, -1); + return DITEM_SUCCESS; +} + +/* menu3 - Look mom! We can finally use our own OK and Cancel buttons! */ +/* prompt title checked fire sel data */ +static dialogMenuItem menu3[] = { + { "Buy!", NULL, NULL, buyBooks }, /* New "OK" button */ + { "No Way!", NULL, NULL, NULL }, /* New "Cancel" button */ + { "German", "Buy books on learning German", getBool, setBool, NULL, &german_book }, + { "Italian", "Buy books on learning Italian", getBool, setBool, NULL, &italian_book }, + { "Slang", "Buy books on commonly used insults", getBool, setBool, NULL, &slang_book }, + { "Clear", "Clear book list", NULL, clearBooks, NULL, NULL, ' ', ' ', ' ' }, +}; + +/* End of hook functions */ + +/* Kick it off, James! */ +int +main(int argc, char **argv) +{ + int retval; + + init_dialog(); + + retval = dialog_checklist("this is dialog_checklist() in action, test #2", + "Same as before, but now we relabel the buttons and override the OK action.", + -1, -1, 4, -4, menu3 + 2, (char *)TRUE); + dialog_clear(); + fprintf(stderr, "returned value for dialog_checklist was %d\n", retval); + + end_dialog(); + return 0; +} diff --git a/gnu/lib/libodialog/TESTS/check3.c b/gnu/lib/libodialog/TESTS/check3.c new file mode 100644 index 0000000..f117bd6 --- /dev/null +++ b/gnu/lib/libodialog/TESTS/check3.c @@ -0,0 +1,92 @@ +/* + * small test-driver for new dialog functionality + * + * Copyright (c) 1995, Jordan Hubbard + * + * All rights reserved. + * + * This source code may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of the software nor does + * the author assume any responsibility for damages incurred with + * its use. + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +/* Hook functions */ + +static int +getBool(dialogMenuItem *self) +{ + if (self->data && *((int *)self->data)) + return TRUE; + return FALSE; +} + +static int +setBool(dialogMenuItem *self) +{ + if (self->data) { + *((int *)self->data) = !*((int *)self->data); + return DITEM_SUCCESS; + } + return DITEM_FAILURE; +} + +static int german_book, italian_book, slang_book; +static int spending; + +static int +check(dialogMenuItem *self) +{ + return ((int)(intptr_t)self->data == spending); +} + +static int +spend(dialogMenuItem *self) +{ + spending = (int)(intptr_t)self->data; + return DITEM_SUCCESS | DITEM_REDRAW; +} + +/* menu4 - Show off a simulated compound menu (group at top is checklist, group at bottom radio) */ +/* prompt title checked fire sel, data lbra mark rbra */ +static dialogMenuItem menu4[] = { + { "German", "Buy books on learning German", getBool, setBool, NULL, &german_book }, + { "Italian","Buy books on learning Italian", getBool, setBool, NULL, &italian_book }, + { "Slang", "Buy books on commonly used insults", getBool, setBool, NULL, &slang_book }, + { "-----", "----------------------------------", NULL, NULL, NULL, NULL, ' ', ' ', ' ' }, + { "1000", "Spend $1,000", check, spend, NULL, (void *)1000, '(', '*', ')' }, + { "500", "Spend $500", check, spend, NULL, (void *)500, '(', '*', ')' }, + { "100", "Spend $100", check, spend, NULL, (void *)100, '(', '*', ')' }, +}; + +/* End of hook functions */ + +/* Kick it off, James! */ +int +main(int argc, char **argv) +{ + int retval; + + init_dialog(); + + + retval = dialog_checklist("this is dialog_checklist() in action, test #3", + "Now we show off some of the button 'styles' one can create.", + -1, -1, 7, -7, menu4, NULL); + dialog_clear(); + fprintf(stderr, "spent $%d on %s%s%s books\n", spending, german_book ? " german" : "", + italian_book ? " italian" : "", slang_book ? " slang" : ""); + + end_dialog(); + return 0; +} diff --git a/gnu/lib/libodialog/TESTS/dselect.c b/gnu/lib/libodialog/TESTS/dselect.c new file mode 100644 index 0000000..1110379 --- /dev/null +++ b/gnu/lib/libodialog/TESTS/dselect.c @@ -0,0 +1,41 @@ +/* + * small test-driver for new dialog functionality + * + * Copyright (c) 1995, Jordan Hubbard + * + * All rights reserved. + * + * This source code may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of the software nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Kick it off, James! */ +int +main(int argc, char **argv) +{ + int retval; + + init_dialog(); + + retval = dialog_dselect(".", "*"); + dialog_clear(); + fprintf(stderr, "returned value for dialog_dselect was %d\n", retval); + + end_dialog(); + return 0; +} diff --git a/gnu/lib/libodialog/TESTS/fselect.c b/gnu/lib/libodialog/TESTS/fselect.c new file mode 100644 index 0000000..6cefaf3 --- /dev/null +++ b/gnu/lib/libodialog/TESTS/fselect.c @@ -0,0 +1,44 @@ +/* + * small test-driver for new dialog functionality + * + * Copyright (c) 1995, Jordan Hubbard + * + * All rights reserved. + * + * This source code may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of the software nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Kick it off, James! */ +int +main(int argc, char **argv) +{ + char *retval; + + init_dialog(); + + retval = dialog_fselect(".", "*.[ch]"); + dialog_clear(); + if (retval) + fprintf(stderr, "returned value for dialog_fselect was %s\n", retval); + else + fprintf(stderr, "returned value for dialog_fselect was NULL\n"); + + end_dialog(); + return 0; +} diff --git a/gnu/lib/libodialog/TESTS/ftree1.c b/gnu/lib/libodialog/TESTS/ftree1.c new file mode 100644 index 0000000..f21e0e5 --- /dev/null +++ b/gnu/lib/libodialog/TESTS/ftree1.c @@ -0,0 +1,45 @@ +/* + * ftree1.c + * + * small test-driver for new dialog functionality + * + * Copyright (c) 1998, Anatoly A. Orehovsky + * + * file ./ftree1.test with xterm widget tree from + * direct editres(1) dump needed !!! + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +int +main(int argc, char **argv) +{ + int retval; + unsigned char *tresult; + + init_dialog(); + retval = dialog_ftree("ftree1.test", '\t', + "ftree dialog box example", + "xterm widget tree from direct editres(1) dump", + -1, -1, 15, + &tresult); + + dialog_update(); + + dialog_clear(); + + end_dialog(); + + if (!retval) + { + puts(tresult); + free(tresult); + } + + exit(retval); +} diff --git a/gnu/lib/libodialog/TESTS/ftree1.test b/gnu/lib/libodialog/TESTS/ftree1.test new file mode 100644 index 0000000..4a8f0fa --- /dev/null +++ b/gnu/lib/libodialog/TESTS/ftree1.test @@ -0,0 +1,73 @@ +XTerm login + VendorShellExt shellext + VT100 vt100 + SimpleMenu fontMenu + SmeBSB menuLabel + SmeBSB fontdefault + SmeBSB font1 + SmeBSB font2 + SmeBSB font3 + SmeBSB font4 + SmeBSB font5 + SmeBSB font6 + SmeBSB fontescape + SmeBSB fontsel + SimpleMenu mainMenu + SmeBSB menuLabel + SmeBSB securekbd + SmeBSB allowsends + SmeBSB redraw + SmeLine line1 + SmeBSB 8-bit control + SmeBSB sun function-keys + SmeLine line2 + SmeBSB suspend + SmeBSB continue + SmeBSB interrupt + SmeBSB hangup + SmeBSB terminate + SmeBSB kill + SmeLine line3 + SmeBSB quit + SimpleMenu vtMenu + SmeBSB menuLabel + SmeBSB scrollbar + SmeBSB jumpscroll + SmeBSB reversevideo + SmeBSB autowrap + SmeBSB reversewrap + SmeBSB autolinefeed + SmeBSB appcursor + SmeBSB appkeypad + SmeBSB scrollkey + SmeBSB scrollttyoutput + SmeBSB allow132 + SmeBSB cursesemul + SmeBSB visualbell + SmeBSB marginbell + SmeBSB altscreen + SmeLine line1 + SmeBSB softreset + SmeBSB hardreset + SmeBSB clearsavedlines + SmeLine line2 + SmeBSB tekshow + SmeBSB tekmode + SmeBSB vthide + TopLevelShell tektronix + VendorShellExt shellext + Tek4014 tek4014 + SimpleMenu tekMenu + SmeBSB menuLabel + SmeBSB tektextlarge + SmeBSB tektext2 + SmeBSB tektext3 + SmeBSB tektextsmall + SmeLine line1 + SmeBSB tekpage + SmeBSB tekreset + SmeBSB tekcopy + SmeLine line2 + SmeBSB vtshow + SmeBSB vtmode + SmeBSB tekhide diff --git a/gnu/lib/libodialog/TESTS/ftree2.c b/gnu/lib/libodialog/TESTS/ftree2.c new file mode 100644 index 0000000..aa4663a --- /dev/null +++ b/gnu/lib/libodialog/TESTS/ftree2.c @@ -0,0 +1,47 @@ +/* + * ftree2.c + * + * small test-driver for new dialog functionality + * + * Copyright (c) 1998, Anatoly A. Orehovsky + * + * file ./ftree2.test with xterm widget tree from + * preprocess editres(1) dump needed !!! + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +int +main(int argc, char **argv) +{ + int retval; + unsigned char *tresult; + + init_dialog(); + use_helpfile("ftree2.test"); + use_helpline("Press Arrows, Tab, Enter or F1"); + retval = dialog_ftree("ftree2.test", '\t', + "ftree dialog box example", + "xterm widget tree from preprocess editres(1) dump", + -1, -1, 15, + &tresult); + + dialog_update(); + + dialog_clear(); + + end_dialog(); + + if (!retval) + { + puts(tresult); + free(tresult); + } + + exit(retval); +} diff --git a/gnu/lib/libodialog/TESTS/ftree2.test b/gnu/lib/libodialog/TESTS/ftree2.test new file mode 100644 index 0000000..0850862 --- /dev/null +++ b/gnu/lib/libodialog/TESTS/ftree2.test @@ -0,0 +1,73 @@ +XTerm login +XTerm login VendorShellExt shellext +XTerm login VT100 vt100 +XTerm login SimpleMenu fontMenu +XTerm login SimpleMenu fontMenu SmeBSB menuLabel +XTerm login SimpleMenu fontMenu SmeBSB fontdefault +XTerm login SimpleMenu fontMenu SmeBSB font1 +XTerm login SimpleMenu fontMenu SmeBSB font2 +XTerm login SimpleMenu fontMenu SmeBSB font3 +XTerm login SimpleMenu fontMenu SmeBSB font4 +XTerm login SimpleMenu fontMenu SmeBSB font5 +XTerm login SimpleMenu fontMenu SmeBSB font6 +XTerm login SimpleMenu fontMenu SmeBSB fontescape +XTerm login SimpleMenu fontMenu SmeBSB fontsel +XTerm login SimpleMenu mainMenu +XTerm login SimpleMenu mainMenu SmeBSB menuLabel +XTerm login SimpleMenu mainMenu SmeBSB securekbd +XTerm login SimpleMenu mainMenu SmeBSB allowsends +XTerm login SimpleMenu mainMenu SmeBSB redraw +XTerm login SimpleMenu mainMenu SmeLine line1 +XTerm login SimpleMenu mainMenu SmeBSB 8-bit control +XTerm login SimpleMenu mainMenu SmeBSB sun function-keys +XTerm login SimpleMenu mainMenu SmeLine line2 +XTerm login SimpleMenu mainMenu SmeBSB suspend +XTerm login SimpleMenu mainMenu SmeBSB continue +XTerm login SimpleMenu mainMenu SmeBSB interrupt +XTerm login SimpleMenu mainMenu SmeBSB hangup +XTerm login SimpleMenu mainMenu SmeBSB terminate +XTerm login SimpleMenu mainMenu SmeBSB kill +XTerm login SimpleMenu mainMenu SmeLine line3 +XTerm login SimpleMenu mainMenu SmeBSB quit +XTerm login SimpleMenu vtMenu +XTerm login SimpleMenu vtMenu SmeBSB menuLabel +XTerm login SimpleMenu vtMenu SmeBSB scrollbar +XTerm login SimpleMenu vtMenu SmeBSB jumpscroll +XTerm login SimpleMenu vtMenu SmeBSB reversevideo +XTerm login SimpleMenu vtMenu SmeBSB autowrap +XTerm login SimpleMenu vtMenu SmeBSB reversewrap +XTerm login SimpleMenu vtMenu SmeBSB autolinefeed +XTerm login SimpleMenu vtMenu SmeBSB appcursor +XTerm login SimpleMenu vtMenu SmeBSB appkeypad +XTerm login SimpleMenu vtMenu SmeBSB scrollkey +XTerm login SimpleMenu vtMenu SmeBSB scrollttyoutput +XTerm login SimpleMenu vtMenu SmeBSB allow132 +XTerm login SimpleMenu vtMenu SmeBSB cursesemul +XTerm login SimpleMenu vtMenu SmeBSB visualbell +XTerm login SimpleMenu vtMenu SmeBSB marginbell +XTerm login SimpleMenu vtMenu SmeBSB altscreen +XTerm login SimpleMenu vtMenu SmeLine line1 +XTerm login SimpleMenu vtMenu SmeBSB softreset +XTerm login SimpleMenu vtMenu SmeBSB hardreset +XTerm login SimpleMenu vtMenu SmeBSB clearsavedlines +XTerm login SimpleMenu vtMenu SmeLine line2 +XTerm login SimpleMenu vtMenu SmeBSB tekshow +XTerm login SimpleMenu vtMenu SmeBSB tekmode +XTerm login SimpleMenu vtMenu SmeBSB vthide +XTerm login TopLevelShell tektronix +XTerm login TopLevelShell tektronix VendorShellExt shellext +XTerm login TopLevelShell tektronix Tek4014 tek4014 +XTerm login SimpleMenu tekMenu +XTerm login SimpleMenu tekMenu SmeBSB menuLabel +XTerm login SimpleMenu tekMenu SmeBSB tektextlarge +XTerm login SimpleMenu tekMenu SmeBSB tektext2 +XTerm login SimpleMenu tekMenu SmeBSB tektext3 +XTerm login SimpleMenu tekMenu SmeBSB tektextsmall +XTerm login SimpleMenu tekMenu SmeLine line1 +XTerm login SimpleMenu tekMenu SmeBSB tekpage +XTerm login SimpleMenu tekMenu SmeBSB tekreset +XTerm login SimpleMenu tekMenu SmeBSB tekcopy +XTerm login SimpleMenu tekMenu SmeLine line2 +XTerm login SimpleMenu tekMenu SmeBSB vtshow +XTerm login SimpleMenu tekMenu SmeBSB vtmode +XTerm login SimpleMenu tekMenu SmeBSB tekhide diff --git a/gnu/lib/libodialog/TESTS/gauge.c b/gnu/lib/libodialog/TESTS/gauge.c new file mode 100644 index 0000000..bf0cfc9 --- /dev/null +++ b/gnu/lib/libodialog/TESTS/gauge.c @@ -0,0 +1,41 @@ +/* + * small test-driver for new dialog functionality + * + * Copyright (c) 1995, Jordan Hubbard + * + * All rights reserved. + * + * This source code may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of the software nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Kick it off, James! */ +int +main(int argc, char **argv) +{ + int i; + + init_dialog(); + + for (i = 0; i <= 100; i++) { + dialog_gauge("Gas tank", "When this gets 100% full, you'd better yank out the nozzle!", 10, 1, 7, 70, i); + usleep(30000); + } + end_dialog(); + return 0; +} diff --git a/gnu/lib/libodialog/TESTS/input1.c b/gnu/lib/libodialog/TESTS/input1.c new file mode 100644 index 0000000..3751071 --- /dev/null +++ b/gnu/lib/libodialog/TESTS/input1.c @@ -0,0 +1,45 @@ +/* + * small test-driver for new dialog functionality + * + * Copyright (c) 1995, Jordan Hubbard + * + * All rights reserved. + * + * This source code may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of the software nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Kick it off, James! */ +int +main(int argc, char **argv) +{ + int retval; + unsigned char result[128]; + + init_dialog(); + + strcpy(result, "not this!"); + retval = dialog_inputbox("this is dialog_inputbox() in action, test #1", + "Enter something really profound below, please.", + -1, -1, result); + dialog_clear(); + fprintf(stderr, "returned value for dialog_inputbox was %d (%s)\n", retval, result); + + end_dialog(); + return 0; +} diff --git a/gnu/lib/libodialog/TESTS/input2.c b/gnu/lib/libodialog/TESTS/input2.c new file mode 100644 index 0000000..827c052 --- /dev/null +++ b/gnu/lib/libodialog/TESTS/input2.c @@ -0,0 +1,47 @@ +/* + * small test-driver for new dialog functionality + * + * Copyright (c) 1995, Jordan Hubbard + * + * All rights reserved. + * + * This source code may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of the software nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Kick it off, James! */ +int +main(int argc, char **argv) +{ + int retval; + unsigned char result[128]; + + init_dialog(); + + result[0]='\0'; + DialogInputAttrs |= DITEM_NO_ECHO; + retval = dialog_inputbox("this is dialog_inputbox() in action, test #2 (no echo)", + "Enter something really secret below, please.", + -1, -1, result); + DialogInputAttrs &= DITEM_NO_ECHO; + dialog_clear(); + fprintf(stderr, "returned value for dialog_inputbox was %d (%s)\n", retval, result); + + end_dialog(); + return 0; +} diff --git a/gnu/lib/libodialog/TESTS/menu1.c b/gnu/lib/libodialog/TESTS/menu1.c new file mode 100644 index 0000000..640157a --- /dev/null +++ b/gnu/lib/libodialog/TESTS/menu1.c @@ -0,0 +1,96 @@ +/* + * small test-driver for new dialog functionality + * + * Copyright (c) 1995, Jordan Hubbard + * + * All rights reserved. + * + * This source code may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of the software nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Start of hook functions */ +static enum { nowhere, berlin, rome, ny } where; + +static int +_menu1_berlin_action(dialogMenuItem *self) +{ + if (where == berlin) { + dialog_mesgbox("excuse me?", "But you're already *in* Berlin!", -1, -1); + } + else { + where = berlin; + dialog_mesgbox("whoosh!", "Welcome to Berlin! Have a beer!", -1, -1); + } + return DITEM_SUCCESS | DITEM_RESTORE | DITEM_CONTINUE; +} + +static int +_menu1_rome_action(dialogMenuItem *self) +{ + if (where == rome) { + dialog_mesgbox("The wine must be getting to you..", "You're already in Rome!", -1, -1); + } + else { + where = rome; + dialog_mesgbox("whoosh!", "Welcome to Rome! Have a coffee!", -1, -1); + } + return DITEM_SUCCESS | DITEM_RESTORE | DITEM_CONTINUE; +} + +static int +_menu1_ny_action(dialogMenuItem *self) +{ + if (where == ny) { + dialog_mesgbox("Say what?", "You're already there!", -1, -1); + } + else { + where = ny; + dialog_mesgbox("whoosh!", "Welcome to New York! Now go someplace else!", -1, -1); + } + return DITEM_SUCCESS | DITEM_RESTORE | DITEM_CONTINUE; +} + +/* menu1 - show off the "fire" action hook */ +/* prompt title checked fire */ +static dialogMenuItem menu1[] = { + { "Berlin", "Go visit Germany's new capitol", NULL, _menu1_berlin_action }, + { "Rome", "Go visit the Roman ruins", NULL, _menu1_rome_action }, + { "New York", "Go visit the streets of New York", NULL, _menu1_ny_action }, +}; + +/* End of hook functions */ + +/* Kick it off, James! */ +int +main(int argc, char **argv) +{ + int retval; + + init_dialog(); + + retval = dialog_menu("this is dialog_menu() in action, test #1", + "this simple menu shows off some of the straight-forward features\n" + "of the new menu system's action dispatch hooks. Select Cancel to leave", + -1, -1, 3, -3, menu1, NULL, NULL, NULL); + dialog_clear(); + fprintf(stderr, "returned value for dialog_menu was %d\n", retval); + + end_dialog(); + return 0; +} diff --git a/gnu/lib/libodialog/TESTS/menu2.c b/gnu/lib/libodialog/TESTS/menu2.c new file mode 100644 index 0000000..1545cd8 --- /dev/null +++ b/gnu/lib/libodialog/TESTS/menu2.c @@ -0,0 +1,96 @@ +/* + * small test-driver for new dialog functionality + * + * Copyright (c) 1995, Jordan Hubbard + * + * All rights reserved. + * + * This source code may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of the software nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Start of hook functions */ +static enum { nowhere, berlin, rome, ny } where; + +static int +_menu1_berlin_action(dialogMenuItem *self) +{ + if (where == berlin) + dialog_mesgbox("excuse me?", "But you're already *in* Berlin!", -1, -1); + else { + where = berlin; + dialog_mesgbox("whoosh!", "Welcome to Berlin! Have a beer!", -1, -1); + } + return DITEM_SUCCESS | DITEM_RESTORE | DITEM_CONTINUE; +} + +static int +_menu1_rome_action(dialogMenuItem *self) +{ + if (where == rome) + dialog_mesgbox("The wine must be getting to you..", "You're already in Rome!", -1, -1); + else { + where = rome; + dialog_mesgbox("whoosh!", "Welcome to Rome! Have a coffee!", -1, -1); + } + return DITEM_SUCCESS | DITEM_RESTORE | DITEM_CONTINUE; +} + +static int +_menu1_ny_action(dialogMenuItem *self) +{ + if (where == ny) + dialog_mesgbox("Say what?", "You're already there!", -1, -1); + else { + where = ny; + dialog_mesgbox("whoosh!", "Welcome to New York! Now go someplace else!", -1, -1); + } + return DITEM_SUCCESS | DITEM_RESTORE | DITEM_CONTINUE; +} + +/* menu1 - show off the "fire" action hook */ +/* prompt title checked fire */ +static dialogMenuItem menu1[] = { + { "Berlin", "Go visit Germany's new capitol", NULL, _menu1_berlin_action }, + { "Rome", "Go visit the Roman ruins", NULL, _menu1_rome_action }, + { "New York", "Go visit the streets of New York", NULL, _menu1_ny_action }, +}; + +/* End of hook functions */ + +/* Kick it off, James! */ +int +main(int argc, char **argv) +{ + int retval; + + init_dialog(); + + use_helpfile("menu2.c"); + use_helpline("Type F1 to view the source for this demo"); + retval = dialog_menu("this is dialog_menu() in action, test #2", + "this simple menu shows off some of the straight-forward features\n" + "of the new menu system's action dispatch hooks as well as a helpline\n" + "and a helpfile. Select Cancel to leave", + -1, -1, 3, -3, menu1, NULL, NULL, NULL); + dialog_clear(); + fprintf(stderr, "returned value for dialog_menu was %d\n", retval); + + end_dialog(); + return 0; +} diff --git a/gnu/lib/libodialog/TESTS/menu3.c b/gnu/lib/libodialog/TESTS/menu3.c new file mode 100644 index 0000000..3a7a137 --- /dev/null +++ b/gnu/lib/libodialog/TESTS/menu3.c @@ -0,0 +1,107 @@ +/* + * small test-driver for new dialog functionality + * + * Copyright (c) 1995, Jordan Hubbard + * + * All rights reserved. + * + * This source code may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of the software nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Hook functions */ + +static int +stop(dialogMenuItem *self) +{ + dialog_mesgbox("!", "I'm no idiot!", -1, -1); + return DITEM_SUCCESS; +} + +static int +maybe(dialogMenuItem *self) +{ + dialog_mesgbox("!", "I said don't rush me! I'm THINKING!", -1, -1); + return DITEM_SUCCESS | DITEM_RESTORE | DITEM_CONTINUE; +} + +/* Dummy menu just to show of the ability */ +static char *insurance[] = { + "1,000,000", "Mondo insurance policy", "Off", + "5,000,000", "Mega insurance policy", "Off", + "10,000,000", "Friend! Most Favored customer!", "On" +}; + +static void +preinsure(dialogMenuItem *self, int is_selected) +{ + if (is_selected) { + static WINDOW *w; + + /* This has to be here first if you want to see selection traverse properly in the invoking menu */ + refresh(); + + w = dupwin(newscr); + DialogX = 1; + DialogY = 13; + dialog_radiolist("How much insurance would you like to take out?", + "If you're really going to do this, we recommend some insurance\n" + "first! What kind of life insurance policy would you like?", + -1, -1, 3, 3, insurance, NULL); + touchwin(w); + wrefresh(w); + delwin(w); + } +} + +/* + * Show a simple menu that puts up a sub menu when a certain item is traversed to + */ + +/* prompt title checked fire sel */ +static dialogMenuItem doit[] = { + { "Rah!" }, + { "No way!" }, + { "Stop", "No, I'm not going to do that!", NULL, stop, NULL }, + { "Maybe", "I'm still thinking about it, don't rush me!", NULL, maybe, NULL, }, + { "Go", "Yes! Yes! I want to do it!", NULL, NULL, preinsure }, +}; + +/* End of hook functions */ + +/* Kick it off, James! */ +int +main(int argc, char **argv) +{ + int retval; + + init_dialog(); + + + DialogX = 5; + DialogY = 1; + retval = dialog_menu("Do you have the GUTS?", + "C'mon, macho man! Do you have what it takes to do something REALLY\n" + "dangerous and stupid? WHAT ARE YOU WAITING FOR?!", + -1, -1, 3, -3, doit + 2, (char *)TRUE, NULL, NULL); + dialog_clear(); + fprintf(stderr, "returned value for dialog_menu was %d\n", retval); + + end_dialog(); + return 0; +} diff --git a/gnu/lib/libodialog/TESTS/msg.c b/gnu/lib/libodialog/TESTS/msg.c new file mode 100644 index 0000000..c6f590f --- /dev/null +++ b/gnu/lib/libodialog/TESTS/msg.c @@ -0,0 +1,42 @@ +/* + * small test-driver for new dialog functionality + * + * Copyright (c) 1995, Jordan Hubbard + * + * All rights reserved. + * + * This source code may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of the software nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Kick it off, James! */ +int +main(int argc, char **argv) +{ + int retval; + + init_dialog(); + + retval = dialog_msgbox("This is dialog_msgbox() in action with pause on", "Hi there. Please press return now.", + -1, -1, 1); + dialog_clear(); + fprintf(stderr, "returned value for dialog_msgbox was %d\n", retval); + + end_dialog(); + return 0; +} diff --git a/gnu/lib/libodialog/TESTS/prgbox.c b/gnu/lib/libodialog/TESTS/prgbox.c new file mode 100644 index 0000000..2da4611 --- /dev/null +++ b/gnu/lib/libodialog/TESTS/prgbox.c @@ -0,0 +1,41 @@ +/* + * small test-driver for new dialog functionality + * + * Copyright (c) 1995, Jordan Hubbard + * + * All rights reserved. + * + * This source code may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of the software nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Kick it off, James! */ +int +main(int argc, char **argv) +{ + int retval; + + init_dialog(); + + retval = dialog_prgbox("This is dialog_prgbox() in action with cal(1)", "cal", 14, 50, TRUE, TRUE); + dialog_clear(); + fprintf(stderr, "returned value for dialog_prgbox was %d\n", retval); + + end_dialog(); + return 0; +} diff --git a/gnu/lib/libodialog/TESTS/radio1.c b/gnu/lib/libodialog/TESTS/radio1.c new file mode 100644 index 0000000..c4eeffd --- /dev/null +++ b/gnu/lib/libodialog/TESTS/radio1.c @@ -0,0 +1,71 @@ +/* + * small test-driver for new dialog functionality + * + * Copyright (c) 1995, Jordan Hubbard + * + * All rights reserved. + * + * This source code may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of the software nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Hook functions */ + +static int spending; + +static int +check(dialogMenuItem *self) +{ + return ((int)(intptr_t)self->data == spending); +} + +static int +spend(dialogMenuItem *self) +{ + spending = (int)(intptr_t)self->data; + return DITEM_SUCCESS | DITEM_REDRAW; +} + +/* menu5 - Show a simple radiolist menu that inherits the radio appearance by default */ +/* prompt title checked fire sel data */ +static dialogMenuItem menu5[] = { + { "1000", "Spend $1,000", check, spend, NULL, (void *)1000 }, + { "500", "Spend $500", check, spend, NULL, (void *)500 }, + { "100", "Spend $100", check, spend, NULL, (void *)100 }, +}; + +/* End of hook functions */ + +/* Kick it off, James! */ +int +main(int argc, char **argv) +{ + int retval; + + init_dialog(); + + + retval = dialog_radiolist("this is dialog_radiolist() in action, test #1", + "this radio menu shows off some of the straight-forward features\n" + "of the new menu system's check & fire dispatch hooks", -1, -1, 3, -3, menu5, NULL); + dialog_clear(); + fprintf(stderr, "returned value for dialog_radiolist was %d (money set to %d)\n", retval, spending); + + end_dialog(); + return 0; +} diff --git a/gnu/lib/libodialog/TESTS/radio2.c b/gnu/lib/libodialog/TESTS/radio2.c new file mode 100644 index 0000000..15e353c --- /dev/null +++ b/gnu/lib/libodialog/TESTS/radio2.c @@ -0,0 +1,89 @@ +/* + * small test-driver for new dialog functionality + * + * Copyright (c) 1995, Jordan Hubbard + * + * All rights reserved. + * + * This source code may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of the software nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Hook functions */ + +static char bachelor[10], bachelette[10]; + +static int +getBachelor(dialogMenuItem *self) +{ + return !strcmp(bachelor, self->prompt); +} + +static int +setBachelor(dialogMenuItem *self) +{ + strcpy(bachelor, self->prompt); + return DITEM_SUCCESS | DITEM_REDRAW; +} + +static int +getBachelette(dialogMenuItem *self) +{ + return !strcmp(bachelette, self->prompt); +} + +static int +setBachelette(dialogMenuItem *self) +{ + strcpy(bachelette, self->prompt); + return DITEM_SUCCESS | DITEM_REDRAW; +} + +/* menu6- More complex radiolist menu that creates two groups in a single menu */ +/* prompt title checked fire */ +static dialogMenuItem menu6[] = { + { "Tom", "Tom's a dynamic shoe salesman from Tulsa, OK!", getBachelor, setBachelor }, + { "Dick", "Dick's a retired engine inspector from McDonnell-Douglas!", getBachelor, setBachelor }, + { "Harry", "Harry's a professional female impersonator from Las Vegas!", getBachelor, setBachelor }, + { "-----", "----------------------------------", NULL, NULL, NULL, NULL, ' ', ' ', ' ' }, + { "Jane", "Jane's a twice-divorced housewife from Moose, Oregon!", getBachelette, setBachelette }, + { "Sally", "Sally's a shy Human Resources Manager for IBM!", getBachelette, setBachelette }, + { "Mary", "Mary's an energetic serial killer on the lam!", getBachelette, setBachelette }, +}; + +/* End of hook functions */ + +/* Kick it off, James! */ +int +main(int argc, char **argv) +{ + int retval; + + init_dialog(); + + retval = dialog_radiolist("this is dialog_radiolist() in action, test #2", + "Welcome to \"The Love Blender!\" - America's favorite game show\n" + "where YOU, the contestant, get to choose which of these two\n" + "fine specimens of humanity will go home together, whether they\n" + "like it or not!", -1, -1, 7, -7, menu6, NULL); + dialog_clear(); + fprintf(stderr, "I'm sure that %s and %s will be very happy together!\n", bachelor, bachelette); + + end_dialog(); + return 0; +} diff --git a/gnu/lib/libodialog/TESTS/radio3.c b/gnu/lib/libodialog/TESTS/radio3.c new file mode 100644 index 0000000..2175358 --- /dev/null +++ b/gnu/lib/libodialog/TESTS/radio3.c @@ -0,0 +1,98 @@ +/* + * small test-driver for new dialog functionality + * + * Copyright (c) 1995, Jordan Hubbard + * + * All rights reserved. + * + * This source code may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of the software nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Hook functions */ + +static int spending; + +static int +check(dialogMenuItem *self) +{ + return ((int)(intptr_t)self->data == spending); +} + +static int +spend(dialogMenuItem *self) +{ + spending = (int)(intptr_t)self->data; + return DITEM_SUCCESS | DITEM_REDRAW; +} + +static void +ask(dialogMenuItem *self, int is_selected) +{ + if (is_selected) { + char *str; + + if (!strcmp(self->prompt, "1000")) + str = "You'd better ask both your parents first! "; + else if (!strcmp(self->prompt, "500")) + str = "You'd better at least ask your Dad! "; + else + str = "Yes, being frugal is probably a good idea!"; + DialogX = 15; + DialogY = 17; + dialog_msgbox("Free Advice", str, -1, -1, 0); + } +} + +/* + * menu5 - Show a simple radiolist menu that inherits the radio appearance by default and appears at + * a different location, leaving room for a msg box below it. This shows off the DialogX/DialogY extensions. + */ + +/* prompt title checked fire sel data */ +static dialogMenuItem menu5[] = { + { "1000", "Spend $1,000", check, spend, ask, (void *)1000 }, + { "500", "Spend $500", check, spend, ask, (void *)500 }, + { "100", "Spend $100", check, spend, ask, (void *)100 }, +}; + +/* End of hook functions */ + +/* Kick it off, James! */ +int +main(int argc, char **argv) +{ + int retval; + + init_dialog(); + + + DialogX = 5; + DialogY = 1; + retval = dialog_radiolist("this is dialog_radiolist() in action, test #3", + "This radio menu shows off the ability to put dialog menus and other\n" + "controls at different locations, as well as the `selected' hook which\n" + "lets you follow the traversal of the selection bar as well as what's\n" + "selected.", + -1, -1, 3, -3, menu5, NULL); + dialog_clear(); + fprintf(stderr, "returned value for dialog_radiolist was %d (money set to %d)\n", retval, spending); + + end_dialog(); + return 0; +} diff --git a/gnu/lib/libodialog/TESTS/text.c b/gnu/lib/libodialog/TESTS/text.c new file mode 100644 index 0000000..e071937 --- /dev/null +++ b/gnu/lib/libodialog/TESTS/text.c @@ -0,0 +1,41 @@ +/* + * small test-driver for new dialog functionality + * + * Copyright (c) 1995, Jordan Hubbard + * + * All rights reserved. + * + * This source code may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of the software nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Kick it off, James! */ +int +main(int argc, char **argv) +{ + int retval; + + init_dialog(); + + retval = dialog_textbox("This is dialog_textbox() in action with /etc/passwd", "/etc/passwd", 10, 60); + dialog_clear(); + fprintf(stderr, "returned value for dialog_textbox was %d\n", retval); + + end_dialog(); + return 0; +} diff --git a/gnu/lib/libodialog/TESTS/tree.c b/gnu/lib/libodialog/TESTS/tree.c new file mode 100644 index 0000000..c69b52e --- /dev/null +++ b/gnu/lib/libodialog/TESTS/tree.c @@ -0,0 +1,111 @@ +/* + * tree.c + * + * small test-driver for new dialog functionality + * + * Copyright (c) 1998, Anatoly A. Orehovsky + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +unsigned char *names[] = { + "/", + "/dev", + "/dev/fd", + "/tmp", + "/usr", + "/var", + "/home", + "/stand", + "/stand/etc", + "/stand/en_US.ISO8859-1", + "/stand/info", + "/stand/info/bin", + "/stand/info/des", + "/stand/info/games", + "/stand/info/manpages", + "/stand/info/proflibs", + "/stand/info/dict", + "/stand/info/info", + "/stand/info/src", + "/etc", + "/etc/gnats", + "/etc/kerberosIV", + "/etc/mtree", + "/etc/namedb", + "/etc/ppp", + "/etc/uucp", + "/etc/sliphome", + "/proc", + "/lkm", + "/mnt", + "/root", + "/sbin", + "/bin", + 0 +}; + +unsigned char *names1[] = { + "a", + "a:b", + "a:b:c", + "a:d" +}; + +int +main(int argc, char **argv) +{ + int retval; + unsigned char *tresult; + char comstr[BUFSIZ]; + + init_dialog(); + do { + use_helpline("Press OK for listing directory"); + retval = dialog_tree(names, + sizeof(names)/sizeof(unsigned char *) - 1, + '/', + "tree dialog box example", + "Typical find -x / -type d output", + -1, -1, 15, + &tresult); + + if (retval) + break; + + use_helpline(NULL); + (void)snprintf(comstr, sizeof(comstr), + "ls -CF %s", tresult); + + retval = dialog_prgbox( + comstr, + comstr, 20, 60, TRUE, TRUE); + + dialog_clear(); + + retval = dialog_tree(names1, + sizeof(names1)/sizeof(unsigned char *), + ':', + "tree dialog box example", + "Other tree", + -1, -1, 5, + &tresult); + if (!retval) + { + dialog_clear(); + } + } while (!retval); + + dialog_update(); + + dialog_clear(); + + end_dialog(); + + exit(retval); +} diff --git a/gnu/lib/libodialog/TESTS/yesno.c b/gnu/lib/libodialog/TESTS/yesno.c new file mode 100644 index 0000000..647b51c --- /dev/null +++ b/gnu/lib/libodialog/TESTS/yesno.c @@ -0,0 +1,45 @@ +/* + * small test-driver for new dialog functionality + * + * Copyright (c) 1995, Jordan Hubbard + * + * All rights reserved. + * + * This source code may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of the software nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Kick it off, James! */ +int +main(int argc, char **argv) +{ + int rval1, rval2; + + init_dialog(); + + rval1 = dialog_yesno("This is dialog_yesno() in action", + "Have you stopped deliberately putting bugs into your code?", -1, -1); + dialog_clear(); + rval2 = dialog_noyes("This is dialog_noyes() in action", + "Have you stopped beating your wife?", -1, -1); + dialog_clear(); + end_dialog(); + fprintf(stderr, "returned value for dialog_yesno was %d\n", rval1); + fprintf(stderr, "returned value for dialog_noyes was %d\n", rval2); + return 0; +} diff --git a/gnu/lib/libodialog/TODO b/gnu/lib/libodialog/TODO new file mode 100644 index 0000000..132a4a4 --- /dev/null +++ b/gnu/lib/libodialog/TODO @@ -0,0 +1,36 @@ +- cut off names in the listbox that are to long +done 27Jan95 + The current behaviour may not be desirable. When browsing through + long names these, when highlighted, will be shown with the first + characters cut off, when not highlighted the last characters will + be cut off. + +- look at behaviour of TAB key when browsing through directories. +done 28Jan95 + +- make sure the full name of the directory is written to the + "Directory:"-box +done 28Jan95 + +- mark current selections in listbox when initializing the listobject +Idontknow +- test and use Notify() when checking for error conditions +ok +- test overall +- adapt color of buttons when changing focus to the button. +done 28Jan95 +- add shade to dialog_fselect()-window +done 29Jan95 +- add (nn%) indication to lists. +done 30Jan95 +- add use_helpfile() +done 13Feb95 +- add use_helpline() + +NOTE: apparently there is a bug (or a strange interaction between pkg_manage +and dialog_textbox) in dialog_textbox. When I use this routine to display +the helpfile in display_helpfile() the program gets mysterious segmentation +faults and bus errors. +I now use dialog_mesgbox, after I have read the file into a buffer. + + diff --git a/gnu/lib/libodialog/checklist.c b/gnu/lib/libodialog/checklist.c new file mode 100644 index 0000000..e349ca6 --- /dev/null +++ b/gnu/lib/libodialog/checklist.c @@ -0,0 +1,661 @@ +/* + * checklist.c -- implements the checklist box + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * Substantial rennovation: 12/18/95, Jordan K. Hubbard + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include "dialog.priv.h" + + +static void print_item(WINDOW *win, unsigned char *tag, unsigned char *item, int status, int choice, int selected, dialogMenuItem *me, int list_width, int item_x, int check_x); + +#define DREF(di, item) ((di) ? &((di)[(item)]) : NULL) + +/* + * Display a dialog box with a list of options that can be turned on or off + */ +int +dialog_checklist(unsigned char *title, unsigned char *prompt, int height, int width, + int list_height, int cnt, void *it, unsigned char *result) +{ + int i, j, x, y, cur_x, cur_y, old_x, old_y, box_x, box_y, key = 0, button, + choice, l, k, scroll, max_choice, item_no = 0, *status; + int redraw_menu = FALSE, cursor_reset = FALSE; + int rval = 0, onlist = 1, ok_space, cancel_space; + char okButton, cancelButton; + WINDOW *dialog, *list; + unsigned char **items = NULL; + dialogMenuItem *ditems; + int list_width, check_x, item_x; + + /* Allocate space for storing item on/off status */ + if ((status = alloca(sizeof(int) * abs(cnt))) == NULL) { + endwin(); + fprintf(stderr, "\nCan't allocate memory in dialog_checklist().\n"); + exit(-1); + } + +draw: + choice = scroll = button = 0; + /* Previous calling syntax, e.g. just a list of strings? */ + if (cnt >= 0) { + items = it; + ditems = NULL; + item_no = cnt; + /* Initializes status */ + for (i = 0; i < item_no; i++) + status[i] = !strcasecmp(items[i*3 + 2], "on"); + } + /* It's the new specification format - fake the rest of the code out */ + else { + item_no = abs(cnt); + ditems = it; + if (!items) + items = (unsigned char **)alloca((item_no * 3) * sizeof(unsigned char *)); + + /* Initializes status */ + for (i = 0; i < item_no; i++) { + status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE; + items[i*3] = ditems[i].prompt; + items[i*3 + 1] = ditems[i].title; + items[i*3 + 2] = status[i] ? "on" : "off"; + } + } + max_choice = MIN(list_height, item_no); + + check_x = 0; + item_x = 0; + /* Find length of longest item in order to center checklist */ + for (i = 0; i < item_no; i++) { + l = strlen(items[i*3]); + for (j = 0; j < item_no; j++) { + k = strlen(items[j*3 + 1]); + check_x = MAX(check_x, l + k + 6); + } + item_x = MAX(item_x, l); + } + if (height < 0) + height = strheight(prompt)+list_height+4+2; + if (width < 0) { + i = strwidth(prompt); + j = ((title != NULL) ? strwidth(title) : 0); + width = MAX(i,j); + width = MAX(width,check_x+4)+4; + } + width = MAX(width,24); + + if (width > COLS) + width = COLS; + if (height > LINES) + height = LINES; + /* center dialog box on screen */ + x = (COLS - width)/2; + y = (LINES - height)/2; + +#ifdef HAVE_NCURSES + if (use_shadow) + draw_shadow(stdscr, y, x, height, width); +#endif + dialog = newwin(height, width, y, x); + if (dialog == NULL) { + endwin(); + fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width, y, x); + return -1; + } + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); + wattrset(dialog, border_attr); + wmove(dialog, height-3, 0); + waddch(dialog, ACS_LTEE); + for (i = 0; i < width-2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dialog_attr); + waddch(dialog, ACS_RTEE); + wmove(dialog, height-2, 1); + for (i = 0; i < width-2; i++) + waddch(dialog, ' '); + + if (title != NULL) { + wattrset(dialog, title_attr); + wmove(dialog, 0, (width - strlen(title))/2 - 1); + waddch(dialog, ' '); + waddstr(dialog, title); + waddch(dialog, ' '); + } + wattrset(dialog, dialog_attr); + wmove(dialog, 1, 2); + print_autowrap(dialog, prompt, height - 1, width - 2, width, 1, 2, TRUE, FALSE); + + list_width = width - 6; + getyx(dialog, cur_y, cur_x); + box_y = cur_y + 1; + box_x = (width - list_width) / 2 - 1; + + /* create new window for the list */ + list = subwin(dialog, list_height, list_width, y + box_y + 1, x + box_x + 1); + if (list == NULL) { + delwin(dialog); + endwin(); + fprintf(stderr, "\nsubwin(dialog,%d,%d,%d,%d) failed, maybe wrong dims\n", list_height, list_width, + y + box_y + 1, x + box_x + 1); + return -1; + } + keypad(list, TRUE); + + /* draw a box around the list items */ + draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2, menubox_border_attr, menubox_attr); + + check_x = (list_width - check_x) / 2; + item_x = check_x + item_x + 6; + + /* Print the list */ + for (i = 0; i < max_choice; i++) + print_item(list, items[i * 3], items[i * 3 + 1], status[i], i, i == choice, DREF(ditems, i), list_width, item_x, check_x); + wnoutrefresh(list); + print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); + + display_helpline(dialog, height - 1, width); + + x = width / 2 - 11; + y = height - 2; + /* Is this a fancy new style argument string where we get to override + * the buttons, or an old style one where they're fixed? + */ + if (ditems && result) { + cancelButton = toupper(ditems[CANCEL_BUTTON].prompt[0]); + print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : FALSE); + okButton = toupper(ditems[OK_BUTTON].prompt[0]); + print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : TRUE); + } + else { + cancelButton = 'C'; + print_button(dialog, "Cancel", y, x + 14, FALSE); + okButton = 'O'; + print_button(dialog, " OK ", y, x, TRUE); + } + wnoutrefresh(dialog); + wmove(list, choice, check_x+1); + wrefresh(list); + + /* + * XXX Black magic voodoo that allows printing to the checklist + * window. For some reason, if this "refresh" code is not in + * place, printing to the window from the selected callback + * prints "behind" the checklist window. There is probably a + * better way to do this. + */ + draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2, menubox_border_attr, menubox_attr); + + for (i = 0; i < max_choice; i++) + print_item(list, items[i * 3], items[i * 3 + 1], status[i], i, i == choice, DREF(ditems, i), list_width, item_x, check_x); + print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); + + wmove(list, choice, check_x+1); + wnoutrefresh(dialog); + wrefresh(list); + /* XXX Black magic XXX */ + + while (key != ESC) { + key = wgetch(dialog); + + /* Shortcut to OK? */ + if (toupper(key) == okButton) { + if (ditems) { + if (result && ditems[OK_BUTTON].fire) { + int st; + WINDOW *save; + + save = dupwin(newscr); + st = ditems[OK_BUTTON].fire(&ditems[OK_BUTTON]); + if (st & DITEM_RESTORE) { + touchwin(save); + wrefresh(save); + } + delwin(save); + } + } + else if (result) { + *result = '\0'; + for (i = 0; i < item_no; i++) { + if (status[i]) { + strcat(result, items[i*3]); + strcat(result, "\n"); + } + } + } + rval = 0; + key = ESC; /* Lemme out! */ + break; + } + + /* Shortcut to cancel? */ + if (toupper(key) == cancelButton) { + if (ditems && result && ditems[CANCEL_BUTTON].fire) { + int st; + WINDOW *save; + + save = dupwin(newscr); + st = ditems[CANCEL_BUTTON].fire(&ditems[CANCEL_BUTTON]); + if (st & DITEM_RESTORE) { + touchwin(save); + wrefresh(save); + wmove(dialog, cur_y, cur_x); + } + delwin(save); + } + rval = 1; + key = ESC; /* I gotta go! */ + break; + } + + /* Check if key pressed matches first character of any item tag in list */ + for (i = 0; i < max_choice; i++) + if (key != ' ' && key < 0x100 && toupper(key) == toupper(items[(scroll+i)*3][0])) + break; + + if (i < max_choice || (key >= '1' && key <= MIN('9', '0'+max_choice)) || + KEY_IS_UP(key) || KEY_IS_DOWN(key) || ((key == ' ' || key == '\n' || + key == '\r') && onlist)) { + + /* if moving from buttons to the list, reset and redraw buttons */ + if (!onlist) { + onlist = 1; + button = 0; + + if (ditems && result) { + print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); + print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); + } + else { + print_button(dialog, "Cancel", y, x + 14, button); + print_button(dialog, " OK ", y, x, !button); + } + wmove(list, choice, check_x+1); + wnoutrefresh(dialog); + wrefresh(list); + } + + if (key >= '1' && key <= MIN('9', '0'+max_choice)) + i = key - '1'; + + else if (KEY_IS_UP(key)) { + if (!choice) { + if (scroll) { + /* Scroll list down */ + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + if (list_height > 1) { + /* De-highlight current first item before scrolling down */ + print_item(list, items[scroll * 3], items[scroll * 3 + 1], status[scroll], 0, + FALSE, DREF(ditems, scroll), list_width, item_x, check_x); + scrollok(list, TRUE); + wscrl(list, -1); + scrollok(list, FALSE); + } + scroll--; + print_item(list, items[scroll*3], items[scroll*3 + 1], status[scroll], 0, + TRUE, DREF(ditems, scroll), list_width, item_x, check_x); + print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); + wmove(list, choice, check_x+1); + wnoutrefresh(dialog); + wrefresh(list); + } + continue; /* wait for another key press */ + } + else + i = choice - 1; + } + else if (KEY_IS_DOWN(key)) { + if (choice == max_choice - 1) { + if (scroll + choice < item_no - 1) { + /* Scroll list up */ + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + if (list_height > 1) { + /* De-highlight current last item before scrolling up */ + print_item(list, items[(scroll + max_choice - 1) * 3], + items[(scroll + max_choice - 1) * 3 + 1], + status[scroll + max_choice - 1], max_choice - 1, + FALSE, DREF(ditems, scroll + max_choice - 1), list_width, item_x, check_x); + scrollok(list, TRUE); + scroll(list); + scrollok(list, FALSE); + } + scroll++; + print_item(list, items[(scroll + max_choice - 1) * 3], + items[(scroll + max_choice - 1) * 3 + 1], + status[scroll + max_choice - 1], max_choice - 1, TRUE, + DREF(ditems, scroll + max_choice - 1), list_width, item_x, check_x); + print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); + wmove(list, choice, check_x+1); + wnoutrefresh(dialog); + wrefresh(list); + } + continue; /* wait for another key press */ + } + else + i = choice + 1; + } + else if ((key == ' ' || key == '\n' || key == '\r') && onlist) { /* Toggle item status */ + char lbra = 0, rbra = 0, mark = 0; + + getyx(list, old_y, old_x); /* Save cursor position */ + + if (ditems) { + if (ditems[scroll + choice].fire) { + int st; + WINDOW *save; + + save = dupwin(newscr); + st = ditems[scroll + choice].fire(&ditems[scroll + choice]); /* Call "fire" action */ + if (st & DITEM_RESTORE) { + touchwin(save); + wrefresh(save); + } + delwin(save); + if (st & DITEM_REDRAW) { + wclear(list); + for (i = 0; i < item_no; i++) + status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE; + for (i = 0; i < max_choice; i++) { + print_item(list, items[(scroll + i) * 3], items[(scroll + i) * 3 + 1], + status[scroll + i], i, i == choice, DREF(ditems, scroll + i), list_width, item_x, check_x); + } + wnoutrefresh(list); + print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, + cur_x, cur_y); + wrefresh(dialog); + } + if (st & DITEM_LEAVE_MENU) { + /* Allow a fire action to take us out of the menu */ + key = ESC; + rval = 0; + break; + } + else if (st & DITEM_RECREATE) { + delwin(list); + delwin(dialog); + dialog_clear(); + goto draw; + } + } + status[scroll + choice] = ditems[scroll + choice].checked ? + ditems[scroll + choice].checked(&ditems[scroll + choice]) : FALSE; + lbra = ditems[scroll + choice].lbra; + rbra = ditems[scroll + choice].rbra; + mark = ditems[scroll + choice].mark; + } + else + status[scroll + choice] = !status[scroll + choice]; + wmove(list, choice, check_x); + wattrset(list, check_selected_attr); + if (!lbra) + lbra = '['; + if (!rbra) + rbra = ']'; + if (!mark) + mark = 'X'; + wprintw(list, "%c%c%c", lbra, status[scroll + choice] ? mark : ' ', rbra); + wmove(list, old_y, old_x); /* Restore cursor to previous position */ + wrefresh(list); + continue; /* wait for another key press */ + } + + if (i != choice) { + /* De-highlight current item */ + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + print_item(list, items[(scroll + choice) * 3], items[(scroll + choice) * 3 + 1], + status[scroll + choice], choice, FALSE, DREF(ditems, scroll + choice), list_width, item_x, check_x); + + /* Highlight new item */ + choice = i; + print_item(list, items[(scroll + choice) * 3], items[(scroll + choice) * 3 + 1], status[scroll + choice], choice, TRUE, DREF(ditems, scroll + choice), list_width, item_x, check_x); + wmove(list, choice, check_x+1); /* Restore cursor to previous position */ + wrefresh(list); + } + continue; /* wait for another key press */ + } + + switch (key) { + case KEY_PPAGE: /* can we go up? */ + if (scroll > height - 4) + scroll -= (height-4); + else + scroll = 0; + redraw_menu = TRUE; + if (!onlist) { + onlist = 1; + button = 0; + } + break; + + case KEY_NPAGE: /* can we go down a full page? */ + if (scroll + list_height >= item_no-1 - list_height) { + scroll = item_no - list_height; + if (scroll < 0) + scroll = 0; + } + else + scroll += list_height; + redraw_menu = TRUE; + if (!onlist) { + onlist = 1; + button = 0; + } + break; + + case KEY_HOME: /* go to the top */ + scroll = 0; + choice = 0; + redraw_menu = TRUE; + cursor_reset = TRUE; + onlist = 1; + break; + + case KEY_END: /* Go to the bottom */ + scroll = item_no - list_height; + if (scroll < 0) + scroll = 0; + choice = max_choice - 1; + redraw_menu = TRUE; + cursor_reset = TRUE; + onlist = 1; + break; + + case TAB: + case KEY_BTAB: + /* move to next component */ + if (onlist) { /* on list, next is ok button */ + onlist = 0; + if (ditems && result) { + print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); + print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); + ok_space = 1; + cancel_space = strlen(ditems[OK_BUTTON].prompt) + 6; + } + else { + print_button(dialog, "Cancel", y, x + 14, button); + print_button(dialog, " OK ", y, x, !button); + ok_space = 3; + cancel_space = 15; + } + if (button) + wmove(dialog, y, x + cancel_space); + else + wmove(dialog, y, x + ok_space); + wrefresh(dialog); + break; + } + else if (button) { /* on cancel button, next is list */ + button = 0; + onlist = 1; + redraw_menu = TRUE; + break; + } + /* on ok button, next is cancel button, same as left/right case */ + + case KEY_LEFT: + case KEY_RIGHT: + onlist = 0; + button = !button; + if (ditems && result) { + print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); + print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); + ok_space = 1; + cancel_space = strlen(ditems[OK_BUTTON].prompt) + 6; + } + else { + print_button(dialog, "Cancel", y, x + 14, button); + print_button(dialog, " OK ", y, x, !button); + ok_space = 3; + cancel_space = 15; + } + if (button) + wmove(dialog, y, x + cancel_space); + else + wmove(dialog, y, x + ok_space); + wrefresh(dialog); + break; + + case ' ': + case '\n': + case '\r': + if (!onlist) { + if (ditems) { + if (result && ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire) { + int st; + WINDOW *save = dupwin(newscr); + + st = ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire(&ditems[button ? CANCEL_BUTTON : OK_BUTTON]); + if (st & DITEM_RESTORE) { + touchwin(save); + wrefresh(save); + } + delwin(save); + if (st == DITEM_FAILURE) + continue; + } + } + else if (result) { + *result = '\0'; + for (i = 0; i < item_no; i++) { + if (status[i]) { + strcat(result, items[i*3]); + strcat(result, "\n"); + } + } + } + rval = button; + key = ESC; /* Bail out! */ + break; + } + + /* Let me outta here! */ + case ESC: + rval = -1; + break; + + /* Help! */ + case KEY_F(1): + case '?': + display_helpfile(); + break; + } + + if (redraw_menu) { + getyx(list, old_y, old_x); + wclear(list); + + /* + * Re-draw a box around the list items. It is required + * if amount of list items is smaller than height of listbox. + * Otherwise un-redrawn field will be filled with default + * screen attributes instead of dialog attributes. + */ + draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2, menubox_border_attr, menubox_attr); + + for (i = 0; i < max_choice; i++) + print_item(list, items[(scroll + i) * 3], items[(scroll + i) * 3 + 1], status[scroll + i], i, i == choice, DREF(ditems, scroll + i), list_width, item_x, check_x); + print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); + + /* redraw buttons to fix highlighting */ + if (ditems && result) { + print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); + print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); + } + else { + print_button(dialog, "Cancel", y, x + 14, button); + print_button(dialog, " OK ", y, x, !button); + } + wnoutrefresh(dialog); + if (cursor_reset) { + wmove(list, choice, check_x+1); + cursor_reset = FALSE; + } + else { + wmove(list, old_y, old_x); + } + wrefresh(list); + redraw_menu = FALSE; + } + } + delwin(list); + delwin(dialog); + return rval; +} + + +/* + * Print list item + */ +static void +print_item(WINDOW *win, unsigned char *tag, unsigned char *item, int status, int choice, int selected, dialogMenuItem *me, int list_width, int item_x, int check_x) +{ + int i; + + /* Clear 'residue' of last item */ + wattrset(win, menubox_attr); + wmove(win, choice, 0); + for (i = 0; i < list_width; i++) + waddch(win, ' '); + wmove(win, choice, check_x); + wattrset(win, selected ? check_selected_attr : check_attr); + wprintw(win, "%c%c%c", me && me->lbra ? me->lbra : '[', + status ? me && me->mark ? me->mark : 'X' : ' ', + me && me->rbra ? me->rbra : ']'); + wattrset(win, menubox_attr); + waddch(win, ' '); + wattrset(win, selected ? tag_key_selected_attr : tag_key_attr); + waddch(win, tag[0]); + wattrset(win, selected ? tag_selected_attr : tag_attr); + waddstr(win, tag + 1); + wmove(win, choice, item_x); + wattrset(win, selected ? item_selected_attr : item_attr); + waddstr(win, item); + /* If have a selection handler for this, call it */ + if (me && me->selected) { + wrefresh(win); + me->selected(me, selected); + } +} +/* End of print_item() */ diff --git a/gnu/lib/libodialog/colors.h b/gnu/lib/libodialog/colors.h new file mode 100644 index 0000000..7cea0a0 --- /dev/null +++ b/gnu/lib/libodialog/colors.h @@ -0,0 +1,219 @@ +/* + * colors.h -- color attribute definitions + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +/* + * Default color definitions + * + * *_FG = foreground + * *_BG = background + * *_HL = highlight? + */ +#define SCREEN_FG COLOR_CYAN +#define SCREEN_BG COLOR_BLUE +#define SCREEN_HL TRUE + +#define SHADOW_FG COLOR_BLACK +#define SHADOW_BG COLOR_BLACK +#define SHADOW_HL TRUE + +#define DIALOG_FG COLOR_BLACK +#define DIALOG_BG COLOR_WHITE +#define DIALOG_HL FALSE + +#define TITLE_FG COLOR_YELLOW +#define TITLE_BG COLOR_WHITE +#define TITLE_HL TRUE + +#define BORDER_FG COLOR_WHITE +#define BORDER_BG COLOR_WHITE +#define BORDER_HL TRUE + +#define BUTTON_ACTIVE_FG COLOR_WHITE +#define BUTTON_ACTIVE_BG COLOR_BLUE +#define BUTTON_ACTIVE_HL TRUE + +#define BUTTON_INACTIVE_FG COLOR_BLACK +#define BUTTON_INACTIVE_BG COLOR_WHITE +#define BUTTON_INACTIVE_HL FALSE + +#define BUTTON_KEY_ACTIVE_FG COLOR_WHITE +#define BUTTON_KEY_ACTIVE_BG COLOR_BLUE +#define BUTTON_KEY_ACTIVE_HL TRUE + +#define BUTTON_KEY_INACTIVE_FG COLOR_RED +#define BUTTON_KEY_INACTIVE_BG COLOR_WHITE +#define BUTTON_KEY_INACTIVE_HL FALSE + +#define BUTTON_LABEL_ACTIVE_FG COLOR_YELLOW +#define BUTTON_LABEL_ACTIVE_BG COLOR_BLUE +#define BUTTON_LABEL_ACTIVE_HL TRUE + +#define BUTTON_LABEL_INACTIVE_FG COLOR_BLACK +#define BUTTON_LABEL_INACTIVE_BG COLOR_WHITE +#define BUTTON_LABEL_INACTIVE_HL TRUE + +#define INPUTBOX_FG COLOR_BLACK +#define INPUTBOX_BG COLOR_WHITE +#define INPUTBOX_HL FALSE + +#define INPUTBOX_BORDER_FG COLOR_BLACK +#define INPUTBOX_BORDER_BG COLOR_WHITE +#define INPUTBOX_BORDER_HL FALSE + +#define SEARCHBOX_FG COLOR_BLACK +#define SEARCHBOX_BG COLOR_WHITE +#define SEARCHBOX_HL FALSE + +#define SEARCHBOX_TITLE_FG COLOR_YELLOW +#define SEARCHBOX_TITLE_BG COLOR_WHITE +#define SEARCHBOX_TITLE_HL TRUE + +#define SEARCHBOX_BORDER_FG COLOR_WHITE +#define SEARCHBOX_BORDER_BG COLOR_WHITE +#define SEARCHBOX_BORDER_HL TRUE + +#define POSITION_INDICATOR_FG COLOR_YELLOW +#define POSITION_INDICATOR_BG COLOR_WHITE +#define POSITION_INDICATOR_HL TRUE + +#define MENUBOX_FG COLOR_BLACK +#define MENUBOX_BG COLOR_WHITE +#define MENUBOX_HL FALSE + +#define MENUBOX_BORDER_FG COLOR_WHITE +#define MENUBOX_BORDER_BG COLOR_WHITE +#define MENUBOX_BORDER_HL TRUE + +#define ITEM_FG COLOR_BLACK +#define ITEM_BG COLOR_WHITE +#define ITEM_HL FALSE + +#define ITEM_SELECTED_FG COLOR_WHITE +#define ITEM_SELECTED_BG COLOR_BLUE +#define ITEM_SELECTED_HL TRUE + +#define TAG_FG COLOR_YELLOW +#define TAG_BG COLOR_WHITE +#define TAG_HL TRUE + +#define TAG_SELECTED_FG COLOR_YELLOW +#define TAG_SELECTED_BG COLOR_BLUE +#define TAG_SELECTED_HL TRUE + +#define TAG_KEY_FG COLOR_RED +#define TAG_KEY_BG COLOR_WHITE +#define TAG_KEY_HL TRUE + +#define TAG_KEY_SELECTED_FG COLOR_RED +#define TAG_KEY_SELECTED_BG COLOR_BLUE +#define TAG_KEY_SELECTED_HL TRUE + +#define CHECK_FG COLOR_BLACK +#define CHECK_BG COLOR_WHITE +#define CHECK_HL FALSE + +#define CHECK_SELECTED_FG COLOR_WHITE +#define CHECK_SELECTED_BG COLOR_BLUE +#define CHECK_SELECTED_HL TRUE + +#define UARROW_FG COLOR_GREEN +#define UARROW_BG COLOR_WHITE +#define UARROW_HL TRUE + +#define DARROW_FG COLOR_GREEN +#define DARROW_BG COLOR_WHITE +#define DARROW_HL TRUE + +/* End of default color definitions */ + +#define C_ATTR(x,y) ((x ? A_BOLD : 0) | COLOR_PAIR((y))) +#define COLOR_NAME_LEN 10 +#define COLOR_COUNT 8 + + +/* + * Global variables + */ + +typedef struct { + unsigned char name[COLOR_NAME_LEN]; + int value; +} color_names_st; + + +#ifdef __DIALOG_MAIN__ + +/* + * For matching color names with color values + */ +color_names_st color_names[] = { + {"BLACK", COLOR_BLACK}, + {"RED", COLOR_RED}, + {"GREEN", COLOR_GREEN}, + {"YELLOW", COLOR_YELLOW}, + {"BLUE", COLOR_BLUE}, + {"MAGENTA", COLOR_MAGENTA}, + {"CYAN", COLOR_CYAN}, + {"WHITE", COLOR_WHITE}, +}; /* color names */ + + +/* + * Table of color values + */ +int color_table[][3] = { + {SCREEN_FG, SCREEN_BG, SCREEN_HL }, + {SHADOW_FG, SHADOW_BG, SHADOW_HL }, + {DIALOG_FG, DIALOG_BG, DIALOG_HL }, + {TITLE_FG, TITLE_BG, TITLE_HL }, + {BORDER_FG, BORDER_BG, BORDER_HL }, + {BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL }, + {BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL }, + {BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL }, + {BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG, BUTTON_KEY_INACTIVE_HL }, + {BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG, BUTTON_LABEL_ACTIVE_HL }, + {BUTTON_LABEL_INACTIVE_FG,BUTTON_LABEL_INACTIVE_BG,BUTTON_LABEL_INACTIVE_HL}, + {INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL }, + {INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL }, + {SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL }, + {SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL }, + {SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL }, + {POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL }, + {MENUBOX_FG, MENUBOX_BG, MENUBOX_HL }, + {MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL }, + {ITEM_FG, ITEM_BG, ITEM_HL }, + {ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL }, + {TAG_FG, TAG_BG, TAG_HL }, + {TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL }, + {TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL }, + {TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL }, + {CHECK_FG, CHECK_BG, CHECK_HL }, + {CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL }, + {UARROW_FG, UARROW_BG, UARROW_HL }, + {DARROW_FG, DARROW_BG, DARROW_HL }, +}; /* color_table */ + +#else + +extern color_names_st color_names[]; +extern int color_table[][3]; + +#endif /* __DIALOG_MAIN__ */ diff --git a/gnu/lib/libodialog/dialog.3 b/gnu/lib/libodialog/dialog.3 new file mode 100644 index 0000000..2e4b8fb --- /dev/null +++ b/gnu/lib/libodialog/dialog.3 @@ -0,0 +1,842 @@ +.\" +.\" Copyright (c) 1995, Jordan Hubbard +.\" +.\" All rights reserved. +.\" +.\" This manual page may be used, modified, copied, distributed, and +.\" sold, in both source and binary form provided that the above +.\" copyright and these terms are retained, verbatim, as the first +.\" lines of this file. Under no circumstances is the author +.\" responsible for the proper functioning of the software described herein +.\" nor does the author assume any responsibility for damages incurred with +.\" its use. +.\" +.\" $FreeBSD$ +.\" +.Dd January 1, 2000 +.Dt DIALOG 3 +.Os +.Sh NAME +.Nm draw_shadow , +.Nm draw_box , +.Nm line_edit , +.Nm strheight , +.Nm strwidth , +.Nm dialog_create_rc , +.Nm dialog_yesno , +.Nm dialog_noyes , +.Nm dialog_prgbox , +.Nm dialog_msgbox , +.Nm dialog_textbox , +.Nm dialog_menu , +.Nm dialog_checklist , +.Nm dialog_radiolist , +.Nm dialog_inputbox , +.Nm dialog_clear_norefresh , +.Nm dialog_clear , +.Nm dialog_update , +.Nm dialog_fselect , +.Nm dialog_notify , +.Nm dialog_mesgbox , +.Nm dialog_gauge , +.Nm init_dialog , +.Nm end_dialog , +.Nm use_helpfile , +.Nm use_helpline , +.Nm get_helpline , +.Nm restore_helpline , +.Nm dialog_ftree , +.Nm dialog_tree +.Nd provide a simple ncurses-based GUI interface +.Sh SYNOPSIS +.In dialog.h +.Ft "void" +.Fn draw_shadow "WINDOW *win" "int y" "int x" "int height" "int width" +.Ft "void" +.Fn draw_box "WINDOW *win" "int y" "int x" "int height" "int width" "chtype box" "chtype border" +.Ft "int" +.Fo line_edit +.Fa "WINDOW *dialog" +.Fa "int box_y" +.Fa "int box_x" +.Fa "int flen" +.Fa "int box_width" +.Fa "chtype attr" +.Fa "int first" +.Fa "unsigned char *result" +.Fa "int attr_mask" +.Fc +.Ft "int" +.Fn strheight "const char *p" +.Ft "int" +.Fn strwidth "const char *p" +.Ft "void" +.Fn dialog_create_rc "unsigned char *filename" +.Ft "int" +.Fn dialog_yesno "unsigned char *title" "unsigned char *prompt" "int height" "int width" +.Ft "int" +.Fn dialog_noyes "unsigned char *title" "unsigned char *prompt" "int height" "int width" +.Ft "int" +.Fn dialog_prgbox "unsigned char *title" "const unsigned char *line" "int height" "int width" "int pause" "int use_shell" +.Ft "int" +.Fn dialog_textbox "unsigned char *title" "unsigned char *file" "int height" "int width" +.Ft "int" +.Fo dialog_menu +.Fa "unsigned char *title" +.Fa "unsigned char *prompt" +.Fa "int height" +.Fa "int width" +.Fa "int menu_height" +.Fa "int cnt" +.Fa "void *it" +.Fa "unsigned char *result" +.Fa "int *ch" +.Fa "int *sc" +.Fc +.Ft "int" +.Fn dialog_checklist "unsigned char *title" "unsigned char *prompt" "int height" "int width" "int list_height" "int cnt" "void *it" "unsigned char *result" +.Ft "int" +.Fn dialog_radiolist "unsigned char *title" "unsigned char *prompt" "int height" "int width" "int list_height" "int cnt" "void *it" "unsigned char *result" +.Ft "int" +.Fn dialog_inputbox "unsigned char *title" "unsigned char *prompt" "int height" "int width" "unsigned char *result" +.Ft "char *" +.Fn dialog_fselect "char *dir" "char *fmask" +.Ft "int" +.Fn dialog_dselect "char *dir" "char *fmask" +.Ft "void" +.Fn dialog_notify "char *msg" +.Ft "int" +.Fn dialog_mesgbox "unsigned char *title" "unsigned char *prompt" "int height" "int width" +.Ft "void" +.Fn dialog_gauge "char *title" "char *prompt" "int y" "int x" "int height" "int width" "int perc" +.Ft "void" +.Fn use_helpfile "char *hfile" +.Ft "void" +.Fn use_helpline "char *hline" +.Ft "char *" +.Fn get_helpline "void" +.Ft "void" +.Fn dialog_clear_norefresh "void" +.Ft "void" +.Fn dialog_clear "void" +.Ft "void" +.Fn dialog_update "void" +.Ft "void" +.Fn init_dialog "void" +.Ft "void" +.Fn end_dialog "void" +.Ft "int" +.Fn dialog_ftree "unsigned char *filename" "unsigned char FS" "unsigned char *title" "unsigned char *prompt" "int height" "int width" "int menu_height" "unsigned char **result" +.Ft "int" +.Fo dialog_tree +.Fa "unsigned char **names" +.Fa "int size" +.Fa "unsigned char FS" +.Fa "unsigned char *title" +.Fa "unsigned char *prompt" +.Fa "int height" +.Fa "int width" +.Fa "int menu_height" +.Fa "unsigned char **result" +.Fc +.Sh DESCRIPTION +The dialog library attempts to provide a fairly simplistic set of +fixed-presentation menus, input boxes, gauges, file requestors and +other general purpose GUI (a bit of a stretch, since it uses +ncurses) objects. +Since the library also had its roots in a +shell-script writer's utility (see the +.Xr dialog 1 +command), the +early API was somewhat primitively based on strings being passed in or +out and parsed. +This API was later extended to take either the +original arguments or arrays of +.Va dialogMenuItem +structures, +giving the user much more control over the internal behavior of each +control. +The +.Va dialogMenuItem +structure internals are public: +.Bd -literal -offset indent +typedef struct _dmenu_item { + char *prompt; + char *title; + int (*checked)(struct _dmenu_item *self); + int (*fire)(struct _dmenu_item *self); + int (*selected)(struct _dmenu_item *self, int is_selected); + void *data; + char lbra, mark, rbra; + long aux; +} dialogMenuItem; +.Ed +.Pp +The +.Dv prompt +and +.Dv title +strings are pretty much self-explanatory, +and the +.Va checked +and +.Va fire +function pointers provide optional +display and action hooks (the +.Dv data +variable being available for +the convenience of those hooks) when more tightly coupled feedback between +a menu object and user code is required. +The +.Va selected +hook also +allows you to verify whether or not a given item is selected (the cursor is +over it) for implementing pretty much any possible context-sensitive +behavior. +A number of clever tricks for simulating various kinds of item +types can also be done by adjusting the values of +.Va lbra +(default: '['), +.Va mark +(default: '*' for radio menus, 'X' for check menus) +and +.Va rbra +(default: ']') and declaring a reasonable +.Va checked +hook, +which should return TRUE for the +.Dq marked +state and FALSE for +.Dq unmarked . +The +.Va aux +field is not used internally, and is available for miscellaneous usage. +If an item has a +.Va fire +hook associated with it, it will also be called +whenever the item is "toggled" in some way and should return one of the +following codes: +.Bd -literal -offset 4n +#define DITEM_SUCCESS 0 /* Successful completion */ +#define DITEM_FAILURE 1 /* Failed to "fire" */ +.Ed +.Pp +The following flags are in the upper 16 bits of return status: +.Bd -literal -offset 4n +#define DITEM_LEAVE_MENU (1 << 16) +#define DITEM_REDRAW (1 << 17) +#define DITEM_RECREATE (1 << 18) +#define DITEM_RESTORE (1 << 19) +#define DITEM_CONTINUE (1 << 20) +.Ed +.Pp +Two special globals also exist for putting a dialog at any arbitrary +X,Y location (the early designers rather short-sightedly made no provisions +for this). +If set to zero, the default centering behavior will be in +effect. +.Pp +Below is a short description of the various functions: +.Pp +The +.Fn draw_shadow +function draws a shadow in curses window +.Va win +using the dimensions of +.Va x , y , width +and +.Va height . +.Pp +The +.Fn draw_box +function draws a bordered box using the dimensions of +.Va x , y , width +and +.Va height . +The attributes from +.Va box +and +.Va border +are used, if specified, while painting the box and border regions of the +object. +.Pp +The +.Fn line_edit +function invokes a simple line editor with an edit box of dimensions +.Va box_x , box_y +and +.Va box_width . +The field length is constrained by +.Va flen , +starting at the +.Va first +character specified and +optionally displayed with character attributes +.Va attr . +The string being edited is stored in +.Va result . +Returns 0 on success, 1 on Cancel, and -1 on failure or ESC. +.Pp +The +.Fn strheight +function returns the height of string in +.Va p , +counting newlines. +.Pp +The +.Fn strwidth +function returns the width of string in +.Va p , +counting newlines. +.Pp +The +.Fn dialog_create_rc +function dumps dialog library settings into +.Pa filename +for later retrieval as defaults. +Returns 0 on success, -1 on failure. +.Pp +The +.Fn dialog_yesno +function displays a text box using +.Va title +and +.Va prompt +strings of dimensions +.Va height +and +.Va width . +Also paint a pair of +.Em Yes +and +.Em \&No +buttons at the bottom. +The default selection is +.Em Yes . +If the +.Em Yes +button is chosen, return FALSE. +If +.Em \&No , +return TRUE. +.Pp +The +.Fn dialog_noyes +function is the same as +.Fn dialog_yesno , +except the default selection is +.Em \&No . +.Pp +The +.Fn dialog_prgbox +function displays a text box of dimensions +.Va height +and +.Va width +containing the output of command +.Va line . +If +.Va use_shell +is TRUE, +.Va line +is passed as an argument to +.Xr sh 1 , +otherwise it is simply passed to +.Xr exec 3 . +If +.Va pause +is TRUE, a final confirmation requestor will be put up when execution +terminates. +Returns 0 on success, -1 on failure. +.Pp +The +.Fn dialog_textbox +function displays a text box containing the contents of +.Va file +with dimensions of +.Va height +and +.Va width . +.Pp +The +.Fn dialog_menu +function displays a menu of dimensions +.Va height +and +.Va width +with an optional internal menu height of +.Va menu_height . +The +.Va cnt +and +.Va it +arguments are of particular importance since they, +together, determine which of the 2 available APIs to use. +To use the +older and traditional interface, +.Va cnt +should be a positive +integer representing the number of string pointer pairs to find in +.Va it +(which should be of type +.Ft char "**" ) , +the strings are +expected to be in prompt and title order for each item and the +.Va result +parameter is expected to point to an array where the +prompt string of the item selected will be copied. +To use the newer +interface, +.Va cnt +should be a +.Va negative +integer representing the number of +.Va dialogMenuItem +structures pointed to by +.Va it +(which should be of type +.Vt dialogMenuItem "*" ) , +one structure per item. +In the new interface, the +.Va result +variable is used as a simple boolean (not a pointer) and should be NULL if +.Va it +only points to menu items and the default OK and Cancel buttons are desired. +If +.Va result +is non-NULL, then +.Va it +is actually expected to point 2 locations +.Va past +the start of the menu item list. +.Va it +is then expected to +point to an item representing the Cancel button, from which the +.Va prompt +and +.Va fire +actions are used to override the default behavior, and +.Va it +to the same for the OK button. +.Pp +Using either API behavior, the +.Va ch +and +.Va sc +values may be passed in to preserve current +item selection and scroll position values across calls. +.Pp +The +.Fn dialog_checklist +function displays a menu of dimensions +.Va height +and +.Va width +with an +optional internal menu height of +.Va list_height . +The +.Va cnt +and +.Va it +arguments are of particular importance since they, +together, determine which of the 2 available APIs to use. +To use the +older and traditional interface, +.Va cnt +should be a positive +integer representing the number of string pointer tuples to find in +.Va it +(which should be of type +.Ft "char **" ) , +the strings are +expected to be in prompt, title and state ("on" or "off") order for +each item and the +.Va result +parameter is expected to point to an +array where the prompt string of the item(s) selected will be +copied. +To use the newer interface, +.Va cnt +should be a +.Em negative +integer representing the number of +.Ft dialogMenuItem +structures pointed to by +.Va it +(which should be of type +.Ft "dialogMenuItem *" ) , +one structure per item. +In the new interface, +the +.Va result +variable is used as a simple boolean (not a pointer) +and should be NULL if +.Va it +only points to menu items and the default OK and Cancel +buttons are desired. +If +.Va result +is non-NULL, then +.Va it +is actually expected to +point 2 locations +.Va past +the start of the menu item list. +.Va it +is then expected to point to an item representing the Cancel +button, from which the +.Va prompt +and +.Va fire +actions are used to override the default behavior, and +.Va it +to the same for the OK button. +.Pp +In the standard API model, the menu supports the selection of multiple items, +each of which is marked with an `X' character to denote selection. +When +the OK button is selected, the prompt values for all items selected are +concatenated into the +.Va result +string. +.Pp +In the new API model, it is not actually necessary to preserve +"checklist" semantics at all since practically everything about how +each item is displayed or marked as "selected" is fully configurable. +You could have a single checklist menu that actually contained a group +of items with "radio" behavior, "checklist" behavior and standard menu +item behavior. +The only reason to call +.Fn dialog_checklist +over +.Fn dialog_radiolist +in the new API model is to inherit the base +behavior, you are no longer constrained by it. +.Pp +Returns 0 on success, 1 on Cancel, and -1 on failure or ESC. +.Pp +The +.Fn dialog_radiolist +function displays a menu of dimensions +.Va height +and +.Va width +with an +optional internal menu height of +.Va list_height . +The +.Va cnt +and +.Va it +arguments are of particular importance since they, +together, determine which of the 2 available APIs to use. +To use the +older and traditional interface, +.Va cnt +should be a positive +integer representing the number of string pointer tuples to find in +.Va it +(which should be of type +.Ft "char **" ) , +the strings are +expected to be in prompt, title and state ("on" or "off") order for +each item and the +.Va result +parameter is expected to point to an +array where the prompt string of the item(s) selected will be +copied. +To use the newer interface, +.Va cnt +should be a +.Dv negative +integer representing the number of +.Ft dialogMenuItem +structures pointed to by +.Va it +(which should be of type +.Ft "dialogMenuItem *" , +one structure per item. +In the new interface, +the +.Va result +variable is used as a simple boolean (not a pointer) +and should be NULL if +.Va it +only points to menu items and the default OK and Cancel +buttons are desired. +If +.Va result +is non-NULL, then +.Va it +is actually expected to point 2 locations +.Va past +the start of the menu item list. +.Va it +is then expected to point to an item representing the Cancel +button, from which the +.Va prompt +and +.Va fire +actions are used to override the default behavior, and +.Va it +does the same for the traditional OK button. +.Pp +In the standard API model, the menu supports the selection of only one +of multiple items, the currently active item marked with an `*' +character to denote selection. +When the OK button is selected, the +prompt value for this item is copied into the +.Va result +string. +.Pp +In the new API model, it is not actually necessary to preserve +"radio button" semantics at all since practically everything about how +each item is displayed or marked as "selected" is fully configurable. +You could have a single radio menu that actually contained a group +of items with "checklist" behavior, "radio" behavior and standard menu +item behavior. +The only reason to call +.Fn dialog_radiolist +over +.Fn dialog_checklistlist +in the new API model is to inherit the base +behavior. +.Pp +Returns 0 on success, 1 on Cancel and -1 on failure or ESC. +.Pp +The +.Fn dialog_inputbox +function displays a single-line text input field in a box displaying +.Va title +and +.Va prompt +of dimensions +.Va height +and +.Va width . +The field entered is stored in +.Va result . +.Pp +Returns 0 on success, -1 on failure or ESC. +.Pp +The +.Fn dialog_fselect +function brings up a file selector dialog starting at +.Va dir +and showing only those file names +matching +.Va fmask . +.Pp +Returns filename selected or NULL. +.Pp +The +.Fn dialog_dselect +function brings up a directory selector dialog starting at +.Va dir +and showing only those directory names +matching +.Va fmask . +.Pp +Returns directory name selected or NULL. +.Pp +The +.Fn dialog_notify +function brings up a generic "hey, you!" notifier dialog containing +.Va msg . +.Pp +The +.Fn dialog_mesgbox +function displays a notifier dialog, but with more control over +.Va title , +.Va prompt , +.Va width +and +.Va height . +This object will also wait for user confirmation, unlike +.Fn dialog_notify . +.Pp +Returns 0 on success, -1 on failure. +.Pp +The +.Fn dialog_gauge +function displays a horizontal bar-graph style gauge. +A value of +.Em 100 +for +.Em perc +constitutes a full gauge, a value of +.Em 0 +an empty one. +.Pp +The +.Fn use_helpfile +function for any menu supporting context sensitive help, invokes the text box +object on this file whenever the +.Em F1 +key is pressed. +.Pp +The +.Fn use_helpline +function displays this line of helpful text below any menu being displayed. +.Pp +The +.Fn get_helpline +function gets the current value of the helpful text line. +.Pp +The +.Fn dialog_clear_norefresh +function clears the screen back to the dialog background color, but do not +refresh the contents just yet. +.Pp +The +.Fn dialog_clear +function clears the screen back to the dialog background color immediately. +.Pp +The +.Fn dialog_update +function does any pending screen refreshes now. +.Pp +The +.Fn init_dialog +function initializes the dialog library (call this routine before any other +dialog API calls). +.Pp +The +.Fn end_dialog +function shuts down the dialog library (call this if you need to get back to +sanity). +.Pp +The +.Fn dialog_ftree +function shows a tree described by the data from the file +.Pa filename . +The data in the file should look like +.Xr find 1 +output. +For the +.Xr find 1 +output, the field separator +.Va FS +will be +.Dq \&/ . +If +.Va height +and +.Va width +are positive numbers, they set the absolute +size of the whole +.Fn dialog_ftree +box. +If +.Va height +and +.Va width +are negative numbers, the size of the +.Fn dialog_ftree +box will be calculated automatically. +.Va menu_height +sets the height of the tree subwindow inside the +.Fn dialog_ftree +box and must be set. +.Va title +is shown centered on the upper border of the +.Fn dialog_ftree +box. +.Va prompt +is shown inside the +.Fn dialog_ftree +box above the tree subwindow and can contain +.Ql \e\&n +to split lines. +One can navigate in +the tree by pressing UP/DOWN or +.Sm off +.So \&+ Sc \&/ So \&- Sc , +.Sm on +PG_UP/PG_DOWN or +.Sm off +.So b Sc \&/SPACE +.Sm on +and +HOME/END or +.Sm off +.So g Sc \&/ So G Sc . +.Sm on +A leaf of the +tree is selected by pressing TAB or LEFT/RIGHT the OK +button and pressing ENTER. +filename may contain data like +.Xr find 1 +output, as well as like the output of +.Xr find 1 +with +.Fl d +option. +Some of the transient paths to the leaves of the tree may +be absent. +Such data is corrected when fed from filename. +.Pp +The function returns 0 and a pointer to the selected leaf (to the path to +the leaf from the root of the tree) into result, if the OK button was +selected. +The memory allocated for the building of the tree is freed on +exiting +.Fn dialog_ftree . +The memory for the result line should be freed +later manually, if necessary. +If the Cancel button was selected, the +function returns 1. +In case of exiting +.Fn dialog_ftree +on ESC, the function returns -1. +.Pp +The +.Fn dialog_tree +function returns the same results as +.Fn dialog_ftree . +If 0 is returned, result will contain a pointer from the array +.Va names . +.\" \fBdialog_tree\fR displays the tree very much like \fBdialog_ftree\fR does, +.\" with some exceptions. The source data for the building of the tree is an +.\" array \fBnames\fR of paths to the leaves (should be similar to \fBfind(1)\fR +.\" output) of the size \fBsize\fR. However, there is no correction of data like +.\" in \fBdialog_ftree\fR. Thus, to display a correct tree, the array must +.\" already contain correct data. Besides, in each session every unique use of +.\" \fBdialog_tree\fR is kept in memory, and later, when calling +.\" \fBdialog_tree\fR with the same \fBnames\fR, \fBsize\fR, \fBFS\fR, +.\" \fBheight\fR, \fBwidth\fR and \fBmenu_height\fR the position of the cursor +.\" in the tree subwindow is restored. +.Sh SEE ALSO +.Xr dialog 1 , +.Xr ncurses 3 +.Sh HISTORY +These functions appeared in +.Fx 2.0 +as the +.Xr dialog 1 +command and were soon split into a separate library +and command by +.An Andrey Chernov . +.An Marc van Kempen +implemented most of the extra controls and objects, +.An Jordan Hubbard +added the dialogMenuItem renovations and this man page and +.An Anatoly A. Orehovsky +implemented +.Fn dialog_ftree +and +.Fn dialog_tree . +.Sh AUTHORS +.An -nosplit +The primary author would appear to be +.An Savio Lam Aq lam836@cs.cuhk.hk +with contributions over the years by +.An Stuart Herbert Aq S.Herbert@sheffield.ac.uk , +.An Marc van Kempen Aq wmbfmk@urc.tue.nl , +.An Andrey Chernov Aq ache@FreeBSD.org , +.An Jordan Hubbard Aq jkh@FreeBSD.org +and +.An Anatoly A. Orehovsky Aq tolik@mpeks.tomsk.su . +.Sh BUGS +Sure! diff --git a/gnu/lib/libodialog/dialog.h b/gnu/lib/libodialog/dialog.h new file mode 100644 index 0000000..369b139 --- /dev/null +++ b/gnu/lib/libodialog/dialog.h @@ -0,0 +1,211 @@ +#ifndef _DIALOG_H_INCLUDE +#define _DIALOG_H_INCLUDE + +/* + * dialog.h -- common declarations for all dialog modules + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * Substantial rennovation: 12/18/95, Jordan K. Hubbard + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * $FreeBSD$ + * + */ + +#define HAVE_NCURSES + +#ifdef HAVE_NCURSES +#include + +#else + +#ifdef ultrix +#include +#else +#include +#endif + +#endif + +/* special return codes for `fire' actions */ +#define DITEM_STATUS(flag) ((flag) & 0x0000FFFF) +#define DITEM_SUCCESS 0 +#define DITEM_FAILURE 1 + +/* Flags - returned in upper 16 bits of return status */ +#define DITEM_LEAVE_MENU (1 << 16) +#define DITEM_REDRAW (1 << 17) +#define DITEM_RECREATE (1 << 18) +#define DITEM_RESTORE (1 << 19) +#define DITEM_CONTINUE (1 << 20) + +/* Attributes as used by entry fields right now */ +#define DITEM_NO_ECHO 0x0001 + + +/* negative offsets for buttons in item lists, if specified */ +#define OK_BUTTON -2 +#define CANCEL_BUTTON -1 + +/* for use in describing more exotic behaviors */ +typedef struct _dmenu_item { + char *prompt; + char *title; + int (*checked)(struct _dmenu_item *self); + int (*fire)(struct _dmenu_item *self); + void (*selected)(struct _dmenu_item *self, int is_selected); + void *data; + char lbra, mark, rbra; + long aux; +} dialogMenuItem; + +#define VERSION "0.4" +#define MAX_LEN 4096 + +#ifndef TRUE +#define TRUE (1) +#endif +#ifndef FALSE +#define FALSE (0) +#endif + +extern int DialogX, DialogY, DialogInputAttrs; + +/* + * Attribute names + */ +#define screen_attr attributes[0] +#define shadow_attr attributes[1] +#define dialog_attr attributes[2] +#define title_attr attributes[3] +#define border_attr attributes[4] +#define button_active_attr attributes[5] +#define button_inactive_attr attributes[6] +#define button_key_active_attr attributes[7] +#define button_key_inactive_attr attributes[8] +#define button_label_active_attr attributes[9] +#define button_label_inactive_attr attributes[10] +#define inputbox_attr attributes[11] +#define inputbox_border_attr attributes[12] +#define searchbox_attr attributes[13] +#define searchbox_title_attr attributes[14] +#define searchbox_border_attr attributes[15] +#define position_indicator_attr attributes[16] +#define menubox_attr attributes[17] +#define menubox_border_attr attributes[18] +#define item_attr attributes[19] +#define item_selected_attr attributes[20] +#define tag_attr attributes[21] +#define tag_selected_attr attributes[22] +#define tag_key_attr attributes[23] +#define tag_key_selected_attr attributes[24] +#define check_attr attributes[25] +#define check_selected_attr attributes[26] +#define uarrow_attr attributes[27] +#define darrow_attr attributes[28] + +/* number of attributes */ +#define ATTRIBUTE_COUNT 29 + +extern chtype attributes[]; + +#ifdef HAVE_NCURSES +extern bool use_shadow; +void draw_shadow(WINDOW *win, int y, int x, int height, int width); +#endif +void draw_box(WINDOW *win, int y, int x, int height, int width, chtype box, chtype border); +int line_edit(WINDOW *dialog, int box_y, int box_x, int flen, int box_width, chtype attrs, int first, unsigned char *result, int attr_mask); +int strheight(const char *p); +int strwidth(const char *p); + +void dialog_create_rc(unsigned char *filename); +int dialog_yesno(unsigned char *title, unsigned char *prompt, int height, int width); +int dialog_noyes(unsigned char *title, unsigned char *prompt, int height, int width); +int dialog_prgbox(unsigned char *title, const unsigned char *line, int height, int width, int pause, int use_shell); +int dialog_msgbox(unsigned char *title, unsigned char *prompt, int height, int width, int pause); +int dialog_textbox(unsigned char *title, unsigned char *file, int height, int width); +int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int width, int menu_height, + int item_no, void *itptr, unsigned char *result, int *ch, int *sc); +int dialog_checklist(unsigned char *title, unsigned char *prompt, int height, int width, int list_height, + int item_no, void *itptr, unsigned char *result); +int dialog_radiolist(unsigned char *title, unsigned char *prompt, int height, int width, int list_height, + int item_no, void *itptr, unsigned char *result); +int dialog_inputbox(unsigned char *title, unsigned char *prompt, int height, int width, unsigned char *result); +void dialog_clear_norefresh(void); +void dialog_clear(void); +void dialog_update(void); +void init_dialog(void); +void end_dialog(void); + +/* Additions to libdialog */ +char *dialog_fselect(char *dir, char *fmask); +int dialog_dselect(char *dir, char *fmask); +void dialog_notify(char *msg); +int dialog_mesgbox(unsigned char *title, unsigned char *prompt, int height, int width); +void use_helpfile(char *helpfile); +void use_helpline(char *helpline); +char *get_helpline(void); +void restore_helpline(char *helpline); +void dialog_gauge(char *title, char *prompt, int y, int x, int height, int width, int perc); + +/* + * Display a tree menu from file + * + * filename - file with like find(1) output + * FS - fields separator + * title - title of dialog box + * prompt - prompt text into dialog box + * height - height of dialog box + * width - width of dialog box + * menu_height - height of menu box + * result - pointer to char array + * + * return values: + * -1 - ESC pressed + * 0 - Ok, result set (must be freed later) + * 1 - Cancel + */ +int dialog_ftree(unsigned char *filename, unsigned char FS, + unsigned char *title, unsigned char *prompt, + int height, int width, int menu_height, + unsigned char **result); + +/* + * Display a tree menu from array + * + * names - array with like find(1) output + * size - size of array + * FS - fields separator + * title - title of dialog box + * prompt - prompt text into dialog box + * height - height of dialog box + * width - width of dialog box + * menu_height - height of menu box + * result - pointer to char array + * + * return values: + * -1 - ESC pressed + * 0 - Ok, result set + * 1 - Cancel + */ + +int dialog_tree(unsigned char **names, int size, unsigned char FS, + unsigned char *title, unsigned char *prompt, + int height, int width, int menu_height, + unsigned char **result); + +#endif /* _DIALOG_H_INCLUDE */ diff --git a/gnu/lib/libodialog/dialog.priv.h b/gnu/lib/libodialog/dialog.priv.h new file mode 100644 index 0000000..06c01a5 --- /dev/null +++ b/gnu/lib/libodialog/dialog.priv.h @@ -0,0 +1,183 @@ +/* + * dialog.h -- common declarations for all dialog modules + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +#include +#include +#include +#include +#include +#include +#include + +#if defined(LOCALE) +#include +#endif + + +/* + * Change these if you want + */ +#define USE_SHADOW TRUE +#define USE_COLORS TRUE + +#define ESC 27 +#define TAB 9 +#define BUF_SIZE (10*1024) + +#ifndef MIN +#define MIN(x,y) (x < y ? x : y) +#endif +#ifndef MAX +#define MAX(x,y) (x > y ? x : y) +#endif + +#ifndef ctrl +#define ctrl(a) ((a) - 'a' + 1) +#endif + +#ifndef HAVE_NCURSES +#ifndef ACS_ULCORNER +#define ACS_ULCORNER '+' +#endif +#ifndef ACS_LLCORNER +#define ACS_LLCORNER '+' +#endif +#ifndef ACS_URCORNER +#define ACS_URCORNER '+' +#endif +#ifndef ACS_LRCORNER +#define ACS_LRCORNER '+' +#endif +#ifndef ACS_HLINE +#define ACS_HLINE '-' +#endif +#ifndef ACS_VLINE +#define ACS_VLINE '|' +#endif +#ifndef ACS_LTEE +#define ACS_LTEE '+' +#endif +#ifndef ACS_RTEE +#define ACS_RTEE '+' +#endif +#ifndef ACS_UARROW +#define ACS_UARROW '^' +#endif +#ifndef ACS_DARROW +#define ACS_DARROW 'v' +#endif +#endif /* HAVE_NCURSES */ + +/* Travel key conventions */ +#define KEY_IS_UP(key) ((key) == KEY_UP || (key) == '-' || key == '\020' /* ^P */) +#define KEY_IS_DOWN(key) ((key) == KEY_DOWN || (key) == '+' || key == '\016' /* ^N */) + +/* + * Global variables + */ +#ifdef __DIALOG_MAIN__ + +#ifdef HAVE_NCURSES + +/* use colors by default? */ +bool use_colors = USE_COLORS; + +/* shadow dialog boxes by default? + Note that 'use_shadow' implies 'use_colors' */ +bool use_shadow = USE_SHADOW; + +#endif + + +/* + * Attribute values, default is for mono display + */ +chtype attributes[] = { + A_NORMAL, /* screen_attr */ + A_NORMAL, /* shadow_attr */ + A_REVERSE, /* dialog_attr */ + A_REVERSE, /* title_attr */ + A_REVERSE, /* border_attr */ + A_BOLD, /* button_active_attr */ + A_DIM, /* button_inactive_attr */ + A_UNDERLINE, /* button_key_active_attr */ + A_UNDERLINE, /* button_key_inactive_attr */ + A_NORMAL, /* button_label_active_attr */ + A_NORMAL, /* button_label_inactive_attr */ + A_REVERSE, /* inputbox_attr */ + A_REVERSE, /* inputbox_border_attr */ + A_REVERSE, /* searchbox_attr */ + A_REVERSE, /* searchbox_title_attr */ + A_REVERSE, /* searchbox_border_attr */ + A_REVERSE, /* position_indicator_attr */ + A_REVERSE, /* menubox_attr */ + A_REVERSE, /* menubox_border_attr */ + A_REVERSE, /* item_attr */ + A_NORMAL, /* item_selected_attr */ + A_REVERSE, /* tag_attr */ + A_REVERSE, /* tag_selected_attr */ + A_NORMAL, /* tag_key_attr */ + A_BOLD, /* tag_key_selected_attr */ + A_REVERSE, /* check_attr */ + A_REVERSE, /* check_selected_attr */ + A_REVERSE, /* uarrow_attr */ + A_REVERSE /* darrow_attr */ +}; + +#else + +#ifdef HAVE_NCURSES +extern bool use_colors; +#endif + +#endif /* __DIALOG_MAIN__ */ + + + +#ifdef HAVE_NCURSES + +/* + * Function prototypes + */ +#ifdef __DIALOG_MAIN__ + +extern int parse_rc(void); + +#endif /* __DIALOG_MAIN__ */ + +#endif + + +#ifdef HAVE_NCURSES +void color_setup(void); +#endif + +void attr_clear(WINDOW *win, int height, int width, chtype attr); +void print_autowrap(WINDOW *win, unsigned char *prompt, int height, int width, int maxwidth, + int y, int x, int center, int rawmode); +void print_button(WINDOW *win, unsigned char *label, int y, int x, int selected); +FILE *raw_popen(const char *program, char * const *argv, const char *type); +int raw_pclose(FILE *iop); +void display_helpfile(void); +void display_helpline(WINDOW *w, int y, int width); +void print_arrows(WINDOW *dialog, int scroll, int menu_height, int item_no, int box_x, + int box_y, int tag_x, int cur_x, int cur_y); + diff --git a/gnu/lib/libodialog/dir.c b/gnu/lib/libodialog/dir.c new file mode 100644 index 0000000..5348c2f --- /dev/null +++ b/gnu/lib/libodialog/dir.c @@ -0,0 +1,549 @@ +/**************************************************************************** + * + * Program: dir.c + * Author: Marc van Kempen + * desc: Directory routines, sorting and reading + * + * Copyright (c) 1995, Marc van Kempen + * + * All rights reserved. + * + * This software may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of this software, nor does + * the author assume any responsibility for damages incurred with + * its use. + * + ****************************************************************************/ + +#include +#include + +#include /* XXX for _POSIX_VERSION ifdefs */ + +#if !defined sgi && !defined _POSIX_VERSION +#include +#endif +#if defined __sun__ +#include +#endif +#if defined sgi || defined _POSIX_VERSION +#include +#endif + +#include +#include +#include +#include +#include +#include "dir.h" + +/**************************************************************************** + * + * local prototypes + * + ****************************************************************************/ + +void toggle_dotfiles(void); +int show_dotfiles(void); +int dir_alphasort(const void *d1, const void *d2); +int dir_sizesort(const void *d1, const void *d2); +int dir_datesort(const void *d1, const void *d2); +int dir_extsort(const void *d1, const void *d2); + +/**************************************************************************** + * + * global variables + * + ****************************************************************************/ + + +/* This is user-selectable, I've set them fixed for now however */ + +void *_sort_func = dir_alphasort; +static int _showdotfiles = TRUE; + +/**************************************************************************** + * + * Functions + * + ****************************************************************************/ + +int +dir_select_nd( +#if defined __linux__ + const struct dirent *d +#else + struct dirent *d +#endif +) +/* + * desc: allways include a directory entry , except + * for the current directory and other dot-files + * keep '..' however. + * pre: points to a dirent + * post: returns TRUE if d->d_name != "." else FALSE + */ +{ + if (strcmp(d->d_name, ".")==0 || + (d->d_name[0] == '.' && strlen(d->d_name) > 1 && d->d_name[1] != '.')) { + return(FALSE); + } else { + return(TRUE); + } +}/* dir_select_nd() */ + + +int +dir_select( +#ifdef __linux__ + const struct dirent *d +#else + struct dirent *d +#endif +) +/* + * desc: allways include a directory entry , except + * for the current directory + * pre: points to a dirent + * post: returns TRUE if d->d_name != "." else FALSE + */ +{ + if (strcmp(d->d_name, ".")==0) { /* don't include the current directory */ + return(FALSE); + } else { + return(TRUE); + } +} /* dir_select() */ + +int +dir_select_root_nd( +#ifdef __linux__ + const struct dirent *d +#else + struct dirent *d +#endif +) +/* + * desc: allways include a directory entry , except + * for the current directory and the parent directory. + * Also skip any other dot-files. + * pre: points to a dirent + * post: returns TRUE if d->d_name[0] != "." else FALSE + */ +{ + if (d->d_name[0] == '.') { /* don't include the current directory */ + return(FALSE); /* nor the parent directory */ + } else { + return(TRUE); + } +} /* dir_select_root_nd() */ + + +int +dir_select_root( +#ifdef __linux__ + const struct dirent *d +#else + struct dirent *d +#endif +) +/* + * desc: allways include a directory entry , except + * for the current directory and the parent directory + * pre: points to a dirent + * post: returns TRUE if d->d_name[0] != "." else FALSE + */ +{ + if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) { + return(FALSE); + } else { + return(TRUE); + } +}/* dir_select_root() */ + + +#ifdef NO_ALPHA_SORT +int +alphasort(const void *d1, const void *d2) +/* + * desc: a replacement for what should be in the library + */ +{ + return(strcmp(((struct dirent *) d1)->d_name, + ((struct dirent *) d2)->d_name)); +} /* alphasort() */ +#endif + +int +dir_alphasort(const void *d1, const void *d2) +/* + * desc: compare d1 and d2, but put directories always first + * put '..' always on top + * + */ +{ + DirList *f1 = ((DirList *) d1), + *f2 = ((DirList *) d2); + struct stat *s1 = &(f1->filestatus); + struct stat *s2 = &(f2->filestatus); + + /* check for '..' */ + if (strcmp(((DirList *) d1)->filename, "..") == 0) { + return(-1); + } + if (strcmp(((DirList *) d2)->filename, "..") == 0) { + return(1); + } + + /* put directories first */ + if ((s1->st_mode & S_IFDIR) && (s2->st_mode & S_IFDIR)) { + return(strcmp(f1->filename, f2->filename)); + }; + if (s1->st_mode & S_IFDIR) { + return(-1); + } + if (s2->st_mode & S_IFDIR) { + return(1); + } + return(strcmp(f1->filename, f2->filename)); + +} /* dir_alphasort() */ + + +int +dir_sizesort(const void *d1, const void *d2) +/* + * desc: compare d1 and d2, but put directories always first + * + */ +{ + DirList *f1 = ((DirList *) d1), + *f2 = ((DirList *) d2); + struct stat *s1 = &(f1->filestatus); + struct stat *s2 = &(f2->filestatus); + + /* check for '..' */ + if (strcmp(((DirList *) d1)->filename, "..") == 0) { + return(-1); + } + if (strcmp(((DirList *) d2)->filename, "..") == 0) { + return(1); + } + + /* put directories first */ + if ((s1->st_mode & S_IFDIR) && (s2->st_mode & S_IFDIR)) { + return(s1->st_size < s2->st_size ? + -1 + : + s1->st_size >= s2->st_size); + }; + if (s1->st_mode & S_IFDIR) { + return(-1); + } + if (s2->st_mode & S_IFDIR) { + return(1); + } + return(s1->st_size < s2->st_size ? + -1 + : + s1->st_size >= s2->st_size); + +} /* dir_sizesort() */ + +int +dir_datesort(const void *d1, const void *d2) +/* + * desc: compare d1 and d2 on date, but put directories always first + */ +{ + DirList *f1 = ((DirList *) d1), + *f2 = ((DirList *) d2); + struct stat *s1 = &(f1->filestatus); + struct stat *s2 = &(f2->filestatus); + + + /* check for '..' */ + if (strcmp(((DirList *) d1)->filename, "..") == 0) { + return(-1); + } + if (strcmp(((DirList *) d2)->filename, "..") == 0) { + return(1); + } + + /* put directories first */ + if ((s1->st_mode & S_IFDIR) && (s2->st_mode & S_IFDIR)) { + return(s1->st_mtime < s2->st_mtime ? + -1 + : + s1->st_mtime >= s2->st_mtime); + }; + if (s1->st_mode & S_IFDIR) { + return(-1); + } + if (s2->st_mode & S_IFDIR) { + return(1); + } + return(s1->st_mtime < s2->st_mtime ? + -1 + : + s1->st_mtime >= s2->st_mtime); + +} /* dir_datesort() */ + + +int +null_strcmp(char *s1, char *s2) +/* + * desc: compare strings allowing NULL pointers + */ +{ + if ((s1 == NULL) && (s2 == NULL)) { + return(0); + } + if (s1 == NULL) { + return(-1); + } + if (s2 == NULL) { + return(1); + } + return(strcmp(s1, s2)); +} /* null_strcmp() */ + + +int +dir_extsort(const void *d1, const void *d2) +/* + * desc: compare d1 and d2 on extension, but put directories always first + * extension = "the characters after the last dot in the filename" + * pre: d1 and d2 are pointers to DirList type records + * post: see code + */ +{ + DirList *f1 = ((DirList *) d1), + *f2 = ((DirList *) d2); + struct stat *s1 = &(f1->filestatus); + struct stat *s2 = &(f2->filestatus); + char *ext1, *ext2; + int extf, ret; + + + /* check for '..' */ + if (strcmp(((DirList *) d1)->filename, "..") == 0) { + return(-1); + } + if (strcmp(((DirList *) d2)->filename, "..") == 0) { + return(1); + } + + + /* find the first extension */ + + ext1 = f1->filename + strlen(f1->filename); + extf = FALSE; + while (!extf && (ext1 > f1->filename)) { + extf = (*--ext1 == '.'); + } + if (!extf) { + ext1 = NULL; + } else { + ext1++; + } + /* ext1 == NULL if there's no "extension" else ext1 points */ + /* to the first character of the extension string */ + + /* find the second extension */ + + ext2 = f2->filename + strlen(f2->filename); + extf = FALSE; + while (!extf && (ext2 > f2->filename)) { + extf = (*--ext2 == '.'); + } + if (!extf) { + ext2 = NULL; + } else { + ext2++; + } + /* idem as for ext1 */ + + if ((s1->st_mode & S_IFDIR) && (s2->st_mode & S_IFDIR)) { + ret = null_strcmp(ext1, ext2); + if (ret == 0) { + return(strcmp(f1->filename, f2->filename)); + } else { + return(ret); + } + }; + if (s1->st_mode & S_IFDIR) { + return(-1); + } + if (s2->st_mode & S_IFDIR) { + return(1); + } + ret = null_strcmp(ext1, ext2); + if (ret == 0) { + return(strcmp(f1->filename, f2->filename)); + } else { + return(ret); + } + +} /* dir_extsort() */ + + +void +get_dir(char *dirname, char *fmask, DirList **dir, int *n) +/* + * desc: get the files in the current directory + * pre: == NULL + * post: contains dir-entries + */ +{ + char cwd[MAXPATHLEN]; + char buf[256]; + struct dirent **dire; + struct stat status; + int i, j, nb; + long d; + + + getcwd(cwd, MAXPATHLEN); + if (strcmp(cwd, "/") == 0) { /* we are in the root directory */ + if (show_dotfiles()) { + *n = scandir(dirname, &dire, dir_select_root, alphasort); + } else { + *n = scandir(dirname, &dire, dir_select_root_nd, alphasort); + } + } else { + if (show_dotfiles()) { + *n = scandir(dirname, &dire, dir_select, alphasort); + } else { + *n = scandir(dirname, &dire, dir_select_nd, alphasort); + } + } + + /* There is the possibility that we have entered a directory */ + /* which we are not allowed to read, scandir thus returning */ + /* -1 for *n. */ + /* Actually I should also check for lack of memory, but I'll */ + /* let my application happily crash if this is the case */ + /* Solution: */ + /* manually insert the parent directory as the only */ + /* directory entry, and return. */ + + if (*n == -1) { + *n = 1; + *dir = (DirList *) malloc(sizeof(DirList)); + strcpy((*dir)[0].filename, ".."); + lstat("..", &status); + (*dir)[0].filestatus = status; + (*dir)[0].link = FALSE; + return; + } + + *dir = (DirList *) malloc( *n * sizeof(DirList) ); + d = 0; + i = 0; + j = 0; + while (j<*n) { + lstat(dire[j]->d_name, &status); + /* check if this file is to be included */ + /* always include directories, the rest is subject to fmask */ + if (S_ISDIR(status.st_mode) + || fnmatch(fmask, dire[j]->d_name, FNM_NOESCAPE) != FNM_NOMATCH) { + strcpy((*dir)[i].filename, dire[j]->d_name); + (*dir)[i].filestatus = status; + if ((S_IFMT & status.st_mode) == S_IFLNK) { /* handle links */ + (*dir)[i].link = TRUE; + stat(dire[j]->d_name, &status); + nb = readlink(dire[j]->d_name, buf, sizeof(buf) - 1); + if (nb == -1) { + printf("get_dir(): Error reading link: %s\n", dire[j]->d_name); + exit(-1); + } else { + (*dir)[i].linkname = malloc(sizeof(char) * nb + 1); + strncpy((*dir)[i].linkname, buf, nb); + (*dir)[i].linkname[nb] = 0; + } + (*dir)[i].filestatus = status; + } else { + (*dir)[i].link = FALSE; + (*dir)[i].linkname = NULL; + } + i++; + } else { + /* skip this entry */ + } + j++; + } + *n = i; + + /* sort the directory with the directory names on top */ + qsort((*dir), *n, sizeof(DirList), _sort_func); + + /* Free the allocated memory */ + for (i=0; i<*n; i++) { + free(dire[i]); + } + free(dire); + + return; +}/* get_dir() */ + + +void +FreeDir(DirList *d, int n) +/* + * desc: free the dirlist d + * pre: d != NULL + * post: memory allocated to d has been released + */ +{ + int i; + + if (d) { + for (i=0; i +#include +#include + +typedef struct DirList { /* structure to hold the directory entries */ + char filename[MAXNAMLEN]; /* together with the stat-info per file */ + struct stat filestatus; /* filename, or the name to which it points */ + int link; /* is it a link ? */ + char *linkname; /* the name of the file the link points to */ +} DirList; + +#ifndef TRUE +#define TRUE (1) +#endif +#ifndef FALSE +#define FALSE (0) +#endif + +void get_dir(char *dirname, char *fmask, DirList **dir, int *n); +void get_filenames(DirList *d, int n, char ***names, int *nf); +void FreeDir(DirList *d, int n); diff --git a/gnu/lib/libodialog/fselect.c b/gnu/lib/libodialog/fselect.c new file mode 100644 index 0000000..6669edc --- /dev/null +++ b/gnu/lib/libodialog/fselect.c @@ -0,0 +1,402 @@ +/* + * program: fselect.c + * author: Marc van Kempen (wmbfmk@urc.tue.nl) + * Desc: File selection routine + * + * Copyright (c) 1995, Marc van Kempen + * + * All rights reserved. + * + * This software may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of this software, nor does + * the author assume any responsibility for damages incurred with + * its use. + * + */ + +#include +#include +#include +#include +#include "ui_objects.h" +#include "dir.h" +#include "dialog.priv.h" + +/* + * Local prototypes + */ + +char *dialog_dfselect(char *dir, char *fmask, int is_fselect); + +/* + * Functions + */ + +void +get_directories(DirList *d, int n, char ***names, int *nd) +/* + * Desc: return the directorienames in as an array in + * , the # of entries in , memory allocated + * to *names should be freed when done with it. + */ +{ + int i; + + /* count the directories, which are in front */ + *nd = 0; + while ((*nd < n) && (S_ISDIR(d[*nd].filestatus.st_mode))) (*nd)++; + *names = (char **) malloc( *nd * sizeof(char *) ); + for (i=0; i<*nd; i++) { + (*names)[i] = (char *) malloc( strlen(d[i].filename) + 1); + strcpy((*names)[i], d[i].filename); + } + + return; +} /* get_directories() */ + +void +get_filenames(DirList *d, int n, char ***names, int *nf) +/* + * Desc: return the filenames in as an arry in + * , the # of entries in , memory allocated + * to *names should be freed when done. + */ +{ + int nd, i; + + /* the # of regular files is the total # of files - # of directories */ + /* count the # of directories */ + nd = 0; + while ((nd < n) && (S_ISDIR(d[nd].filestatus.st_mode))) nd++; + + *names = (char **) malloc( (n-nd) * sizeof(char *) ); + *nf = n - nd; + for (i=0; i<*nf; i++) { + (*names)[i] = (char *) malloc( strlen(d[i+nd].filename) + 1); + strcpy((*names)[i], d[i+nd].filename); + } + + return; +} /* get_filenames() */ + +void +FreeNames(char **names, int n) +/* + * Desc: free the space occupied by names + */ +{ + int i; + + /* free the space occupied by names */ + for (i=0; iprev)->obj == (void *) dirs_obj)) { + obj=obj->prev; + } + break; + case SEL_ESC: + quit = TRUE; + cancel = TRUE; + break; + case KEY_F(1): + display_helpfile(); + break; + } + } + + FreeNames(names, nd); + DelObj(obj); + delwin(ds_win); + + return(cancel); + +} /* dialog_dselect() */ + +int +dialog_dselect(char *dir, char *fmask) +/* + * Desc: Choose a directory + */ +{ + if (dialog_dfselect(dir, fmask, FALSE)) { + return(FALSE); /* esc or cancel was pressed */ + } else { + return(TRUE); /* directory was selected */ + } +} /* dialog_dselect() */ + +char * +dialog_fselect(char *dir, char *fmask) +/* + * Desc: Choose a file from a directory + */ +{ + return(dialog_dfselect(dir, fmask, TRUE)); +} /* dialog_fselect() */ + +char * +dialog_dfselect(char *dir, char *fmask, int is_fselect) +/* + * Desc: choose a file from the directory , which + * initially display files with the mask + * pre: is the initial directory + * only files corresponding to the mask are displayed + * post: returns NULL if no file was selected + * else returns pointer to filename, space is allocated, should + * be freed after use. + */ +{ + DirList *d = NULL; + char msg[512]; + char **fnames, **dnames, *ret_name; + WINDOW *fs_win; + int n, nd, nf, ret; + StringObj *fm_obj, *dir_obj, *sel_obj; + char o_fm[255], o_dir[MAXPATHLEN], o_sel[MAXPATHLEN]; + char old_fmask[255], old_dir[MAXPATHLEN]; + ListObj *dirs_obj, *files_obj; + struct ComposeObj *obj = NULL, *o; + int quit, cancel; + ButtonObj *okbut_obj, *canbut_obj; + int ok_button, cancel_button; + + if (chdir(dir)) { + sprintf(msg, "Could not move into specified directory: %s", dir); + dialog_notify(msg); + return(NULL); + } + getcwd(o_dir, MAXPATHLEN); + + /* setup the fileselect-window and initialize its components */ + fs_win = newwin(LINES-2, COLS-20, 1, 10); + if (fs_win == NULL) { + endwin(); + fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", + LINES-2, COLS-20, 2, 10); + exit(1); + } + draw_box(fs_win, 0, 0, LINES-2, COLS-20, dialog_attr, border_attr); + wattrset(fs_win, dialog_attr); + if (is_fselect) { + mvwaddstr(fs_win, 0, (COLS-20)/2 - 7, " File Select "); + } else { + mvwaddstr(fs_win, 0, (COLS-20)/2 - 9, " Directory Select "); + } + draw_shadow(stdscr, 1, 10, LINES-2, COLS-20); + display_helpline(fs_win, LINES-3, COLS-20); + + /* Filemask entry */ + strcpy(o_fm, fmask); + fm_obj = NewStringObj(fs_win, "Filemask:", o_fm, 1, 2, 19, 255); + AddObj(&obj, STRINGOBJ, (void *) fm_obj); + + /* Directory entry */ + dir_obj = NewStringObj(fs_win, "Directory:", o_dir, 1, 22, COLS-44, 255); + AddObj(&obj, STRINGOBJ, (void *) dir_obj); + + /* Directory list */ + get_dir(".", fmask, &d, &n); /* read the entire directory */ + get_directories(d, n, &dnames, &nd); /* extract the dir-entries */ + if (is_fselect) { + dirs_obj = NewListObj(fs_win, "Directories:", dnames, o_dir, 5, 2, + LINES-16, (COLS-20)/2-2, nd); + } else { + dirs_obj = NewListObj(fs_win, "Directories:", dnames, o_dir, 5, 2, + LINES-12, (COLS-20)/2-2, nd); + } + AddObj(&obj, LISTOBJ, (void *) dirs_obj); + + /* Filenames list */ + get_filenames(d, n, &fnames, &nf); /* extract the filenames */ + if (is_fselect) { + files_obj = NewListObj(fs_win, "Files:", fnames, o_sel, 5, (COLS-20)/2+1, + LINES-16, (COLS-20)/2-3, nf); + } else { + files_obj = NewListObj(fs_win, "Files:", fnames, o_sel, 5, (COLS-20)/2+1, + LINES-12, (COLS-20)/2-3, nf); + } + AddObj(&obj, LISTOBJ, (void *) files_obj); + + if (is_fselect) { + /* Selection entry */ + o_sel[0] = '\0'; + sel_obj = NewStringObj(fs_win, "Selection:", o_sel, LINES-10, 2, COLS-24, 255); + AddObj(&obj, STRINGOBJ, (void *) sel_obj); + } + + /* Ok button */ + ok_button = FALSE; + okbut_obj = NewButtonObj(fs_win, "Ok", &ok_button, LINES-6, 20); + AddObj(&obj, BUTTONOBJ, (void *) okbut_obj); + + /* Cancel button */ + cancel_button = FALSE; + canbut_obj = NewButtonObj(fs_win, "Cancel", &cancel_button, LINES-6, 30); + AddObj(&obj, BUTTONOBJ, (void *) canbut_obj); + + /* Make sure all objects on the window are drawn */ + wrefresh(fs_win); + keypad(fs_win, TRUE); + + /* Start the reading */ + o = obj; + strcpy(old_fmask, o_fm); + strcpy(old_dir, o_dir); + quit = FALSE; + cancel = FALSE; + while (!quit) { + ret = PollObj(&o); + switch(ret) { + case SEL_CR: + if (strcmp(old_fmask, o_fm) || strcmp(old_dir, o_dir)) { + /* reread directory and update the listobjects */ + if (strcmp(old_dir, o_dir)) { /* dir entry was changed */ + if (chdir(o_dir)) { + dialog_notify("Could not change into directory"); + strcpy(o_dir, old_dir); + } else { + getcwd(o_dir, MAXPATHLEN); + strcpy(old_dir, o_dir); + } + RefreshStringObj(dir_obj); + } else { /* fmask entry was changed */ + strcpy(old_fmask, o_fm); + } + get_dir(".", o_fm, &d, &n); + FreeNames(dnames, nd); + get_directories(d, n, &dnames, &nd); + UpdateListObj(dirs_obj, dnames, nd); + FreeNames(fnames, nf); + get_filenames(d, n, &fnames, &nf); + UpdateListObj(files_obj, fnames, nf); + if (((o->prev)->obj == (void *) dirs_obj)) { + o=o->prev; + } + } + break; + case SEL_BUTTON: + /* check which button was pressed */ + if (ok_button) { + quit = TRUE; + } + if (cancel_button) { + quit = TRUE; + cancel = TRUE; + } + break; + case SEL_ESC: + quit = TRUE; + cancel = TRUE; + break; + case KEY_F(1): + case '?': + display_helpfile(); + break; + } + } + DelObj(obj); + FreeNames(dnames, nd); + FreeNames(fnames, nf); + delwin(fs_win); + + if (cancel || (strlen(o_sel) == 0)) { + return(NULL); + } else { + ret_name = (char *) malloc( strlen(o_sel) + 1 ); + strcpy(ret_name, o_sel); + return(ret_name); + } +} /* dialog_fselect() */ + diff --git a/gnu/lib/libodialog/gauge.c b/gnu/lib/libodialog/gauge.c new file mode 100644 index 0000000..d8138f6 --- /dev/null +++ b/gnu/lib/libodialog/gauge.c @@ -0,0 +1,79 @@ +/* + * gauge.c + * + * progress indicator for libdialog + * + * + * Copyright (c) 1995, Marc van Kempen + * + * All rights reserved. + * + * This software may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of this software, nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include "dialog.h" + +void +dialog_gauge(char *title, char *prompt, int y, int x, + int height, int width, int perc) +/* + * Desc: display a progress bar, progress indicated by + */ +{ + WINDOW *gw; + int glen, i; + char percs[5]; + + gw = newwin(height, width, y, x); + if (!gw) { + fprintf(stderr, "dialog_gauge: Error creating window (%d, %d, %d, %d)", + height, width, y, x); + exit(-1); + } + + draw_box(gw, 0, 0, height, width, dialog_attr, border_attr); + draw_shadow(stdscr, y, x, height, width); + + wattrset(gw, title_attr); + if (title) { + wmove(gw, 0, (width - strlen(title))/2 - 1); + waddstr(gw, "[ "); + waddstr(gw, title); + waddstr(gw, " ]"); + } + wattrset(gw, dialog_attr); + if (prompt) { + wmove(gw, 1, (width - strlen(prompt))/2 - 1); + waddstr(gw, prompt); + } + + draw_box(gw, 2, 2, 3, width-4, dialog_attr, border_attr); + glen = (int) ((float) perc/100 * (width-6)); + + wattrset(gw, dialog_attr); + sprintf(percs, "%3d%%", perc); + wmove(gw, 5, width/2 - 2); + waddstr(gw, percs); + + wattrset(gw, A_BOLD); + wmove(gw, 3, 3); + for (i=0; i +#include +#include +#include +#include +#include + +static char _helpfilebuf[MAXPATHLEN]; +static char _helplinebuf[77]; /* limit the helpline to 76 characters */ +static char *_helpfile = NULL; +static char *_helpline = NULL; + +/****************************************************************** + * + * helpfile routines + * + ******************************************************************/ + +void +use_helpfile(char *hfile) +/* + * desc: set the helpfile to be opened on pressing F1 to + */ +{ + if (hfile != NULL) { + _helpfile = _helpfilebuf; + strcpy(_helpfile, hfile); + } else { + _helpfile = NULL; + } + + return; +} /* use_helpfile() */ + +void +display_helpfile(void) +/* + * desc: display the current helpfile in a window + */ +{ + WINDOW *w; + FILE *f; + struct stat sb; + char msg[80], *buf; + static int in_help = FALSE; + char *savehline = NULL; + + if (in_help) return; /* dont call help when you're in help */ + + if (_helpfile != NULL) { + if ((w = dupwin(newscr)) == NULL) { + dialog_notify("No memory to dup previous screen\n"); + return; + } + if ((f = fopen(_helpfile, "r")) == NULL) { + sprintf(msg, "Can't open helpfile : %s\n", _helpfile); + dialog_notify(msg); + return; + } + if (fstat(fileno(f), &sb)) { + sprintf(msg, "Can't stat helpfile : %s\n", _helpfile); + dialog_notify(msg); + return; + } + if ((buf = (char *) malloc( sb.st_size )) == NULL) { + sprintf(msg, "Could not malloc space for helpfile : %s\n", _helpfile); + dialog_notify(msg); + return; + } + if (fread(buf, 1, sb.st_size, f) != sb.st_size) { + sprintf(msg, "Could not read entire help file : %s", _helpfile); + dialog_notify(msg); + free(buf); + return; + } + buf[sb.st_size] = 0; + in_help = TRUE; + savehline = get_helpline(); + use_helpline("Use arrowkeys, PgUp, PgDn, Home and End to move through text"); + dialog_mesgbox("Online help", buf, LINES-4, COLS-4); + restore_helpline(savehline); + in_help = FALSE; + touchwin(w); + wrefresh(w); + delwin(w); + free(buf); + } else { + /* do nothing */ + } + + return; +} /* display_helpfile() */ + + +/****************************************************************** + * + * helpline routines + * + ******************************************************************/ + +void +use_helpline(char *hline) +/* + * desc: set the helpline to printed in dialogs + */ +{ + if (hline) { + _helpline = _helplinebuf; + if (strlen(hline) > 76) { + /* only display the first 76 characters in the helpline */ + strncpy(_helpline, hline, 76); + _helpline[76] = 0; + } else { + strcpy(_helpline, hline); + } + } else { + _helpline = NULL; + } + + return; +} /* use_helpline() */ + +void +display_helpline(WINDOW *w, int y, int width) +/* + * desc: display the helpline at the given coordinates in the window + */ +{ + if (_helpline != NULL) { + if (strlen(_helpline) > width - 6) { + _helpline[width - 6] = 0; + } + wmove(w, y, (int) (width - strlen(_helpline)- 4) / 2); + wattrset(w, title_attr); + waddstr(w, "[ "); + waddstr(w, _helpline); + waddstr(w, " ]"); + } else { + /* do nothing */ + } + + return; +} + +char * +get_helpline(void) +/* + * desc: allocate new space, copy the helpline to it and return a pointer to it + */ +{ + char *hlp; + + if (_helpline) { + hlp = (char *) malloc( strlen(_helpline) + 1 ); + strcpy(hlp, _helpline); + } else { + hlp = NULL; + } + + return(hlp); +} /* get_helpline() */ + +void +restore_helpline(char *helpline) +/* + * Desc: set the helpline to and free the space allocated to it + */ +{ + use_helpline(helpline); + free(helpline); + + return; +} /* restore_helpline() */ diff --git a/gnu/lib/libodialog/inputbox.c b/gnu/lib/libodialog/inputbox.c new file mode 100644 index 0000000..1f61ed5 --- /dev/null +++ b/gnu/lib/libodialog/inputbox.c @@ -0,0 +1,190 @@ +/* + * inputbox.c -- implements the input box + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +#include +#include "dialog.priv.h" + + +/* + * Display a dialog box for inputing a string + */ +int dialog_inputbox(unsigned char *title, unsigned char *prompt, int height, int width, unsigned char *result) +{ + int i, j, x, y, box_y, box_x, box_width, first, + key = 0, button = -1; + unsigned char instr[MAX_LEN+1]; + WINDOW *dialog; + + if (height < 0) + height = strheight(prompt)+2+4; + if (width < 0) { + i = strwidth(prompt); + j = ((title != NULL) ? strwidth(title) : 0); + width = MAX(i,j) + 4; + } + width = MAX(width,24); + + if (width > COLS) + width = COLS; + if (height > LINES) + height = LINES; + /* center dialog box on screen */ + x = DialogX ? DialogX : (COLS - width)/2; + y = DialogY ? DialogY : (LINES - height)/2; + +#ifdef HAVE_NCURSES + if (use_shadow) + draw_shadow(stdscr, y, x, height, width); +#endif + dialog = newwin(height, width, y, x); + if (dialog == NULL) { + endwin(); + fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x); + exit(1); + } + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); + wattrset(dialog, border_attr); + wmove(dialog, height-3, 0); + waddch(dialog, ACS_LTEE); + for (i = 0; i < width-2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dialog_attr); + waddch(dialog, ACS_RTEE); + wmove(dialog, height-2, 1); + for (i = 0; i < width-2; i++) + waddch(dialog, ' '); + + if (title != NULL) { + wattrset(dialog, title_attr); + wmove(dialog, 0, (width - strlen(title))/2 - 1); + waddch(dialog, ' '); + waddstr(dialog, title); + waddch(dialog, ' '); + } + wattrset(dialog, dialog_attr); + wmove(dialog, 1, 2); + print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE); + + /* Draw the input field box */ + box_width = width-6; + getyx(dialog, y, x); + box_y = y + 2; + box_x = (width - box_width)/2; + draw_box(dialog, y+1, box_x-1, 3, box_width+2, border_attr, dialog_attr); + + display_helpline(dialog, height-1, width); + + x = width/2-11; + y = height-2; + print_button(dialog, "Cancel", y, x+14, FALSE); + print_button(dialog, " OK ", y, x, TRUE); + + first = 1; + strcpy(instr, result); + wattrset(dialog, dialog_attr); + + while (key != ESC) { + + if (button == -1) { /* Input box selected */ + key = line_edit(dialog, box_y, box_x, -1, box_width, inputbox_attr, first, instr, DialogInputAttrs); + first = 0; + } + else + key = wgetch(dialog); + + switch (key) { + case 'O': + case 'o': + delwin(dialog); + strcpy(result, instr); + return 0; + case 'C': + case 'c': + delwin(dialog); + return 1; + case KEY_UP: + case KEY_LEFT: + case KEY_BTAB: + switch (button) { + case -1: + button = 1; /* Indicates "Cancel" button is selected */ + print_button(dialog, " OK ", y, x, FALSE); + print_button(dialog, "Cancel", y, x+14, TRUE); + wrefresh(dialog); + break; + case 0: + button = -1; /* Indicates input box is selected */ + print_button(dialog, "Cancel", y, x+14, FALSE); + print_button(dialog, " OK ", y, x, TRUE); + break; + case 1: + button = 0; /* Indicates "OK" button is selected */ + print_button(dialog, "Cancel", y, x+14, FALSE); + print_button(dialog, " OK ", y, x, TRUE); + wrefresh(dialog); + break; + } + break; + case TAB: + case KEY_DOWN: + case KEY_RIGHT: + switch (button) { + case -1: + button = 0; /* Indicates "OK" button is selected */ + print_button(dialog, "Cancel", y, x+14, FALSE); + print_button(dialog, " OK ", y, x, TRUE); + wrefresh(dialog); + break; + case 0: + button = 1; /* Indicates "Cancel" button is selected */ + print_button(dialog, " OK ", y, x, FALSE); + print_button(dialog, "Cancel", y, x+14, TRUE); + wrefresh(dialog); + break; + case 1: + button = -1; /* Indicates input box is selected */ + print_button(dialog, "Cancel", y, x+14, FALSE); + print_button(dialog, " OK ", y, x, TRUE); + break; + } + break; + case ' ': + case '\n': + case '\r': + delwin(dialog); + if (button < 1) + strcpy(result, instr); + return (button == -1 ? 0 : button); + case ESC: + break; + case KEY_F(1): + case '?': + display_helpfile(); + break; + } + } + + delwin(dialog); + return -1; /* ESC pressed */ +} +/* End of dialog_inputbox() */ diff --git a/gnu/lib/libodialog/kernel.c b/gnu/lib/libodialog/kernel.c new file mode 100644 index 0000000..9ed5eac --- /dev/null +++ b/gnu/lib/libodialog/kernel.c @@ -0,0 +1,536 @@ +/* + * dialog - Display simple dialog boxes from shell scripts + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * + * HISTORY: + * + * 17/12/93 - Version 0.1 released. + * + * 19/12/93 - menu will now scroll if there are more items than can fit + * on the screen. + * - added 'checklist', a dialog box with a list of options that + * can be turned on or off. A list of options that are on is + * returned on exit. + * + * 20/12/93 - Version 0.15 released. + * + * 29/12/93 - Incorporated patch from Patrick J. Volkerding + * (volkerdi@mhd1.moorhead.msus.edu) that made these changes: + * - increased MAX_LEN to 2048 + * - added 'infobox', equivalent to a message box without pausing + * - added option '--clear' that will clear the screen + * - Explicit line breaking when printing prompt text can be + * invoked by real newline '\n' besides the string "\n" + * - an optional parameter '--title ' can be used to + * specify a title string for the dialog box + * + * 03/01/94 - added 'textbox', a dialog box for displaying text from a file. + * - Version 0.2 released. + * + * 04/01/94 - some fixes and improvements for 'textbox': + * - fixed a bug that will cause a segmentation violation when a + * line is longer than MAX_LEN characters. Lines will now be + * truncated if they are longer than MAX_LEN characters. + * - removed wrefresh() from print_line(). This will increase + * efficiency of print_page() which calls print_line(). + * - display current position in the form of percentage into file. + * - Version 0.21 released. + * + * 05/01/94 - some changes for faster screen update. + * + * 07/01/94 - much more flexible color settings. Can use all 16 colors + * (8 normal, 8 highlight) of the Linux console. + * + * 08/01/94 - added run-time configuration using configuration file. + * + * 09/01/94 - some minor bug fixes and cleanups for menubox, checklist and + * textbox. + * + * 11/01/94 - added a man page. + * + * 13/01/94 - some changes for easier porting to other Unix systems (tested + * on Ultrix, SunOS and HPUX) + * - Version 0.3 released. + * + * 08/06/94 - Patches by Stuart Herbert - S.Herbert@shef.ac.uk + * Fixed attr_clear and the textbox stuff to work with ncurses 1.8.5 + * Fixed the wordwrap routine - it'll actually wrap properly now + * Added a more 3D look to everything - having your own rc file could + * prove 'interesting' to say the least :-) + * Added radiolist option + * - Version 0.4 released. + */ + +#include +__FBSDID("$FreeBSD$"); + +#define __DIALOG_MAIN__ + +#include +#include +#include "dialog.priv.h" +#ifdef HAVE_NCURSES +#include "colors.h" +#endif + +/* These are two "secret" globals that can be fiddled to make a dialog + * come up someplace other than a "centered" calculation for X,Y + */ +int DialogX, DialogY; + +/* This "secret" global allows you to change the behavior of an input field */ +int DialogInputAttrs; + +/* + * Do some initialization for dialog + */ +void init_dialog(void) +{ + + if (issetugid()) { + errx(1, "libdialog is unsafe to use in setugid applications"); + } + +#if defined(LOCALE) + (void) setlocale(LC_ALL, ""); +#endif + +#ifdef HAVE_NCURSES + if (parse_rc() == -1) /* Read the configuration file */ + exit(-1); +#endif + + if (initscr() == NULL) { /* Init curses */ + fprintf(stderr, "\nCurses initialization error.\n"); + exit(-1); + } + keypad(stdscr, TRUE); + cbreak(); + noecho(); + +#ifdef HAVE_NCURSES + if (use_colors || use_shadow) /* Set up colors */ + color_setup(); +#endif + + /* Set screen to screen attribute */ + dialog_clear_norefresh(); + DialogX = DialogY = 0; +} +/* End of init_dialog() */ + + +#ifdef HAVE_NCURSES +/* + * Setup for color display + */ +void color_setup(void) +{ + int i; + + if (has_colors()) { /* Terminal supports color? */ + start_color(); + + /* Initialize color pairs */ + for (i = 0; i < ATTRIBUTE_COUNT; i++) + init_pair(i+1, color_table[i][0], color_table[i][1]); + + /* Setup color attributes */ + for (i = 0; i < ATTRIBUTE_COUNT; i++) + attributes[i] = C_ATTR(color_table[i][2], i+1); + } +} +/* End of color_setup() */ +#endif + + +/* + * Set window to attribute 'attr' + */ +void attr_clear(WINDOW *win, int height, int width, chtype attr) +{ + int i, j; + + wattrset(win, attr); /* Set window to attribute 'attr' */ + for (i = 0; i < height; i++) { + wmove(win, i, 0); + for (j = 0; j < width; j++) + waddch(win, ' '); + } +} +/* End of attr_clear() */ + + +/* + * Print a string of text in a window, automatically wrap around to the + * next line if the string is too long to fit on one line. Note that the + * string may contain "\n" to represent a newline character or the real + * newline '\n', but in that case, auto wrap around will be disabled. + */ +void print_autowrap(WINDOW *win, unsigned char *prompt, int height, int width, int maxwidth, int y, int x, int center, int rawmode) +{ + int cur_x, cur_y, i; + unsigned char tempstr[MAX_LEN+1], *word, *tempptr, *tempptr1; + chtype ostuff[132], attrs = 0, init_bottom = 0; + + wsetscrreg(win, y, height); + getyx(win, cur_y, cur_x); + + strncpy(tempstr, prompt, MAX_LEN); + tempstr[MAX_LEN] = '\0'; + if ((!rawmode && strstr(tempstr, "\\n") != NULL) || + (strchr(tempstr, '\n') != NULL)) { /* Prompt contains "\n" or '\n' */ + word = tempstr; + while (1) { + tempptr = rawmode ? NULL : strstr(word, "\\n"); + tempptr1 = strchr(word, '\n'); + if (tempptr == NULL && tempptr1 == NULL) + break; + else if (tempptr == NULL) { /* No more "\n" */ + tempptr = tempptr1; + tempptr[0] = '\0'; + } + else if (tempptr1 == NULL) { /* No more '\n' */ + tempptr[0] = '\0'; + tempptr++; + } + else { /* Prompt contains both "\n" and '\n' */ + if (strlen(tempptr)-2 < strlen(tempptr1)-1) { + tempptr = tempptr1; + tempptr[0] = '\0'; + } + else { + tempptr[0] = '\0'; + tempptr++; + } + } + + waddstr(win, word); + word = tempptr + 1; + if (++cur_y > height) { + cur_y--; + if (!init_bottom) { + for (i = 0; i < x; i++) + ostuff[i] = mvwinch(win, cur_y, i); + for (i = width; i < maxwidth; i++) + ostuff[i] = mvwinch(win, cur_y, i); + attrs = getattrs(win); + init_bottom = 1; + } + scrollok(win, TRUE); + scroll(win); + scrollok(win, FALSE); + wmove(win, cur_y, 0); + for (i = 0; i < x; i++) { + wattrset(win, ostuff[i]&A_ATTRIBUTES); + waddch(win, ostuff[i]); + } + wattrset(win, attrs); + for ( ; i < width; i++) + waddch(win, ' '); + for ( ; i < maxwidth; i++) { + wattrset(win, ostuff[i]&A_ATTRIBUTES); + waddch(win, ostuff[i]); + } + wattrset(win, attrs); + wrefresh(win); + } + wmove(win, cur_y, cur_x = x); + } + waddstr(win, word); + } + else if (center && strlen(tempstr) <= width-x*2) { /* If prompt is short */ + wmove(win, cur_y, (width - strlen(tempstr)) / 2); + waddstr(win, tempstr); + } + else if (!center && strlen(tempstr) <= width-cur_x) { /* If prompt is short */ + waddstr(win, tempstr); + } + else { + char *p = tempstr; + + /* Print prompt word by word, wrap around if necessary */ + while ((word = strsep(&p, "\t\n ")) != NULL) { + int loop; + unsigned char sc; + + if (*word == '\0') + continue; + do { + loop = 0; + if (cur_x+strlen(word) >= width+1) { /* wrap around to next line */ + if (x+strlen(word) >= width+1) { + sc = word[width-cur_x-1]; + word[width-cur_x-1] = '\0'; + wmove(win, cur_y, cur_x); + waddstr(win, word); + word[width-cur_x-1] = sc; + word += width-cur_x-1; + getyx(win, cur_y, cur_x); + loop = 1; + } + cur_y++; + cur_x = x; + if (cur_y > height) { + cur_y--; + if (!init_bottom) { + for (i = 0; i < x; i++) + ostuff[i] = mvwinch(win, cur_y, i); + for (i = width; i < maxwidth; i++) + ostuff[i] = mvwinch(win, cur_y, i); + attrs = getattrs(win); + init_bottom = 1; + } + scrollok(win, TRUE); + scroll(win); + scrollok(win, FALSE); + wmove(win, cur_y, 0); + for (i = 0; i < x; i++) { + wattrset(win, ostuff[i]&A_ATTRIBUTES); + waddch(win, ostuff[i]); + } + wattrset(win, attrs); + for ( ; i < width; i++) + waddch(win, ' '); + for ( ; i < maxwidth; i++) { + wattrset(win, ostuff[i]&A_ATTRIBUTES); + waddch(win, ostuff[i]); + } + wattrset(win, attrs); + wrefresh(win); + } + } + } + while(loop); + wmove(win, cur_y, cur_x); + waddstr(win, word); + getyx(win, cur_y, cur_x); + cur_x++; + } + } +} +/* End of print_autowrap() */ + + +/* + * Print a button + */ +void print_button(WINDOW *win, unsigned char *label, int y, int x, int selected) +{ + int i, temp; + + wmove(win, y, x); + wattrset(win, selected ? button_active_attr : button_inactive_attr); + waddstr(win, selected ? "[" : " "); + temp = strspn(label, " "); + label += temp; + for (i = 0; i < temp; i++) + waddch(win, ' '); + wattrset(win, selected ? button_key_active_attr : button_key_inactive_attr); + waddch(win, label[0]); + wattrset(win, selected ? button_active_attr : button_inactive_attr); + waddstr(win, label+1); + waddstr(win, selected ? "]" : " "); + wmove(win, y, x+temp+1); +} +/* End of print_button() */ + + +/* + * Draw a rectangular box with line drawing characters + */ +void draw_box(WINDOW *win, int y, int x, int height, int width, chtype box, chtype border) +{ + int i, j; + + wattrset(win, 0); + for (i = 0; i < height; i++) { + wmove(win, y + i, x); + for (j = 0; j < width; j++) + if (!i && !j) + waddch(win, border | ACS_ULCORNER); + else if (i == height-1 && !j) + waddch(win, border | ACS_LLCORNER); + else if (!i && j == width-1) + waddch(win, box | ACS_URCORNER); + else if (i == height-1 && j == width-1) + waddch(win, box | ACS_LRCORNER); + else if (!i) + waddch(win, border | ACS_HLINE); + else if (i == height-1) + waddch(win, box | ACS_HLINE); + else if (!j) + waddch(win, border | ACS_VLINE); + else if (j == width-1) + waddch(win, box | ACS_VLINE); + else + waddch(win, box | ' '); + } +} +/* End of draw_box() */ + + +#ifdef HAVE_NCURSES +/* + * Draw shadows along the right and bottom edge to give a more 3D look + * to the boxes + */ +void draw_shadow(WINDOW *win, int y, int x, int height, int width) +{ + int i,sx,sy; + chtype attrs; + + if (has_colors()) { /* Whether terminal supports color? */ + getbegyx(win,sy,sx); + attrs = getattrs(win); + if (y+height < getmaxy(win)) { + /* small touch */ + wattrset(win, A_INVIS); + wmove(win, y + height, x + 2); + for (i = 0; i < width; i++) + if (i+x+2 < getmaxx(win)) + waddch(win, ' '); + /* end touch */ + wattrset(win, shadow_attr); + wmove(win, y + height, x + 2); + for (i = 0; i < width; i++) + if (i+x+2 < getmaxx(win)) + waddch(win, mvwinch(newscr, sy+y+height, sx+x+2+i) & A_CHARTEXT); + } + if (x+width < getmaxx(win)) { + for (i = y + 1; i < y + height + 1; i++) { + if (i < getmaxy(win)) { + /* small touch */ + wattrset(win, A_INVIS); + wmove(win, i, x + width); + waddch(win, ' '); + if (x+width+1 < getmaxx(win)) + waddch(win, ' '); + /* end touch */ + wattrset(win, shadow_attr); + wmove(win, i, x + width); + waddch(win, mvwinch(newscr, sy+i, sx+x+width) & A_CHARTEXT); + if (x+width+1 < getmaxx(win)) + waddch(win, mvwinch(newscr, sy+i, sx+x+width+1) & A_CHARTEXT); + } + } + } + wattrset(win, attrs); + wnoutrefresh(win); + } +} +/* End of draw_shadow() */ +#endif + +void dialog_clear_norefresh(void) +{ + attr_clear(stdscr, LINES, COLS, screen_attr); + touchwin(stdscr); + wnoutrefresh(stdscr); +} + +void dialog_clear(void) +{ + dialog_clear_norefresh(); + doupdate(); +} + +void dialog_update(void) +{ + refresh(); +} + +void end_dialog(void) +{ + endwin(); +} + +int strwidth(const char *p) +{ + int i = 0, len, incr; + const char *start, *s, *s1, *s2; + + for (start = s = p; ; start = (s += incr)) { + s1 = strchr(s, '\n'); + s2 = strstr(s, "\\n"); + if (s2 == NULL) + s = s1; + else if (s1 == NULL) + s = s2; + else + s = MIN(s1, s2); + if (s == NULL) + break; + incr = 1 + (s == s2); + len = s - start; + if (len > i) + i = len; + } + len = strlen(start); + if (len > i) + i = len; + return i; +} + +int strheight(const char *p) +{ + int i = 1, incr; + const char *s, *s1, *s2; + + for (s = p; ; s += incr) { + s1 = strchr(s, '\n'); + s2 = strstr(s, "\\n"); + if (s2 == NULL) + s = s1; + else if (s1 == NULL) + s = s2; + else + s = MIN(s1, s2); + if (s == NULL) + break; + incr = 1 + (s == s2); + i++; + } + return i; +} + +void print_arrows(WINDOW *dialog, int scroll, int menu_height, int item_no, + int box_x, int box_y, int tag_x, int cur_x, int cur_y) +{ + wmove(dialog, box_y, box_x + tag_x + 1); + wattrset(dialog, scroll ? uarrow_attr : menubox_attr); + waddch(dialog, scroll ? ACS_UARROW : ACS_HLINE); + wmove(dialog, box_y, box_x + tag_x + 2); + waddch(dialog, scroll ? '(' : ACS_HLINE); + wmove(dialog, box_y, box_x + tag_x + 3); + waddch(dialog, scroll ? '-' : ACS_HLINE); + wmove(dialog, box_y, box_x + tag_x + 4); + waddch(dialog, scroll ? ')' : ACS_HLINE); + wmove(dialog, box_y + menu_height + 1, box_x + tag_x + 1); + wattrset(dialog, scroll+menu_height < item_no ? darrow_attr : menubox_border_attr); + waddch(dialog, scroll+menu_height < item_no ? ACS_DARROW : ACS_HLINE); + wmove(dialog, box_y + menu_height + 1, box_x + tag_x + 2); + waddch(dialog, scroll+menu_height < item_no ? '(' : ACS_HLINE); + wmove(dialog, box_y + menu_height + 1, box_x + tag_x + 3); + waddch(dialog, scroll+menu_height < item_no ? '+' : ACS_HLINE); + wmove(dialog, box_y + menu_height + 1, box_x + tag_x + 4); + waddch(dialog, scroll+menu_height < item_no ? ')' : ACS_HLINE); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ +} + diff --git a/gnu/lib/libodialog/lineedit.c b/gnu/lib/libodialog/lineedit.c new file mode 100644 index 0000000..7bfe0e0 --- /dev/null +++ b/gnu/lib/libodialog/lineedit.c @@ -0,0 +1,213 @@ +/* + * Changes Copyright (C) 1995 by Andrey A. Chernov, Moscow + * + * Original Copyright: + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +#include +#include "dialog.priv.h" + +static void redraw_field(WINDOW *dialog, int box_y, int box_x, int flen, int box_width, unsigned char instr[], int input_x, int scroll, chtype attr, chtype old_attr, int fexit, int attr_mask); + +/* + * Line editor + */ +int line_edit(WINDOW* dialog, int box_y, int box_x, int flen, int box_width, chtype attr, int first, unsigned char *result, int attr_mask) +{ + int i, key; + chtype old_attr; + static int input_x, scroll; + static unsigned char instr[MAX_LEN+1]; + unsigned char erase_char = erasechar(); + unsigned char kill_char = killchar(); +#ifdef notyet + unsignec char werase_char = cur_term->Ottyb.c_cc[VWERASE]; +#endif + + old_attr = getattrs(dialog); + keypad(dialog, TRUE); + + if (first) { + memset(instr, 0, sizeof(instr)); + strcpy(instr, result); + i = strlen(instr); +/* input_x = i % box_width;*/ + input_x = (i > box_width) ? box_width - 1 : i; +/* scroll = i - input_x;*/ + scroll = (i > box_width) ? i - box_width + 1: 0; + } + redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); + + for (;;) { + wattrset(dialog, attr); + wrefresh(dialog); + key = wgetch(dialog); + switch (key) { + case ctrl('q'): + goto ret; + break; + case KEY_F(1): + display_helpfile(); + break; + case TAB: + case KEY_BTAB: + case KEY_UP: + case KEY_DOWN: + case ESC: + case '\r': + case '\n': + for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--) + instr[i] = '\0'; + if (key == '\r') + key = '\n'; + goto ret; + case '\025': + case '\030': + kill_it: + input_x = scroll = 0; + /* fall through */ + case '\013': + case KEY_EOL: + memset(instr + scroll + input_x, '\0', sizeof(instr) - scroll - input_x); + redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); + continue; + case '\001': + case KEY_HOME: + input_x = scroll = 0; + redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); + continue; + case '\005': + case KEY_END: + for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--) + instr[i] = '\0'; + i++; + input_x = i % box_width; + scroll = i - input_x; + redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); + continue; + case '\002': + case KEY_LEFT: + if (input_x || scroll) { + if (!input_x) { + int oldscroll = scroll; + scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1); + input_x = oldscroll - 1 - scroll; + redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); + } else { + input_x--; + wmove(dialog, box_y, input_x + box_x); + } + } else + beep(); + continue; + case '\006': + case KEY_RIGHT: + if ( scroll+input_x < MAX_LEN + && (flen < 0 || scroll+input_x < flen) + ) { + if (!instr[scroll+input_x]) + instr[scroll+input_x] = ' '; + if (input_x == box_width-1) { + scroll++; + redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); + } + else { + wmove(dialog, box_y, input_x + box_x); + waddch(dialog, instr[scroll+input_x]); + input_x++; + } + } else + beep(); /* Alarm user about overflow */ + continue; + case '\b': + case '\177': + case KEY_BACKSPACE: + erase_it: + if (input_x || scroll) { + i = strlen(instr); + memmove(instr+scroll+input_x-1, instr+scroll+input_x, i-(scroll+input_x)+1); + if (!input_x) { + int oldscroll = scroll; + scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1); + input_x = oldscroll - 1 - scroll; + } else + input_x--; + redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); + } else + beep(); + continue; + case '\004': + case KEY_DC: + for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--) + instr[i] = '\0'; + i++; + if (i == 0) { + beep(); + continue; + } + memmove(instr+scroll+input_x, instr+scroll+input_x+1, i-(scroll+input_x)); + redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); + continue; + default: + if (CCEQ(key, erase_char)) + goto erase_it; + if (CCEQ(key, kill_char)) + goto kill_it; + if (key < 0x100 && isprint(key)) { + for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--) + instr[i] = '\0'; + i++; + if (i < MAX_LEN && (flen < 0 || scroll+input_x < flen)) { + if (flen < 0 || i < flen) + memmove(instr+scroll+input_x+1, instr+scroll+input_x, i-(scroll+input_x)); + instr[scroll+input_x] = key; + if (input_x == box_width-1 && (flen < 0 || i < flen)) + scroll++; + else + input_x++; + redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); + } else + beep(); /* Alarm user about overflow */ + continue; + } + } + } +ret: + redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, TRUE, attr_mask); + wrefresh(dialog); + strcpy(result, instr); + return key; +} + +static void +redraw_field(WINDOW *dialog, int box_y, int box_x, int flen, int box_width, unsigned char instr[], int input_x, int scroll, chtype attr, chtype old_attr, int fexit, int attr_mask) +{ + int i, fix_len; + + wattrset(dialog, fexit ? old_attr : attr); + wmove(dialog, box_y, box_x); + fix_len = flen >= 0 ? MIN(flen-scroll,box_width) : box_width; + for (i = 0; i < fix_len; i++) + waddch(dialog, instr[scroll+i] ? ((attr_mask & DITEM_NO_ECHO) ? '*' : instr[scroll+i]) : ' '); + wattrset(dialog, old_attr); + for ( ; i < box_width; i++) + waddch(dialog, instr[scroll+i] ? ((attr_mask & DITEM_NO_ECHO) ? '*' : instr[scroll+i]) : ' '); + wmove(dialog, box_y, input_x + box_x); +} diff --git a/gnu/lib/libodialog/menubox.c b/gnu/lib/libodialog/menubox.c new file mode 100644 index 0000000..a01acd5 --- /dev/null +++ b/gnu/lib/libodialog/menubox.c @@ -0,0 +1,469 @@ +/* + * menubox.c -- implements the menu box + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * Substantial rennovation: 12/18/95, Jordan K. Hubbard + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include "dialog.priv.h" +#include +#include + +static void print_item(WINDOW *win, unsigned char *tag, unsigned char *item, int choice, int selected, dialogMenuItem *me, int menu_width, int tag_x, int item_x); + +#define DREF(di, item) ((di) ? &((di)[(item)]) : NULL) + +/* + * Display a menu for choosing among a number of options + */ +int +dialog_menu(unsigned char *title, unsigned char *prompt, int height, int width, int menu_height, int cnt, void *it, unsigned char *result, int *ch, int *sc) +{ + int i, j, x, y, cur_x, cur_y, box_x, box_y, key = 0, button, choice, + l, k, scroll, max_choice, item_no, redraw_menu = FALSE; + char okButton, cancelButton; + int rval = 0, ok_space, cancel_space; + WINDOW *dialog, *menu; + unsigned char **items = NULL; + dialogMenuItem *ditems; + int menu_width, tag_x, item_x; + +draw: + choice = ch ? *ch : 0; + scroll = sc ? *sc : 0; + button = 0; + + /* If item_no is a positive integer, use old item specification format */ + if (cnt >= 0) { + items = it; + ditems = NULL; + item_no = cnt; + } + /* It's the new specification format - fake the rest of the code out */ + else { + item_no = abs(cnt); + ditems = it; + if (!items) + items = (unsigned char **)alloca((item_no * 2) * sizeof(unsigned char *)); + + /* Initializes status */ + for (i = 0; i < item_no; i++) { + items[i*2] = ditems[i].prompt; + items[i*2 + 1] = ditems[i].title; + } + } + max_choice = MIN(menu_height, item_no); + + tag_x = 0; + item_x = 0; + /* Find length of longest item in order to center menu */ + for (i = 0; i < item_no; i++) { + l = strlen(items[i * 2]); + for (j = 0; j < item_no; j++) { + k = strlen(items[j * 2 + 1]); + tag_x = MAX(tag_x, l + k + 2); + } + item_x = MAX(item_x, l); + } + if (height < 0) + height = strheight(prompt) + menu_height + 4 + 2; + if (width < 0) { + i = strwidth(prompt); + j = ((title != NULL) ? strwidth(title) : 0); + width = MAX(i, j); + width = MAX(width, tag_x + 4) + 4; + } + width = MAX(width, 24); + + if (width > COLS) + width = COLS; + if (height > LINES) + height = LINES; + /* center dialog box on screen */ + x = DialogX ? DialogX : (COLS - width) / 2; + y = DialogY ? DialogY : (LINES - height) / 2; + +#ifdef HAVE_NCURSES + if (use_shadow) + draw_shadow(stdscr, y, x, height, width); +#endif + dialog = newwin(height, width, y, x); + if (dialog == NULL) { + endwin(); + fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height, width, y, x); + return -1; + } + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); + wattrset(dialog, border_attr); + wmove(dialog, height - 3, 0); + waddch(dialog, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dialog_attr); + waddch(dialog, ACS_RTEE); + wmove(dialog, height - 2, 1); + for (i = 0; i < width - 2; i++) + waddch(dialog, ' '); + + if (title != NULL) { + wattrset(dialog, title_attr); + wmove(dialog, 0, (width - strlen(title)) / 2 - 1); + waddch(dialog, ' '); + waddstr(dialog, title); + waddch(dialog, ' '); + } + wattrset(dialog, dialog_attr); + wmove(dialog, 1, 2); + print_autowrap(dialog, prompt, height - 1, width - 2, width, 1, 2, TRUE, FALSE); + + menu_width = width - 6; + getyx(dialog, cur_y, cur_x); + box_y = cur_y + 1; + box_x = (width - menu_width) / 2 - 1; + + /* create new window for the menu */ + menu = subwin(dialog, menu_height, menu_width, y + box_y + 1, x + box_x + 1); + if (menu == NULL) { + delwin(dialog); + endwin(); + fprintf(stderr, "\nsubwin(dialog,%d,%d,%d,%d) failed, maybe wrong dims\n", menu_height, menu_width, + y + box_y + 1, x + box_x + 1); + return -1; + } + keypad(menu, TRUE); + + /* draw a box around the menu items */ + draw_box(dialog, box_y, box_x, menu_height+2, menu_width+2, menubox_border_attr, menubox_attr); + + tag_x = menu_width > tag_x + 1 ? (menu_width - tag_x) / 2 : 1; + item_x = menu_width > item_x + 4 ? tag_x + item_x + 2 : menu_width - 3; + + /* Print the menu */ + for (i = 0; i < max_choice; i++) + print_item(menu, items[(scroll + i) * 2], items[(scroll + i) * 2 + 1], i, i == choice, DREF(ditems, scroll + i), menu_width, tag_x, item_x); + wnoutrefresh(menu); + print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y); + + display_helpline(dialog, height - 1, width); + + x = width / 2 - 11; + y = height - 2; + + if (ditems && result) { + cancelButton = toupper(ditems[CANCEL_BUTTON].prompt[0]); + print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : FALSE); + okButton = toupper(ditems[OK_BUTTON].prompt[0]); + print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : TRUE); + } + else { + cancelButton = 'C'; + print_button(dialog, "Cancel", y, x + 14, FALSE); + okButton = 'O'; + print_button(dialog, " OK ", y, x, TRUE); + } + + wrefresh(dialog); + while (key != ESC) { + key = wgetch(dialog); + + /* Shortcut to OK? */ + if (toupper(key) == okButton) { + if (ditems) { + if (result && ditems[OK_BUTTON].fire) { + int status; + WINDOW *save; + + save = dupwin(newscr); + status = ditems[OK_BUTTON].fire(&ditems[OK_BUTTON]); + if (status & DITEM_RESTORE) { + touchwin(save); + wrefresh(save); + } + delwin(save); + } + } + else if (result) + strcpy(result, items[(scroll + choice) * 2]); + rval = 0; + key = ESC; /* Punt! */ + break; + } + + /* Shortcut to cancel? */ + if (toupper(key) == cancelButton) { + if (ditems && result && ditems[CANCEL_BUTTON].fire) { + int status; + WINDOW *save; + + save = dupwin(newscr); + status = ditems[CANCEL_BUTTON].fire(&ditems[CANCEL_BUTTON]); + if (status & DITEM_RESTORE) { + touchwin(save); + wrefresh(save); + } + delwin(save); + } + rval = 1; + key = ESC; /* Run away! */ + break; + } + + /* Check if key pressed matches first character of any item tag in menu */ + for (i = 0; i < max_choice; i++) + if (key < 0x100 && key != ' ' && toupper(key) == toupper(items[(scroll + i) * 2][0])) + break; + + if (i < max_choice || (key >= '1' && key <= MIN('9', '0'+max_choice)) || KEY_IS_UP(key) || KEY_IS_DOWN(key)) { + if (key >= '1' && key <= MIN('9', '0'+max_choice)) + i = key - '1'; + else if (KEY_IS_UP(key)) { + if (!choice) { + if (scroll) { + /* Scroll menu down */ + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + if (menu_height > 1) { + /* De-highlight current first item before scrolling down */ + print_item(menu, items[scroll * 2], items[scroll * 2 + 1], 0, FALSE, DREF(ditems, scroll), menu_width, tag_x, item_x); + scrollok(menu, TRUE); + wscrl(menu, -1); + scrollok(menu, FALSE); + } + scroll--; + print_item(menu, items[scroll * 2], items[scroll * 2 + 1], 0, TRUE, DREF(ditems, scroll), menu_width, tag_x, item_x); + wnoutrefresh(menu); + print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y); + wrefresh(dialog); + } + continue; /* wait for another key press */ + } + else + i = choice - 1; + } + else if (KEY_IS_DOWN(key)) { + if (choice == max_choice - 1) { + if (scroll + choice < item_no - 1) { + /* Scroll menu up */ + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + if (menu_height > 1) { + /* De-highlight current last item before scrolling up */ + print_item(menu, items[(scroll + max_choice - 1) * 2], + items[(scroll + max_choice - 1) * 2 + 1], + max_choice-1, FALSE, DREF(ditems, scroll + max_choice - 1), menu_width, tag_x, item_x); + scrollok(menu, TRUE); + scroll(menu); + scrollok(menu, FALSE); + } + scroll++; + print_item(menu, items[(scroll + max_choice - 1) * 2], + items[(scroll + max_choice - 1) * 2 + 1], + max_choice - 1, TRUE, DREF(ditems, scroll + max_choice - 1), menu_width, tag_x, item_x); + wnoutrefresh(menu); + print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y); + wrefresh(dialog); + } + continue; /* wait for another key press */ + } + else + i = choice + 1; + } + + if (i != choice) { + /* De-highlight current item */ + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + print_item(menu, items[(scroll + choice) * 2], items[(scroll + choice) * 2 + 1], choice, FALSE, DREF(ditems, scroll + choice), menu_width, tag_x, item_x); + + /* Highlight new item */ + choice = i; + print_item(menu, items[(scroll + choice) * 2], items[(scroll + choice) * 2 + 1], choice, TRUE, DREF(ditems, scroll + choice), menu_width, tag_x, item_x); + wnoutrefresh(menu); + wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */ + wrefresh(dialog); + } + continue; /* wait for another key press */ + } + + switch (key) { + case KEY_PPAGE: + if (scroll > height - 4) { /* can we go up? */ + scroll -= (height - 4); + } else { + scroll = 0; + } + redraw_menu = TRUE; + break; + + case KEY_NPAGE: + if (scroll + menu_height >= item_no-1 - menu_height) { /* can we go down a full page? */ + scroll = item_no - menu_height; + if (scroll < 0) + scroll = 0; + } else { + scroll += menu_height; + } + redraw_menu = TRUE; + break; + + case KEY_HOME: + scroll = 0; + choice = 0; + redraw_menu = TRUE; + break; + + case KEY_END: + scroll = item_no - menu_height; + if (scroll < 0) + scroll = 0; + choice = max_choice - 1; + redraw_menu = TRUE; + break; + + case KEY_BTAB: + case TAB: + case KEY_LEFT: + case KEY_RIGHT: + button = !button; + if (ditems && result) { + print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); + print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); + ok_space = 1; + cancel_space = strlen(ditems[OK_BUTTON].prompt) + 6; + } + else { + print_button(dialog, "Cancel", y, x + 14, button); + print_button(dialog, " OK ", y, x, !button); + ok_space = 3; + cancel_space = 15; + } + if (button) + wmove(dialog, y, x+cancel_space); + else + wmove(dialog, y, x+ok_space); + wrefresh(dialog); + break; + + case ' ': + case '\r': + case '\n': + if (!button) { + /* A fire routine can do just about anything to the screen, so be prepared + to accept some hints as to what to do in the aftermath. */ + if (ditems) { + if (ditems[scroll + choice].fire) { + int status; + WINDOW *save; + + save = dupwin(newscr); + status = ditems[scroll + choice].fire(&ditems[scroll + choice]); + if (status & DITEM_RESTORE) { + touchwin(save); + wrefresh(save); + } + delwin(save); + if (status & DITEM_CONTINUE) + continue; + else if (status & DITEM_LEAVE_MENU) { + /* Allow a fire action to take us out of the menu */ + key = ESC; + break; + } + else if (status & DITEM_RECREATE) { + delwin(menu); + delwin(dialog); + dialog_clear(); + goto draw; + } + } + } + else if (result) + strcpy(result, items[(scroll+choice)*2]); + } + rval = button; + key = ESC; + break; + + case ESC: + rval = -1; + break; + + case KEY_F(1): + case '?': + display_helpfile(); + break; + } + + /* save info about menu item position */ + if (ch) + *ch = choice; + if (sc) + *sc = scroll; + + if (redraw_menu) { + for (i = 0; i < max_choice; i++) { + print_item(menu, items[(scroll + i) * 2], items[(scroll + i) * 2 + 1], i, i == choice, DREF(ditems, scroll + i), menu_width, tag_x, item_x); + } + wnoutrefresh(menu); + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y); + wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */ + wrefresh(dialog); + redraw_menu = FALSE; + } + } + delwin(menu); + delwin(dialog); + return rval; +} + + +/* + * Print menu item + */ +static void +print_item(WINDOW *win, unsigned char *tag, unsigned char *item, int choice, int selected, dialogMenuItem *me, int menu_width, int tag_x, int item_x) +{ + int i; + + if (tag == NULL) + errx(1, "bad parameter to print_item()\n"); + + /* Clear 'residue' of last item */ + wattrset(win, menubox_attr); + wmove(win, choice, 0); + for (i = 0; i < menu_width; i++) + waddch(win, ' '); + wmove(win, choice, tag_x); + wattrset(win, selected ? tag_key_selected_attr : tag_key_attr); + waddch(win, tag[0]); + wattrset(win, selected ? tag_selected_attr : tag_attr); + waddnstr(win, tag + 1, item_x - tag_x - 3); + wmove(win, choice, item_x); + wattrset(win, selected ? item_selected_attr : item_attr); + waddnstr(win, item, menu_width - item_x - 1); + /* If have a selection handler for this, call it */ + if (me && me->selected) { + wrefresh(win); + me->selected(me, selected); + } +} +/* End of print_item() */ diff --git a/gnu/lib/libodialog/msgbox.c b/gnu/lib/libodialog/msgbox.c new file mode 100644 index 0000000..41d78c8 --- /dev/null +++ b/gnu/lib/libodialog/msgbox.c @@ -0,0 +1,346 @@ +/* + * msgbox.c -- implements the message box and info box + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include "dialog.priv.h" + + +/* local prototypes */ +static int getnlines(unsigned char *buf); +static void print_page(WINDOW *win, int height, int width, unsigned char *buf, int startline, int hscroll); +static void print_perc(WINDOW *win, int y, int x, float p); + + +/* + * Display a message box. Program will pause and display an "OK" button + * if the parameter 'pause' is non-zero. + */ +int dialog_msgbox(unsigned char *title, unsigned char *prompt, int height, int width, int pause) +{ + int i, j, x, y, key = 0; + WINDOW *dialog; + + if (height < 0) + height = strheight(prompt)+2+2*(!!pause); + if (width < 0) { + i = strwidth(prompt); + j = ((title != NULL) ? strwidth(title) : 0); + width = MAX(i,j)+4; + } + if (pause) + width = MAX(width,10); + + if (width > COLS) + width = COLS; + if (height > LINES) + height = LINES; + /* center dialog box on screen */ + x = DialogX ? DialogX : (COLS - width)/2; + y = DialogY ? DialogY : (LINES - height)/2; + +#ifdef HAVE_NCURSES + if (use_shadow) + draw_shadow(stdscr, y, x, height, width); +#endif + dialog = newwin(height, width, y, x); + if (dialog == NULL) { + endwin(); + fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x); + exit(1); + } + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); + + if (title != NULL) { + wattrset(dialog, title_attr); + wmove(dialog, 0, (width - strlen(title))/2 - 1); + waddch(dialog, ' '); + waddstr(dialog, title); + waddch(dialog, ' '); + } + wattrset(dialog, dialog_attr); + wmove(dialog, 1, 2); + print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE); + + if (pause) { + wattrset(dialog, border_attr); + wmove(dialog, height-3, 0); + waddch(dialog, ACS_LTEE); + for (i = 0; i < width-2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dialog_attr); + waddch(dialog, ACS_RTEE); + wmove(dialog, height-2, 1); + for (i = 0; i < width-2; i++) + waddch(dialog, ' '); + display_helpline(dialog, height-1, width); + print_button(dialog, " OK ", height-2, width/2-6, TRUE); + wrefresh(dialog); + while (key != ESC && key != '\n' && key != ' ' && key != '\r') + key = wgetch(dialog); + if (key == '\r') + key = '\n'; + } + else { + key = '\n'; + wrefresh(dialog); + } + + delwin(dialog); + return (key == ESC ? -1 : 0); +} +/* End of dialog_msgbox() */ + +int +dialog_mesgbox(unsigned char *title, unsigned char *prompt, int height, int width) +/* + * Desc: basically the same as dialog_msgbox, but ... can use PGUP, PGDN and + * arrowkeys to move around the text and pause is always enabled + */ +{ + int i, j, x, y, key=0; + int theight, startline, hscroll, max_lines; + WINDOW *dialog; + + if (height < 0) + height = strheight(prompt)+2+2; + if (width < 0) { + i = strwidth(prompt); + j = ((title != NULL) ? strwidth(title) : 0); + width = MAX(i,j)+4; + } + width = MAX(width,10); + + if (width > COLS) + width = COLS; + if (height > LINES) + height = LINES; + /* center dialog box on screen */ + x = (COLS - width)/2; + y = (LINES - height)/2; + +#ifdef HAVE_NCURSES + if (use_shadow) + draw_shadow(stdscr, y, x, height, width); +#endif + dialog = newwin(height, width, y, x); + if (dialog == NULL) { + endwin(); + fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x); + exit(1); + } + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); + + if (title != NULL) { + wattrset(dialog, title_attr); + wmove(dialog, 0, (width - strlen(title))/2 - 1); + waddch(dialog, ' '); + waddstr(dialog, title); + waddch(dialog, ' '); + } + + wattrset(dialog, border_attr); + wmove(dialog, height-3, 0); + waddch(dialog, ACS_LTEE); + for (i = 0; i < width-2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dialog_attr); + waddch(dialog, ACS_RTEE); + wmove(dialog, height-2, 1); + for (i = 0; i < width-2; i++) + waddch(dialog, ' '); + display_helpline(dialog, height-1, width); + print_button(dialog, " OK ", height-2, width/2-6, TRUE); + wattrset(dialog, dialog_attr); + + theight = height - 4; + startline = 0; + hscroll = 0; + max_lines = getnlines(prompt); + print_page(dialog, theight, width, prompt, startline, hscroll); + print_perc(dialog, height-3, width-9, (float) (startline+theight)/max_lines); + wmove(dialog, height-2, width/2-3); + wrefresh(dialog); + while ((key != ESC) && (key != '\n') && (key != '\r') && (key != ' ')) { + key = wgetch(dialog); + switch(key) { + case KEY_HOME: + startline=0; + hscroll=0; + break; + case KEY_END: + startline = max_lines - theight; + if (startline < 0) startline = 0; + break; + case '\020': /* ^P */ + case KEY_UP: + if (startline > 0) startline--; + break; + case '\016': /* ^N */ + case KEY_DOWN: + if (startline < max_lines - theight) startline++; + break; + case KEY_RIGHT: + hscroll+=5; + break; + case KEY_LEFT: + if (hscroll > 0) hscroll-=5; + if (hscroll < 0) hscroll =0; + break; + case KEY_PPAGE: + if (startline - height > 0) { + startline -= theight; + } else { + startline = 0; + } + break; + case KEY_NPAGE: + if (startline + theight < max_lines - theight) { + startline += theight; + } else { + startline = max_lines - theight; + if (startline < 0) startline = 0; + } + break; + case KEY_F(1): + case '?': + display_helpfile(); + break; + } + print_page(dialog, theight, width, prompt, startline, hscroll); + print_perc(dialog, height-3, width-9, (float) (startline+theight)/max_lines); + wmove(dialog, height-2, width/2-3); + wrefresh(dialog); + } + + delwin(dialog); + return (key == ESC ? -1 : 0); + +} /* dialog_mesgbox() */ + +static void +print_perc(WINDOW *win, int y, int x, float p) +/* + * Desc: print p as a percentage at the coordinates (y,x) + */ +{ + char ps[10]; + + if (p>1.0) p=1.0; + sprintf(ps, "(%3d%%)", (int) (p*100)); + wmove(win, y, x); + waddstr(win, ps); + + return; +} /* print_perc() */ + +static int +getnlines(unsigned char *buf) +/* + * Desc: count the # of lines in + */ +{ + int i = 0; + + if (*buf) + i++; + while (*buf) { + if (*buf == '\n' || *buf == '\r') + i++; + buf++; + } + return(i); +} /* getlines() */ + + +unsigned char * +getline(unsigned char *buf, int n) +/* + * Desc: return a pointer to the n'th line in or NULL if its + * not there + */ +{ + int i; + + if (n<0) { + return(NULL); + } + + i=0; + while (*buf && i + * with a scroll of hscroll from buffer + */ +{ + int i, j; + unsigned char *b; + + b = getline(buf, startline); + for (i=0; i +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +void +dialog_notify(char *msg) +/* + * Desc: display an error message + */ +{ + char *tmphlp; + WINDOW *w; + + w = dupwin(newscr); + if (w == NULL) { + endwin(); + fprintf(stderr, "\ndupwin(newscr) failed, malloc memory corrupted\n"); + exit(1); + } + tmphlp = get_helpline(); + use_helpline("Press enter or space"); + dialog_mesgbox("Message", msg, -1, -1); + restore_helpline(tmphlp); + touchwin(w); + wrefresh(w); + delwin(w); + + return; + +} /* dialog_notify() */ + diff --git a/gnu/lib/libodialog/prgbox.c b/gnu/lib/libodialog/prgbox.c new file mode 100644 index 0000000..bcafacf --- /dev/null +++ b/gnu/lib/libodialog/prgbox.c @@ -0,0 +1,152 @@ +/* + * prgbox.c -- implements the message box and info box + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include + +#include +#include +#include +#include "dialog.priv.h" + +/* + * Display a message box. Program will pause and display an "OK" button + * if the parameter 'pause' is non-zero. + */ +int dialog_prgbox(unsigned char *title, const unsigned char *line, int height, int width, int pause, int use_shell) +{ + int i, x, y, key = 0; + WINDOW *dialog; + FILE *f; + const unsigned char *name; + unsigned char *s, buf[MAX_LEN]; + int status; + + if (height < 0 || width < 0) { + endwin(); + fprintf(stderr, "\nAutosizing is impossible in dialog_prgbox().\n"); + exit(-1); + } + width = MAX(width,10); + + if (width > COLS) + width = COLS; + if (height > LINES) + height = LINES; + /* center dialog box on screen */ + x = DialogX ? DialogX : (COLS - width)/2; + y = DialogY ? DialogY : (LINES - height)/2; + +#ifdef HAVE_NCURSES + if (use_shadow) + draw_shadow(stdscr, y, x, height, width); +#endif + dialog = newwin(height, width, y, x); + if (dialog == NULL) { + endwin(); + fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x); + exit(1); + } + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); + + if (title != NULL) { + wattrset(dialog, title_attr); + wmove(dialog, 0, (width - strlen(title))/2 - 1); + waddch(dialog, ' '); + waddstr(dialog, title); + waddch(dialog, ' '); + } + wattrset(dialog, dialog_attr); + wmove(dialog, 1, 2); + + if (!use_shell) { + char cmdline[MAX_LEN]; + char *av[51], **ap = av, *val, *p; + + strcpy(cmdline, line); + p = cmdline; + while ((val = strsep(&p," \t")) != NULL) { + if (*val != '\0') + *ap++ = val; + } + *ap = NULL; + f = raw_popen(name = av[0], av, "r"); + } else + f = raw_popen(name = line, NULL, "r"); + + status = -1; + if (f == NULL) { + err: + sprintf(buf, "%s: %s\n", name, strerror(errno)); + prr: + print_autowrap(dialog, buf, height-(pause?3:1), width-2, width, 1, 2, FALSE, TRUE); + wrefresh(dialog); + } else { + while (fgets(buf, sizeof(buf), f) != NULL) { + i = strlen(buf); + if (buf[i-1] == '\n') + buf[i-1] = '\0'; + s = buf; + while ((s = strchr(s, '\t')) != NULL) + *s++ = ' '; + print_autowrap(dialog, buf, height-(pause?3:1), width-2, width, 1, 2, FALSE, TRUE); + print_autowrap(dialog, "\n", height-(pause?3:1), width-2, width, 1, 2, FALSE, FALSE); + wrefresh(dialog); + } + if ((status = raw_pclose(f)) == -1) + goto err; + if (WIFEXITED(status) && WEXITSTATUS(status) == 127) { + sprintf(buf, "%s: program not found\n", name); + goto prr; + } + } + + if (pause) { + wattrset(dialog, border_attr); + wmove(dialog, height-3, 0); + waddch(dialog, ACS_LTEE); + for (i = 0; i < width-2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dialog_attr); + waddch(dialog, ACS_RTEE); + wmove(dialog, height-2, 1); + for (i = 0; i < width-2; i++) + waddch(dialog, ' '); + display_helpline(dialog, height-1, width); + print_button(dialog, " OK ", height-2, width/2-6, TRUE); + wrefresh(dialog); + while (key != ESC && key != '\n' && key != ' ' && key != '\r') + key = wgetch(dialog); + if (key == '\r') + key = '\n'; + } + else { + key = '\n'; + wrefresh(dialog); + } + + delwin(dialog); + return (status); +} +/* End of dialog_msgbox() */ diff --git a/gnu/lib/libodialog/radiolist.c b/gnu/lib/libodialog/radiolist.c new file mode 100644 index 0000000..4b865a6 --- /dev/null +++ b/gnu/lib/libodialog/radiolist.c @@ -0,0 +1,628 @@ +/* + * radiolist.c -- implements the radiolist box + * + * AUTHOR: Stuart Herbert - S.Herbert@sheffield.ac.uk + * (from checklist.c by Savio Lam (lam836@cs.cuhk.hk)) + * + * Substantial rennovation: 12/18/95, Jordan K. Hubbard + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include "dialog.priv.h" + + +static void print_item(WINDOW *win, char *tag, char *item, int status, int choice, int selected, dialogMenuItem *me); + +#define DREF(di, item) ((di) ? &((di)[(item)]) : NULL) + +static int list_width, check_x, item_x; + + +/* + * Display a dialog box with a list of options that can be turned on or off + */ +int +dialog_radiolist(unsigned char *title, unsigned char *prompt, int height, int width, int list_height, + int cnt, void *it, unsigned char *result) +{ + int i, j, x, y, cur_x, cur_y, old_x, old_y, box_x, box_y, key = 0, button, + choice, l, k, scroll, max_choice, *status, item_no = 0, was_on = 0; + int redraw_menu = FALSE, cursor_reset = FALSE; + int rval = 0, onlist = 1, ok_space, cancel_space; + char okButton, cancelButton; + WINDOW *dialog, *list; + unsigned char **items = NULL; + dialogMenuItem *ditems; + + /* Allocate space for storing item on/off status */ + if ((status = alloca(sizeof(int) * abs(cnt))) == NULL) { + endwin(); + fprintf(stderr, "\nCan't allocate memory in dialog_radiolist().\n"); + exit(-1); + } + +draw: + button = choice = scroll = 0; + /* Previous calling syntax, e.g. just a list of strings? */ + if (cnt >= 0) { + items = it; + ditems = NULL; + item_no = cnt; + /* Initializes status */ + for (i = 0; i < item_no; i++) { + status[i] = !strcasecmp(items[i*3 + 2], "on"); + if (status[i]) { + if (was_on) + status[i] = FALSE; + else + was_on = 1; + } + } + } + /* It's the new specification format - fake the rest of the code out */ + else { + item_no = abs(cnt); + ditems = it; + if (!items) + items = (unsigned char **)alloca((item_no * 3) * sizeof(unsigned char *)); + /* Initializes status */ + for (i = 0; i < item_no; i++) { + status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE; + if (status[i]) { + if (was_on) + status[i] = FALSE; + else + was_on = 1; + } + items[i*3] = ditems[i].prompt; + items[i*3 + 1] = ditems[i].title; + items[i*3 + 2] = status[i] ? "on" : "off"; + } + } + max_choice = MIN(list_height, item_no); + + check_x = 0; + item_x = 0; + /* Find length of longest item in order to center radiolist */ + for (i = 0; i < item_no; i++) { + l = strlen(items[i * 3]); + for (j = 0; j < item_no; j++) { + k = strlen(items[j * 3 + 1]); + check_x = MAX(check_x, l + k + 6); + } + item_x = MAX(item_x, l); + } + if (height < 0) + height = strheight(prompt) + list_height + 4 + 2; + if (width < 0) { + i = strwidth(prompt); + j = ((title != NULL) ? strwidth(title) : 0); + width = MAX(i, j); + width = MAX(width, check_x + 4) + 4; + } + width = MAX(width, 24); + + if (width > COLS) + width = COLS; + if (height > LINES) + height = LINES; + /* center dialog box on screen */ + x = DialogX ? DialogX : (COLS - width) / 2; + y = DialogY ? DialogY : (LINES - height) / 2; + +#ifdef HAVE_NCURSES + if (use_shadow) + draw_shadow(stdscr, y, x, height, width); +#endif + dialog = newwin(height, width, y, x); + if (dialog == NULL) { + endwin(); + fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height, width, y, x); + return -1; + } + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); + wattrset(dialog, border_attr); + wmove(dialog, height - 3, 0); + waddch(dialog, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dialog_attr); + waddch(dialog, ACS_RTEE); + wmove(dialog, height - 2, 1); + for (i = 0; i < width - 2; i++) + waddch(dialog, ' '); + + if (title != NULL) { + wattrset(dialog, title_attr); + wmove(dialog, 0, (width - strlen(title)) / 2 - 1); + waddch(dialog, ' '); + waddstr(dialog, title); + waddch(dialog, ' '); + } + wattrset(dialog, dialog_attr); + wmove(dialog, 1, 2); + print_autowrap(dialog, prompt, height - 1, width - 2, width, 1, 2, TRUE, FALSE); + + list_width = width - 6; + getyx(dialog, cur_y, cur_x); + box_y = cur_y + 1; + box_x = (width - list_width) / 2 - 1; + + /* create new window for the list */ + list = subwin(dialog, list_height, list_width, y + box_y + 1, x + box_x + 1); + if (list == NULL) { + delwin(dialog); + endwin(); + fprintf(stderr, "\nsubwin(dialog,%d,%d,%d,%d) failed, maybe wrong dims\n", list_height, list_width, + y + box_y + 1,x + box_x + 1); + return -1; + } + keypad(list, TRUE); + + /* draw a box around the list items */ + draw_box(dialog, box_y, box_x, list_height+2, list_width+2, menubox_border_attr, menubox_attr); + + check_x = (list_width - check_x) / 2; + item_x = check_x + item_x + 6; + + /* Print the list */ + for (i = 0; i < max_choice; i++) + print_item(list, items[i * 3], items[i * 3 + 1], status[i], i, i == choice, DREF(ditems, i)); + wnoutrefresh(list); + print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); + + display_helpline(dialog, height-1, width); + + x = width/ 2 - 11; + y = height - 2; + if (ditems && result) { + cancelButton = toupper(ditems[CANCEL_BUTTON].prompt[0]); + print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, + ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : FALSE); + okButton = toupper(ditems[OK_BUTTON].prompt[0]); + print_button(dialog, ditems[OK_BUTTON].prompt, y, x, + ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : TRUE); + } + else { + cancelButton = 'C'; + print_button(dialog, "Cancel", y, x + 14, FALSE); + okButton = 'O'; + print_button(dialog, " OK ", y, x, TRUE); + } + wnoutrefresh(dialog); + wmove(list, choice, check_x+1); + wrefresh(list); + + while (key != ESC) { + key = wgetch(dialog); + + /* See if its the short-cut to "OK" */ + if (toupper(key) == okButton) { + if (ditems) { + if (result && ditems[OK_BUTTON].fire) { + int st; + WINDOW *save; + + save = dupwin(newscr); + st = ditems[OK_BUTTON].fire(&ditems[OK_BUTTON]); + if (st & DITEM_RESTORE) { + touchwin(save); + wrefresh(save); + } + delwin(save); + } + } + else if (result) { + *result = '\0'; + for (i = 0; i < item_no; i++) { + if (status[i]) { + strcat(result, items[i*3]); + break; + } + } + } + rval = 0; + key = ESC; + break; + } + + /* Shortcut to cancel */ + if (toupper(key) == cancelButton) { + if (ditems && result && ditems[CANCEL_BUTTON].fire) { + int st; + WINDOW *save; + + save = dupwin(newscr); + st = ditems[CANCEL_BUTTON].fire(&ditems[CANCEL_BUTTON]); + if (st & DITEM_RESTORE) { + touchwin(save); + wrefresh(save); + } + delwin(save); + } + rval = 1; + key = ESC; + break; + } + + /* Check if key pressed matches first character of any item tag in list */ + for (i = 0; i < max_choice; i++) + if (key != ' ' && toupper(key) == toupper(items[(scroll + i) * 3][0])) + break; + + if (i < max_choice || (key >= '1' && key <= MIN('9', '0' + max_choice)) || + KEY_IS_UP(key) || KEY_IS_DOWN(key) || ((key == ' ' || key == '\r' || key == '\n') && onlist == 1)) { + + /* if moving from buttons to the list, reset and redraw buttons */ + if (!onlist) { + onlist = 1; + button = 0; + + if (ditems && result ) { + print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, + ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); + print_button(dialog, ditems[OK_BUTTON].prompt, y, x, + ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); + } + else { + print_button(dialog, "Cancel", y, x + 14, button); + print_button(dialog, " OK ", y, x, !button); + } + } + wmove(list, choice, check_x+1); + wnoutrefresh(dialog); + wrefresh(list); + + if (key >= '1' && key <= MIN('9', '0' + max_choice)) + i = key - '1'; + else if (KEY_IS_UP(key)) { + if (!choice) { + if (scroll) { + /* Scroll list down */ + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + if (list_height > 1) { + /* De-highlight current first item before scrolling down */ + print_item(list, items[scroll*3], items[scroll*3 + 1], status[scroll], 0, + FALSE, DREF(ditems, scroll)); + scrollok(list, TRUE); + wscrl(list, -1); + scrollok(list, FALSE); + } + scroll--; + print_item(list, items[scroll*3], items[scroll*3 + 1], status[scroll], 0, + TRUE, DREF(ditems, scroll)); + print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); + wmove(list, choice, check_x+1); + wnoutrefresh(dialog); + wrefresh(list); + } + continue; /* wait for another key press */ + } + else + i = choice - 1; + } + else if (KEY_IS_DOWN(key)) { + if (choice == max_choice - 1) { + if (scroll + choice < item_no - 1) { + /* Scroll list up */ + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + if (list_height > 1) { + /* De-highlight current last item before scrolling up */ + print_item(list, items[(scroll + max_choice - 1) * 3], + items[(scroll + max_choice - 1) * 3 + 1], + status[scroll + max_choice - 1], max_choice - 1, + FALSE, DREF(ditems, scroll + max_choice - 1)); + scrollok(list, TRUE); + scroll(list); + scrollok(list, FALSE); + } + scroll++; + print_item(list, items[(scroll + max_choice - 1) * 3], + items[(scroll + max_choice - 1) * 3 + 1], + status[scroll + max_choice - 1], max_choice - 1, + TRUE, DREF(ditems, scroll + max_choice - 1)); + print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); + wmove(list, choice, check_x+1); + wnoutrefresh(dialog); + wrefresh(list); + } + continue; /* wait for another key press */ + } + else + i = choice + 1; + } + else if ((key == ' ' || key == '\r' || key == '\n') && onlist) { /* Toggle item status */ + getyx(list, old_y, old_x); /* Save cursor position */ + if (status[scroll + choice]) + continue; + else if (ditems) { + if (ditems[scroll + choice].fire) { + int st; + WINDOW *save; + + save = dupwin(newscr); + st = ditems[scroll + choice].fire(&ditems[scroll + choice]); + if (st & DITEM_RESTORE) { + touchwin(save); + wrefresh(save); + } + delwin(save); + if (st & DITEM_REDRAW) { + wclear(list); + for (i = 0; i < item_no; i++) + status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE; + + for (i = 0; i < max_choice; i++) { + print_item(list, items[(scroll + i) * 3], items[(scroll + i) * 3 + 1], + status[scroll + i], i, i == choice, + DREF(ditems, scroll + i)); + } +/* wmove(list, old_y, old_x);*/ /* Restore cursor to previous position */ +/* wrefresh(list); */ + } + if (st & DITEM_LEAVE_MENU) { + /* Allow a fire action to take us out of the menu */ + key = ESC; + break; + } + else if (st & DITEM_RECREATE) { + delwin(list); + delwin(dialog); + dialog_clear(); + goto draw; + } + } + for (i = 0; i < item_no; i++) + status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE; + } + else { + for (i = 0; i < item_no; i++) + status[i] = 0; + status[scroll + choice] = TRUE; + } + for (i = 0; i < max_choice; i++) + print_item(list, items[(scroll + i) * 3], items[(scroll + i) * 3 + 1], + status[scroll + i], i, i == choice, DREF(ditems, scroll + i)); + wmove(list, choice, check_x+1); /* Restore cursor position */ + wrefresh(list); + continue; /* wait for another key press */ + } + + if (i != choice) { + /* De-highlight current item */ + print_item(list, items[(scroll + choice) * 3], items[(scroll + choice) * 3 +1], + status[scroll + choice], choice, FALSE, DREF(ditems, scroll + choice)); + /* Highlight new item */ + choice = i; + print_item(list, items[(scroll + choice) * 3], items[(scroll + choice) * 3 + 1], + status[scroll + choice], choice, TRUE, DREF(ditems, scroll + choice)); + wmove(list, choice, check_x+1); /* Restore cursor position */ + wrefresh(list); + } + continue; /* wait for another key press */ + } + + switch (key) { + case KEY_PPAGE: + if (scroll > height-4) /* can we go up? */ + scroll -= (height-4); + else + scroll = 0; + redraw_menu = TRUE; + if (!onlist) { + onlist = 1; + button = 0; + } + break; + + case KEY_NPAGE: + if (scroll + list_height >= item_no-1 - list_height) { /* can we go down a full page? */ + scroll = item_no - list_height; + if (scroll < 0) + scroll = 0; + } + else + scroll += list_height; + redraw_menu = TRUE; + if (!onlist) { + onlist = 1; + button = 0; + } + break; + + case KEY_HOME: + scroll = 0; + choice = 0; + redraw_menu = TRUE; + cursor_reset = TRUE; + onlist = 1; + break; + + case KEY_END: + scroll = item_no - list_height; + if (scroll < 0) + scroll = 0; + choice = max_choice - 1; + redraw_menu = TRUE; + cursor_reset = TRUE; + onlist = 1; + break; + + case TAB: + case KEY_BTAB: + /* move to next component */ + if (onlist) { /* on list, next is ok button */ + onlist = 0; + if (ditems && result) + ok_space = 1; + else + ok_space = 3; + wmove(dialog, y, x + ok_space); + wrefresh(dialog); + break; + } + else if (button) { /* on cancel button, next is list */ + button = 0; + onlist = 1; + redraw_menu = TRUE; + break; + } + /* on ok button, next is cancel button, same as left/right case */ + + case KEY_LEFT: + case KEY_RIGHT: + onlist = 0; + button = !button; + if (ditems && result) { + print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, + ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); + print_button(dialog, ditems[OK_BUTTON].prompt, y, x, + ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); + ok_space = 1; + cancel_space = strlen(ditems[OK_BUTTON].prompt) + 6; + } + else { + print_button(dialog, "Cancel", y, x + 14, button); + print_button(dialog, " OK ", y, x, !button); + ok_space = 3; + cancel_space = 15; + } + if (button) + wmove(dialog, y, x + cancel_space); + else + wmove(dialog, y, x + ok_space); + wrefresh(dialog); + break; + + case ' ': + case '\r': + case '\n': + if (!onlist) { + if (ditems) { + if (result && ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire) { + int st; + WINDOW *save; + + save = dupwin(newscr); + st = ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire(&ditems[button ? CANCEL_BUTTON : OK_BUTTON]); + if (st & DITEM_RESTORE) { + touchwin(save); + wrefresh(save); + } + delwin(save); + } + } + else if (result) { + *result = '\0'; + for (i = 0; i < item_no; i++) { + if (status[i]) { + strcpy(result, items[i*3]); + break; + } + } + } + rval = button; + key = ESC; + break; + } + + case ESC: + rval = -1; + break; + + case KEY_F(1): + case '?': + display_helpfile(); + break; + } + + if (redraw_menu) { + getyx(list, old_y, old_x); + wclear(list); + for (i = 0; i < max_choice; i++) + print_item(list, items[(scroll + i) * 3], items[(scroll + i) * 3 + 1], status[scroll + i], + i, i == choice, DREF(ditems, scroll + i)); + print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); + + /* redraw buttons to fix highlighting */ + if (ditems && result) { + print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, + ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); + print_button(dialog, ditems[OK_BUTTON].prompt, y, x, + ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); + } + else { + print_button(dialog, "Cancel", y, x + 14, button); + print_button(dialog, " OK ", y, x, !button); + } + wnoutrefresh(dialog); + if (cursor_reset) { + wmove(list, choice, check_x+1); + cursor_reset = FALSE; + } + else { + wmove(list, old_y, old_x); + } + wrefresh(list); + redraw_menu = FALSE; + } + } + + delwin(list); + delwin(dialog); + return rval; /* ESC pressed */ +} + +/* + * Print list item + */ +static void +print_item(WINDOW *win, char *tag, char *item, int status, int choice, int selected, dialogMenuItem *me) +{ + int i; + + /* Clear 'residue' of last item */ + wattrset(win, menubox_attr); + wmove(win, choice, 0); + for (i = 0; i < list_width; i++) + waddch(win, ' '); + wmove(win, choice, check_x); + wattrset(win, selected ? check_selected_attr : check_attr); + wprintw(win, "%c%c%c", me && me->lbra ? me->lbra : '(', + status ? me && me->mark ? me->mark : '*' : ' ', + me && me->rbra ? me->rbra : ')'); + wattrset(win, menubox_attr); + waddch(win, ' '); + wattrset(win, selected ? tag_key_selected_attr : tag_key_attr); + waddch(win, tag[0]); + wattrset(win, selected ? tag_selected_attr : tag_attr); + waddstr(win, tag + 1); + wmove(win, choice, item_x); + wattrset(win, selected ? item_selected_attr : item_attr); + waddstr(win, item); + /* If have a selection handler for this, call it */ + if (me && me->selected) { + wrefresh(win); + me->selected(me, selected); + } +} +/* End of print_item() */ diff --git a/gnu/lib/libodialog/raw_popen.c b/gnu/lib/libodialog/raw_popen.c new file mode 100644 index 0000000..163c09a --- /dev/null +++ b/gnu/lib/libodialog/raw_popen.c @@ -0,0 +1,161 @@ +/* + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software written by Ken Arnold and + * published in UNIX Review, Vol. 6, No. 8. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)popen.c 8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +static struct pid { + struct pid *next; + FILE *fp; + pid_t pid; +} *pidlist; + +FILE * +raw_popen(const char *program, char * const *argv, const char *type) +{ + struct pid *cur; + FILE *iop; + int pdes[2], pid; + + if ((*type != 'r' && *type != 'w') || type[1]) + return (NULL); + + if ((cur = malloc(sizeof(struct pid))) == NULL) + return (NULL); + + if (pipe(pdes) < 0) { + (void)free(cur); + return (NULL); + } + + switch (pid = vfork()) { + case -1: /* Error. */ + (void)close(pdes[0]); + (void)close(pdes[1]); + (void)free(cur); + return (NULL); + /* NOTREACHED */ + case 0: /* Child. */ + if (*type == 'r') { + if (pdes[1] != STDOUT_FILENO) { + (void)dup2(pdes[1], STDOUT_FILENO); + (void)close(pdes[1]); + } + (void) close(pdes[0]); + } else { + if (pdes[0] != STDIN_FILENO) { + (void)dup2(pdes[0], STDIN_FILENO); + (void)close(pdes[0]); + } + (void)close(pdes[1]); + } + if (argv == NULL) + execl(_PATH_BSHELL, "sh", "-c", program, (char *)NULL); + else + execvp(program, argv); + _exit(127); + /* NOTREACHED */ + } + + /* Parent; assume fdopen can't fail. */ + if (*type == 'r') { + iop = fdopen(pdes[0], type); + (void)close(pdes[1]); + } else { + iop = fdopen(pdes[1], type); + (void)close(pdes[0]); + } + + /* Link into list of file descriptors. */ + cur->fp = iop; + cur->pid = pid; + cur->next = pidlist; + pidlist = cur; + + return (iop); +} + +/* + * pclose -- + * Pclose returns -1 if stream is not associated with a `popened' command, + * if already `pclosed', or waitpid returns an error. + */ +int +raw_pclose(FILE *iop) +{ + register struct pid *cur, *last; + int omask, pstat; + pid_t pid; + + (void)fclose(iop); + + /* Find the appropriate file pointer. */ + for (last = NULL, cur = pidlist; cur; last = cur, cur = cur->next) + if (cur->fp == iop) + break; + if (cur == NULL) + return (-1); + + /* Get the status of the process. */ + omask = sigblock(sigmask(SIGINT)|sigmask(SIGQUIT)|sigmask(SIGHUP)); + do { + pid = waitpid(cur->pid, (int *) &pstat, 0); + } while (pid == -1 && errno == EINTR); + (void)sigsetmask(omask); + + /* Remove the entry from the linked list. */ + if (last == NULL) + pidlist = cur->next; + else + last->next = cur->next; + free(cur); + + return (pid == -1 ? -1 : pstat); +} diff --git a/gnu/lib/libodialog/rc.c b/gnu/lib/libodialog/rc.c new file mode 100644 index 0000000..36631a6 --- /dev/null +++ b/gnu/lib/libodialog/rc.c @@ -0,0 +1,375 @@ +/* + * rc.c -- routines for processing the configuration file + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include "dialog.priv.h" +#include "colors.h" +#include "rc.h" + + +static unsigned char *attr_to_str(int fg, int bg, int hl); +static int str_to_attr(unsigned char *str, int *fg, int *bg, int *hl); +static int parse_line(unsigned char *line, unsigned char **var, unsigned char **value); + + +/* + * Create the configuration file + */ +void dialog_create_rc(unsigned char *filename) +{ + int i; + FILE *rc_file; + + if ((rc_file = fopen(filename, "wt")) == NULL) { + fprintf(stderr, "\nError opening file for writing in create_rc().\n"); + exit(-1); + } + + fprintf(rc_file, "#\ +\n# Run-time configuration file for dialog\ +\n#\ +\n# Automatically generated by \"dialog --create-rc \"\ +\n#\ +\n#\ +\n# Types of values:\ +\n#\ +\n# Number - \ +\n# String - \"string\"\ +\n# Boolean - \ +\n# Attribute - (foreground,background,highlight?)\ +\n#\n\n"); + + /* Print an entry for each configuration variable */ + for (i = 0; i < VAR_COUNT; i++) { + fprintf(rc_file, "\n# %s\n", vars[i].comment); /* print comment */ + switch (vars[i].type) { + case VAL_INT: + fprintf(rc_file, "%s = %d\n", vars[i].name, *((int *) vars[i].var)); + break; + case VAL_STR: + fprintf(rc_file, "%s = \"%s\"\n", vars[i].name, (unsigned char *) vars[i].var); + break; + case VAL_BOOL: + fprintf(rc_file, "%s = %s\n", vars[i].name, *((bool *) vars[i].var) ? "ON" : "OFF"); + break; + case VAL_ATTR: + fprintf(rc_file, "%s = %s\n", vars[i].name, attr_to_str(((int *) vars[i].var)[0], ((int *) vars[i].var)[1], ((int *) vars[i].var)[2])); + break; + } + } + + fclose(rc_file); +} +/* End of create_rc() */ + + +/* + * Parse the configuration file and set up variables + */ +int parse_rc(void) +{ + int i, l = 1, parse, fg, bg, hl; + unsigned char str[MAX_LEN+1], *var, *value, *tempptr; + FILE *rc_file; + + /* + * + * At start, 'dialog' determines the settings to use as follows: + * + * a) if environment variable DIALOGRC is set, it's value determines the + * name of the configuration file. + * + * b) if the file in (a) can't be found, use the file $HOME/.dialogrc + * as the configuration file. + * + * c) if the file in (b) can't be found, use compiled in defaults. + * + */ + + if ((tempptr = getenv("DIALOGRC")) != NULL) + rc_file = fopen(tempptr, "rt"); + + if (tempptr == NULL || rc_file == NULL) { /* step (a) failed? */ + /* try step (b) */ + if ((tempptr = getenv("HOME")) == NULL) + return 0; /* step (b) failed, use default values */ + + if (tempptr[0] == '\0' || lastch(tempptr) == '/') + sprintf(str, "%s%s", tempptr, DIALOGRC); + else + sprintf(str, "%s/%s", tempptr, DIALOGRC); + + if ((rc_file = fopen(str, "rt")) == NULL) + return 0; /* step (b) failed, use default values */ + } + + /* Scan each line and set variables */ + while (fgets(str, MAX_LEN, rc_file) != NULL) { + if (lastch(str) != '\n') { /* ignore rest of file if line too long */ + fprintf(stderr, "\nParse error: line %d of configuration file too long.\n", l); + fclose(rc_file); + return -1; /* parse aborted */ + } + else { + lastch(str) = '\0'; + parse = parse_line(str, &var, &value); /* parse current line */ + + switch (parse) { + case LINE_BLANK: /* ignore blank lines and comments */ + case LINE_COMMENT: + break; + case LINE_OK: + /* search table for matching config variable name */ + for (i = 0; i < VAR_COUNT && strcmp(vars[i].name, var); i++); + + if (i == VAR_COUNT) { /* no match */ + fprintf(stderr, "\nParse error: unknown variable at line %d of configuration file.\n", l); + return -1; /* parse aborted */ + } + else { /* variable found in table, set run time variables */ + switch (vars[i].type) { + case VAL_INT: + *((int *) vars[i].var) = atoi(value); + break; + case VAL_STR: + if (!isquote(value[0]) || !isquote(lastch(value)) || strlen(value) < 2) { + fprintf(stderr, "\nParse error: string value expected at line %d of configuration file.\n", l); + return -1; /* parse aborted */ + } + else { + /* remove the (") quotes */ + value++; + lastch(value) = '\0'; + strcpy((unsigned char *) vars[i].var, value); + } + break; + case VAL_BOOL: + if (!strcasecmp(value, "ON")) + *((bool *) vars[i].var) = TRUE; + else if (!strcasecmp(value, "OFF")) + *((bool *) vars[i].var) = FALSE; + else { + fprintf(stderr, "\nParse error: boolean value expected at line %d of configuration file.\n", l); + return -1; /* parse aborted */ + } + break; + case VAL_ATTR: + if (str_to_attr(value, &fg, &bg, &hl) == -1) { + fprintf(stderr, "\nParse error: attribute value expected at line %d of configuration file.\n", l); + return -1; /* parse aborted */ + } + ((int *) vars[i].var)[0] = fg; + ((int *) vars[i].var)[1] = bg; + ((int *) vars[i].var)[2] = hl; + break; + } + } + break; + case LINE_ERROR: + fprintf(stderr, "\nParse error: syntax error at line %d of configuration file.\n", l); + return -1; /* parse aborted */ + } + } + + l++; /* next line */ + } + + fclose(rc_file); + return 0; /* parse successful */ +} +/* End of parse_rc() */ + + +/* + * Convert an attribute to a string representation like this: + * + * "(foreground,background,highlight)" + */ +static unsigned char *attr_to_str(int fg, int bg, int hl) +{ + int i; + static unsigned char str[MAX_LEN+1]; + + strcpy(str, "("); + /* foreground */ + for (i = 0; fg != color_names[i].value; i++); + strcat(str, color_names[i].name); + strcat(str, ","); + + /* background */ + for (i = 0; bg != color_names[i].value; i++); + strcat(str, color_names[i].name); + + /* highlight */ + strcat(str, hl ? ",ON)" : ",OFF)"); + + return str; +} +/* End of attr_to_str() */ + + +/* + * Extract the foreground, background and highlight values from an attribute + * represented as a string in this form: + * + * "(foreground,background,highlight)" + */ +static int str_to_attr(unsigned char *str, int *fg, int *bg, int *hl) +{ + int i = 0, j, get_fg = 1; + unsigned char tempstr[MAX_LEN+1], *part; + + if (str[0] != '(' || lastch(str) != ')') + return -1; /* invalid representation */ + + /* remove the parenthesis */ + strcpy(tempstr, str + 1); + lastch(tempstr) = '\0'; + + + /* get foreground and background */ + + while (1) { + /* skip white space before fg/bg string */ + while (whitespace(tempstr[i]) && tempstr[i] != '\0') i++; + if (tempstr[i] == '\0') + return -1; /* invalid representation */ + part = tempstr + i; /* set 'part' to start of fg/bg string */ + + /* find end of fg/bg string */ + while(!whitespace(tempstr[i]) && tempstr[i] != ',' && tempstr[i] != '\0') i++; + + if (tempstr[i] == '\0') + return -1; /* invalid representation */ + else if (whitespace(tempstr[i])) { /* not yet ',' */ + tempstr[i++] = '\0'; + + /* skip white space before ',' */ + while(whitespace(tempstr[i]) && tempstr[i] != '\0') i++; + + if (tempstr[i] != ',') + return -1; /* invalid representation */ + } + + tempstr[i++] = '\0'; /* skip the ',' */ + for (j = 0; j < COLOR_COUNT && strcasecmp(part, color_names[j].name); j++); + if (j == COLOR_COUNT) /* invalid color name */ + return -1; + if (get_fg) { + *fg = color_names[j].value; + get_fg = 0; /* next we have to get the background */ + } + else { + *bg = color_names[j].value; + break; + } + } /* got foreground and background */ + + + /* get highlight */ + + /* skip white space before highlight string */ + while (whitespace(tempstr[i]) && tempstr[i] != '\0') i++; + if (tempstr[i] == '\0') + return -1; /* invalid representation */ + part = tempstr + i; /* set 'part' to start of highlight string */ + + /* trim trailing white space from highlight string */ + i = strlen(part) - 1; + while(whitespace(part[i])) i--; + part[i+1] = '\0'; + + if (!strcasecmp(part, "ON")) + *hl = TRUE; + else if (!strcasecmp(part, "OFF")) + *hl = FALSE; + else + return -1; /* invalid highlight value */ + + return 0; +} +/* End of str_to_attr() */ + + +/* + * Parse a line in the configuration file + * + * Each line is of the form: "variable = value". On exit, 'var' will contain + * the variable name, and 'value' will contain the value string. + * + * Return values: + * + * LINE_BLANK - line is blank + * LINE_COMMENT - line is comment + * LINE_OK - line is ok + * LINE_ERROR - syntax error in line + */ +static int parse_line(unsigned char *line, unsigned char **var, unsigned char **value) +{ + int i = 0; + + /* ignore white space at beginning of line */ + while(whitespace(line[i]) && line[i] != '\0') i++; + + if (line[i] == '\0') /* line is blank */ + return LINE_BLANK; + else if (line[i] == '#') /* line is comment */ + return LINE_COMMENT; + else if (line[i] == '=') /* variables names can't strart with a '=' */ + return LINE_ERROR; + + /* set 'var' to variable name */ + *var = line + i++; /* skip to next character */ + + /* find end of variable name */ + while(!whitespace(line[i]) && line[i] != '=' && line[i] != '\0') i++; + + if (line[i] == '\0') /* syntax error */ + return LINE_ERROR; + else if (line[i] == '=') + line[i++] = '\0'; + else { + line[i++] = '\0'; + + /* skip white space before '=' */ + while(whitespace(line[i]) && line[i] != '\0') i++; + + if (line[i] != '=') /* syntax error */ + return LINE_ERROR; + else + i++; /* skip the '=' */ + } + + /* skip white space after '=' */ + while(whitespace(line[i]) && line[i] != '\0') i++; + + if (line[i] == '\0') + return LINE_ERROR; + else + *value = line + i; /* set 'value' to value string */ + + /* trim trailing white space from 'value' */ + i = strlen(*value) - 1; + while(whitespace((*value)[i])) i--; + (*value)[i+1] = '\0'; + + return LINE_OK; /* no syntax error in line */ +} +/* End of parse_line() */ diff --git a/gnu/lib/libodialog/rc.h b/gnu/lib/libodialog/rc.h new file mode 100644 index 0000000..fc19d03 --- /dev/null +++ b/gnu/lib/libodialog/rc.h @@ -0,0 +1,222 @@ +/* + * rc.h -- declarations for configuration file processing + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +#define DIALOGRC ".dialogrc" +#define VAR_LEN 30 +#define COMMENT_LEN 70 + +/* Types of values */ +#define VAL_INT 0 +#define VAL_STR 1 +#define VAL_BOOL 2 +#define VAL_ATTR 3 + +/* Type of line in configuration file */ +#define LINE_BLANK 2 +#define LINE_COMMENT 1 +#define LINE_OK 0 +#define LINE_ERROR -1 + +/* number of configuration variables */ +#define VAR_COUNT (sizeof(vars) / sizeof(vars_st)) + +/* check if character is white space */ +#define whitespace(c) (c == ' ' || c == '\t') + +/* check if character is string quoting characters */ +#define isquote(c) (c == '"' || c == '\'') + +/* get last character of string */ +#define lastch(str) str[strlen(str)-1] + +/* + * Configuration variables + */ +typedef struct { + unsigned char name[VAR_LEN]; /* name of configuration variable as in DIALOGRC */ + void *var; /* address of actually variable to change */ + int type; /* type of value */ + unsigned char comment[COMMENT_LEN]; /* comment to put in "rc" file */ +} vars_st; + +vars_st vars[] = { + { "use_shadow", + &use_shadow, + VAL_BOOL, + "Shadow dialog boxes? This also turns on color." }, + + { "use_colors", + &use_colors, + VAL_BOOL, + "Turn color support ON or OFF" }, + + { "screen_color", + color_table[0], + VAL_ATTR, + "Screen color" }, + + { "shadow_color", + color_table[1], + VAL_ATTR, + "Shadow color" }, + + { "dialog_color", + color_table[2], + VAL_ATTR, + "Dialog box color" }, + + { "title_color", + color_table[3], + VAL_ATTR, + "Dialog box title color" }, + + { "border_color", + color_table[4], + VAL_ATTR, + "Dialog box border color" }, + + { "button_active_color", + color_table[5], + VAL_ATTR, + "Active button color" }, + + { "button_inactive_color", + color_table[6], + VAL_ATTR, + "Inactive button color" }, + + { "button_key_active_color", + color_table[7], + VAL_ATTR, + "Active button key color" }, + + { "button_key_inactive_color", + color_table[8], + VAL_ATTR, + "Inactive button key color" }, + + { "button_label_active_color", + color_table[9], + VAL_ATTR, + "Active button label color" }, + + { "button_label_inactive_color", + color_table[10], + VAL_ATTR, + "Inactive button label color" }, + + { "inputbox_color", + color_table[11], + VAL_ATTR, + "Input box color" }, + + { "inputbox_border_color", + color_table[12], + VAL_ATTR, + "Input box border color" }, + + { "searchbox_color", + color_table[13], + VAL_ATTR, + "Search box color" }, + + { "searchbox_title_color", + color_table[14], + VAL_ATTR, + "Search box title color" }, + + { "searchbox_border_color", + color_table[15], + VAL_ATTR, + "Search box border color" }, + + { "position_indicator_color", + color_table[16], + VAL_ATTR, + "File position indicator color" }, + + { "menubox_color", + color_table[17], + VAL_ATTR, + "Menu box color" }, + + { "menubox_border_color", + color_table[18], + VAL_ATTR, + "Menu box border color" }, + + { "item_color", + color_table[19], + VAL_ATTR, + "Item color" }, + + { "item_selected_color", + color_table[20], + VAL_ATTR, + "Selected item color" }, + + { "tag_color", + color_table[21], + VAL_ATTR, + "Tag color" }, + + { "tag_selected_color", + color_table[22], + VAL_ATTR, + "Selected tag color" }, + + { "tag_key_color", + color_table[23], + VAL_ATTR, + "Tag key color" }, + + { "tag_key_selected_color", + color_table[24], + VAL_ATTR, + "Selected tag key color" }, + + { "check_color", + color_table[25], + VAL_ATTR, + "Check box color" }, + + { "check_selected_color", + color_table[26], + VAL_ATTR, + "Selected check box color" }, + + { "uarrow_color", + color_table[27], + VAL_ATTR, + "Up arrow color" }, + + { "darrow_color", + color_table[28], + VAL_ATTR, + "Down arrow color" } +}; /* vars */ + + + +/* + * Routines to process configuration file + */ +int parse_rc(void); diff --git a/gnu/lib/libodialog/textbox.c b/gnu/lib/libodialog/textbox.c new file mode 100644 index 0000000..19a13bb --- /dev/null +++ b/gnu/lib/libodialog/textbox.c @@ -0,0 +1,699 @@ +/* + * textbox.c -- implements the text box + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include "dialog.priv.h" + + +static void back_lines(int n); +static void print_page(WINDOW *win, int height, int width); +static void print_line(WINDOW *win, int row, int width); +static unsigned char *get_line(void); +static int get_search_term(WINDOW *win, unsigned char *search_term, int height, int width); +static void print_position(WINDOW *win, int height, int width); + + +static int hscroll = 0, fd, file_size, bytes_read, begin_reached = 1, + end_reached = 0, page_length; +static unsigned char *buf, *page; + + +/* + * Display text from a file in a dialog box. + */ +int dialog_textbox(unsigned char *title, unsigned char *file, int height, int width) +{ + int i, x, y, cur_x, cur_y, fpos, key = 0, dir, temp, temp1; +#ifdef HAVE_NCURSES + int passed_end; +#endif + unsigned char search_term[MAX_LEN+1], *tempptr, *found; + WINDOW *dialog, *text; + + if (height < 0 || width < 0) { + fprintf(stderr, "\nAutosizing is impossible in dialog_textbox().\n"); + return(-1); + } + + search_term[0] = '\0'; /* no search term entered yet */ + + /* Open input file for reading */ + if ((fd = open(file, O_RDONLY)) == -1) { + fprintf(stderr, "\nCan't open input file <%s>in dialog_textbox().\n", file); + return(-1); + } + /* Get file size. Actually, 'file_size' is the real file size - 1, + since it's only the last byte offset from the beginning */ + if ((file_size = lseek(fd, 0, SEEK_END)) == -1) { + fprintf(stderr, "\nError getting file size in dialog_textbox().\n"); + return(-1); + } + /* Restore file pointer to beginning of file after getting file size */ + if (lseek(fd, 0, SEEK_SET) == -1) { + fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n"); + return(-1); + } + /* Allocate space for read buffer */ + if ((buf = malloc(BUF_SIZE+1)) == NULL) { + endwin(); + fprintf(stderr, "\nCan't allocate memory in dialog_textbox().\n"); + exit(-1); + } + if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) { + fprintf(stderr, "\nError reading file in dialog_textbox().\n"); + return(-1); + } + buf[bytes_read] = '\0'; /* mark end of valid data */ + page = buf; /* page is pointer to start of page to be displayed */ + + if (width > COLS) + width = COLS; + if (height > LINES) + height = LINES; + /* center dialog box on screen */ + x = DialogX ? DialogX : (COLS - width)/2; + y = DialogY ? DialogY : (LINES - height)/2; + +#ifdef HAVE_NCURSES + if (use_shadow) + draw_shadow(stdscr, y, x, height, width); +#endif + dialog = newwin(height, width, y, x); + if (dialog == NULL) { + endwin(); + fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x); + exit(1); + } + keypad(dialog, TRUE); + + /* Create window for text region, used for scrolling text */ +/* text = newwin(height-4, width-2, y+1, x+1); */ + text = subwin(dialog, height-4, width-2, y+1, x+1); + if (text == NULL) { + endwin(); + fprintf(stderr, "\nsubwin(dialog,%d,%d,%d,%d) failed, maybe wrong dims\n", height-4,width-2,y+1,x+1); + exit(1); + } + keypad(text, TRUE); + + draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); + + wattrset(dialog, border_attr); + wmove(dialog, height-3, 0); + waddch(dialog, ACS_LTEE); + for (i = 0; i < width-2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dialog_attr); + waddch(dialog, ACS_RTEE); + wmove(dialog, height-2, 1); + for (i = 0; i < width-2; i++) + waddch(dialog, ' '); + + if (title != NULL) { + wattrset(dialog, title_attr); + wmove(dialog, 0, (width - strlen(title))/2 - 1); + waddch(dialog, ' '); + waddstr(dialog, title); + waddch(dialog, ' '); + } + display_helpline(dialog, height-1, width); + + print_button(dialog, " OK ", height-2, width/2-6, TRUE); + wnoutrefresh(dialog); + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + + /* Print first page of text */ + attr_clear(text, height-4, width-2, dialog_attr); + print_page(text, height-4, width-2); + print_position(dialog, height, width); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh(dialog); + + while ((key != ESC) && (key != '\n') && (key != '\r') && (key != ' ')) { + key = wgetch(dialog); + switch (key) { + case 'E': /* Exit */ + case 'e': + delwin(dialog); + free(buf); + close(fd); + return 0; + case 'g': /* First page */ + case KEY_HOME: + if (!begin_reached) { + begin_reached = 1; + /* First page not in buffer? */ + if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) { + endwin(); + fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n"); + exit(-1); + } + if (fpos > bytes_read) { /* Yes, we have to read it in */ + if (lseek(fd, 0, SEEK_SET) == -1) { + endwin(); + fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n"); + exit(-1); + } + if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) { + endwin(); + fprintf(stderr, "\nError reading file in dialog_textbox().\n"); + exit(-1); + } + buf[bytes_read] = '\0'; + } + page = buf; + print_page(text, height-4, width-2); + print_position(dialog, height, width); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh(dialog); + } + break; + case 'G': /* Last page */ +#ifdef HAVE_NCURSES + case KEY_END: +#endif + end_reached = 1; + /* Last page not in buffer? */ + if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) { + endwin(); + fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n"); + exit(-1); + } + if (fpos < file_size) { /* Yes, we have to read it in */ + if (lseek(fd, -BUF_SIZE, SEEK_END) == -1) { + endwin(); + fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n"); + exit(-1); + } + if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) { + endwin(); + fprintf(stderr, "\nError reading file in dialog_textbox().\n"); + exit(-1); + } + buf[bytes_read] = '\0'; + } + page = buf + bytes_read; + back_lines(height-4); + print_page(text, height-4, width-2); + print_position(dialog, height, width); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh(dialog); + break; + case 'K': /* Previous line */ + case 'k': + case '\020': /* ^P */ + case KEY_UP: + if (!begin_reached) { + back_lines(page_length+1); +#ifdef HAVE_NCURSES + /* We don't call print_page() here but use scrolling to ensure + faster screen update. However, 'end_reached' and 'page_length' + should still be updated, and 'page' should point to start of + next page. This is done by calling get_line() in the following + 'for' loop. */ + scrollok(text, TRUE); + wscrl(text, -1); /* Scroll text region down one line */ + scrollok(text, FALSE); + page_length = 0; + passed_end = 0; + for (i = 0; i < height-4; i++) { + if (!i) { + print_line(text, 0, width-2); /* print first line of page */ + wnoutrefresh(text); + } + else + get_line(); /* Called to update 'end_reached' and 'page' */ + if (!passed_end) + page_length++; + if (end_reached && !passed_end) + passed_end = 1; + } +#else + print_page(text, height-4, width-2); +#endif + print_position(dialog, height, width); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh(dialog); + } + break; + case 'B': /* Previous page */ + case 'b': + case KEY_PPAGE: + if (!begin_reached) { + back_lines(page_length + height-4); + print_page(text, height-4, width-2); + print_position(dialog, height, width); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh(dialog); + } + break; + case 'J': /* Next line */ + case 'j': + case '\016': /* ^N */ + case KEY_DOWN: + if (!end_reached) { + begin_reached = 0; + scrollok(text, TRUE); + scroll(text); /* Scroll text region up one line */ + scrollok(text, FALSE); + print_line(text, height-5, width-2); +#ifndef HAVE_NCURSES + wmove(text, height-5, 0); + waddch(text, ' '); + wmove(text, height-5, width-3); + waddch(text, ' '); +#endif + wnoutrefresh(text); + print_position(dialog, height, width); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh(dialog); + } + break; + case 'F': /* Next page */ + case 'f': + case KEY_NPAGE: + if (!end_reached) { + begin_reached = 0; + print_page(text, height-4, width-2); + print_position(dialog, height, width); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh(dialog); + } + break; + case '0': /* Beginning of line */ + case 'H': /* Scroll left */ + case 'h': + case KEY_LEFT: + if (hscroll > 0) { + if (key == '0') + hscroll = 0; + else + hscroll--; + /* Reprint current page to scroll horizontally */ + back_lines(page_length); + print_page(text, height-4, width-2); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh(dialog); + } + break; + case 'L': /* Scroll right */ + case 'l': + case KEY_RIGHT: + if (hscroll < MAX_LEN) { + hscroll++; + /* Reprint current page to scroll horizontally */ + back_lines(page_length); + print_page(text, height-4, width-2); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh(dialog); + } + break; + case '/': /* Forward search */ + case 'n': /* Repeat forward search */ + case '?': /* Backward search */ + case 'N': /* Repeat backward search */ + /* set search direction */ + dir = (key == '/' || key == 'n') ? 1 : 0; + if (dir ? !end_reached : !begin_reached) { + if (key == 'n' || key == 'N') { + if (search_term[0] == '\0') { /* No search term yet */ + fprintf(stderr, "\a"); /* beep */ + break; + } + } + else /* Get search term from user */ + if (get_search_term(text, search_term, height-4, width-2) == -1) { + /* ESC pressed in get_search_term(). Reprint page to clear box */ + wattrset(text, dialog_attr); + back_lines(page_length); + print_page(text, height-4, width-2); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh(dialog); + break; + } + /* Save variables for restoring in case search term can't be found */ + tempptr = page; + temp = begin_reached; + temp1 = end_reached; + if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) { + endwin(); + fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n"); + exit(-1); + } + fpos -= bytes_read; + /* update 'page' to point to next (previous) line before + forward (backward) searching */ + back_lines(dir ? page_length-1 : page_length+1); + found = NULL; + if (dir) /* Forward search */ + while((found = strstr(get_line(), search_term)) == NULL) { + if (end_reached) + break; + } + else /* Backward search */ + while((found = strstr(get_line(), search_term)) == NULL) { + if (begin_reached) + break; + back_lines(2); + } + if (found == NULL) { /* not found */ + fprintf(stderr, "\a"); /* beep */ + /* Restore program state to that before searching */ + if (lseek(fd, fpos, SEEK_SET) == -1) { + endwin(); + fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n"); + exit(-1); + } + if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) { + endwin(); + fprintf(stderr, "\nError reading file in dialog_textbox().\n"); + exit(-1); + } + buf[bytes_read] = '\0'; + page = tempptr; + begin_reached = temp; + end_reached = temp1; + /* move 'page' to point to start of current page in order to + re-print current page. Note that 'page' always points to + start of next page, so this is necessary */ + back_lines(page_length); + } + else /* Search term found */ + back_lines(1); + /* Reprint page */ + wattrset(text, dialog_attr); + print_page(text, height-4, width-2); + if (found != NULL) + print_position(dialog, height, width); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh(dialog); + } + else /* no need to find */ + fprintf(stderr, "\a"); /* beep */ + break; + case ESC: + break; + case KEY_F(1): + display_helpfile(); + break; + } + } + + delwin(dialog); + free(buf); + close(fd); + return (key == ESC ? -1 : 0); +} +/* End of dialog_textbox() */ + + +/* + * Go back 'n' lines in text file. Called by dialog_textbox(). + * 'page' will be updated to point to the desired line in 'buf'. + */ +static void back_lines(int n) +{ + int i, fpos; + + begin_reached = 0; + /* We have to distinguish between end_reached and !end_reached since at end + of file, the line is not ended by a '\n'. The code inside 'if' basically + does a '--page' to move one character backward so as to skip '\n' of the + previous line */ + if (!end_reached) { + /* Either beginning of buffer or beginning of file reached? */ + if (page == buf) { + if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) { + endwin(); + fprintf(stderr, "\nError moving file pointer in back_lines().\n"); + exit(-1); + } + if (fpos > bytes_read) { /* Not beginning of file yet */ + /* We've reached beginning of buffer, but not beginning of file yet, + so read previous part of file into buffer. Note that we only + move backward for BUF_SIZE/2 bytes, but not BUF_SIZE bytes to + avoid re-reading again in print_page() later */ + /* Really possible to move backward BUF_SIZE/2 bytes? */ + if (fpos < BUF_SIZE/2 + bytes_read) { + /* No, move less then */ + if (lseek(fd, 0, SEEK_SET) == -1) { + endwin(); + fprintf(stderr, "\nError moving file pointer in back_lines().\n"); + exit(-1); + } + page = buf + fpos - bytes_read; + } + else { /* Move backward BUF_SIZE/2 bytes */ + if (lseek(fd, -(BUF_SIZE/2 + bytes_read), SEEK_CUR) == -1) { + endwin(); + fprintf(stderr, "\nError moving file pointer in back_lines().\n"); + exit(-1); + } + page = buf + BUF_SIZE/2; + } + if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) { + endwin(); + fprintf(stderr, "\nError reading file in back_lines().\n"); + exit(-1); + } + buf[bytes_read] = '\0'; + } + else { /* Beginning of file reached */ + begin_reached = 1; + return; + } + } + if (*(--page) != '\n') { /* '--page' here */ + /* Something's wrong... */ + endwin(); + fprintf(stderr, "\nInternal error in back_lines().\n"); + exit(-1); + } + } + + /* Go back 'n' lines */ + for (i = 0; i < n; i++) + do { + if (page == buf) { + if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) { + endwin(); + fprintf(stderr, "\nError moving file pointer in back_lines().\n"); + exit(-1); + } + if (fpos > bytes_read) { + /* Really possible to move backward BUF_SIZE/2 bytes? */ + if (fpos < BUF_SIZE/2 + bytes_read) { + /* No, move less then */ + if (lseek(fd, 0, SEEK_SET) == -1) { + endwin(); + fprintf(stderr, "\nError moving file pointer in back_lines().\n"); + exit(-1); + } + page = buf + fpos - bytes_read; + } + else { /* Move backward BUF_SIZE/2 bytes */ + if (lseek(fd, -(BUF_SIZE/2 + bytes_read), SEEK_CUR) == -1) { + endwin(); + fprintf(stderr, "\nError moving file pointer in back_lines().\n"); + exit(-1); + } + page = buf + BUF_SIZE/2; + } + if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) { + endwin(); + fprintf(stderr, "\nError reading file in back_lines().\n"); + exit(-1); + } + buf[bytes_read] = '\0'; + } + else { /* Beginning of file reached */ + begin_reached = 1; + return; + } + } + } while (*(--page) != '\n'); + page++; +} +/* End of back_lines() */ + + +/* + * Print a new page of text. Called by dialog_textbox(). + */ +static void print_page(WINDOW *win, int height, int width) +{ + int i, passed_end = 0; + + page_length = 0; + for (i = 0; i < height; i++) { + print_line(win, i, width); + if (!passed_end) + page_length++; + if (end_reached && !passed_end) + passed_end = 1; + } + wnoutrefresh(win); +} +/* End of print_page() */ + + +/* + * Print a new line of text. Called by dialog_textbox() and print_page(). + */ +static void print_line(WINDOW *win, int row, int width) +{ + int i, y, x; + unsigned char *line; + + line = get_line(); + line += MIN(strlen(line),hscroll); /* Scroll horizontally */ + wmove(win, row, 0); /* move cursor to correct line */ + waddch(win,' '); +#ifdef HAVE_NCURSES + waddnstr(win, line, MIN(strlen(line),width-2)); +#else + line[MIN(strlen(line),width-2)] = '\0'; + waddstr(win, line); +#endif + + getyx(win, y, x); + /* Clear 'residue' of previous line */ + for (i = 0; i < width-x; i++) + waddch(win, ' '); +} +/* End of print_line() */ + + +/* + * Return current line of text. Called by dialog_textbox() and print_line(). + * 'page' should point to start of current line before calling, and will be + * updated to point to start of next line. + */ +static unsigned char *get_line(void) +{ + int i = 0, fpos; + static unsigned char line[MAX_LEN+1]; + + end_reached = 0; + while (*page != '\n') { + if (*page == '\0') { /* Either end of file or end of buffer reached */ + if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) { + endwin(); + fprintf(stderr, "\nError moving file pointer in get_line().\n"); + exit(-1); + } + if (fpos < file_size) { /* Not end of file yet */ + /* We've reached end of buffer, but not end of file yet, so read next + part of file into buffer */ + if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) { + endwin(); + fprintf(stderr, "\nError reading file in get_line().\n"); + exit(-1); + } + buf[bytes_read] = '\0'; + page = buf; + } + else { + if (!end_reached) + end_reached = 1; + break; + } + } + else + if (i < MAX_LEN) + line[i++] = *(page++); + else { + if (i == MAX_LEN) /* Truncate lines longer than MAX_LEN characters */ + line[i++] = '\0'; + page++; + } + } + if (i <= MAX_LEN) + line[i] = '\0'; + if (!end_reached) + page++; /* move pass '\n' */ + + return line; +} +/* End of get_line() */ + + +/* + * Display a dialog box and get the search term from user + */ +static int get_search_term(WINDOW *win, unsigned char *search_term, int height, int width) +{ + int x, y, key = 0, first, + box_height = 3, box_width = 30; + + x = (width - box_width)/2; + y = (height - box_height)/2; +#ifdef HAVE_NCURSES + if (use_shadow) + draw_shadow(win, y, x, box_height, box_width); +#endif + draw_box(win, y, x, box_height, box_width, dialog_attr, searchbox_border_attr); + wattrset(win, searchbox_title_attr); + wmove(win, y, x+box_width/2-4); + waddstr(win, " Search "); + wattrset(win, dialog_attr); + + search_term[0] = '\0'; + + first = 1; + while (key != ESC) { + key = line_edit(win, y+1, x+1, -1, box_width-2, searchbox_attr, first, search_term, 0); + first = 0; + switch (key) { + case '\n': + if (search_term[0] != '\0') + return 0; + break; + case ESC: + break; + } + } + + return -1; /* ESC pressed */ +} +/* End of get_search_term() */ + + +/* + * Print current position + */ +static void print_position(WINDOW *win, int height, int width) +{ + int fpos, percent; + + if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) { + endwin(); + fprintf(stderr, "\nError moving file pointer in print_position().\n"); + exit(-1); + } + wattrset(win, position_indicator_attr); + percent = !file_size ? 100 : ((fpos-bytes_read+page-buf)*100)/file_size; + wmove(win, height-3, width-9); + wprintw(win, "(%3d%%)", percent); +} +/* End of print_position() */ diff --git a/gnu/lib/libodialog/tree.c b/gnu/lib/libodialog/tree.c new file mode 100644 index 0000000..ceacf05 --- /dev/null +++ b/gnu/lib/libodialog/tree.c @@ -0,0 +1,1133 @@ +/* + * tree.c -- implements the 'tree' interface element for libdialog + * + * Author: Anatoly A. Orehovsky (tolik@mpeks.tomsk.su) + * + * Copyright (c) 1997, Anatoly A. Orehovsky + * 09/28/98 - patched by Anatoly A. Orehovsky (smart_tree()) + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include "dialog.priv.h" +#include + +/* static utils for make tree */ +struct leaf { + unsigned char *name; /* name of leaf */ + unsigned char *branches; /* branches that going by leaf */ + unsigned char slip; /* slip of leaf*/ + int shift; /* shift relative root of tree */ +}; + +static int mk_slip(struct leaf array[], int arr_size, + int number, int shift); + +/* make tree from file + * + * filename - name of file with like find(1) output + * p_names - pointer to array of strings + * p_size - pointer to size of array + * FS - fields separator + * p_array - pointer to array of leafs + * + * return values: + * 0 - ok and names by p_names, size by p_size, array by p_array set + * -1 - memory allocation error (errno set) + */ + +static int mk_ftree(char *filename, + unsigned char ***p_names, int *p_size, unsigned char FS, + struct leaf **p_array); + +/* make tree from array + * + * names - array of strings + * size - size of array + * FS - fields separator + * p_array - pointer to array of leafs + * + * return values: + * 0 - ok and array by p_array set + * -1 - memory allocation error (errno set) + */ + +static int mk_tree(unsigned char **names, int size, unsigned char FS, + struct leaf **p_array); + +/* free memory from tree (leafs) + * + * return values: + * nothing + */ + +static void free_leafs(struct leaf *array, int size); + +/* free memory from source data for tree (names) + * + * return values: + * if 0 <= choice <= size - pointer to name from names, + * and memory for name not released (must be freed later) + * else - NULL (recomended choice -1 for it) + */ + +static unsigned char *free_names(unsigned char **names, + int size, int choice); + +/* end of static utils for make tree */ + +/* static utils for ftree */ + +/* control struct for queue */ +struct queue { + int size; /* size of queue */ + struct m_queue *first; /* begin of queue */ + struct m_queue *last; /* end of queue */ +}; + +/* queue member */ +struct m_queue { + void *pointer; /* queue member */ + struct m_queue *next; /* next queue member */ +}; + +/* init struct queue by zeros */ +static void init_queue(struct queue *queue); + +/* add pointer to queue */ +/* return - pointer or NULL if error */ +static void *p2_queue(struct queue *queue, void *pointer); + +/* get first from queue */ +/* return - pointer or NULL if queue is empty */ +static void *first_queue(struct queue *queue); + +/* make zero terminated array from queue */ +/* return - pointer to array or NULL if error */ +static void **q2arr(struct queue *queue, int depth); + +/* smart_tree (for like find(1) with -d flag output compliance) */ +/* return - not NULL or NULL if malloc error */ +static unsigned char *smart_tree(struct queue *queue, unsigned char FS, + unsigned char *current, + unsigned char *prev); + +/* end of static utils for ftree */ + +/* static utils for saved_tree */ + +/* saved values for unique tree */ +struct saved_tree { + unsigned char **names; /* names + */ + int size; /* size + */ + unsigned char FS; /* FS + */ + int height; /* height + */ + int width; /* width + */ + int menu_height; /* menu_height - unique for treebox ? */ + int ch; /* saved ch - choice */ + int sc; /* saved sc - scroll */ +}; + +/* search saved tree within queue */ +/* return - struct saved_tree * or NULL if not found */ +static struct saved_tree *search_saved_tree(struct queue *queue, + unsigned char **names, + int size, + unsigned char FS, + int height, + int width, + int menu_height); + +/* end of static utils for saved_tree */ + +static void print_item(WINDOW *win, struct leaf item, int choice, int selected); + +static void print_position(WINDOW *win, int x, int y, + int cur_pos, int size); + +static int menu_width, item_x; + +static int dialog_treemenu(unsigned char *title, unsigned char *prompt, + int height, int width, int menu_height, + int item_no, struct leaf items[], + int *result, + int *ch, int *sc); + +/* + * Display a menu for choosing among a number of options + */ +static +int dialog_treemenu(unsigned char *title, unsigned char *prompt, + int height, int width, int menu_height, + int item_no, struct leaf items[], + int *result, + int *ch, int *sc) +{ + int i, j, x, y, cur_x, cur_y, box_x, box_y, key = 0, button = 0, choice = 0, + l, scroll = 0, max_choice, redraw_menu = FALSE; + WINDOW *dialog, *menu; + + if (ch) /* restore menu item info */ + choice = *ch; + if (sc) + scroll = *sc; + + max_choice = MIN(menu_height, item_no); + + item_x = 0; + /* Find length of longest item in order to center menu */ + for (i = 0; i < item_no; i++) { + l = strlen(items[i].name) + strlen(items[i].branches) * 4 + 4; + item_x = MAX(item_x, l); + } + + if (height < 0) + height = strheight(prompt)+menu_height+4+2; + if (width < 0) { + i = strwidth(prompt); + j = ((title != NULL) ? strwidth(title) : 0); + width = MAX(i,j); + width = MAX(width,item_x+4)+4; + } + width = MAX(width,24); + + if (width > COLS) + width = COLS; + if (height > LINES) + height = LINES; + /* center dialog box on screen */ + x = (COLS - width)/2; + y = (LINES - height)/2; + +#ifdef HAVE_NCURSES + if (use_shadow) + draw_shadow(stdscr, y, x, height, width); +#endif + dialog = newwin(height, width, y, x); + if (dialog == NULL) { + endwin(); + fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x); + exit(1); + } + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); + wattrset(dialog, border_attr); + wmove(dialog, height-3, 0); + waddch(dialog, ACS_LTEE); + for (i = 0; i < width-2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dialog_attr); + waddch(dialog, ACS_RTEE); + wmove(dialog, height-2, 1); + for (i = 0; i < width-2; i++) + waddch(dialog, ' '); + + if (title != NULL) { + wattrset(dialog, title_attr); + wmove(dialog, 0, (width - strlen(title))/2 - 1); + waddch(dialog, ' '); + waddstr(dialog, title); + waddch(dialog, ' '); + } + wattrset(dialog, dialog_attr); + wmove(dialog, 1, 2); + print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE); + + menu_width = width-6; + getyx(dialog, cur_y, cur_x); + box_y = cur_y + 1; + box_x = (width - menu_width)/2 - 1; + + /* create new window for the menu */ + menu = subwin(dialog, menu_height, menu_width, y + box_y + 1, x + box_x + 1); + if (menu == NULL) { + endwin(); + fprintf(stderr, "\nsubwin(dialog,%d,%d,%d,%d) failed, maybe wrong dims\n", menu_height,menu_width,y+box_y+1,x+box_x+1); + exit(1); + } + keypad(menu, TRUE); + + /* draw a box around the menu items */ + draw_box(dialog, box_y, box_x, menu_height+2, menu_width+2, menubox_border_attr, menubox_attr); + + item_x = 1; + + /* Print the menu */ + for (i = 0; i < max_choice; i++) + print_item(menu, items[(scroll+i)], i, i == choice); + wnoutrefresh(menu); + print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, item_x, cur_x, cur_y); + print_position(dialog, box_x+menu_width, box_y+menu_height, scroll+choice, item_no); + + display_helpline(dialog, height-1, width); + + x = width/2-11; + y = height-2; + print_button(dialog, "Cancel", y, x+14, FALSE); + print_button(dialog, " OK ", y, x, TRUE); + + wrefresh(dialog); + + while (key != ESC) { + key = wgetch(dialog); + /* Check if key pressed matches first character of any item tag in menu */ + + if (key == KEY_UP || key == KEY_DOWN || key == '-' || key == '+') { + if (key == KEY_UP || key == '-') { + if (!choice) { + if (scroll) { +#ifdef BROKEN_WSCRL + /* wscrl() in ncurses 1.8.1 seems to be broken, causing a segmentation + violation when scrolling windows of height = 4, so scrolling is not + used for now */ + scroll--; + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + /* Reprint menu to scroll down */ + for (i = 0; i < max_choice; i++) + print_item(menu, items[(scroll+i)], i, i == choice); + +#else + + /* Scroll menu down */ + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + if (menu_height > 1) { + /* De-highlight current first item before scrolling down */ + print_item(menu, items[scroll], 0, FALSE); + scrollok(menu, TRUE); + wscrl(menu, -1); + scrollok(menu, FALSE); + } + scroll--; + print_item(menu, items[scroll], 0, TRUE); +#endif + wnoutrefresh(menu); + print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, item_x, cur_x, cur_y); + print_position(dialog, box_x+menu_width, box_y+menu_height, scroll+choice, item_no); + wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */ + wrefresh(dialog); + } + continue; /* wait for another key press */ + } + else + i = choice - 1; + } + else if (key == KEY_DOWN || key == '+') { + if (choice == max_choice - 1) { + if (scroll+choice < item_no-1) { +#ifdef BROKEN_WSCRL + /* wscrl() in ncurses 1.8.1 seems to be broken, causing a segmentation + violation when scrolling windows of height = 4, so scrolling is not + used for now */ + scroll++; + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + /* Reprint menu to scroll up */ + for (i = 0; i < max_choice; i++) + print_item(menu, items[(scroll+i)], i, i == choice); + +#else + + /* Scroll menu up */ + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + if (menu_height > 1) { + /* De-highlight current last item before scrolling up */ + print_item(menu, items[(scroll+max_choice-1)], max_choice-1, FALSE); + scrollok(menu, TRUE); + scroll(menu); + scrollok(menu, FALSE); + } + scroll++; + print_item(menu, items[(scroll+max_choice-1)], max_choice-1, TRUE); +#endif + wnoutrefresh(menu); + print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, item_x, cur_x, cur_y); + print_position(dialog, box_x+menu_width, box_y+menu_height, scroll+choice, item_no); + wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */ + wrefresh(dialog); + } + continue; /* wait for another key press */ + } + else + i = choice + 1; + } + + if (i != choice) { + /* De-highlight current item */ + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + print_item(menu, items[(scroll+choice)], choice, FALSE); + + /* Highlight new item */ + choice = i; + print_item(menu, items[(scroll+choice)], choice, TRUE); + wnoutrefresh(menu); + print_position(dialog, box_x+menu_width, box_y+menu_height, scroll+choice, item_no); + wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */ + wrefresh(dialog); + } + continue; /* wait for another key press */ + } + + /* save info about menu item position */ + if (ch) + *ch = choice; + if (sc) + *sc = scroll; + + switch (key) { + case KEY_PPAGE: + case 'B' : + case 'b' : + if (scroll > menu_height) { /* can we go up? */ + scroll -= (menu_height); + } else { + scroll = 0; + } + redraw_menu = TRUE; + break; + case KEY_NPAGE: + case 'F' : + case 'f' : + if (scroll + menu_height >= item_no-1 - menu_height) { /* can we go down a full page? */ + scroll = item_no - menu_height; + if (scroll < 0) scroll = 0; + } else { + scroll += menu_height; + } + redraw_menu = TRUE; + break; + case KEY_HOME: + case 'g' : + scroll = 0; + choice = 0; + redraw_menu = TRUE; + break; + case KEY_END: + case 'G' : + scroll = item_no - menu_height; + if (scroll < 0) scroll = 0; + choice = max_choice - 1; + redraw_menu = TRUE; + break; + case 'O': + case 'o': + delwin(dialog); + *result = scroll+choice; + return 0; + case 'C': + case 'c': + delwin(dialog); + return 1; + case KEY_BTAB: + case TAB: + case KEY_LEFT: + case KEY_RIGHT: + if (!button) { + button = 1; /* Indicates "Cancel" button is selected */ + print_button(dialog, " OK ", y, x, FALSE); + print_button(dialog, "Cancel", y, x+14, TRUE); + } + else { + button = 0; /* Indicates "OK" button is selected */ + print_button(dialog, "Cancel", y, x+14, FALSE); + print_button(dialog, " OK ", y, x, TRUE); + } + wrefresh(dialog); + break; + case ' ': + case '\r': + case '\n': + delwin(dialog); + if (!button) + *result = scroll+choice; + return button; + case ESC: + break; + case KEY_F(1): + case '?': + display_helpfile(); + break; + } + if (redraw_menu) { + for (i = 0; i < max_choice; i++) { + print_item(menu, items[(scroll+i)], + i, i == choice); + } + wnoutrefresh(menu); + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, item_x, cur_x, cur_y); + print_position(dialog, box_x+menu_width, box_y+menu_height, scroll+choice, item_no); + wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */ + wrefresh(dialog); + redraw_menu = FALSE; + } + } + + delwin(dialog); + return -1; /* ESC pressed */ +} +/* End of dialog_treemenu() */ + + +/* + * Print menu item + */ +static void print_item(WINDOW *win, struct leaf item, int choice, int selected) +{ + int i, j = menu_width - 2; + char *branches = item.branches; + + /* Clear 'residue' of last item */ + wattrset(win, menubox_attr); + wmove(win, choice, 0); + for (i = 0; i < menu_width; i++) + waddch(win, ' '); + wmove(win, choice, item_x); + + while(*branches && j) + { + switch (*branches++) { + case ' ' : waddch(win, ' '); + break; + case '|' : waddch(win, ACS_VLINE); + } + + j--; + i = 3; + while(i-- && j) + { + waddch(win, ' '); + j--; + } + } + + if (j) + { + switch (item.slip) { + case '+' : waddch(win, ACS_LTEE); + break; + case '`' : waddch(win, ACS_LLCORNER); + } + j--; + } + + i = 3; + while(i-- && j) + { + waddch(win, ACS_HLINE); + j--; + } + + wattrset(win, selected ? item_selected_attr : item_attr); + if (j) + waddnstr(win, item.name, j); +} +/* End of print_item() */ + +/* + * Print current position + */ +static void print_position(WINDOW *win, int x, int y, + int cur_pos, int size) +{ + int percent; + + wattrset(win, position_indicator_attr); + percent = cur_pos == size - 1 ? 100 : (cur_pos * 100)/(size - 1); + wmove(win, y + 1, x - 6); + wprintw(win, "(%3d%%)", percent); +} +/* End of print_position() */ + +/* + * Display a tree menu from file + * + * filename - file with like find(1) output + * FS - fields separator + * title - title of dialog box + * prompt - prompt text into dialog box + * height - height of dialog box + * width - width of dialog box + * menu_height - height of menu box + * result - pointer to char array + * + * return values: + * -1 - ESC pressed + * 0 - Ok, result set (must be freed later) + * 1 - Cancel + */ + +int dialog_ftree(unsigned char *filename, unsigned char FS, + unsigned char *title, unsigned char *prompt, + int height, int width, int menu_height, + unsigned char **result) +{ + int retcode, choice, size; + struct leaf *items; + unsigned char **names; + + if (mk_ftree(filename, &names, &size, FS, &items)) + { + perror("dialog_ftree"); + end_dialog(); + exit(-1); + } + + if (!size) + { + fprintf(stderr, "\ndialog_ftree: file %s is empty\n", filename); + end_dialog(); + exit(-1); + } + + retcode = dialog_treemenu(title, prompt, height, width, menu_height, + size, items, &choice, NULL, NULL); + + free_leafs(items, size); + + if (!retcode) + *result = free_names(names, size, choice); + else + (void)free_names(names, size, -1); + + return retcode; +} +/* End of dialog_ftree() */ + +/* + * Display a tree menu from array + * + * names - array with like find(1) output + * size - size of array + * FS - fields separator + * title - title of dialog box + * prompt - prompt text into dialog box + * height - height of dialog box + * width - width of dialog box + * menu_height - height of menu box + * result - pointer to char array + * + * return values: + * -1 - ESC pressed + * 0 - Ok, result set + * 1 - Cancel + */ + +int dialog_tree(unsigned char **names, int size, unsigned char FS, + unsigned char *title, unsigned char *prompt, + int height, int width, int menu_height, + unsigned char **result) +{ + int retcode, choice; + struct leaf *items; + struct saved_tree *st; + static struct queue *q_saved_tree = NULL; + + if (!size) + { + fprintf(stderr, "\ndialog_tree: source array is empty\n"); + end_dialog(); + exit(-1); + } + + if (mk_tree(names, size, FS, &items)) + { + perror("dialog_tree"); + end_dialog(); + exit(-1); + } + +/* is tree saved ? */ + if (!(st = search_saved_tree(q_saved_tree, names, + size, FS, + height, width, menu_height))) { + if (!q_saved_tree) { + if (!(q_saved_tree = + calloc(sizeof (struct queue), 1))) { + perror("dialog_tree"); + end_dialog(); + exit(-1); + } + } + + if (!(st = calloc(sizeof (struct saved_tree), 1))) { + perror("dialog_tree"); + end_dialog(); + exit(-1); + } + + st->names = names; + st->size = size; + st->FS = FS; + st->height = height; + st->width = width; + st->menu_height = menu_height; + + if (!p2_queue(q_saved_tree, st)) { + perror("dialog_tree"); + end_dialog(); + exit(-1); + } + } + + retcode = dialog_treemenu(title, prompt, height, width, menu_height, + size, items, &choice, + &(st->ch), &(st->sc)); + + free_leafs(items, size); + + if (!retcode) + *result = names[choice]; + + return retcode; +} +/* End of dialog_tree() */ + +/* utils for ftree */ + +/* init struct queue by zeros */ +static void +init_queue(struct queue *queue) +{ + bzero((void *)queue, sizeof(struct queue)); +} + +/* add pointer to queue */ +/* return - pointer or NULL if error */ +static void * +p2_queue(struct queue *queue, void *pointer) +{ + if (!queue) + return NULL; + + if (!queue->first) + { + if (!(queue->first = queue->last = + calloc(1, sizeof(struct m_queue)))) + return NULL; + + } + else + { + if (!(queue->last->next = + calloc(1, sizeof(struct m_queue)))) + return NULL; + + queue->last = queue->last->next; + } + + queue->size++; + return queue->last->pointer = pointer; +} + +/* get first from queue */ +/* return - pointer or NULL if queue is empty */ +static void * +first_queue(struct queue *queue) +{ + void *retval; + struct m_queue *new_first; + + if (!queue || + !queue->first || + !queue->size) + return NULL; + + retval = queue->first->pointer; + new_first = queue->first->next; + free(queue->first); + queue->first = new_first; + queue->size--; + + return retval; + +} + +/* make zero terminated array from queue */ +/* return - pointer to array or NULL if error */ +static void ** +q2arr(struct queue *queue, int depth) +{ + void **mono, **end; + + if (!queue || + !queue->first || + !queue->size) + return NULL; + + /* memory allocation for array */ + if (!(mono = end = malloc(depth * sizeof(void *) + 1))) + return NULL; + + while(depth--) + { + if (!(*end++ = first_queue(queue))) + break; + } + + *end = NULL; + + return mono; + +} + +/* + * smart_tree (for like find(1) with -d flag output compliance) + * + * return values: + * NULL - malloc error + * not NULL - ok + * + */ +static +unsigned char * +smart_tree(struct queue *queue, + unsigned char FS, + unsigned char *current, + unsigned char *prev) { + unsigned char *pcurrent = current, *pprev = prev, *toqueue; + register char break_flag = 0; + + while(*pcurrent && *pprev) { + if (*pcurrent == *pprev) { + pcurrent++; + pprev++; + } + else { + break_flag = 1; + break; + } + } + + if (!*pprev || break_flag) { + if (*pcurrent == FS) { + pcurrent++; + + if ((!*prev) && (*pcurrent)) { + unsigned char tchar = *pcurrent; + + *pcurrent = '\0'; + if (!(toqueue = strdup(current))) { + *pcurrent = tchar; + return NULL; + } + if (!p2_queue(queue, toqueue)) { + *pcurrent = tchar; + return NULL; + } + *pcurrent = tchar; + } + } + + while(*pcurrent) { + if (*pcurrent == FS) { + *pcurrent = '\0'; + if (!(toqueue = strdup(current))) { + *pcurrent = FS; + return NULL; + } + if (!p2_queue(queue, toqueue)) { + *pcurrent = FS; + return NULL; + } + *pcurrent = FS; + } + pcurrent++; + } + if (!p2_queue(queue, current)) + return NULL; + } + return current; +} + +/* end of utils for ftree */ + +/* utils for make tree */ + +/* if error - return -1 */ +static +int +mk_slip(struct leaf array[], int arr_size, int number, int shift) +{ + int t_number; + int t_shift; + + if (number > arr_size - 1) + return number - 1; + + t_shift = shift; + + if (!(array[number].branches = calloc(1, t_shift + 1))) + return -1; + + (void)memset(array[number].branches, ' ', t_shift); + + t_number = number; + + while (array[number].shift < array[t_number + 1].shift) + { + t_number = mk_slip(array, arr_size, t_number + 1, t_shift + 1); + if (t_number < 0) + return -1; + if (t_number == arr_size - 1) + break; + } + + if (array[number].shift == array[t_number + 1].shift) + array[number].slip = '+'; + + if ((array[number].shift > array[t_number + 1].shift) || + t_number == arr_size - 1) + array[number].slip = '`'; + + return t_number; + +} /* mk_slip() */ + +/* make tree from file + * + * filename - name of file with like find(1) output + * p_names - pointer to array of strings + * p_size - pointer to size of array + * FS - fields separator + * p_array - pointer to array of leafs + * + * return values: + * 0 - ok and names by p_names, size by p_size, array by p_array set + * -1 - memory allocation error (errno set) + */ + +static +int +mk_ftree(char *filename, + unsigned char ***p_names, int *p_size, unsigned char FS, + struct leaf **p_array) +{ + int NR; /* number of input records */ + struct queue queue; + unsigned char *string, *sstring = ""; + unsigned char **names; + + FILE *input_file; + + if (!(input_file = fopen(filename, "r"))) + return -1; + + init_queue(&queue); + + if (!(string = malloc(BUFSIZ))) + return -1; + + /* read input file into queue */ + while(fgets(string, BUFSIZ, input_file)) + { + if (strchr(string, '\n')) + *strchr(string, '\n') = '\0'; + + if (!(string = realloc(string, strlen(string) + 1))) + return -1; + + if (!smart_tree(&queue, FS, string, sstring)) + return -1; + sstring = string; + + if (!(string = malloc(BUFSIZ))) + return -1; + } /* read input file into queue */ + + if (fclose(input_file) == EOF) + return -1; + + if (!(NR = queue.size)) + { + *p_size = 0; + return 0; + } + + /* make array from queue */ + if (!(names = (unsigned char **)q2arr(&queue, NR))) + return -1; + + *p_names = names; + *p_size = NR; + + /* make tree from array */ + return mk_tree(names, NR, FS, p_array); + +} /* mk_ftree */ + +/* make tree from array + * + * names - array of strings + * size - size of array + * FS - fields separator + * p_array - pointer to array of leafs + * + * return values: + * 0 - ok and array by p_array set + * -1 - memory allocation error (errno set) + */ + +static +int +mk_tree(unsigned char **names, int size, unsigned char FS, + struct leaf **p_array) +{ + int i; + struct leaf *array; + + /* make array of leafs */ + if (!(array = calloc(size, sizeof(struct leaf)))) + return -1; + + /* init leafs */ + for (i = 0; i < size; i++) + { + unsigned char *in_string, *name; + int shift = 0; + + in_string = name = names[i]; + while(*in_string) + { + if (*in_string == FS) { + if (!i && !*(in_string + 1)) + name = in_string; + else + { + shift++; + name = in_string + 1; + } + } + in_string++; + } + array[i].name = name; + array[i].shift = shift; + array[i].slip = '\0'; + array[i].branches = NULL; + } /* init leafs */ + + /* make slips */ + for (i = 0;i < size; i++) + { + i = mk_slip(array, size, i, 0); + if (i < 0) + return -1; + } /* make slips */ + + /* make branches */ + for (i = 1;i < size; i++) + { + unsigned char *src = array[i - 1].branches; + unsigned char *dst = array[i].branches; + + while(*src && *dst) + *dst++ = *src++; + + if (*dst) + switch (array[i - 1].slip) { + case '+' : *dst = '|'; + break; + case '`' : *dst = ' '; + } + } /* make branches */ + + *p_array = array; + return 0; + +} /* mk_tree() */ + +/* free memory from tree (leafs) + * + * return values: + * nothing + */ + +static +void +free_leafs(struct leaf *array, int size) +{ + struct leaf *p_array = array; + + while (size--) + free(array++->branches); + + free(p_array); +} /* free_leafs() */ + +/* free memory from source data for tree (names) + * + * return values: + * if 0 <= choice <= size - pointer to name from names, + * and memory for name not released (must be freed later) + * else - NULL (recomended choice -1 for it) + */ + +static +unsigned char * +free_names(unsigned char **names, int size, int choice) +{ + unsigned char *retval = NULL; + unsigned char **p_names = names; + + while (size--) + { + if (!choice--) + retval = *names++; + else + free(*names++); + } + free(p_names); + return retval; +} /* free_names() */ + +/* end of utils for make tree */ + +/* static utils for saved_tree */ + +/* search saved tree within queue */ +/* return - struct *saved_tree or NULL if not found */ +static +struct saved_tree * +search_saved_tree(struct queue *queue, unsigned char **names, int size, + unsigned char FS, + int height, int width, + int menu_height) +{ + struct m_queue *member; + struct saved_tree *retval; + + if (!queue || !names || !FS || + !height || !width || !menu_height) + return NULL; + + if (!(member = queue->first)) + return NULL; + + while (member->next) { + retval = member->pointer; + if ((names == retval->names) && + (size == retval->size) && + (FS == retval->FS) && + (height == retval->height) && + (width == retval->width) && + (menu_height == retval->menu_height)) + return retval; + member = member->next; + } + retval = member->pointer; + if ((names == retval->names) && + (size == retval->size) && + (FS == retval->FS) && + (height == retval->height) && + (width == retval->width) && + (menu_height == retval->menu_height)) + return retval; + return NULL; +} + +/* end of static utils for saved_tree */ diff --git a/gnu/lib/libodialog/ui_objects.c b/gnu/lib/libodialog/ui_objects.c new file mode 100644 index 0000000..dde1513 --- /dev/null +++ b/gnu/lib/libodialog/ui_objects.c @@ -0,0 +1,829 @@ +/* + * Program: objects.c + * Author: Marc van Kempen + * Desc: Implementation of UI-objects: + * - String input fields + * - List selection + * - Buttons + * + * Copyright (c) 1995, Marc van Kempen + * + * All rights reserved. + * + * This software may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of this software, nor does + * the author assume any responsibility for damages incurred with + * its use. + * + */ + +#include +#include +#include +#include +#include "dialog.priv.h" +#include "ui_objects.h" + +#define ESC 27 + +/*********************************************************************** + * + * Obj routines + * + ***********************************************************************/ + +void +AddObj(ComposeObj **Obj, int objtype, void *obj) +/* + * Desc: Add the object to the list of objects + */ +{ + if (*Obj == NULL) { + /* Create the root object */ + *Obj = (ComposeObj *) malloc( sizeof(ComposeObj) ); + if (!Obj) { + printf("AddObj: Error malloc'ing ComposeObj\n"); + exit(-1); + } + (*Obj)->objtype = objtype; + (*Obj)->obj = obj; + (*Obj)->next = NULL; + (*Obj)->prev = NULL; + } else { + ComposeObj *o = *Obj; + + /* create the next object */ + while (o->next) o = (ComposeObj *) o->next; + o->next = (struct ComposeObj *) malloc( sizeof(ComposeObj) ); + if (!o->next) { + printf("AddObj: Error malloc'ing o->next\n"); + exit(-1); + } + o->next->objtype = objtype; + o->next->obj = obj; + o->next->next = NULL; + o->next->prev = o; + } + + return; +} /* AddObj() */ + +void +FreeObj(ComposeObj *Obj) +/* + * Desc: free the memory occupied by *Obj + */ +{ + ComposeObj *o = Obj; + + o = Obj; + while (o) { + o = Obj->next; + free(Obj); + Obj = o; + } + + return; +} /* FreeObj() */ + + +int +ReadObj(ComposeObj *Obj) +/* + * Desc: navigate through the different objects calling their + * respective navigation routines as necessary + * Pre: Obj != NULL + */ +{ + ComposeObj *o; + ComposeObj *last; /* the last object in the list */ + int ret; /* the return value from the selection routine */ + + /* find the last object in the list */ + last = Obj; + while (last->next) last = last->next; + + ret = 0; + o = Obj; + while ((ret != SEL_BUTTON) && (ret != SEL_ESC)) { + switch(o->objtype) { + case STRINGOBJ: + ret = SelectStringObj((StringObj *) o->obj); + break; + case LISTOBJ: + ret = SelectListObj((ListObj *) o->obj); + break; + case BUTTONOBJ: + ret = SelectButtonObj((ButtonObj *) o->obj); + break; + } + switch(ret) { + case KEY_DOWN: + case SEL_CR: + case SEL_TAB: /* move to the next object in the list */ + if (o->next != NULL) { + o = o->next; /* next object */ + } else { + o = Obj; /* beginning of the list */ + } + break; + + case KEY_UP: + case SEL_BACKTAB: /* move to the previous object in the list */ + if (o->prev != NULL) { + o = o->prev; /* previous object */ + } else { + o = last; /* end of the list */ + } + break; + + case KEY_F(1): /* display help_file */ + case '?': + display_helpfile(); + break; + } + } + + return(ret); + +} /* ReadObj() */ + + +int +PollObj(ComposeObj **Obj) +{ + ComposeObj *last; /* the last object in the list */ + ComposeObj *first; /* the first object in the list */ + int ret; /* the return value from the selection routine */ + + /* find the last object in the list */ + last = *Obj; + while (last->next) last = last->next; + + /* find the first object in the list */ + first = *Obj; + while (first->prev) first = first->prev; + + ret = 0; + switch((*Obj)->objtype) { + case STRINGOBJ: + ret = SelectStringObj((StringObj *) (*Obj)->obj); + break; + case LISTOBJ: + ret = SelectListObj((ListObj *) (*Obj)->obj); + break; + case BUTTONOBJ: + ret = SelectButtonObj((ButtonObj *) (*Obj)->obj); + break; + } + switch(ret) { + case KEY_DOWN: + case SEL_CR: + case SEL_TAB: /* move to the next object in the list */ + if ((*Obj)->next != NULL) { + *Obj = (*Obj)->next; /* next object */ + } else { + *Obj = first; /* beginning of the list */ + } + break; + + case KEY_UP: + case SEL_BACKTAB: /* move to the previous object in the list */ + if ((*Obj)->prev != NULL) { + *Obj = (*Obj)->prev; /* previous object */ + } else { + *Obj = last; /* end of the list */ + } + break; + } + + return(ret); + +} /* PollObj() */ + + +void +DelObj(ComposeObj *Obj) +/* + * Desc: Free all objects + */ +{ + ComposeObj *o; + + o = Obj; + while (Obj != NULL) { + switch(Obj->objtype) { + case STRINGOBJ: + DelStringObj((StringObj *) Obj->obj); + break; + case LISTOBJ: + DelListObj((ListObj *) Obj->obj); + break; + case BUTTONOBJ: + DelButtonObj((ButtonObj *) Obj->obj); + break; + } + Obj = Obj->next; + } + + FreeObj(o); +} /* DelObj() */ + +/*********************************************************************** + * + * StringObj routines + * + ***********************************************************************/ + +static void +outstr(WINDOW *win, char *str, int attrs) +{ + if (attrs & DITEM_NO_ECHO) { + char *cpy; + int n = strlen(str); + + cpy = alloca(n + 1); + memset(cpy, '*', n); + cpy[n] = '\0'; + waddstr(win, cpy); + } + else + waddstr(win, str); +} + +void +RefreshStringObj(StringObj *so) +/* + * Desc: redraw the object + */ +{ + char tmp[512]; + + wmove(so->win, so->y, so->x+1); + wattrset(so->win, dialog_attr); + waddstr(so->win, so->title); + + draw_box(so->win, so->y+1, so->x, 3, so->w, dialog_attr, border_attr); + wattrset(so->win, item_attr); + wmove(so->win, so->y+2, so->x+1); + if (strlen(so->s) > so->w-2) { + strncpy(tmp, (char *) so->s + strlen(so->s) - so->w + 2, so->w - 1); + outstr(so->win, tmp, so->attr_mask); + } else { + outstr(so->win, so->s, so->attr_mask); + } + + return; +} /* RefreshStringObj() */ + +StringObj * +NewStringObj(WINDOW *win, char *title, char *s, int y, int x, int w, int len) +/* + * Desc: Initialize a new stringobj and return a pointer to it. + * Draw the object on the screen at the specified coordinates + */ +{ + StringObj *so; + + /* Initialize a new object */ + so = (StringObj *) malloc( sizeof(StringObj) ); + if (!so) { + printf("NewStringObj: Error malloc'ing StringObj\n"); + exit(-1); + } + so->title = (char *) malloc( strlen(title) + 1); + if (!so->title) { + printf("NewStringObj: Error malloc'ing so->title\n"); + exit(-1); + } + strcpy(so->title, title); + so->s = s; + strcpy(so->s, s); + so->x = x; + so->y = y; + so->w = w; + so->len = len; + so->win = win; + so->attr_mask = DialogInputAttrs; /* Grossly use a global to avoid changing API */ + + /* Draw it on the screen */ + RefreshStringObj(so); + + return(so); +} /* NewStringObj() */ + +int +SelectStringObj(StringObj *so) +/* + * Desc: get input using the info in + */ +{ + int key; + char tmp[so->len+1]; + + strcpy(tmp, so->s); + key = line_edit(so->win, so->y+2, so->x+1, + so->len, so->w-2, inputbox_attr, TRUE, tmp, so->attr_mask); + if ((key == '\n') || (key == '\r') || (key == '\t') || key == (KEY_BTAB) ) { + strcpy(so->s, tmp); + } + RefreshStringObj(so); + if (key == ESC) { + return(SEL_ESC); + } + if (key == '\t') { + return(SEL_TAB); + } + if ( (key == KEY_BTAB) || (key == KEY_F(2)) ) { + return(SEL_BACKTAB); + } + if ((key == '\n') || (key == '\r')) { + return(SEL_CR); + } + return(key); +} /* SelectStringObj() */ + + +void +DelStringObj(StringObj *so) +/* + * Desc: Free the space occupied by + */ +{ + free(so->title); + free(so); + + return; +} + +/*********************************************************************** + * + * ListObj routines + * + ***********************************************************************/ + +void +DrawNames(ListObj *lo) +/* + * Desc: Just refresh the names, not the surrounding box and title + */ +{ + int i, j, h, x, y; + char tmp[MAXPATHLEN]; + + x = lo->x + 1; + y = lo->y + 2; + h = lo->h - 2; + for (i=lo->scroll; in && iscroll+h; i++) { + wmove(lo->win, y+i-lo->scroll, x); + if (lo->seld[i]) { + wattrset(lo->win, A_BOLD); + } else { + wattrset(lo->win, item_attr); + } + if (strlen(lo->name[i]) > lo->w-2) { + strncpy(tmp, lo->name[i], lo->w-2); + tmp[lo->w - 2] = 0; + waddstr(lo->win, tmp); + } else { + waddstr(lo->win, lo->name[i]); + for (j=strlen(lo->name[i]); jw-2; j++) waddstr(lo->win, " "); + } + } + wattrset(lo->win, item_attr); + while (iscroll+h) { + wmove(lo->win, y+i-lo->scroll, x); + for (j=0; jw-2; j++) waddstr(lo->win, " "); + i++; + } + + return; +} /* DrawNames() */ + +void +RefreshListObj(ListObj *lo) +/* + * Desc: redraw the list object + */ +{ + char perc[7]; + + /* setup the box */ + wmove(lo->win, lo->y, lo->x+1); + wattrset(lo->win, dialog_attr); + waddstr(lo->win, lo->title); + draw_box(lo->win, lo->y+1, lo->x, lo->h, lo->w, dialog_attr, border_attr); + + /* draw the names */ + DrawNames(lo); + + /* Draw % indication */ + sprintf(perc, "(%3d%%)", MIN(100, (int) (100 * (lo->sel+lo->h-2) / MAX(1, lo->n)))); + wmove(lo->win, lo->y + lo->h, lo->x + lo->w - 8); + wattrset(lo->win, dialog_attr); + waddstr(lo->win, perc); + + + return; +} /* RefreshListObj() */ + +ListObj * +NewListObj(WINDOW *win, char *title, char **list, char *listelt, int y, int x, + int h, int w, int n) +/* + * Desc: create a listobj, draw it on the screen and return a pointer to it. + */ +{ + ListObj *lo; + int i; + + /* Initialize a new object */ + lo = (ListObj *) malloc( sizeof(ListObj) ); + if (!lo) { + fprintf(stderr, "NewListObj: Error malloc'ing ListObj\n"); + exit(-1); + } + lo->title = (char *) malloc( strlen(title) + 1); + if (!lo->title) { + fprintf(stderr, "NewListObj: Error malloc'ing lo->title\n"); + exit(-1); + } + strcpy(lo->title, title); + lo->name = list; + if (n>0) { + lo->seld = (int *) malloc( n * sizeof(int) ); + if (!lo->seld) { + fprintf(stderr, "NewListObj: Error malloc'ing lo->seld\n"); + exit(-1); + } + for (i=0; iseld[i] = FALSE; + } + } else { + lo->seld = NULL; + } + lo->y = y; + lo->x = x; + lo->w = w; + lo->h = h; + lo->n = n; + lo->scroll = 0; + lo->sel = 0; + lo->elt = listelt; + lo->win = win; + + /* Draw the object on the screen */ + RefreshListObj(lo); + + return(lo); +} /* NewListObj() */ + +void +UpdateListObj(ListObj *lo, char **list, int n) +/* + * Desc: Update the list in the listobject with the provided list + * Pre: lo->name "has been freed" + * "(A i: 0<=in: "lo->name[i] has been freed")" + */ +{ + int i; + + if (lo->seld) { + free(lo->seld); + } + + /* Rewrite the list in the object */ + lo->name = list; + if (n>0) { + lo->seld = (int *) malloc( n * sizeof(int) ); + if (!lo->seld) { + fprintf(stderr, "UpdateListObj: Error malloc'ing lo->seld\n"); + exit(-1); + } + for (i=0; iseld[i] = FALSE; + } + } else { + lo->seld = NULL; + } + lo->n = n; + lo->scroll = 0; + lo->sel = 0; + + /* Draw the object on the screen */ + RefreshListObj(lo); + + return; +} /* UpdateListObj() */ + +int +SelectListObj(ListObj *lo) +/* + * Desc: get a listname (or listnames), TAB to move on, or ESC ESC to exit + * Pre: lo->n >= 1 + */ +{ + int key, sel_x, sel_y, quit; + char tmp[MAXPATHLEN]; + char perc[4]; + + sel_x = lo->x+1; + sel_y = lo->y + 2 + lo->sel - lo->scroll; + + if (lo->n == 0) return(SEL_TAB); + + keypad(lo->win, TRUE); + + /* Draw current selection in inverse video */ + wmove(lo->win, sel_y, sel_x); + wattrset(lo->win, item_selected_attr); + waddstr(lo->win, lo->name[lo->sel]); + + key = wgetch(lo->win); + quit = FALSE; + while ((key != '\t') && (key != '\n') && (key != '\r') + && (key != ESC) && (key != KEY_F(1)) && (key != '?') && !quit) { + /* first draw current item in normal video */ + wmove(lo->win, sel_y, sel_x); + if (lo->seld[lo->sel]) { + wattrset(lo->win, A_BOLD); + } else { + wattrset(lo->win, item_attr); + } + if (strlen(lo->name[lo->sel]) > lo->w - 2) { + strncpy(tmp, lo->name[lo->sel], lo->w - 2); + tmp[lo->w - 2] = 0; + waddstr(lo->win, tmp); + } else { + waddstr(lo->win, lo->name[lo->sel]); + } + + switch (key) { + case KEY_DOWN: + case ctrl('n'): + if (sel_y < lo->y + lo->h-1) { + if (lo->sel < lo->n-1) { + sel_y++; + lo->sel++; + } + } else { + if (lo->sel < lo->n-1) { + lo->sel++; + lo->scroll++; + DrawNames(lo); + wrefresh(lo->win); + } + } + break; + case KEY_UP: + case ctrl('p'): + if (sel_y > lo->y+2) { + if (lo->sel > 0) { + sel_y--; + lo->sel--; + } + } else { + if (lo->sel > 0) { + lo->sel--; + lo->scroll--; + DrawNames(lo); + wrefresh(lo->win); + } + } + break; + case KEY_HOME: + case ctrl('a'): + lo->sel = 0; + lo->scroll = 0; + sel_y = lo->y + 2; + DrawNames(lo); + wrefresh(lo->win); + break; + case KEY_END: + case ctrl('e'): + if (lo->n < lo->h - 3) { + lo->sel = lo->n-1; + lo->scroll = 0; + sel_y = lo->y + 2 + lo->sel - lo->scroll; + } else { + /* more than one page of list */ + lo->sel = lo->n-1; + lo->scroll = lo->n-1 - (lo->h-3); + sel_y = lo->y + 2 + lo->sel - lo->scroll; + DrawNames(lo); + wrefresh(lo->win); + } + break; + case KEY_NPAGE: + case ctrl('f'): + lo->sel += lo->h - 2; + if (lo->sel >= lo->n) lo->sel = lo->n - 1; + lo->scroll += lo->h - 2; + if (lo->scroll >= lo->n - 1) lo->scroll = lo->n - 1; + if (lo->scroll < 0) lo->scroll = 0; + sel_y = lo->y + 2 + lo->sel - lo->scroll; + DrawNames(lo); + wrefresh(lo->win); + break; + case KEY_PPAGE: + case ctrl('b'): + lo->sel -= lo->h - 2; + if (lo->sel < 0) lo->sel = 0; + lo->scroll -= lo->h - 2; + if (lo->scroll < 0) lo->scroll = 0; + sel_y = lo->y + 2 + lo->sel - lo->scroll; + DrawNames(lo); + wrefresh(lo->win); + break; + default: + quit = TRUE; + break; + } + /* Draw % indication */ + sprintf(perc, "(%3d%%)", MIN(100, (int) + (100 * (lo->sel+lo->h - 2) / MAX(1, lo->n)))); + wmove(lo->win, lo->y + lo->h, lo->x + lo->w - 8); + wattrset(lo->win, dialog_attr); + waddstr(lo->win, perc); + + /* draw current item in inverse */ + wmove(lo->win, sel_y, sel_x); + wattrset(lo->win, item_selected_attr); + if (strlen(lo->name[lo->sel]) > lo->w - 2) { + /* when printing in inverse video show the last characters in the */ + /* name that will fit in the window */ + strncpy(tmp, + lo->name[lo->sel] + strlen(lo->name[lo->sel]) - (lo->w - 2), + lo->w - 2); + tmp[lo->w - 2] = 0; + waddstr(lo->win, tmp); + } else { + waddstr(lo->win, lo->name[lo->sel]); + } + if (!quit) key = wgetch(lo->win); + } + + if (key == ESC) { + return(SEL_ESC); + } + if (key == '\t') { + return(SEL_TAB); + } + if ((key == KEY_BTAB) || (key == ctrl('b'))) { + return(SEL_BACKTAB); + } + if ((key == '\n') || (key == '\r')) { + strcpy(lo->elt, lo->name[lo->sel]); + return(SEL_CR); + } + return(key); +} /* SelectListObj() */ + +void +DelListObj(ListObj *lo) +/* + * Desc: Free the space occupied by the listobject + */ +{ + free(lo->title); + if (lo->seld != NULL) free(lo->seld); + free(lo); + + return; +} /* DelListObj() */ + +void +MarkCurrentListObj(ListObj *lo) +/* + * Desc: mark the current item for the selection list + */ +{ + lo->seld[lo->sel] = !(lo->seld[lo->sel]); + DrawNames(lo); + + return; +} /* MarkCurrentListObj() */ + +void +MarkAllListObj(ListObj *lo) +/* + * Desc: mark all items + */ +{ + int i; + + for (i=0; in; i++) { + lo->seld[i] = TRUE; + } + DrawNames(lo); + + return; +} /* MarkAllListObj() */ + +void +UnMarkAllListObj(ListObj *lo) +/* + * Desc: unmark all items + */ +{ + int i; + + for (i=0; in; i++) { + lo->seld[i] = FALSE; + } + DrawNames(lo); + + return; +} /* UnMarkAllListObj() */ + + +/*********************************************************************** + * + * ButtonObj routines + * + ***********************************************************************/ + + +void +RefreshButtonObj(ButtonObj *bo) +/* + * Desc: redraw the button + */ +{ + draw_box(bo->win, bo->y, bo->x, 3, bo->w, dialog_attr, border_attr); + print_button(bo->win, bo->title, bo->y+1, bo->x+2, FALSE); + + return; +} /* RefreshButtonObj() */ + +ButtonObj * +NewButtonObj(WINDOW *win, char *title, int *pushed, int y, int x) +/* + * Desc: Create a new button object + */ +{ + ButtonObj *bo; + + bo = (ButtonObj *) malloc( sizeof(ButtonObj) ); + + bo->win = win; + bo->title = (char *) malloc( strlen(title) + 1); + strcpy(bo->title, title); + bo->x = x; + bo->y = y; + bo->w = strlen(title) + 6; + bo->h = 3; + bo->pushed = pushed; + + RefreshButtonObj(bo); + + return(bo); +} /* NewButtonObj() */ + +int +SelectButtonObj(ButtonObj *bo) +/* + * Desc: Wait for buttonpresses or TAB's to move on, or ESC ESC + */ +{ + int key; + + print_button(bo->win, bo->title, bo->y+1, bo->x+2, TRUE); + wmove(bo->win, bo->y+1, bo->x+(bo->w/2)-1); + key = wgetch(bo->win); + print_button(bo->win, bo->title, bo->y+1, bo->x+2, FALSE); + switch(key) { + case '\t': + return(SEL_TAB); + break; + case KEY_BTAB: + case ctrl('b'): + return(SEL_BACKTAB); + case '\n': + case '\r': + *(bo->pushed) = TRUE; + return(SEL_BUTTON); + break; + case ESC: + return(SEL_ESC); + break; + default: + return(key); + break; + } +} /* SelectButtonObj() */ + +void +DelButtonObj(ButtonObj *bo) +/* + * Desc: Free the space occupied by + */ +{ + free(bo->title); + free(bo); + + return; +} /* DelButtonObj() */ diff --git a/gnu/lib/libodialog/ui_objects.h b/gnu/lib/libodialog/ui_objects.h new file mode 100644 index 0000000..b30feb8 --- /dev/null +++ b/gnu/lib/libodialog/ui_objects.h @@ -0,0 +1,114 @@ +/* + * Author: Marc van Kempen + * Desc: include file for UI-objects + * + * Copyright (c) 1995, Marc van Kempen + * + * All rights reserved. + * + * This software may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of this software, nor does + * the author assume any responsibility for damages incurred with + * its use. + * + */ + +#include "dialog.h" +#include + +/*********************************************************************** + * + * Defines + * + ***********************************************************************/ + +#define ctrl(a) ((a) - 'a' + 1) + +/* the Object types */ +#define STRINGOBJ 1 +#define LISTOBJ 2 +#define BUTTONOBJ 3 + +/* the return signals from the selection routines */ +/* 1000 and higher should avoid conflicts with keys pressed */ +#define SEL_CR 1001 /* return was pressed */ +#define SEL_ESC 1002 /* ESC pressed */ +#define SEL_TAB 1003 /* TAB pressed */ +#define SEL_BACKTAB 1004 /* SHIFT-TAB pressed */ +#define SEL_BUTTON 1005 /* a button was pressed */ + +/*********************************************************************** + * + * Typedefs + * + ***********************************************************************/ + +typedef struct { + WINDOW *win; /* the window it's contained in */ + char *title; /* the prompt for the input field */ + char *s; /* initial value of the input field */ + int x, y, w, len; /* the (y, x) position of the upperleft */ + /* corner and the width of the display */ + /* and length of the field */ + int attr_mask; /* special attributes */ +} StringObj; + +typedef struct { + WINDOW *win; /* the windows it's contained in */ + char *title; /* the title of the list */ + char **name; /* the names of the list */ + int *seld; /* the currently selected names */ + char *elt; /* the current element in the list list[sel] */ + int x, y, w, h, n; /* dimensions of list and # of elements (n) */ + int scroll, sel; /* current position in the list */ +} ListObj; + +typedef struct { + WINDOW *win; /* the window it's contained in */ + char *title; /* title for the button */ + int x, y, w, h; /* its dimensions */ + int *pushed; /* boolean that determines wether button was pushed */ +} ButtonObj; + +typedef struct ComposeObj { + int objtype; + void *obj; + struct ComposeObj *next, *prev; +} ComposeObj; + +/********************************************************************** + * + * Prototypes + * + **********************************************************************/ + +void RefreshStringObj(StringObj *so); +StringObj *NewStringObj(WINDOW *win, char *title, char *s, + int y, int x, int w, int len); +int SelectStringObj(StringObj *so); +void DelStringObj(StringObj *so); + +void RefreshListObj(ListObj *lo); +ListObj *NewListObj(WINDOW *win, char *title, char **list, + char *listelt, int y, int x, int h, int w, int n); +void UpdateListObj(ListObj *lo, char **list, int n); +int SelectListObj(ListObj *lo); +void DelListObj(ListObj *obj); +void MarkCurrentListObj(ListObj *lo); +void MarkAllListObj(ListObj *lo); +void UnMarkAllListObj(ListObj *lo); + +void RefreshButtonObj(ButtonObj *bo); +ButtonObj *NewButtonObj(WINDOW *win, char *title, int *pushed, + int y, int x); +int SelectButtonObj(ButtonObj *bo); +void DelButtonObj(ButtonObj *bo); +void AddObj(ComposeObj **Obj, int objtype, void *obj); +void FreeObj(ComposeObj *Obj); +int ReadObj(ComposeObj *Obj); +int PollObj(ComposeObj **Obj); +void DelObj(ComposeObj *Obj); + diff --git a/gnu/lib/libodialog/yesno.c b/gnu/lib/libodialog/yesno.c new file mode 100644 index 0000000..24eb41a --- /dev/null +++ b/gnu/lib/libodialog/yesno.c @@ -0,0 +1,169 @@ +/* + * yesno.c -- implements the yes/no box + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include "dialog.priv.h" + +/* Actual work function */ +static int dialog_yesno_proc(unsigned char *title, unsigned char *prompt, + int height, int width, int yesdefault); + +/* + * Display a dialog box with two buttons - Yes and No + */ +int +dialog_yesno(unsigned char *title, unsigned char *prompt, int height, int width) +{ + return dialog_yesno_proc(title, prompt, height, width, TRUE); +} + +/* + * Display a dialog box with two buttons - No and Yes + */ +int +dialog_noyes(unsigned char *title, unsigned char *prompt, int height, int width) +{ + return dialog_yesno_proc(title, prompt, height, width, FALSE); +} + +static int +dialog_yesno_proc(unsigned char *title, unsigned char *prompt, int height, int width, int yesdefault) +{ + int i, j, x, y, key, button; + WINDOW *dialog; + char *tmphlp; + + /* disable helpline */ + tmphlp = get_helpline(); + use_helpline(NULL); + + if (height < 0) + height = strheight(prompt)+4; + if (width < 0) { + i = strwidth(prompt); + j = ((title != NULL) ? strwidth(title) : 0); + width = MAX(i,j)+4; + } + width = MAX(width,23); + + if (width > COLS) + width = COLS; + if (height > LINES) + height = LINES; + /* center dialog box on screen */ + x = DialogX ? DialogX : (COLS - width)/2; + y = DialogY ? DialogY : (LINES - height)/2; + +#ifdef HAVE_NCURSES + if (use_shadow) + draw_shadow(stdscr, y, x, height, width); +#endif + dialog = newwin(height, width, y, x); + if (dialog == NULL) { + endwin(); + fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x); + exit(1); + } + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); + wattrset(dialog, border_attr); + wmove(dialog, height-3, 0); + waddch(dialog, ACS_LTEE); + for (i = 0; i < width-2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dialog_attr); + waddch(dialog, ACS_RTEE); + wmove(dialog, height-2, 1); + for (i = 0; i < width-2; i++) + waddch(dialog, ' '); + + if (title != NULL) { + wattrset(dialog, title_attr); + wmove(dialog, 0, (width - strlen(title))/2 - 1); + waddch(dialog, ' '); + waddstr(dialog, title); + waddch(dialog, ' '); + } + wattrset(dialog, dialog_attr); + wmove(dialog, 1, 2); + print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE); + + display_helpline(dialog, height-1, width); + + x = width/2-10; + y = height-2; + + /* preset button 0 or 1 for YES or NO as the default */ + key = 0; + button = !yesdefault; + while (key != ESC) { + print_button(dialog, " No ", y, x+13, button); + print_button(dialog, " Yes " , y, x, !button); + if (button) + wmove(dialog, y, x+16); + else + wmove(dialog, y, x+2); + wrefresh(dialog); + + key = wgetch(dialog); + switch (key) { + case 'Y': + case 'y': + delwin(dialog); + restore_helpline(tmphlp); + return 0; + case 'N': + case 'n': + delwin(dialog); + restore_helpline(tmphlp); + return 1; + case KEY_BTAB: + case TAB: + case KEY_UP: + case KEY_DOWN: + case KEY_LEFT: + case KEY_RIGHT: + button = !button; + /* redrawn at the loop's entry */ + break; + case ' ': + case '\r': + case '\n': + delwin(dialog); + restore_helpline(tmphlp); + return button; + case ESC: + break; + case KEY_F(1): + case '?': + display_helpfile(); + break; + } + } + + delwin(dialog); + restore_helpline(tmphlp); + return -1; /* ESC pressed */ +} +/* End of dialog_yesno() */ diff --git a/gnu/usr.bin/dialog/COPYING b/gnu/usr.bin/dialog/COPYING deleted file mode 100644 index a43ea21..0000000 --- a/gnu/usr.bin/dialog/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/gnu/usr.bin/dialog/Makefile b/gnu/usr.bin/dialog/Makefile index 8e50ad3..bdda638 100644 --- a/gnu/usr.bin/dialog/Makefile +++ b/gnu/usr.bin/dialog/Makefile @@ -1,17 +1,13 @@ -# Makefile for dialog # $FreeBSD$ -.include - -.if ${MK_EXAMPLES} != "no" -SUBDIR= TESTS -.endif - +DIALOG= ${.CURDIR}/../../../contrib/dialog PROG= dialog -CFLAGS+= -Wall -Wstrict-prototypes - DPADD= $(LIBDIALOG) $(LIBNCURSES) -LDADD= -ldialog -lncurses +LDADD= -ldialog -lncursesw -lm +CFLAGS+= -I${.CURDIR} -I${DIALOG} +.PATH: ${DIALOG} + +WARNS?= 3 .include diff --git a/gnu/usr.bin/dialog/README b/gnu/usr.bin/dialog/README deleted file mode 100644 index 975bdac..0000000 --- a/gnu/usr.bin/dialog/README +++ /dev/null @@ -1,161 +0,0 @@ - - dialog - Display dialog boxes in shell script (version 0.3) - =========================================================== - -This is a program that will enable you to present a variety of questions or -display messages using dialog boxes from a shell script. Currently, these -types of dialog boxes are implemented: yes/no box, menu box, input box, -message box, text box, info box, checklist box. The idea of writing this -program came from the fact that most questions asked in a shell script (and -many interactive programs as well) can be classified into these few types: - - - 1) One that requires the user to answer either yes or no. - - 2) One that presents a number of options for the user to choose. - - 3) One that requires the user to input a string. - - 4) One that displays a message and optionally wait for a key press - before continuing. - - 5) One that presents a list of options that can be turned on or off. - - -The program 'dialog' can, say for example, be called in a shell script to -present the first type of questions like this: - - - if dialog --yesno - then - ... - fi - - - e.g. if dialog --yesno "Do you want to continue?" 7 51 - then - echo "Continuing..." - else - echo "Aborting..." - fi - - -I've included a sample shell script for each type of boxes in the directory -samples. The program requires ncurses to compile. Running 'dialog' without -arguments will display the usage. - - - -FEATURES --------- - - * Friendly dialog box interface with buttons, etc. - - * Auto wrap around of question text if it's too long to fit on - one line. - - * "\n" can be inserted in question text to control line breaking - explicitly. The real newline character '\n' can also be used. - - * run-time configruation of color settings and other options using - a configuration file. - - - -WHAT'S NEW SINCE VERSION 0.21? ------------------------------- - - * some changes for faster screen update. - - * much more flexible color settings. Can use all 16 colors - (8 normal, 8 highlight) of the Linux console. - - * added run-time configuration using configuration file. - - * some minor bug fixes and cleanups for menubox, checklist and - textbox. - - * added a man page. - - * some changes for easier porting to other Unix systems (tested - on Ultrix, SunOS and HPUX) - - - -INSTALLATION ------------- - - 1. cd ./src - - 2. Go to step 3 if your system has ncurses (e.g. Linux). - Edit Makefile and remove -DHAVE_NCURSES from DEFS. Also - remove rc.c from SRCS and rc.o from OBJS. Change LIBS as - appropriate (Usually, it should be '-lcurses -ltermcap'). - Go to step 6. - - 3. Edit Makefile and remove -DBROKEN_WSCRL from DEFS if you - are using ncurses 1.8.3 or newer. Menu scrolling should - be faster. DON'T REMOVE IT IF YOU ARE NOT USING AT LEAST - VERSION 1.8.3 OF NCURSES. - - 4. Edit dialog.h and change USE_SHADOW to FALSE if you don't - want shadowed dialog boxes. Also change USE_COLORS to - FALSE if you don't want colors. Note that 'dialog' will - check if the terminal supports colors, and will use mono - settings if it doesn't, so USE_COLORS won't do any harm - even if you have a mono display. Also note that USE_SHADOW - implies USE_COLORS. These two options can be changed at - run-time using the run-time configuration file (see below). - - 5. Edit colors.h to change default color definitions if you - don't like the defaults. These are only compiled in defaults, - you can change them at run-time using the run-time - configuration file. - - 6. 'make depend; make install' will compile and install the - binaries in /usr/local/bin (change BINDIR in Makefile if - you want to install elsewhere). - - 7. 'make install.man' will install the man page to - /usr/local/man (change MANDIR in Makefile if you want to - install elsewhere). - - 8. You can then try the sample shell scripts in the samples - directory (make sure the environment variable DIALOG is - not set, the scripts use it to find the dialog binary, if - it's not set, "../src/dialog" will be used). - - 9. Don't forget to mail me (mail address at end of this file) - if you find any bugs, have some good color settings to - contribute or just want to tell me that you like it, Don't - mail me if you don't like it :-) - - - -RUN-TIME CONFIGURATION ----------------------- - - 1. Create a sample configuration file by typing: - - "dialog --create-rc " - - 2. At start, 'dialog' determines the settings to use as follows: - - a) if environment variable DIALOGRC is set, it's value - determines the name of the configuration file. - - b) if the file in (a) can't be found, use the file - $HOME/.dialogrc as the configuration file. - - c) if the file in (b) can't be found, use compiled in - defaults. - - 3. Edit the sample configuration file and copy it to some place - that 'dialog' can find, as stated in step 2 above. - - - - -Comments and bug reports welcome. - -- Savio Lam (lam836@cs.cuhk.hk) diff --git a/gnu/usr.bin/dialog/README.lib b/gnu/usr.bin/dialog/README.lib deleted file mode 100644 index 472c206..0000000 --- a/gnu/usr.bin/dialog/README.lib +++ /dev/null @@ -1,3 +0,0 @@ -Now 'dialog' splitted to this sources and library of functions, -see /usr/src/gnu/lib/libdialog for details. - Ache. diff --git a/gnu/usr.bin/dialog/TESTS/Makefile b/gnu/usr.bin/dialog/TESTS/Makefile deleted file mode 100644 index 39eb15e..0000000 --- a/gnu/usr.bin/dialog/TESTS/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -# $FreeBSD$ - -NO_OBJ= -FILES= README checklist ftreebox infobox inputbox menubox msgbox \ - prgbox radiolist textbox treebox yesno -FILESDIR= ${SHAREDIR}/examples/dialog - -.include diff --git a/gnu/usr.bin/dialog/TESTS/README b/gnu/usr.bin/dialog/TESTS/README deleted file mode 100644 index 951fe3b..0000000 --- a/gnu/usr.bin/dialog/TESTS/README +++ /dev/null @@ -1,15 +0,0 @@ -These shell scripts demonstrate possibilities of the dialog(1) tool. - -checklist - checkbox list -ftreebox - file tree box -infobox - info box -inputbox - input box -menubox - menu -msgbox - message box -prgbox - program box -radiolist - radio button list -textbox - simple text box -treebox - tree box -yesno - yes/no dialog - -$FreeBSD$ diff --git a/gnu/usr.bin/dialog/TESTS/checklist b/gnu/usr.bin/dialog/TESTS/checklist deleted file mode 100755 index 008e874..0000000 --- a/gnu/usr.bin/dialog/TESTS/checklist +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh -DIALOG=${DIALOG=/usr/bin/dialog} - -$DIALOG --title "CHECKLIST BOX" --clear \ - --checklist "Hi, this is a checklist box. You can use this to \n\ -present a list of choices which can be turned on or \n\ -off. If there are more items than can fit on the \n\ -screen, the list will be scrolled. You can use the \n\ -UP/DOWN arrow keys, the first letter of the choice as a\n\ -hot key, or the number keys 1-9 to choose an option. \n\ -Press SPACE to toggle an option on/off. \n\n\ - Which of the following are fruits?" -1 -1 5 \ - "Apple" "It's an apple." off \ - "Dog" "No, that's not my dog." ON \ - "Orange" "Yeah, that's juicy." off \ - "Cat" "No, never put a dog and a cat together!" oN \ - "Fish" "Cats like fish." On \ - "Lemon" "You know how it tastes." on 2> /tmp/checklist.tmp.$$ - -retval=$? - -choice=`cat /tmp/checklist.tmp.$$` -rm -f /tmp/checklist.tmp.$$ - -case $retval in - 0) - echo "'$choice' chosen.";; - 1) - echo "Cancel pressed.";; - 255) - [ -z "$choice" ] || echo $choice ; - echo "ESC pressed.";; -esac diff --git a/gnu/usr.bin/dialog/TESTS/ftreebox b/gnu/usr.bin/dialog/TESTS/ftreebox deleted file mode 100755 index 621dc1e..0000000 --- a/gnu/usr.bin/dialog/TESTS/ftreebox +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh -DIALOG=${DIALOG=/usr/bin/dialog} - -find -xd / -type d > /tmp/ftreebox.tmp.$$ - -$DIALOG --clear --title "FTREE BOX" \ - --hline "Press arrows, TAB or Enter" \ - --hfile "../COPYING" \ - --ftree "/tmp/ftreebox.tmp.$$" "/" \ - "This is ftree box" \ - -1 -1 10 2>/tmp/ftree.tmp.$$ - -retval=$? - -choice=`cat /tmp/ftree.tmp.$$` - -case $retval in - 0) - echo "'$choice' chosen.";; - 1) - echo "Cancel pressed.";; - 255) - [ -z "$choice" ] || echo $choice ; - echo "ESC pressed.";; -esac - -rm -f /tmp/ftreebox.tmp.$$ /tmp/ftree.tmp.$$ diff --git a/gnu/usr.bin/dialog/TESTS/infobox b/gnu/usr.bin/dialog/TESTS/infobox deleted file mode 100755 index 89d4736..0000000 --- a/gnu/usr.bin/dialog/TESTS/infobox +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -DIALOG=${DIALOG=/usr/bin/dialog} - -$DIALOG --title "INFO BOX" \ - --infobox "Hi, this is an information box. It is -different from a message box in that it will -not pause waiting for input after displaying -the message. The pause here is only introduced -by the sleep command, not by dialog. - -You have 10 seconds to read this..." -1 -1 - -stty -echo -sleep 10 -stty echo diff --git a/gnu/usr.bin/dialog/TESTS/inputbox b/gnu/usr.bin/dialog/TESTS/inputbox deleted file mode 100755 index 2acb846..0000000 --- a/gnu/usr.bin/dialog/TESTS/inputbox +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh -DIALOG=${DIALOG=/usr/bin/dialog} - -$DIALOG --title "INPUT BOX" --clear \ - --inputbox "Hi, this is an input dialog box. You can use \n\ -this to ask questions that require the user \n\ -to input a string as the answer. You can \n\ -input strings of length longer than the \n\ -width of the input box, in that case, the \n\ -input field will be automatically scrolled. \n\ -You can use BACKSPACE, LEFT, RIGHT, HOME, END\n\ -to correct errors. \n\n\ -Try inputing your name below:" -1 -1 "John Smith" 2> /tmp/inputbox.tmp.$$ - -retval=$? - -input=`cat /tmp/inputbox.tmp.$$` -rm -f /tmp/inputbox.tmp.$$ - -case $retval in - 0) - echo "Input string is '$input'";; - 1) - echo "Cancel pressed.";; - 255) - [ -z "$input" ] || echo $input ; - echo "ESC pressed.";; -esac diff --git a/gnu/usr.bin/dialog/TESTS/menubox b/gnu/usr.bin/dialog/TESTS/menubox deleted file mode 100755 index 39fe52f..0000000 --- a/gnu/usr.bin/dialog/TESTS/menubox +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/sh -DIALOG=${DIALOG=/usr/bin/dialog} - -$DIALOG --clear --title "MENU BOX" \ - --hline "Press 1-9, Up/Down, first letter or Enter" \ - --menu "Hi, this is a menu box. You can use this to \n\ -present a list of choices for the user to \n\ -choose. If there are more items than can fit \n\ -on the screen, the menu will be scrolled. \n\ -You can use the UP/DOWN arrow keys, the first \n\ -letter of the choice as a hot key, or the \n\ -number keys 1-9 to choose an option.\n\ -Try it now!\n\n\ - Choose the OS you like:" -1 -1 4 \ - "FreeBSD" "A Real Operating System for Real Users" \ - "Linux" "Another free Unix Clone for 386/486" \ - "OS/2" "IBM OS/2" \ - "WIN NT" "Microsoft Windows NT" \ - "PCDOS" "IBM PC DOS" \ - "MSDOS" "Microsoft DOS" 2> /tmp/menu.tmp.$$ - -retval=$? - -choice=`cat /tmp/menu.tmp.$$` -rm -f /tmp/menu.tmp.$$ - -case $retval in - 0) - echo "'$choice' chosen.";; - 1) - echo "Cancel pressed.";; - 255) - [ -z "$choice" ] || echo $choice ; - echo "ESC pressed.";; -esac diff --git a/gnu/usr.bin/dialog/TESTS/msgbox b/gnu/usr.bin/dialog/TESTS/msgbox deleted file mode 100755 index 7f1b1f8..0000000 --- a/gnu/usr.bin/dialog/TESTS/msgbox +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh -DIALOG=${DIALOG=/usr/bin/dialog} - -$DIALOG --title "MESSAGE BOX" --clear \ - --msgbox "Hi, this is a simple message box. You can use this to\n\ -display any message you like. The box will remain until\n\ -you press the ENTER key." -1 -1 - -case $? in - 0) - echo "OK";; - 255) - echo "ESC pressed.";; -esac diff --git a/gnu/usr.bin/dialog/TESTS/prgbox b/gnu/usr.bin/dialog/TESTS/prgbox deleted file mode 100755 index 5a631f5..0000000 --- a/gnu/usr.bin/dialog/TESTS/prgbox +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -DIALOG=${DIALOG=/usr/bin/dialog} - -$DIALOG --title "PROGRAM BOX: 'cal'" --clear \ - --prgbox "cal" 13 27 - -case $? in - 0) - echo "OK";; - *) - echo "Exit code:" $?;; -esac diff --git a/gnu/usr.bin/dialog/TESTS/radiolist b/gnu/usr.bin/dialog/TESTS/radiolist deleted file mode 100755 index 7402790..0000000 --- a/gnu/usr.bin/dialog/TESTS/radiolist +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh -DIALOG=${DIALOG=/usr/bin/dialog} - -$DIALOG --title "RADIOLIST BOX" --clear \ - --radiolist "Hi, this is a radiolist box. You can use this to \n\ -present a list of choices, one of them can be turned \n\ -on or off. If there are more items than can fit on the \n\ -screen, the list will be scrolled. You can use the \n\ -UP/DOWN arrow keys, the first letter of the choice as a\n\ -hot key, or the number keys 1-9 to choose an option. \n\ -Press SPACE to toggle an option on/off. \n\n\ - Which of the following are fruits?" -1 -1 5 \ - "Apple" "It's an apple." off \ - "Dog" "No, that's not my dog." ON \ - "Orange" "Yeah, that's juicy." off \ - "Cat" "No, never put a dog and a cat together!" oFF \ - "Fish" "Cats like fish." OFF \ - "Lemon" "You know how it tastes." oFF 2> /tmp/radiolist.tmp.$$ - -retval=$? - -choice=`cat /tmp/radiolist.tmp.$$` -rm -f /tmp/radiolist.tmp.$$ - -case $retval in - 0) - echo "'$choice' chosen.";; - 1) - echo "Cancel pressed.";; - 255) - [ -z "$choice" ] || echo $choice ; - echo "ESC pressed.";; -esac diff --git a/gnu/usr.bin/dialog/TESTS/textbox b/gnu/usr.bin/dialog/TESTS/textbox deleted file mode 100755 index ed7c2d9..0000000 --- a/gnu/usr.bin/dialog/TESTS/textbox +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/sh -DIALOG=${DIALOG=/usr/bin/dialog} - -cat << EOF > /tmp/textbox.tmp.$$ -Hi, this is a text dialog box. It can be used to display text from a file. -The file should not contain any 'tab' characters, so you should 'expand' -the file first if it contains 'tab' characters. - -It's like a simple text file viewer, with these keys implemented: - -PGDN/SPACE - Move down one page -PGUP/'b' - Move up one page -DOWN/'j' - Move down one line -UP/'k' - Move up one line -LEFT/'h' - Scroll left -RIGHT/'l' - Scroll right -'0' - Move to beginning of line -HOME/'g' - Move to beginning of file -END/'G' - Move to end of file -'/' - Forward search -'?' - Backward search -'n' - Repeat last search (forward) -'N' - Repeat last search (backward) - - -The following is a sample text file: - - -EOF - -cat ../COPYING | expand >> /tmp/textbox.tmp.$$ - -$DIALOG --clear --title "TEXT BOX" --textbox "/tmp/textbox.tmp.$$" 22 77 - -case $? in - 0) - echo "OK";; - 255) - echo "EXIT choosed.";; -esac - -rm -f /tmp/textbox.tmp.$$ diff --git a/gnu/usr.bin/dialog/TESTS/treebox b/gnu/usr.bin/dialog/TESTS/treebox deleted file mode 100755 index c5a546f..0000000 --- a/gnu/usr.bin/dialog/TESTS/treebox +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh -DIALOG=${DIALOG=/usr/bin/dialog} - -$DIALOG --clear --title "TREE BOX" \ - --hline "Press arrows, TAB or Enter" \ - --hfile "../COPYING" \ - --tree "/" \ - "This is tree box" -1 -1 10 \ - `find -x / -type d` 2>/tmp/tree.tmp.$$ - -retval=$? - -choice=`cat /tmp/tree.tmp.$$` - -case $retval in - 0) - echo "'$choice' chosen.";; - 1) - echo "Cancel pressed.";; - 255) - [ -z "$choice" ] || echo $choice ; - echo "ESC pressed.";; -esac - -rm -f /tmp/tree.tmp.$$ diff --git a/gnu/usr.bin/dialog/TESTS/yesno b/gnu/usr.bin/dialog/TESTS/yesno deleted file mode 100755 index 36e95c8..0000000 --- a/gnu/usr.bin/dialog/TESTS/yesno +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh -DIALOG=${DIALOG=/usr/bin/dialog} - -$DIALOG --title "YES/NO BOX" --clear \ - --hline "Press F1 or ? to see GNU GPL" \ - --hfile ../COPYING \ - --yesno "Hi, this is a yes/no dialog box. You can use this to ask \ - questions that have an answer of either yes or no. \ - BTW, do you notice that long lines will be automatically \ - wrapped around so that they can fit in the box? You can \ - also control line breaking explicitly by inserting \ - 'backslash n' at any place you like, but in this case, \ - auto wrap around will be disabled and you will have to \ - control line breaking yourself." 15 61 - -case $? in - 0) - echo "Yes chosen.";; - 1) - echo "No chosen.";; - 255) - echo "ESC pressed.";; -esac diff --git a/gnu/usr.bin/dialog/dialog.1 b/gnu/usr.bin/dialog/dialog.1 deleted file mode 100644 index 420a31d..0000000 --- a/gnu/usr.bin/dialog/dialog.1 +++ /dev/null @@ -1,326 +0,0 @@ -.\" $FreeBSD$ -.TH DIALOG 1 "2 October 1998" -.SH NAME -dialog \- display dialog boxes from shell scripts -.SH SYNOPSIS -.B dialog --clear -.br -.BI "dialog --create-rc " file -.br -.B dialog -[ -.BI "\-\-title " title -] -[ -.B \-\-clear -] -[ -.BI "\-\-hline " line -] -[ -.BI "\-\-hfile " file -] -.B box-options -.SH DESCRIPTION -.B Dialog -is a program which allows you to present a variety of questions or -display messages in dialog box form from a shell script. The following -types of dialog objects are currently supported: -.LP -.BR yes/no " box," " menu" " box," " input" " box," -.BR message " box," " text" " box," " info" " box," -.BR checklist " box," " program" " box," -.BR radiolist " box," -.BR ftree " and " tree " boxes." -.SH OPTIONS -.TP -.B \-\-clear -The screen will be cleared to the -.BR "screen attribute" " on exit." -.TP -.BI \-\-create-rc " file" -.RB "Since " dialog " supports run-time configuration," -this can be used to dump a sample configuration file to the file specified -by -.IR file "." -.TP -.BI \-\-title " title" -Specifies a -.I title -string to be displayed at the top of the dialog box. -.TP -.BI \-\-hline " line" -Specifies a -.I line -string to be displayed at the bottom of the dialog box. -.TP -.BI \-\-hfile " file" -Specifies a -.I file -to be displayed by pressing ? or F1. -.TP -.B Box Options -.TP -.BI \-\-yesno " text height width \fR[ \fByes \fR| \fBno \fR]" -.RB A " yes/no" " dialog box of size" -.I height -rows by -.I width -columns will be displayed. The string specified by -.I text -is displayed inside the dialog box. If this string is too long to fit -in one line, it will be automatically divided into multiple lines at -the appropriate points. The -.I text -string may also contain the sub-string -.I -"\en" -or newline characters -.I `\en\' -to control line breaking explicitly. This dialog box is useful for -asking questions that require the user to answer either yes or no. -.RB "The dialog box has a" " Yes" " button and a " No -button, in which the user can switch between by pressing the -.IR TAB " key." -.RB A " Yes" " button is selected by default unless" " no" -is specified. -.TP -.BI \-\-msgbox " text height width" -.RB A " message" " box is very similar to a" " yes/no" " box." -The only difference between a -.B message -box and a -.B yes/no -box is that a -.B message -box has only a single -.B OK -button. You can use this dialog box to display any message you like. -After reading the message, the user can press the -.I ENTER -key so that -.B dialog -will exit and the calling shell script can continue its operation. -.TP -.BI \-\-infobox " text height width" -.RB An " info" " box is basically a" " message" " box." -However, in this case, -.B dialog -will exit immediately after displaying the message to the user. The -screen is not cleared when -.B dialog -exits, so that the message will remain on the screen until the calling -shell script clears it later. This is useful when you want to inform -the user that some operations are carrying on that may require some -time to finish. -.TP -.BI \-\-inputbox " text height width" -.RB "An " input " box is useful when you want to ask questions that" -require the user to input a string as the answer. When inputing the -string, the -.I BACKSPACE -key can be used to correct typing errors. If the input string is longer than -can be fitted in the dialog box, the input field will be scrolled. On exit, -the input string will be printed on -.IR stderr "." -.TP -.BI \-\-textbox " file height width" -.RB A " text" " box lets you display the contents of a text file in a" -dialog box. It is like a simple text file viewer. The user can move -through the file by using the -.IR UP/DOWN ", " PGUP/PGDN -.RI and " HOME/END" " keys available on most keyboards." -If the lines are too long to be displayed in the box, the -.I LEFT/RIGHT -keys can be used to scroll the text region horizontally. For more -convenience, forward and backward searching functions are also provided. -.IP "\fB\-\-menu \fItext height width menu-height \fR[ \fItag item \fR] \fI..." -As its name suggests, a -.B menu -box is a dialog box that can be used to present a list of choices in -the form of a menu for the user to choose. Each menu entry consists of a -.IR tag " string and an " item " string. The" -.I tag -gives the entry a name to distinguish it from the other entries in the -menu. The -.I item -is a short description of the option that the entry represents. The -user can move between the menu entries by pressing the -.I UP/DOWN -keys, the first letter of the -.I tag -as a hot-key, or the number keys -.IR 1-9 ". There are" -.I menu-height -entries displayed in the menu at one time, but the menu will be -scrolled if there are more entries than that. When -.B dialog -exits, the -.I tag -of the chosen menu entry will be printed on -.IR stderr "." -.TP -.BI \-\-prgbox " command height width" -.RB A " program" " box lets you display output of command in" -dialog box. -.IP "\fB\-\-checklist \fItext height width list-height \fR[ \fItag item status \fR] \fI..." -.RB "A " checklist " box is similar to a " menu " box in that there are" -multiple entries presented in the form of a menu. Instead of choosing -one entry among the entries, each entry can be turned on or off by the -user. The initial on/off state of each entry is specified by -.IR status "." -On exit, a list of the -.I tag -strings of those entries that are turned on will be printed on -.IR stderr "." -.IP "\fB\-\-radiolist \fItext height width list-height \fR[ \fItag item status \fR] \fI..." -.RB "A " radiolist " box is similar to a " checklist " but it only allows" -a single entry to be selected. One entry may initially be turned on as -specified by -.IR status "." -On exit, the -.I tag -string of the entry that is turned on will be printed on -.IR stderr "." -.IP "\fB\-\-ftree \fIfile FS text height width menu-height" -.B ftree -box is a dialog box showing the tree described by the data from the file -.IR file "." -The data in the file should look like find(1) output. For the -find output, the field separator -.I FS -will be -.IR \'/\' ". If" -.IR height " and" -.IR width " are" -positive numbers, they set the absolute size of the whole -.BR ftree " box. If" -.IR height " and" -.IR width " are negative numbers, the size of the" -.B ftree -box will be -selected automatically. -.I menu-height -sets the height of the tree subwindow inside the -.B ftree -box and must be set. -.I text -is shown inside the -.B ftree -box above the tree subwindow and can contain newline characters -.I '\en\' -to split lines. One can navigate in the tree by pressing -.IR UP/DOWN " or " \'+\'/\'-\' ", " PG_UP/PG_DOWN " or " \'b\'/SPACE -.RI "and " HOME/END " or " \'g\'/\'G\' "." -A leaf of the tree is selected by pressing -.IR TAB " or " LEFT/RIGHT -the -.B OK -button and pressing -.IR ENTER "." -The selected leaf (to be more -exact, the full path to it from the root of the tree) is printed to -.IR stderr "." -If -.B Cancel -and then -.I ENTER -is pressed, nothing is printed to -.IR stderr "." -.I file -may contain data like find(1) -output, as well as like the output of find(1) with -.I -d -option. Some of the transient paths to the leaves of the tree may be -absent. Such data is corrected when fed from file. -.IP "\fB\-\-tree \fIFS text height width menu-height \fR[ \fIitem \fR] \fI..." -.B tree -box is like -.B ftree -box with some exceptions. First, the data is not -entered from a file, but from the command line as -.I item item ... -Second, the data thus entered is not corrected in any way. -Thus, the data like the output of find(1) with -.I -d -option will look incorrectly. -.SH "RUN-TIME CONFIGURATION" -.TP 4 -1. -Create a sample configuration file by typing: -.LP -.in +1i -"dialog --create-rc " -.TP 4 -2. -At start, -.B dialog -determines the settings to use as follows: -.RS -.TP 4 -a) -if environment variable -.B DIALOGRC -is set, its value determines the name of the configuration file. -.TP 4 -b) -if the file in (a) can't be found, use the file -.I $HOME/.dialogrc -as the configuration file. -.TP 4 -c) -if the file in (b) can't be found, use compiled in defaults. -.RE -.TP 4 -3. -Edit the sample configuration file and copy it to some place that -.B dialog -can find, as stated in step 2 above. -.SH ENVIRONMENT -.TP 15 -.B DIALOGRC -Define this variable if you want to specify the name of the configuration file -to use. -.SH FILES -.TP 20 -.I $HOME/.dialogrc -default configuration file -.SH DIAGNOSTICS -Exit status is 0 if -.BR dialog " is exited by pressing the " Yes " or " OK -button, and 1 if the -.BR No " or " Cancel -button is pressed. Otherwise, if errors occur inside -.B dialog -or -.B dialog -is exited by pressing the -.I ESC -key, the exit status is -1. -.SH SEE ALSO -dialog(3) -.SH BUGS -Text files containing -.I tab -characters may cause problems with -.B text -box. -.I Tab -characters in text files must first be expanded to spaces before being -.RB "displayed by " text " box." -.sp 1 -Screen update is too slow. -.sp 1 -The -.B ftree -and -.B tree -boxes do not allow the tree to be moved to the left or to -the right. Thus, if there are many levels of data, some of the leaves can be -rendered invisible. A standard display with 80 characters allows for 17 -levels to be visible. Deeper levels are invisible. However, the navigation -in the tree and selection of leaves do work. -.SH AUTHOR -Savio Lam (lam836@cs.cuhk.hk) -.sp 1 -Changes by Anatoly A. Orehovsky (tolik@mpeks.tomsk.su) (ftree and tree boxes) diff --git a/gnu/usr.bin/dialog/dialog.c b/gnu/usr.bin/dialog/dialog.c deleted file mode 100644 index dcbf19d..0000000 --- a/gnu/usr.bin/dialog/dialog.c +++ /dev/null @@ -1,394 +0,0 @@ -/* - * dialog - Display simple dialog boxes from shell scripts - * - * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $FreeBSD$ - * - * - * HISTORY: - * - * 17/12/93 - Version 0.1 released. - * - * 19/12/93 - menu will now scroll if there are more items than can fit - * on the screen. - * - added 'checklist', a dialog box with a list of options that - * can be turned on or off. A list of options that are on is - * returned on exit. - * - * 20/12/93 - Version 0.15 released. - * - * 29/12/93 - Incorporated patch from Patrick J. Volkerding - * (volkerdi@mhd1.moorhead.msus.edu) that made these changes: - * - increased MAX_LEN to 2048 - * - added 'infobox', equivalent to a message box without pausing - * - added option '--clear' that will clear the screen - * - Explicit line breaking when printing prompt text can be - * invoked by real newline '\n' besides the string "\n" - * - an optional parameter '--title ' can be used to - * specify a title string for the dialog box - * - * 03/01/94 - added 'textbox', a dialog box for displaying text from a file. - * - Version 0.2 released. - * - * 04/01/94 - some fixes and improvements for 'textbox': - * - fixed a bug that will cause a segmentation violation when a - * line is longer than MAX_LEN characters. Lines will now be - * truncated if they are longer than MAX_LEN characters. - * - removed wrefresh() from print_line(). This will increase - * efficiency of print_page() which calls print_line(). - * - display current position in the form of percentage into file. - * - Version 0.21 released. - * - * 05/01/94 - some changes for faster screen update. - * - * 07/01/94 - much more flexible color settings. Can use all 16 colors - * (8 normal, 8 highlight) of the Linux console. - * - * 08/01/94 - added run-time configuration using configuration file. - * - * 09/01/94 - some minor bug fixes and cleanups for menubox, checklist and - * textbox. - * - * 11/01/94 - added a man page. - * - * 13/01/94 - some changes for easier porting to other Unix systems (tested - * on Ultrix, SunOS and HPUX) - * - Version 0.3 released. - * - * 08/06/94 - Patches by Stuart Herbert - S.Herbert@shef.ac.uk - * Fixed attr_clear and the textbox stuff to work with ncurses 1.8.5 - * Fixed the wordwrap routine - it'll actually wrap properly now - * Added a more 3D look to everything - having your own rc file could - * prove 'interesting' to say the least :-) - * Added radiolist option - * - Version 0.4 released. - * - * 09/28/98 - Patches by Anatoly A. Orehovsky - tolik@mpeks.tomsk.su - * Added ftree and tree options - * - */ - -#include - -#include -#include -#include -#include -#include - -void Usage(char *name); -void EndDialog(int cls); - -int main(int argc, char *argv[]) -{ - int offset = 0, clear_screen = 0, end_common_opts = 0, default_yesno = 1, retval; - unsigned char *title = NULL; - unsigned char result[MAX_LEN]; - char *hline = NULL, *hfile = NULL; - - if (argc < 2) - Usage(argv[0]); - else if (!strcmp(argv[1], "--create-rc")) { -#ifdef HAVE_NCURSES - if (argc != 3) - Usage(argv[0]); - dialog_create_rc(argv[2]); - return 0; -#else - fprintf(stderr, "\nThis option is currently unsupported on your system.\n"); - return -1; -#endif - } - - while (offset < argc-1 && !end_common_opts) { /* Common options */ - if (!strcmp(argv[offset+1], "--title")) { - if (argc-offset < 3 || title != NULL) /* No two "--title" please! */ - Usage(argv[0]); - else { - title = argv[offset+2]; - offset += 2; - } - } - else if (!strcmp(argv[offset+1], "--hline")) { - if (argc-offset < 3 || hline != NULL) /* No two "--hline" please! */ - Usage(argv[0]); - else { - hline = argv[offset+2]; - use_helpline(hline); - offset += 2; - } - } - else if (!strcmp(argv[offset+1], "--hfile")) { - if (argc-offset < 3 || hfile != NULL) /* No two "--hfile" please! */ - Usage(argv[0]); - else { - hfile = argv[offset+2]; - use_helpfile(hfile); - offset += 2; - } - } - else if (!strcmp(argv[offset+1], "--clear")) { - if (clear_screen) /* Hey, "--clear" can't appear twice! */ - Usage(argv[0]); - else if (argc == 2) { /* we only want to clear the screen */ - init_dialog(); - dialog_update(); /* init_dialog() will clear the screen for us */ - end_dialog(); - return 0; - } - else { - clear_screen = 1; - offset++; - } - } - else /* no more common options */ - end_common_opts = 1; - } - - if (argc-1 == offset) /* no more options */ - Usage(argv[0]); - - /* Box options */ - - if (!strcmp(argv[offset+1], "--yesno")) { - if (argc-offset != 5 && argc-offset != 6) - Usage(argv[0]); - if (argc-offset == 6) { - if (!strcmp(argv[offset+5], "yes")) - default_yesno = 1; - else if (!strcmp(argv[offset+5], "no")) - default_yesno = 0; - else - Usage(argv[0]); - } - init_dialog(); - if (default_yesno == 1) - retval = dialog_yesno(title, argv[offset+2], atoi(argv[offset+3]), - atoi(argv[offset+4])); - else - retval = dialog_noyes(title, argv[offset+2], atoi(argv[offset+3]), - atoi(argv[offset+4])); - - dialog_update(); - EndDialog(clear_screen); - return retval; - } - else if (!strcmp(argv[offset+1], "--msgbox")) { - if (argc-offset != 5) - Usage(argv[0]); - init_dialog(); - retval = dialog_msgbox(title, argv[offset+2], atoi(argv[offset+3]), - atoi(argv[offset+4]), 1); - - dialog_update(); - EndDialog(clear_screen); - return retval; - } - else if (!strcmp(argv[offset+1], "--prgbox")) { - if (argc-offset != 5) - Usage(argv[0]); - init_dialog(); - retval = dialog_prgbox(title, argv[offset+2], atoi(argv[offset+3]), - atoi(argv[offset+4]), TRUE, TRUE); - - dialog_update(); - EndDialog(clear_screen); - return WEXITSTATUS(retval); - } - else if (!strcmp(argv[offset+1], "--infobox")) { - if (argc-offset != 5) - Usage(argv[0]); - init_dialog(); - retval = dialog_msgbox(title, argv[offset+2], atoi(argv[offset+3]), - atoi(argv[offset+4]), 0); - - dialog_update(); - EndDialog(clear_screen); - return retval; - } - else if (!strcmp(argv[offset+1], "--textbox")) { - if (argc-offset != 5) - Usage(argv[0]); - init_dialog(); - retval = dialog_textbox(title, argv[offset+2], atoi(argv[offset+3]), - atoi(argv[offset+4])); - - dialog_update(); - EndDialog(clear_screen); - return retval; - } - else if (!strcmp(argv[offset+1], "--menu")) { - if (argc-offset < 8 || ((argc-offset) % 2)) - Usage(argv[0]); - init_dialog(); - retval = dialog_menu(title, argv[offset+2], atoi(argv[offset+3]), - atoi(argv[offset+4]), atoi(argv[offset+5]), - (argc-offset-6)/2, argv+offset + 6, result, - NULL, NULL); - dialog_update(); - if (retval == 0) - fputs(result, stderr); - EndDialog(clear_screen); - return retval; - } - else if (!strcmp(argv[offset+1], "--checklist")) { - if (argc-offset < 9 || ((argc-offset-6) % 3)) - Usage(argv[0]); - init_dialog(); - retval = dialog_checklist(title, argv[offset+2], atoi(argv[offset+3]), - atoi(argv[offset+4]), atoi(argv[offset+5]), - (argc-offset-6)/3, argv+offset + 6, result); - - dialog_update(); - if (retval == 0) { - unsigned char *s, *h; int first; - - h = result; - first = 1; - while ((s = strchr(h, '\n')) != NULL) { - *s++ = '\0'; - if (!first) - fputc(' ', stderr); - else - first = 0; - fprintf(stderr, "\"%s\"", h); - h = s; - } - } - EndDialog(clear_screen); - return retval; - } - else if (!strcmp(argv[offset+1], "--radiolist")) { - if (argc-offset < 9 || ((argc-offset-6) % 3)) - Usage(argv[0]); - init_dialog(); - retval = dialog_radiolist(title, argv[offset+2], atoi(argv[offset+3]), - atoi(argv[offset+4]), atoi(argv[offset+5]), - (argc-offset-6)/3, argv+offset + 6, result); - - dialog_update(); - if (retval == 0) - fputs(result, stderr); - EndDialog(clear_screen); - return retval; - } - else if (!strcmp(argv[offset+1], "--inputbox")) { - if (argc-offset != 5 && argc-offset != 6) - Usage(argv[0]); - if (argc-offset == 6) - strcpy(result, argv[offset+5]); - else - *result = '\0'; - init_dialog(); - retval = dialog_inputbox(title, argv[offset+2], atoi(argv[offset+3]), - atoi(argv[offset+4]), result); - - dialog_update(); - if (retval == 0) - fputs(result, stderr); - EndDialog(clear_screen); - return retval; - } -/* ftree and tree options */ - else if (!strcmp(argv[offset+1], "--ftree")) { - unsigned char *tresult; - if (argc-offset != 8) - Usage(argv[0]); - init_dialog(); - retval = dialog_ftree(argv[offset+2], *argv[offset+3], - title, argv[offset+4], atoi(argv[offset+5]), atoi(argv[offset+6]), - atoi(argv[offset+7]), &tresult); - - dialog_update(); - if (!retval) - { - fputs(tresult, stderr); - free(tresult); - } - EndDialog(clear_screen); - return retval; - } - else if (!strcmp(argv[offset+1], "--tree")) { - unsigned char *tresult; - if (argc-offset < 8) - Usage(argv[0]); - init_dialog(); - retval = dialog_tree((unsigned char **)argv+offset+7, argc-offset-7, - *argv[offset+2], title, argv[offset+3], atoi(argv[offset+4]), - atoi(argv[offset+5]), atoi(argv[offset+6]), &tresult); - - dialog_update(); - if (!retval) - fputs(tresult, stderr); - - EndDialog(clear_screen); - return retval; - } - - Usage(argv[0]); - - return 0; -} -/* End of main() */ - - -/* - * Print program usage - */ -void Usage(char *name) -{ - fprintf(stderr, "\ -\ndialog version 0.3, by Savio Lam (lam836@cs.cuhk.hk).\ -\n patched to version %s by Stuart Herbert (S.Herbert@shef.ac.uk)\ -\n Changes Copyright (C) 1995 by Andrey A. Chernov, Moscow, Russia\ -\n patched by Anatoly A. Orehovsky (tolik@mpeks.tomsk.su)\ -\n\ -\n* Display dialog boxes from shell scripts *\ -\n\ -\nUsage: %s --clear\ -\n %s --create-rc \ -\n %s [--title ] [--clear] [--hline <line>] [--hfile <file>]\\\ -\n <Box options>\ -\n\ -\nBox options:\ -\n\ -\n --yesno <text> <height> <width> [yes|no]\ -\n --msgbox <text> <height> <width>\ -\n --prgbox \"<command line>\" <height> <width>\ -\n --infobox <text> <height> <width>\ -\n --inputbox <text> <height> <width> [<init string>]\ -\n --textbox <file> <height> <width>\ -\n --menu <text> <height> <width> <menu height> <tag1> <item1>...\ -\n --checklist <text> <height> <width> <list height> <tag1> <item1> <status1>...\ -\n --radiolist <text> <height> <width> <list height> <tag1> <item1> <status1>...\ -\n --ftree <file> <FS> <text> <height> <width> <menu height>\ -\n --tree <FS> <text> <height> <width> <menu height> <item1>...\n", VERSION, name, name, name); - exit(-1); -} -/* End of Usage() */ - -/* - * End dialog - */ -void EndDialog(int cls) -{ - if (cls) /* clear screen before exit */ - dialog_clear(); - end_dialog(); -} -/* End of Dialog() */ -- cgit v1.1