Получить индекс выбора dialog_menu в диалоге (libdialog) - PullRequest
0 голосов
/ 13 апреля 2020

Я реализую небольшую диалоговую систему, используя dialog в C и читаю документацию здесь , но не могу понять, как получить индекс выбора dialog_menu команда.

Я понимаю, что функция init_dialog(FILE *, FILE *) принимает здесь stdout в качестве вывода, но тогда я не верю, что возможно перенаправить вывод в переменную в любом случае.

При запуске этого кода нажатие кнопки «Выход» возвращает код 1, а нажатие любой из двух опций возвращает 0. Как я могу различить эти варианты?

#include <dialog.h>
#include <stdio.h>
#include <stdlib.h>

#define LEN(arr) ((int) (sizeof(arr) / sizeof(arr)[0]))

int
menu()
{
    int select;
    char *modes[] =
    {
        "1", "The first option",
        "2", "The second option"
    };

    init_dialog(stdin, stdout);
    select = dialog_menu("test_app", "Choose an option.", 0, 0, 0, LEN(modes) / 2, modes);
    end_dialog();

    return select;
}

int
main()
{
    int status;
    status = menu();
    printf("%d\n", status);
    return status;
}

1 Ответ

0 голосов
/ 13 апреля 2020

Библиотека dialog содержит структуру с именем dialog_vars, которая содержит среди многих переменных char *input_result.

Когда в меню делается выбор, input_result устанавливается на значение тега , (в предоставленном исходном коде этот тег является либо "1", либо "2", а если выбор не сделан вообще, указатель NULL.

От здесь, strcmp может быть сделано, чтобы определить, какой ответ был выбран.

PS: Всегда убедитесь, что вы вызываете dlg_clr_result() перед повторными диалогами, потому что выбор объединен to input_result и, следовательно, не вызывая функцию, новый результат будет добавлен к старому вместо его замены.

Пример:

#include <dialog.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LEN(arr) ((int) (sizeof(arr) / sizeof(arr)[0]))

void
menu()
{
    char *modes[] =
    {
        "1", "The first option",
        "2", "The second option"
    };

    init_dialog(stdin, stdout);
    dialog_menu("test_app", "Choose an option.", 0, 0, 0, LEN(modes) / 2, modes);
    end_dialog();

    char *result = dialog_vars.input_result; /* this will be "1", "2" or NULL */

    init_dialog(stdin, stdout);
    dialog_menu("test_app", strcmp(result, "1") ? "One" : "Two", 0, 0, 1);
    end_dialog();
}

int
main()
{
    menu();
    return 0;
}
...