📄 dialog.c
字号:
#endif#ifdef HAVE_GAUGEstatic intj_gauge(JUMPARGS){ *offset_add = arg_rest(av); return dialog_gauge(t, av[1], numeric_arg(av, 2), numeric_arg(av, 3), optional_num(av, 4, 0));}#endif#ifdef HAVE_TAILBOXstatic intj_tailbox(JUMPARGS){ *offset_add = 4; return dialog_tailbox(t, av[1], numeric_arg(av, 2), numeric_arg(av, 3), FALSE);}static intj_tailboxbg(JUMPARGS){ *offset_add = 4; return dialog_tailbox(t, av[1], numeric_arg(av, 2), numeric_arg(av, 3), TRUE);}#endif/* *INDENT-OFF* */static const Mode modes[] ={ {o_yesno, 4, 4, j_yesno}, {o_msgbox, 4, 4, j_msgbox}, {o_infobox, 4, 4, j_infobox}, {o_textbox, 4, 4, j_textbox}, {o_menu, 7, 0, j_menu}, {o_inputmenu, 7, 0, j_inputmenu}, {o_checklist, 8, 0, j_checklist}, {o_radiolist, 8, 0, j_radiolist}, {o_inputbox, 4, 5, j_inputbox}, {o_passwordbox, 4, 5, j_passwordbox},#ifdef HAVE_XDIALOG {o_calendar, 4, 7, j_calendar}, {o_fselect, 4, 5, j_fselect}, {o_timebox, 4, 7, j_timebox},#endif#ifdef HAVE_FORMBOX {o_form, 13, 0, j_form},#endif#ifdef HAVE_GAUGE {o_gauge, 4, 5, j_gauge},#endif#ifdef HAVE_TAILBOX {o_tailbox, 4, 4, j_tailbox}, {o_tailboxbg, 4, 4, j_tailboxbg},#endif};/* *INDENT-ON* */static char *optionString(char **argv, int *num){ int next = *num + 1; char *result = argv[next]; if (result == 0) { char temp[80]; sprintf(temp, "Expected a string-parameter for %.20s", argv[*num]); Usage(temp); } *num = next; return result;}static intoptionValue(char **argv, int *num){ int next = *num + 1; char *src = argv[next]; char *tmp = 0; int result = 0; if (src != 0) { result = strtol(src, &tmp, 0); if (tmp == 0 || *tmp != 0) src = 0; } if (src == 0) { char temp[80]; sprintf(temp, "Expected a numeric-parameter for %.20s", argv[*num]); Usage(temp); } *num = next; return result;}/* * Print parts of a message */static voidPrintList(const char *const *list){ const char *leaf = strrchr(program, '/'); unsigned n = 0; if (leaf != 0) leaf++; else leaf = program; while (*list != 0) { fprintf(dialog_state.output, *list, n ? leaf : dialog_version()); (void) fputc('\n', dialog_state.output); n = 1; list++; }}static const Mode *lookupMode(eOptions code){ const Mode *modePtr = 0; unsigned n; for (n = 0; n < sizeof(modes) / sizeof(modes[0]); n++) { if (modes[n].code == code) { modePtr = &modes[n]; break; } } return modePtr;}/* * Print program help-message */static voidHelp(void){ static const char *const tbl_1[] = { "cdialog (ComeOn Dialog!) version %s", "", "* Display dialog boxes from shell scripts *", "", "Usage: %s <options> { --and-widget <options> }", "where options are \"common\" options, followed by \"box\" options", "",#ifdef HAVE_RC_FILE "Special options:", " [--create-rc \"Ifile\"]",#endif 0 }, *const tbl_3[] = { "", "Auto-size with height and width = 0. Maximize with height and width = -1.", "Global-auto-size if also menu_height/list_height = 0.", 0 }; unsigned j, k; PrintList(tbl_1); fprintf(dialog_state.output, "Common options:\n "); for (j = k = 0; j < sizeof(options) / sizeof(options[0]); j++) { if ((options[j].pass & 1) && options[j].help != 0) { unsigned len = 6 + strlen(options[j].name) + strlen(options[j].help); k += len; if (k > 75) { fprintf(dialog_state.output, "\n "); k = len; } fprintf(dialog_state.output, " [--%s%s%s]", options[j].name, *(options[j].help) ? " " : "", options[j].help); } } fprintf(dialog_state.output, "\nBox options:\n"); for (j = 0; j < sizeof(options) / sizeof(options[0]); j++) { if ((options[j].pass & 2) != 0 && options[j].help != 0 && lookupMode(options[j].code)) fprintf(dialog_state.output, " --%-12s %s\n", options[j].name, options[j].help); } PrintList(tbl_3); dlg_exit(DLG_EXIT_OK);}static voidinit_result(char *buffer){ /* clear everything we do not save for the next widget */ memset(&dialog_vars, 0, sizeof(dialog_vars)); dialog_vars.input_result = buffer; dialog_vars.input_result[0] = '\0';}intmain(int argc, char *argv[]){ FILE *input = stdin; char temp[256]; bool esc_pressed = FALSE; bool ignore_unknown = FALSE; int offset = 1; int offset_add; int retval = DLG_EXIT_OK; int done; int j; eOptions code; const Mode *modePtr; char my_buffer[MAX_LEN + 1]; memset(&dialog_state, 0, sizeof(dialog_state)); memset(&dialog_vars, 0, sizeof(dialog_vars));#if defined(ENABLE_NLS) /* initialize locale support */ setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE);#elif defined(HAVE_SETLOCALE) (void) setlocale(LC_ALL, "");#endif unescape_argv(&argc, argv); program = argv[0]; dialog_state.output = stderr; /* * Look for the last --stdout, --stderr or --output-fd option, and use * that. We can only write to one of them. If --stdout is used, that * can interfere with initializing the curses library, so we want to * know explicitly if it is used. */ while (offset < argc) { int base = offset; switch (lookupOption(argv[offset], 7)) { case o_stdout: dialog_state.output = stdout; break; case o_stderr: dialog_state.output = stderr; break; case o_input_fd: if ((j = optionValue(argv, &offset)) < 0 || (input = fdopen(j, "r")) == 0) dlg_exiterr("Cannot open input-fd\n"); break; case o_output_fd: if ((j = optionValue(argv, &offset)) < 0 || (dialog_state.output = fdopen(j, "w")) == 0) dlg_exiterr("Cannot open output-fd\n"); break; default: ++offset; continue; } for (j = base; j < argc; ++j) { dialog_argv[j] = dialog_argv[j + 1 + (offset - base)]; if (dialog_opts != 0) dialog_opts[j] = dialog_opts[j + 1 + (offset - base)]; } argc -= (1 + offset - base); offset = base; } offset = 1; init_result(my_buffer); if (argc == 2) { /* if we don't want clear screen */ switch (lookupOption(argv[1], 7)) { case o_print_maxsize: (void) initscr(); endwin(); fflush(dialog_state.output); fprintf(dialog_state.output, "MaxSize: %d, %d\n", SLINES, SCOLS); break; case o_print_version: fprintf(dialog_state.output, "Version: %s\n", dialog_version()); break; case o_clear: initscr(); refresh(); endwin(); break; case o_ignore: break; default: case o_help: Help(); break; } return DLG_EXIT_OK; } if (argc < 2) { Help(); }#ifdef HAVE_RC_FILE if (lookupOption(argv[1], 7) == o_create_rc) { if (argc != 3) { sprintf(temp, "Expected a filename for %.50s", argv[1]); Usage(temp); } if (dlg_parse_rc() == -1) /* Read the configuration file */ dlg_exiterr("dialog: dlg_parse_rc"); dlg_create_rc(argv[2]); return DLG_EXIT_OK; }#endif init_dialog(input, dialog_state.output); while (offset < argc && !esc_pressed) { init_result(my_buffer); done = FALSE; while (offset < argc && !done) { /* Common options */ switch (lookupOption(argv[offset], 1)) { case o_title: dialog_vars.title = optionString(argv, &offset); break; case o_backtitle: dialog_vars.backtitle = optionString(argv, &offset); break; case o_separator: case o_separate_widget: dialog_state.separate_str = optionString(argv, &offset); break; case o_separate_output: dialog_vars.separate_output = TRUE; break; case o_colors: dialog_vars.colors = TRUE; break; case o_cr_wrap: dialog_vars.cr_wrap = TRUE; break; case o_no_collapse: dialog_vars.nocollapse = TRUE; break; case o_no_kill: dialog_vars.cant_kill = TRUE; break; case o_nocancel: dialog_vars.nocancel = TRUE; break; case o_size_err: dialog_vars.size_err = TRUE; break; case o_beep: dialog_vars.beep_signal = TRUE; break; case o_beep_after: dialog_vars.beep_after_signal = TRUE; break; case o_shadow: dialog_state.use_shadow = TRUE; break; case o_defaultno: dialog_vars.defaultno = TRUE; break; case o_default_item: dialog_vars.default_item = optionString(argv, &offset); break; case o_insecure: dialog_vars.insecure = TRUE; break; case o_item_help: dialog_vars.item_help = TRUE; break; case o_help_button: dialog_vars.help_button = TRUE; break; case o_help_status: dialog_vars.help_status = TRUE; break; case o_extra_button: dialog_vars.extra_button = TRUE; break; case o_ignore: ignore_unknown = TRUE; break; case o_keep_window: dialog_vars.keep_window = TRUE; break; case o_no_shadow: dialog_state.use_shadow = FALSE; break; case o_print_size: dialog_vars.print_siz = TRUE; break; case o_print_maxsize: /* * If this is the last option, we do not want any error * messages - just our output. Calling end_dialog() cancels * the refresh() at the end of the program as well. */ if (argv[offset + 1] == 0) { ignore_unknown = TRUE; end_dialog(); } fflush(dialog_state.output); fprintf(dialog_state.output, "MaxSize: %d, %d\n", SLINES, SCOLS); break; case o_print_version: fprintf(dialog_state.output, "Version: %s\n", dialog_version()); break; case o_tab_correct: dialog_vars.tab_correct = TRUE; break; case o_sleep: dialog_vars.sleep_secs = optionValue(argv, &offset); break; case o_timeout: dialog_vars.timeout_secs = optionValue(argv, &offset); break; case o_max_input: dialog_vars.max_input = optionValue(argv, &offset); break; case o_tab_len: dialog_state.tab_len = optionValue(argv, &offset); break; case o_trim: dialog_vars.trim_whitespace = TRUE; break; case o_aspect: dialog_state.aspect_ratio = optionValue(argv, &offset); break; case o_begin: dialog_vars.begin_set = TRUE; dialog_vars.begin_y = optionValue(argv, &offset); dialog_vars.begin_x = optionValue(argv, &offset); break; case o_clear: dialog_vars.dlg_clear_screen = TRUE; break; case o_yes_label: dialog_vars.yes_label = optionString(argv, &offset); break; case o_no_label: dialog_vars.no_label = optionString(argv, &offset); break; case o_ok_label: dialog_vars.ok_label = optionString(argv, &offset); break; case o_cancel_label: dialog_vars.cancel_label = optionString(argv, &offset); break; case o_extra_label: dialog_vars.extra_label = optionString(argv, &offset); break; case o_exit_label: dialog_vars.exit_label = optionString(argv, &offset); break; case o_help_label: dialog_vars.help_label = optionString(argv, &offset); break; case o_noitem: case o_fullbutton: /* ignore */ break; /* options of Xdialog which we ignore */ case o_icon: case o_wmclass: (void) optionString(argv, &offset); /* FALLTHRU */ case o_allow_close: case o_auto_placement: case o_fixed_font: case o_keep_colors: case o_no_close: case o_no_cr_wrap: case o_screen_center: case o_smooth: case o_under_mouse: break; case o_unknown: if (ignore_unknown) break; /* FALLTHRU */ default: /* no more common options */ done = TRUE; break; } if (!done) offset++; } if (argv[offset] == NULL) { if (ignore_unknown) break; Usage("Expected a box option"); } for (j = offset; j < argc; j++) { if (offset > 0) { switch (lookupOption(argv[j - 1], 7)) { case o_unknown: case o_title: case o_backtitle: break; default: dlg_trim_string(argv[j]); break; } } } if (lookupOption(argv[offset], 2) != o_checklist && dialog_vars.separate_output) { sprintf(temp, "Expected --checklist, not %.20s", argv[offset]); Usage(temp); } if (dialog_state.aspect_ratio == 0) dialog_state.aspect_ratio = DEFAULT_ASPECT_RATIO; dlg_put_backtitle(); /* use a table to look for the requested mode, to avoid code duplication */ modePtr = 0; if ((code = lookupOption(argv[offset], 2)) != o_unknown) modePtr = lookupMode(code); if (modePtr == 0) { sprintf(temp, "%s option %.20s", lookupOption(argv[offset], 7) != o_unknown ? "Unexpected" : "Unknown", argv[offset]); Usage(temp); } if (arg_rest(&argv[offset]) < modePtr->argmin) { sprintf(temp, "Expected at least %d tokens for %.20s, have %d", modePtr->argmin - 1, argv[offset], arg_rest(&argv[offset]) - 1); Usage(temp); } if (modePtr->argmax && arg_rest(&argv[offset]) > modePtr->argmax) { sprintf(temp, "Expected no more than %d tokens for %.20s, have %d", modePtr->argmax - 1, argv[offset], arg_rest(&argv[offset]) - 1); Usage(temp); } retval = show_result((*(modePtr->jumper)) (dialog_vars.title, argv + offset, &offset_add)); offset += offset_add; if (dialog_vars.input_result != my_buffer) free(dialog_vars.input_result); if (retval == DLG_EXIT_ESC) { esc_pressed = TRUE; } else { if (dialog_vars.beep_after_signal) (void) beep(); if (dialog_vars.sleep_secs) (void) napms(dialog_vars.sleep_secs * 1000); if (offset < argc) { switch (lookupOption(argv[offset], 7)) { case o_and_widget: offset++; break; case o_unknown: sprintf(temp, "Expected --and-widget, not %.20s", argv[offset]); Usage(temp); break; default: /* if we got a cancel, etc., stop chaining */ if (retval != DLG_EXIT_OK) esc_pressed = TRUE; else dialog_vars.dlg_clear_screen = TRUE; break; } } if (dialog_vars.dlg_clear_screen) dlg_clear(); } } dlg_killall_bg(&retval); if (dialog_state.screen_initialized) { (void) refresh(); end_dialog(); } dlg_exit(retval);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -