libodialog: Remove no longer used library.
This commit is contained in:
parent
561984be06
commit
46968249f1
@ -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.
|
||||
-
|
@ -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.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) 19yy <name of author>
|
||||
|
||||
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.
|
||||
|
||||
<signature of Ty Coon>, 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.
|
@ -1,24 +0,0 @@
|
||||
# Makefile for libdialog
|
||||
# $FreeBSD$
|
||||
|
||||
.include <bsd.own.mk>
|
||||
|
||||
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 <bsd.lib.mk>
|
@ -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.
|
@ -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 <bsd.prog.mk>
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <dialog.h>
|
||||
|
||||
/* 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;
|
||||
}
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <dialog.h>
|
||||
|
||||
/* 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;
|
||||
}
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/wait.h>
|
||||
#include <dialog.h>
|
||||
|
||||
/* 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;
|
||||
}
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <dialog.h>
|
||||
|
||||
/* 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;
|
||||
}
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <dialog.h>
|
||||
|
||||
/* 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;
|
||||
}
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <dialog.h>
|
||||
|
||||
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);
|
||||
}
|
@ -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
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <dialog.h>
|
||||
|
||||
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);
|
||||
}
|
@ -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
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <dialog.h>
|
||||
|
||||
/* 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;
|
||||
}
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <dialog.h>
|
||||
|
||||
/* 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;
|
||||
}
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <dialog.h>
|
||||
|
||||
/* 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;
|
||||
}
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <dialog.h>
|
||||
|
||||
/* 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;
|
||||
}
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <dialog.h>
|
||||
|
||||
/* 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;
|
||||
}
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <dialog.h>
|
||||
|
||||
/* 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;
|
||||
}
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <dialog.h>
|
||||
|
||||
/* 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;
|
||||
}
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <dialog.h>
|
||||
|
||||
/* 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;
|
||||
}
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <dialog.h>
|
||||
|
||||
/* 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;
|
||||
}
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <dialog.h>
|
||||
|
||||
/* 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;
|
||||
}
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <dialog.h>
|
||||
|
||||
/* 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;
|
||||
}
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <dialog.h>
|
||||
|
||||
/* 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;
|
||||
}
|
@ -1,111 +0,0 @@
|
||||
/*
|
||||
* tree.c
|
||||
*
|
||||
* small test-driver for new dialog functionality
|
||||
*
|
||||
* Copyright (c) 1998, Anatoly A. Orehovsky
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <dialog.h>
|
||||
|
||||
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);
|
||||
}
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <dialog.h>
|
||||
|
||||
/* 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;
|
||||
}
|
@ -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.
|
||||
|
||||
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <dialog.h>
|
||||
#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() */
|
@ -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__ */
|
@ -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!
|
@ -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 <ncurses.h>
|
||||
|
||||
#else
|
||||
|
||||
#ifdef ultrix
|
||||
#include <cursesX.h>
|
||||
#else
|
||||
#include <curses.h>
|
||||
#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 */
|
@ -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 <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
|
||||
#if defined(LOCALE)
|
||||
#include <locale.h>
|
||||
#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);
|
||||
|
@ -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 <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <unistd.h> /* XXX for _POSIX_VERSION ifdefs */
|
||||
|
||||
#if !defined sgi && !defined _POSIX_VERSION
|
||||
#include <sys/dir.h>
|
||||
#endif
|
||||
#if defined __sun__
|
||||
#include <sys/dirent.h>
|
||||
#endif
|
||||
#if defined sgi || defined _POSIX_VERSION
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <fnmatch.h>
|
||||
#include <sys/param.h>
|
||||
#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 <d>, except
|
||||
* for the current directory and other dot-files
|
||||
* keep '..' however.
|
||||
* pre: <d> 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 <d>, except
|
||||
* for the current directory
|
||||
* pre: <d> 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 <d>, except
|
||||
* for the current directory and the parent directory.
|
||||
* Also skip any other dot-files.
|
||||
* pre: <d> 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 <d>, except
|
||||
* for the current directory and the parent directory
|
||||
* pre: <d> 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: <dir> == NULL
|
||||
* post: <dir> contains <n> 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<n; i++) {
|
||||
if (d[i].linkname) {
|
||||
free(d[i].linkname);
|
||||
}
|
||||
}
|
||||
free(d);
|
||||
} else {
|
||||
printf("dir.c:FreeDir(): d == NULL\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
return;
|
||||
} /* FreeDir() */
|
||||
|
||||
void
|
||||
toggle_dotfiles(void)
|
||||
/*
|
||||
* desc: toggle visibility of dot-files
|
||||
*/
|
||||
{
|
||||
_showdotfiles = !_showdotfiles;
|
||||
|
||||
return;
|
||||
} /* toggle_dotfiles() */
|
||||
|
||||
int
|
||||
show_dotfiles(void)
|
||||
/*
|
||||
* desc: return the value of _showdotfiles
|
||||
*/
|
||||
{
|
||||
return(_showdotfiles);
|
||||
} /* show_dotfiles() */
|
||||
|
||||
void
|
||||
set_dotfiles(int b)
|
||||
/*
|
||||
* desc: set the value of _showdotfiles
|
||||
*/
|
||||
{
|
||||
_showdotfiles = b;
|
||||
|
||||
return;
|
||||
} /* set_dotfiles() */
|
@ -1,38 +0,0 @@
|
||||
/*
|
||||
* include file for dir.c
|
||||
*
|
||||
* 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 <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/dirent.h>
|
||||
|
||||
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);
|
@ -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 <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/param.h>
|
||||
#include <dialog.h>
|
||||
#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 <dir> as an array in
|
||||
* <names>, the # of entries in <nd>, 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 <dir> as an arry in
|
||||
* <names>, the # of entries in <nf>, 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; i<n; i++) {
|
||||
free(names[i]);
|
||||
}
|
||||
free(names);
|
||||
|
||||
return;
|
||||
} /* FreeNames() */
|
||||
|
||||
int
|
||||
dialog_dselect_old(void)
|
||||
/*
|
||||
* Desc: starting from the current directory,
|
||||
* choose a new current directory
|
||||
*/
|
||||
{
|
||||
DirList *d = NULL;
|
||||
char **names, old_dir[MAXPATHLEN];
|
||||
WINDOW *ds_win;
|
||||
ButtonObj *okbut, *cancelbut;
|
||||
ListObj *dirs_obj;
|
||||
StringObj *dir_obj;
|
||||
char o_dir[MAXPATHLEN];
|
||||
struct ComposeObj *obj = NULL;
|
||||
int n, nd, okbutton, cancelbutton,
|
||||
quit, cancel, ret;
|
||||
|
||||
ds_win = newwin(LINES-8, COLS-30, 4, 15);
|
||||
if (ds_win == NULL) {
|
||||
fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n",
|
||||
LINES-8, COLS-30, 4, 15);
|
||||
exit(1);
|
||||
}
|
||||
draw_box(ds_win, 0, 0, LINES-8, COLS-30, dialog_attr, border_attr);
|
||||
wattrset(ds_win, dialog_attr);
|
||||
mvwaddstr(ds_win, 0, (COLS-30)/2 - 9, " Directory Select ");
|
||||
draw_shadow(stdscr, 4, 15, LINES-8, COLS-30);
|
||||
display_helpline(ds_win, LINES-9, COLS-30);
|
||||
|
||||
/* the Directory string input field */
|
||||
getcwd(o_dir, MAXPATHLEN);
|
||||
dir_obj = NewStringObj(ds_win, "Directory:", o_dir, 1, 2, COLS-34, MAXPATHLEN-1);
|
||||
AddObj(&obj, STRINGOBJ, (void *) dir_obj);
|
||||
|
||||
/* the list of directories */
|
||||
get_dir(".", "*", &d, &n);
|
||||
get_directories(d, n, &names, &nd);
|
||||
dirs_obj = NewListObj(ds_win, "Directories:", names, o_dir, 5, 2,
|
||||
LINES-15, COLS-48, nd);
|
||||
AddObj(&obj, LISTOBJ, (void *) dirs_obj);
|
||||
|
||||
/* the Ok-button */
|
||||
okbutton = FALSE;
|
||||
okbut = NewButtonObj(ds_win, "Continue", &okbutton, 7, COLS-45);
|
||||
AddObj(&obj, BUTTONOBJ, (void *) okbut);
|
||||
|
||||
/* the Cancel-button */
|
||||
cancelbutton = FALSE;
|
||||
cancelbut = NewButtonObj(ds_win, "Return", &cancelbutton, 11, COLS-44);
|
||||
AddObj(&obj, BUTTONOBJ, (void *) cancelbut);
|
||||
|
||||
quit = FALSE;
|
||||
cancel = FALSE;
|
||||
strcpy(old_dir, o_dir);
|
||||
while (!quit) {
|
||||
ret = PollObj(&obj);
|
||||
switch(ret) {
|
||||
case SEL_BUTTON:
|
||||
if (okbutton) {
|
||||
quit = TRUE;
|
||||
}
|
||||
if (cancelbutton) {
|
||||
quit = TRUE;
|
||||
cancel = TRUE;
|
||||
}
|
||||
break;
|
||||
case SEL_CR:
|
||||
if (strcmp(old_dir, o_dir)) {
|
||||
/* the directory was changed, cd into it */
|
||||
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);
|
||||
}
|
||||
get_dir(".", "*", &d, &n);
|
||||
FreeNames(names, nd);
|
||||
get_directories(d, n, &names, &nd);
|
||||
UpdateListObj(dirs_obj, names, nd);
|
||||
if (((obj->prev)->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 <dir>, which
|
||||
* initially display files with the mask <filemask>
|
||||
* pre: <dir> is the initial directory
|
||||
* only files corresponding to the mask <fmask> 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() */
|
||||
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#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 <perc>
|
||||
*/
|
||||
{
|
||||
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<glen; i++) waddch(gw, ' ');
|
||||
|
||||
wrefresh(gw);
|
||||
delwin(gw);
|
||||
|
||||
return;
|
||||
} /* dialog_gauge() */
|
||||
|
@ -1,194 +0,0 @@
|
||||
/***************************************************************
|
||||
*
|
||||
* Program: help.c
|
||||
* Author: Marc van Kempen
|
||||
* Desc: get help
|
||||
*
|
||||
*
|
||||
* 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 <stdlib.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <string.h>
|
||||
#include <dialog.h>
|
||||
|
||||
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 <helpfile>
|
||||
*/
|
||||
{
|
||||
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 <y, x> in the window <w>
|
||||
*/
|
||||
{
|
||||
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 <helpline> and free the space allocated to it
|
||||
*/
|
||||
{
|
||||
use_helpline(helpline);
|
||||
free(helpline);
|
||||
|
||||
return;
|
||||
} /* restore_helpline() */
|
@ -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 <dialog.h>
|
||||
#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() */
|
@ -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 <string>' 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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#define __DIALOG_MAIN__
|
||||
|
||||
#include <dialog.h>
|
||||
#include <err.h>
|
||||
#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 */
|
||||
}
|
||||
|
@ -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 <dialog.h>
|
||||
#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);
|
||||
}
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <dialog.h>
|
||||
#include "dialog.priv.h"
|
||||
#include <err.h>
|
||||
#include <ncurses.h>
|
||||
|
||||
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() */
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <dialog.h>
|
||||
#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 <buf>
|
||||
*/
|
||||
{
|
||||
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 <buf> or NULL if its
|
||||
* not there
|
||||
*/
|
||||
{
|
||||
int i;
|
||||
|
||||
if (n<0) {
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
i=0;
|
||||
while (*buf && i<n) {
|
||||
if (*buf == '\n' || *buf == '\r') {
|
||||
i++;
|
||||
}
|
||||
buf++;
|
||||
}
|
||||
if (i<n) {
|
||||
return(NULL);
|
||||
} else {
|
||||
return(buf);
|
||||
}
|
||||
} /* getline() */
|
||||
|
||||
static void
|
||||
print_page(WINDOW *win, int height, int width, unsigned char *buf, int startline, int hscroll)
|
||||
/*
|
||||
* Desc: Print a page of text in the current window, starting at line <startline>
|
||||
* with a <horizontal> scroll of hscroll from buffer <buf>
|
||||
*/
|
||||
{
|
||||
int i, j;
|
||||
unsigned char *b;
|
||||
|
||||
b = getline(buf, startline);
|
||||
for (i=0; i<height; i++) {
|
||||
/* clear line */
|
||||
wmove(win, 1+i, 1);
|
||||
for (j=0; j<width-2; j++) waddnstr(win, " ", 1);
|
||||
wmove(win, 1+i, 1);
|
||||
j = 0;
|
||||
/* scroll to the right */
|
||||
while (*b && (*b != '\n') && (*b != '\r') && (j<hscroll)) {
|
||||
b++;
|
||||
j++;
|
||||
}
|
||||
/* print new line */
|
||||
j = 0;
|
||||
while (*b && (*b != '\n') && (*b != '\r') && (j<width-2)) {
|
||||
waddnstr(win, b, 1);
|
||||
if (*b != '\t') { /* check for tabs */
|
||||
j++;
|
||||
} else {
|
||||
j = ((int) (j+1)/8 + 1) * 8 - 1;
|
||||
}
|
||||
b++;
|
||||
}
|
||||
while (*b && (*b != '\n') && (*b != '\r')) b++;
|
||||
if (*b) b++; /* skip over '\n', if it exists */
|
||||
}
|
||||
} /* print_page() */
|
||||
|
||||
|
||||
|
||||
|
@ -1,53 +0,0 @@
|
||||
/*
|
||||
* File: notify.c
|
||||
* Author: Marc van Kempen
|
||||
* Desc: display a notify box with a message
|
||||
*
|
||||
* 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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <dialog.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
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() */
|
||||
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <dialog.h>
|
||||
#include <errno.h>
|
||||
#include <sys/wait.h>
|
||||
#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() */
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <dialog.h>
|
||||
#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() */
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
#include <signal.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <paths.h>
|
||||
|
||||
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);
|
||||
}
|
@ -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 <dialog.h>
|
||||
#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 <file>\"\
|
||||
\n#\
|
||||
\n#\
|
||||
\n# Types of values:\
|
||||
\n#\
|
||||
\n# Number - <number>\
|
||||
\n# String - \"string\"\
|
||||
\n# Boolean - <ON|OFF>\
|
||||
\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() */
|
@ -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);
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <dialog.h>
|
||||
#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() */
|
File diff suppressed because it is too large
Load Diff
@ -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 <stdlib.h>
|
||||
#include <sys/param.h>
|
||||
#include <ncurses.h>
|
||||
#include <dialog.h>
|
||||
#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 <obj> to the list of objects <Obj>
|
||||
*/
|
||||
{
|
||||
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 <so>
|
||||
*/
|
||||
{
|
||||
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 <so>
|
||||
*/
|
||||
{
|
||||
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; i<lo->n && i<lo->scroll+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]); j<lo->w-2; j++) waddstr(lo->win, " ");
|
||||
}
|
||||
}
|
||||
wattrset(lo->win, item_attr);
|
||||
while (i<lo->scroll+h) {
|
||||
wmove(lo->win, y+i-lo->scroll, x);
|
||||
for (j=0; j<lo->w-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; i<n; i++) {
|
||||
lo->seld[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<=i<lo->n: "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; i<n; i++) {
|
||||
lo->seld[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; i<lo->n; i++) {
|
||||
lo->seld[i] = TRUE;
|
||||
}
|
||||
DrawNames(lo);
|
||||
|
||||
return;
|
||||
} /* MarkAllListObj() */
|
||||
|
||||
void
|
||||
UnMarkAllListObj(ListObj *lo)
|
||||
/*
|
||||
* Desc: unmark all items
|
||||
*/
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0; i<lo->n; 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 <bo>
|
||||
*/
|
||||
{
|
||||
free(bo->title);
|
||||
free(bo);
|
||||
|
||||
return;
|
||||
} /* DelButtonObj() */
|
@ -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 <ncurses.h>
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* 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 <w> of the display */
|
||||
/* and length <len> 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);
|
||||
|
@ -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 <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <dialog.h>
|
||||
#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() */
|
Loading…
Reference in New Issue
Block a user