====== Dialog Boxes ======
\\
There are multiple dialog boxes tools. Choice mainly depend on features you need.
Very light, go with Whiptail. More advanced (file explorer, date/time, file editor, forms, etc), but still simple, go with Dialog. Advanced (like GUI with multiple windows, menu, etc), go with Newt.
===== Whiptail =====
Whiptail is used directly from bash.
Example is better than words sometime:
while true; do
choice=$(whiptail --title "Choose dialog to open" --menu "Please choose a dialog to open" 0 0 0 \
"1" "inputbox" \
"2" "yesno" \
"3" "msgbox" \
"4" "passwordbox" \
"5" "gauge" \
"6" "textbox" \
"7" "exit" 3>&1 1>&2 2>&3)
case "$choice" in
1)
inputboxresult=$(whiptail --inputbox "This is an inputbox" --title "inputbox" 0 0 3>&1 1>&2 2>&3)
echo $inputboxresult
;;
2)
whiptail --yesno "This is a yesno box" --title "yesno" 0 0
echo $?
;;
3)
whiptail --msgbox "This is a msgbox" --title "msgbox" 0 0
echo $?
;;
4)
passwordboxresult=$(whiptail --passwordbox "This is a passwordbox" --title "passwordbox" 0 0 3>&1 1>&2 2>&3)
echo $passwordboxresult
;;
5)
(
cat < /dev/null
sleep 1s
cat < /dev/null
sleep 1s
cat < /tmp/myfile
echo "world" >> /tmp/myfile
echo "!" >> /tmp/myfile
whiptail --textbox --scrolltext /tmp/myfile 20 0
echo $?
;;
7)
break
;;
esac
done
Good documentation:
https://en.wikibooks.org/wiki/Bash_Shell_Scripting/Whiptail
===== Dialog =====
Dialog is used directly from bash. On most distributions, you need to install dialog (yum install dialog).
Dialog syntax is very close to Whiptail.
Example is better than words sometime:
while true; do
choice=$(dialog --backtitle "My dialog example" --title "Choose dialog to open" --menu "Please choose a dialog to open" 0 50 0 \
"1" "inputbox" \
"2" "yesno" \
"3" "msgbox" \
"4" "passwordbox" \
"5" "gauge" \
"6" "textbox" \
"7" "exit" 3>&1 1>&2 2>&3)
case "$choice" in
1)
inputboxresult=$(dialog --backtitle "My dialog example" --title "inputbox" --inputbox "This is an inputbox" 8 50 3>&1 1>&2 2>&3)
echo $inputboxresult
;;
2)
dialog --ascii-lines --backtitle "My dialog example" --title "yesno" --yesno "This is a yesno box" 6 50
echo $?
;;
3)
dialog --colors --backtitle "My dialog example" --title "msgbox" --msgbox "This \Zb\Z1is a msg\Znbox" 6 50
echo $?
;;
4)
passwordboxresult=$(dialog --backtitle "My dialog example" --title "passwordbox" --passwordbox "This is a passwordbox" 8 50 3>&1 1>&2 2>&3)
echo $passwordboxresult
;;
5)
(
cat < /dev/null
sleep 1s
cat < /dev/null
sleep 1s
cat < /tmp/myfile
echo "world" >> /tmp/myfile
echo "!" >> /tmp/myfile
dialog --backtitle "My dialog example" --textbox /tmp/myfile 20 0
echo $?
;;
7)
break
;;
esac
done
Note: if you get strange characters instead of lines and you are using putty on windows, use --ascci-lines for each dialog command, or before opening ssh, go into putty configuration, then in Connection -> Data, change Terminalt-type string from xterm to linux. Ensure also that in Window -> Translation, UTF-8 is used.
Good documentation:
http://www.unixcl.com/2009/12/linux-dialog-utility-short-tutorial.html
===== Newt =====
Newt is based on C language, but is very powerfull.
First install some packages (here on centos):
yum install newt newt-devel slang-devel
Then an ugly example would be:
#include
#include
#include
int main(void) {
void * result;
struct partition * curr;
newtInit();
newtCls();
newtDrawRootText(0, 0, "My manager");
newtDrawRootText(4, 4, "This is a test manager");
newtDrawRootText(4, 6, "All actions done here are logged in /var/log/manager.log");
newtComponent win1, form, b1, b2, listbox;
win1 = newtOpenWindow(10, 10, 80, 30, "Button Sample");
b1 = newtButton(10, 9, "Ok");
b2 = newtButton(22, 9, "Cancel");
listbox= newtListbox(10,15,2, NEWT_FLAG_RETURNEXIT);
newtListboxAppendEntry(listbox, "do nothing" , "1");
newtListboxAppendEntry(listbox, "touch file" , "2");
form = newtForm(NULL, NULL, 0);
newtFormAddComponents(form, b1, b2, listbox, NULL);
newtRunForm(form);
result = newtListboxGetCurrent(listbox);
newtFormDestroy(form);
newtPopWindow();
newtFinished();
const char * toto=result;
printf("%c\n",*toto);
printf("%p\n",result);
if ( toto == "2" )
{int status = system("touch /tmp/testr");}
}
To build it:
gcc -o test.out test.c -lnewt
Full documentation can be found at: http://gnewt.sourceforge.net/tutorial.html\\
To get more informations on functions: https://sourcecodebrowser.com/newt/0.52.10/listbox_8c.html