=== Библиотека виджетов

Входит в подпакет *make-initrd-bootchain-interactive*. Скрипты виджетов
попадают в каталог */lib/IM-widgets* внутри формируемого образа initramfs.
Библиотеку можно расширять, но следует иметь ввиду, что генератор *make-initrd*
не допускает перезапись уже попавших в образ файлов.

В начале каждой функции виджета следует использовать вызов *IM_start_input*,
если это виджет ввода, а в остальных случаях использовать *IM_start_output*.
Помимо динамической загрузки необходимого кода, такой подход позволяет
сообщить модулю о начале ввода, что является одним из триггеров переключения
в интерактивный терминал (по умолчанию */dev/tty2*). Если виджету требуется
код другого виджета, то его следует указать в списке требуемых, например:

[,,subs="verbatim,quotes"]
----
IM_start_output gauge errmsg
----

Все нижеперечисленные диалоги выводят заголовок верхнего уровня из переменной
*$IM_BACKTITLE*, которая в случае *altboot* устанавливается из конфигурационной
переменной *$OEM_DISTRIBUTION* (в основе параметр *dialog --backtitle*).
Перед вызовом любой функции диалога можно экспортировать переменную
*DIALOGRC*=/путь/к/кофигу_dialog для определения альтернативной палитры цветов.
Все функции диалогов используют глобальную переменную *$IM_WIDGET_ARGS* для
передачи программе *dialog* дополнительных аргументов.

==== choice

Диалог ввода. Выводит меню из одного или более пунктов. Метки перед пунктами
не выводятся, а записываются в указанную переменную, когда пользователь выберет
соответствующий пункт в меню. Если выбор будет сделан, возвращает 0. Основан
на *dialog --menu*.

.Синтаксис:
[,,subs="verbatim,quotes"]
----
`*IM_choice*` <переменная> <текст> <метка1> <пункт1> [<метка2> <пункт2>...]
----

.Пример использования:
[,,subs="verbatim,quotes"]
----
text="Please choose the installation method."

while ! `*IM_choice*` method "$text" \
    nfs   "NFS server"      \
    ftp   "FTP server"      \
    http  "HTTP server"     \
    cifs  "SAMBA server"    \
    cdrom "CD-ROM Drive"    \
    disk  "Hard Disk Drive" \
    #
do
    sleep 0.5
done
----

==== dlgmsg

Диалог ввода. Выводит текстовое сообщение. Всегда возвращает 0.
Основан на *dialog --msgbox*.

.Синтаксис:
[,,subs="verbatim,quotes"]
----
`*IM_dlgmsg*` <заголовок> <текст>
----

.Пример использования:
[,,subs="verbatim,quotes"]
----
`*IM_dlgmsg*` "Live is success!" "$text"
----

==== errmsg

Диалог ввода. Выводит сообщение об ошибке. Всегда возвращает 0.
Основан на *dialog --msgbox*.

.Синтаксис:
[,,subs="verbatim,quotes"]
----
`*IM_errmsg*` <текст>
----

.Пример использования:
[,,subs="verbatim,quotes"]
----
`*IM_errmsg*` "Disk read error, try again!"
----

==== form

Диалог ввода. Выводит смешанную форму ввода данных. Позволяет ввести одно
или несколько текстовых полей данных в указанные переменные. Некоторые имена
переменных ассоциирует с паролем, для них вводимые символы выводятся «***»
(звёздочкой). Если данные были введены и нажата ENTER или кнопка «OK»,
возвращает 0. Если нажата Esc или кнопка «Cancel», возвращает не 0.
Основан на *dialog --mixedform*.

.Синтаксис:
[,,subs="verbatim,quotes"]
----
`*IM_form*` <заголовок> <текст> <высота_текста> \
  <переменная1> <макс_размер_строки1> <подпись_поля1> \
  [<переменная2> <макс_размер_строки2> <подпись_поля2>...]
----

.Пример использования:
[,,subs="verbatim,quotes"]
----
`*IM_form*` "$title" "$text" 5    \
  server     64 "HTTP-server" \
  directory 128 "Directory"   \
  ||
  continue
----

==== gauge

Диалог вывода. Выводит «градусник», он же «ползунок» или «прогресс бар».
Целое число от 0 до 100 должно быть подано на вход через stdout для
определения процента проделанной работы. Хорошо согласуется с программой
*pv*. Всегда возвращает 0. Основан на *dialog --gauge*.

.Синтаксис:
[,,subs="verbatim,quotes"]
----
echo <целое> | `*IM_gauge*` <заголовок> [<текст>]
----

.Пример использования:
[,,subs="verbatim,quotes"]
----
for i in $(seq 1 10); do
  echo "${i}0" | `*IM_gauge*` "[ Loading... ]"
  sleep 1
done
----

==== ponder

Диалог вывода. Выводит виджет «ожидание», изображающий неопределённое время
происходящего процесса, работает независимо от основного кода программы.
Параметры <пауза> и <шаг> при запуске определяют на сколько процентов будет
автоматически продвигаться градусник спустя заданное время, т.е. задают
частоту и скорость обновления виджета. Всегда возвращает 0. Основан на
виджете *ponder*.

.Синтаксис:
[,,subs="verbatim,quotes"]
----
`*IM_ponder_start*` <заголовок> [[[<текст>] <пауза>] <шаг>]
...
`*IM_ponder_stop*`
----

.Пример использования:
[,,subs="verbatim,quotes"]
----
`*IM_ponder_start*` "[ Scanning disk... ]" \
    "Searching random bits on the disk for fill CRNG entropy..."
( find / -type f -print0 |
  xargs -0 grep "Linus Torvalds"
) >/tmp/Linus.txt 2>/dev/null
`*IM_ponder_stop*`
----

