/* Display a help file in a filebox */ int systemDisplayHelp(char *file) { char *fname = NULL; char buf[FILENAME_MAX]; int ret = 0; WINDOW *w = savescr(); printf("zzz"); fname = systemHelpFile(file, buf); if (!fname) { snprintf(buf, FILENAME_MAX, "The %s file is not provided on this particular floppy image.", file); use_helpfile(NULL); use_helpline(NULL); dialog_mesgbox("Sorry!", buf, -1, -1); ret = 1; } else { use_helpfile(NULL); use_helpline(NULL); dialog_textbox(file, fname, LINES, COLS); } restorescr(w); return ret; }
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); }
/* Put up a message in an input box and return the value */ char * msgGetInput(char *buf, const char *fmt, ...) { va_list args; char *errstr; static char input_buffer[256]; int rval; WINDOW *w = savescr(); errstr = (char *)alloca(FILENAME_MAX); va_start(args, fmt); vsnprintf(errstr, FILENAME_MAX, fmt, args); va_end(args); use_helpline(NULL); use_helpfile(NULL); if (buf) SAFE_STRCPY(input_buffer, buf); else input_buffer[0] = '\0'; if (OnVTY) { ioctl(0, VT_ACTIVATE, 1); /* Switch back */ msgInfo(NULL); } rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer); restorescr(w); if (!rval) return input_buffer; else return NULL; }
int dmenuSystemCommandBox(dialogMenuItem *tmp) { WINDOW *w = savescr(); use_helpfile(NULL); use_helpline("Select OK to dismiss this dialog"); dialog_prgbox(tmp->title, (char *)tmp->data, 22, 76, 1, 1); restorescr(w); return DITEM_SUCCESS; }
/* Traverse over an internal menu */ Boolean dmenuOpen(DMenu *menu, int *choice, int *scroll, int *curr, int *max, Boolean buttons) { int n, rval = 0; dialogMenuItem *items; items = menu->items; if (buttons) items += 2; /* Count up all the items */ for (n = 0; items[n].title; n++); while (1) { char buf[FILENAME_MAX]; WINDOW *w = savescr(); /* Any helpful hints, put 'em up! */ use_helpline(menu->helpline); use_helpfile(systemHelpFile(menu->helpfile, buf)); dialog_clear_norefresh(); /* Pop up that dialog! */ if (menu->type & DMENU_NORMAL_TYPE) rval = dialog_menu((u_char *)menu->title, (u_char *)menu->prompt, -1, -1, menu_height(menu, n), -n, items, (char *)(uintptr_t)buttons, choice, scroll); else if (menu->type & DMENU_RADIO_TYPE) rval = dialog_radiolist((u_char *)menu->title, (u_char *)menu->prompt, -1, -1, menu_height(menu, n), -n, items, (char *)(uintptr_t)buttons); else if (menu->type & DMENU_CHECKLIST_TYPE) rval = dialog_checklist((u_char *)menu->title, (u_char *)menu->prompt, -1, -1, menu_height(menu, n), -n, items, (char *)(uintptr_t)buttons); else msgFatal("Menu: `%s' is of an unknown type\n", menu->title); if (exited) { exited = FALSE; restorescr(w); return TRUE; } else if (rval) { restorescr(w); return FALSE; } else if (menu->type & DMENU_SELECTION_RETURNS) { restorescr(w); return TRUE; } } }
/* This is it - how to get the setup values */ static int anonftpOpenDialog(void) { WINDOW *ds_win; ComposeObj *obj = NULL; int n = 0, cancel = FALSE; int max; char title[80]; WINDOW *w = savescr(); /* We need a curses window */ if (!(ds_win = openLayoutDialog(ANONFTP_HELPFILE, " Anonymous FTP Configuration ", ANONFTP_DIALOG_X, ANONFTP_DIALOG_Y, ANONFTP_DIALOG_WIDTH, ANONFTP_DIALOG_HEIGHT))) { beep(); msgConfirm("Cannot open anonymous ftp dialog window!!"); restorescr(w); return DITEM_FAILURE; } /* Draw a sub-box for the path configuration */ draw_box(ds_win, ANONFTP_DIALOG_Y + 7, ANONFTP_DIALOG_X + 8, ANONFTP_DIALOG_HEIGHT - 11, ANONFTP_DIALOG_WIDTH - 17, dialog_attr, border_attr); wattrset(ds_win, dialog_attr); sprintf(title, " Path Configuration "); mvwaddstr(ds_win, ANONFTP_DIALOG_Y + 7, ANONFTP_DIALOG_X + 22, title); /** Initialize the config Data Structure **/ bzero(&tconf, sizeof(tconf)); SAFE_STRCPY(tconf.group, FTP_GROUP); SAFE_STRCPY(tconf.upload, FTP_UPLOAD); SAFE_STRCPY(tconf.comment, FTP_COMMENT); SAFE_STRCPY(tconf.homedir, FTP_HOMEDIR); sprintf(tconf.uid, "%d", FTP_UID); /* Some more initialisation before we go into the main input loop */ obj = initLayoutDialog(ds_win, layout, ANONFTP_DIALOG_X, ANONFTP_DIALOG_Y, &max); cancelbutton = okbutton = 0; while (layoutDialogLoop(ds_win, layout, &obj, &n, max, &cancelbutton, &cancel)); /* Clear this crap off the screen */ delwin(ds_win); use_helpfile(NULL); restorescr(w); if (cancel) return DITEM_FAILURE; return DITEM_SUCCESS; }
static void handle_intr(int sig) { WINDOW *save = savescr(); use_helpline(NULL); use_helpfile(NULL); if (OnVTY) { ioctl(0, VT_ACTIVATE, 1); /* Switch back */ msgInfo(NULL); } (void)dialog_menu("Installation interrupt", "Do you want to abort the installation?", -1, -1, 2, -2, intrmenu, NULL, NULL, NULL); restorescr(save); }
/* Put up a message in a popup information box */ void msgNotify(const char *fmt, ...) { va_list args; char *errstr; errstr = (char *)alloca(FILENAME_MAX); va_start(args, fmt); vsnprintf(errstr, FILENAME_MAX, fmt, args); va_end(args); use_helpline(NULL); use_helpfile(NULL); if (isDebug()) msgDebug("Notify: %s\n", errstr); dialog_msgbox(NULL, errstr, -1, -1, 0); }
/* Tell the user there's some output to go look at */ void msgWeHaveOutput(const char *fmt, ...) { va_list args; char *errstr; WINDOW *w = savescr(); errstr = (char *)alloca(FILENAME_MAX); va_start(args, fmt); vsnprintf(errstr, FILENAME_MAX, fmt, args); va_end(args); use_helpline(NULL); use_helpfile(NULL); msgDebug("Notify: %s\n", errstr); dialog_clear_norefresh(); sleep(2); dialog_msgbox(NULL, errstr, -1, -1, 0); restorescr(w); }
/* Put up a message in a popup confirmation box */ void msgConfirm(const char *fmt, ...) { va_list args; char *errstr; WINDOW *w = savescr(); errstr = (char *)alloca(FILENAME_MAX); va_start(args, fmt); vsnprintf(errstr, FILENAME_MAX, fmt, args); va_end(args); use_helpline(NULL); use_helpfile(NULL); if (OnVTY) { ioctl(0, VT_ACTIVATE, 1); msgInfo(NULL); } dialog_notify(errstr); restorescr(w); }
/* Put up a message in a popup no/yes box and return 0 for YES, 1 for NO */ int msgNoYes(const char *fmt, ...) { va_list args; char *errstr; int ret; WINDOW *w = savescr(); errstr = (char *)alloca(FILENAME_MAX); va_start(args, fmt); vsnprintf(errstr, FILENAME_MAX, fmt, args); va_end(args); use_helpline(NULL); use_helpfile(NULL); if (OnVTY) { ioctl(0, VT_ACTIVATE, 1); /* Switch back */ msgInfo(NULL); } if (variable_get(VAR_NONINTERACTIVE)) return 1; /* If non-interactive, return NO all the time */ ret = dialog_noyes("User Confirmation Requested", errstr, -1, -1); restorescr(w); return ret; }
int index_menu(PkgNodePtr root, PkgNodePtr top, PkgNodePtr plist, int *pos, int *scroll) { struct ListPtrs lists; size_t maxname; int n, rval; int curr, max; PkgNodePtr kp; dialogMenuItem *nitems; Boolean hasPackages; WINDOW *w; lists.root = root; lists.top = top; lists.plist = plist; hasPackages = FALSE; nitems = NULL; n = maxname = 0; /* Figure out if this menu is full of "leaves" or "branches" */ for (kp = top->kids; kp && kp->name; kp = kp->next) { size_t len; ++n; if (kp->type == PACKAGE && plist) { hasPackages = TRUE; if ((len = strlen(kp->name)) > maxname) maxname = len; } } if (!n && plist) { msgConfirm("The %s menu is empty.", top->name); return DITEM_LEAVE_MENU; } w = savescr(); while (1) { n = 0; curr = max = 0; use_helpline(NULL); use_helpfile(NULL); kp = top->kids; if (!hasPackages && plist) { nitems = item_add(nitems, "OK", NULL, NULL, NULL, NULL, NULL, NULL, &curr, &max); nitems = item_add(nitems, "Install", NULL, NULL, NULL, NULL, NULL, NULL, &curr, &max); } while (kp && kp->name) { char buf[256]; IndexEntryPtr ie = kp->data; /* Brutally adjust description to fit in menu */ if (kp->type == PACKAGE) snprintf(buf, sizeof buf, "[%s]", ie->path ? ie->path : "External vendor"); else SAFE_STRCPY(buf, kp->desc); if (strlen(buf) > (_MAX_DESC - maxname)) buf[_MAX_DESC - maxname] = '\0'; nitems = item_add(nitems, kp->name, buf, pkg_checked, pkg_fire, pkg_selected, kp, &lists, &curr, &max); ++n; kp = kp->next; } /* NULL delimiter so item_free() knows when to stop later */ nitems = item_add(nitems, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &curr, &max); recycle: dialog_clear_norefresh(); if (hasPackages) rval = dialog_checklist(top->name, top->desc, -1, -1, n > MAX_MENU ? MAX_MENU : n, -n, nitems, NULL); else rval = dialog_menu(top->name, top->desc, -1, -1, n > MAX_MENU ? MAX_MENU : n, -n, nitems + (plist ? 2 : 0), (char *)plist, pos, scroll); if (rval == -1 && plist) { static char *cp; PkgNodePtr menu; /* Search */ if ((cp = msgGetInput(cp, "Search by package name. Please enter search string:")) != NULL) { PkgNodePtr p = index_search(top, cp, &menu); if (p) { int pos, scroll; /* These need to be set to point at the found item, actually. Hmmm! */ pos = scroll = 0; index_menu(root, menu, plist, &pos, &scroll); } else msgConfirm("Search string: %s yielded no hits.", cp); } goto recycle; } items_free(nitems, &curr, &max); restorescr(w); return rval ? DITEM_FAILURE : DITEM_SUCCESS; } }
int userAddUser(dialogMenuItem *self) { WINDOW *ds_win, *save; ComposeObj *obj = NULL; int n = 0, cancel = FALSE, ret; int max, firsttime = TRUE; if (RunningAsInit && !strstr(variable_get(SYSTEM_STATE), "install")) { msgConfirm("This option may only be used after the system is installed, sorry!"); return DITEM_FAILURE; } save = savescr(); dialog_clear_norefresh(); /* We need a curses window */ if (!(ds_win = openLayoutDialog(USER_HELPFILE, " User and Group Management ", USER_DIALOG_X, USER_DIALOG_Y, USER_DIALOG_WIDTH, USER_DIALOG_HEIGHT))) { beep(); msgConfirm("Cannot open adduser dialog window!!"); return(DITEM_FAILURE); } /* Draw a user entry box */ draw_box(ds_win, USER_DIALOG_Y + 1, USER_DIALOG_X + 3, USER_DIALOG_HEIGHT - 6, USER_DIALOG_WIDTH - 6, dialog_attr, border_attr); wattrset(ds_win, dialog_attr); mvwaddstr(ds_win, USER_DIALOG_Y + 1, USER_DIALOG_X + 22, " Add a new user "); CLEAR(uname); CLEAR(uid); CLEAR(ugroup); CLEAR(gecos); CLEAR(passwd); CLEAR(umemb); CLEAR(homedir); CLEAR(shell); /* Some more initialisation before we go into the main input loop */ obj = initLayoutDialog(ds_win, userLayout, USER_DIALOG_X, USER_DIALOG_Y, &max); reenter: cancelbutton = okbutton = 0; if (firsttime) { /* fill in the blanks, well, just the GID */ completeUser(); RefreshStringObj(userLayout[LAYOUT_UID].obj); RefreshStringObj(userLayout[LAYOUT_UGROUP].obj); RefreshStringObj(userLayout[LAYOUT_GECOS].obj); RefreshStringObj(userLayout[LAYOUT_UMEMB].obj); RefreshStringObj(userLayout[LAYOUT_HOMEDIR].obj); RefreshStringObj(userLayout[LAYOUT_SHELL].obj); firsttime = FALSE; } while (layoutDialogLoop(ds_win, userLayout, &obj, &n, max, &cancelbutton, &cancel)); if (!cancel && !verifyUserSettings(ds_win)) goto reenter; /* Clear this crap off the screen */ delwin(ds_win); dialog_clear_norefresh(); use_helpfile(NULL); if (!cancel) { addUser(ds_win); ret = DITEM_SUCCESS; } else ret = DITEM_FAILURE; restorescr(save); return ret; }