static newtComponent textbox(int maxHeight, int width, const char * text, int flags, int * height) { newtComponent tb; int sFlag = (flags & FLAG_SCROLL_TEXT) ? NEWT_FLAG_SCROLL : 0; int i; char * buf, * dst; const char * src; dst = buf = alloca(strlen(text) + 1); src = text; while (*src) { if (*src == '\\' && *(src + 1) == 'n') { src += 2; *dst++ = '\n'; } else *dst++ = *src++; } *dst++ = '\0'; tb = newtTextbox(1, 0, width, maxHeight, NEWT_FLAG_WRAP | sFlag); newtTextboxSetText(tb, buf); i = newtTextboxGetNumLines(tb); if (i < maxHeight) { newtTextboxSetHeight(tb, i); maxHeight = i; } *height = maxHeight; return tb; }
static int newtChecklist(const char* title, const char* message, unsigned int width, unsigned int height, unsigned int num_entries, const char** entries, int* states) { int ret; const int list_height = 4; char cbstates[num_entries]; for (unsigned int i = 0; i < num_entries; i++) { cbstates[i] = states[i] ? '*' : ' '; } newtCenteredWindow(width, height, title); newtComponent textbox = newtTextbox(1, 1, width - 2, height - 6 - list_height, NEWT_FLAG_WRAP); newtTextboxSetText(textbox, message); int top = newtTextboxGetNumLines(textbox) + 2; newtComponent form = newtForm(NULL, NULL, 0); newtComponent sb = NULL; if (list_height < num_entries) { sb = newtVerticalScrollbar( width - 4, top + 1, list_height, NEWT_COLORSET_CHECKBOX, NEWT_COLORSET_ACTCHECKBOX); newtFormAddComponent(form, sb); } newtComponent subform = newtForm(sb, NULL, 0); newtFormSetBackground(subform, NEWT_COLORSET_CHECKBOX); newtFormSetHeight(subform, list_height); newtFormSetWidth(subform, width - 10); for (unsigned int i = 0; i < num_entries; i++) { newtComponent cb = newtCheckbox(4, top + i, entries[i], cbstates[i], NULL, &cbstates[i]); newtFormAddComponent(subform, cb); } newtFormAddComponents(form, textbox, subform, NULL); newtComponent btn_okay = newtButton((width - 18) / 3, height - 4, _("OK")); newtComponent btn_cancel = newtButton((width - 18) / 3 * 2 + 9, height - 4, _("Cancel")); newtFormAddComponents(form, btn_okay, btn_cancel, NULL); newtComponent answer = newtRunForm(form); if ((answer == NULL) || (answer == btn_cancel)) { ret = -1; } else { ret = 0; for (unsigned int i = 0; i < num_entries; i++) { states[i] = (cbstates[i] != ' '); if (states[i]) ret++; } } newtFormDestroy(form); newtPopWindow(); return ret; }
/** * Ask the user to enter a value. * @param title The title of the dialog box. * @param b The blurb (e.g. what you want the user to enter). * @param output The string to put the user's answer in. It has to be freed by the caller * @return TRUE if the user pressed OK, FALSE if they pressed Cancel. */ bool popup_and_get_string(char *title, char *b, char *output) { /*@ newt ************************************************************ */ newtComponent myForm; newtComponent b_1; newtComponent b_2; newtComponent b_res; newtComponent text; newtComponent type_here; /*@ pointers ********************************************************* */ char *entry_value = NULL; /*@ buffers ********************************************************** */ char *blurb = NULL; size_t n = 0; bool ret = TRUE; assert_string_is_neither_NULL_nor_zerolength(title); assert(b != NULL); if (g_text_mode) { printf ("---promptstring---1--- %s\r\n---promptstring---2--- %s\r\n---promptstring---Q---\r\n--> ", title, b); paranoid_free(output); (void) getline(&output, &n, stdin); if (output[strlen(output) - 1] == '\n') output[strlen(output) - 1] = '\0'; return (ret); } asprintf(&blurb, b); text = newtTextboxReflowed(2, 1, blurb, 48, 5, 5, 0); type_here = newtEntry(2, newtTextboxGetNumLines(text) + 2, output, 50, &entry_value, NEWT_FLAG_RETURNEXIT ); b_1 = newtButton(6, newtTextboxGetNumLines(text) + 4, _(" OK ")); b_2 = newtButton(18, newtTextboxGetNumLines(text) + 4, _("Cancel")); newtCenteredWindow(54, newtTextboxGetNumLines(text) + 9, title); myForm = newtForm(NULL, NULL, 0); newtFormAddComponents(myForm, text, type_here, b_1, b_2, NULL); /* BERLIOS: center_string is now broken replace it ! */ //center_string(blurb, 80); newtPushHelpLine(blurb); paranoid_free(blurb); b_res = newtRunForm(myForm); newtPopHelpLine(); if (b_res == b_2) { ret = FALSE; } else { // Copy entry_value before destroying the form // clearing potentially output before paranoid_alloc(output,entry_value); } newtFormDestroy(myForm); newtPopWindow(); return(ret); }
/** * Pop up a dialog box with user-defined buttons. * @param p The text to put in the dialog box. * @param button1 The label on the first button. * @param button2 The label on the second button, or "" if you only want one button. * @return TRUE if @p button1 was pushed, FALSE otherwise. */ bool popup_with_buttons(char *p, char *button1, char *button2) { /*@ buffers *********************************************************** */ char *prompt; char *tmp = NULL; size_t n = 0; /*@ newt ************************************************************** */ newtComponent myForm; newtComponent b_1; newtComponent b_2; newtComponent b_res; newtComponent text; assert_string_is_neither_NULL_nor_zerolength(p); assert(button1 != NULL); assert(button2 != NULL); if (g_text_mode) { if (strlen(button2) == 0) { printf("%s (%s) --> ", p, button1); } else { printf("%s (%s or %s) --> ", p, button1, button2); } for (asprintf(&tmp, " "); strcmp(tmp, button1) && (strlen(button2) == 0 || strcmp(tmp, button2));) { printf("--> "); paranoid_free(tmp); (void) getline(&tmp, &n, stdin); } if (!strcmp(tmp, button1)) { paranoid_free(tmp); return (TRUE); } else { paranoid_free(tmp); return (FALSE); } } asprintf(&prompt, p); text = newtTextboxReflowed(1, 1, prompt, 40, 5, 5, 0); b_1 = newtButton(20 - ((button2[0] != '\0') ? strlen(button1) + 2 : strlen(button1) / 2), newtTextboxGetNumLines(text) + 3, button1); if (button2[0] != '\0') { b_2 = newtButton(24, newtTextboxGetNumLines(text) + 3, button2); } else { b_2 = NULL; } // newtOpenWindow (25, 5, 46, newtTextboxGetNumLines (text) + 7, "Alert"); newtCenteredWindow(46, newtTextboxGetNumLines(text) + 7, _("Alert")); myForm = newtForm(NULL, NULL, 0); newtFormAddComponents(myForm, text, b_1, b_2, NULL); /* BERLIOS: center_string is now broken replace it ! */ //center_string(prompt, 80); newtPushHelpLine(prompt); paranoid_free(prompt); b_res = newtRunForm(myForm); newtPopHelpLine(); newtFormDestroy(myForm); newtPopWindow(); if (b_res == b_1) { return (TRUE); } else { return (FALSE); } }
/* Small window to change IP and Netmask of some colour */ void changeaddress(char *colour, int *changed_flag) { newtComponent networkform; newtComponent text; newtComponent ok, cancel; struct newtExitStruct exitstruct; char keyvalue[STRING_SIZE]; char addresskey[STRING_SIZE]; char netmaskkey[STRING_SIZE]; char netaddresskey[STRING_SIZE]; newtComponent addresslabel; newtComponent netmasklabel; newtComponent addressentry; newtComponent netmaskentry; const char *addressresult; const char *netmaskresult; char message[STRING_SIZE_LARGE]; int error; int numLines; char *tmpstring; /* Build some key strings. */ sprintf(addresskey, "%s_1_ADDRESS", colour); sprintf(netmaskkey, "%s_1_NETMASK", colour); sprintf(netaddresskey, "%s_1_NETADDRESS", colour); /* workaround gcc warning, there is really 1 %s there */ tmpstring=strdup(gettext("TR_ENTER_THE_IP_ADDRESS_INFORMATION")); snprintf(message, STRING_SIZE, tmpstring, colour); free(tmpstring); text = newtTextboxReflowed(1, 1, message, 68, 0, 0, 0); numLines = newtTextboxGetNumLines(text); /* workaround gcc warning, there is really 1 %s there */ tmpstring=strdup(gettext("TR_INTERFACE")); snprintf(message, STRING_SIZE, tmpstring, colour); free(tmpstring); newtCenteredWindow(72, 10 + numLines, message); networkform = newtForm(NULL, NULL, 0); newtFormAddComponent(networkform, text); /* Address */ addresslabel = newtTextbox(2, 2 + numLines, 18, 1, 0); newtTextboxSetText(addresslabel, gettext("TR_IP_ADDRESS_PROMPT")); if (!strcmp(colour, "GREEN")) { /* green only for now */ strcpy(keyvalue, DEFAULT_IP); } else { strcpy(keyvalue, ""); } find_kv_default(eth_kv, addresskey, keyvalue); addressentry = newtEntry(20, 2 + numLines, keyvalue, 20, &addressresult, 0); newtEntrySetFilter(addressentry, filterip, NULL); newtFormAddComponent(networkform, addresslabel); newtFormAddComponent(networkform, addressentry); /* Netmask */ netmasklabel = newtTextbox(2, 3 + numLines, 18, 1, 0); newtTextboxSetText(netmasklabel, gettext("TR_NETMASK_PROMPT")); strcpy(keyvalue, DEFAULT_NETMASK); find_kv_default(eth_kv, netmaskkey, keyvalue); netmaskentry = newtEntry(20, 3 + numLines, keyvalue, 20, &netmaskresult, 0); newtEntrySetFilter(netmaskentry, filterip, NULL); newtFormAddComponent(networkform, netmasklabel); newtFormAddComponent(networkform, netmaskentry); ok = newtButton(6, 5 + numLines, gettext("TR_OK")); /* In case of installer we need a valid address, no turning back */ if (flag_is_state == setupchroot) { newtFormAddComponent(networkform, ok); } else { cancel = newtButton(26, 5 + numLines, gettext("TR_GO_BACK")); newtFormAddComponents(networkform, ok, cancel, NULL); } newtRefresh(); newtDrawForm(networkform); do { error = 0; newtFormRun(networkform, &exitstruct); if (exitstruct.u.co == ok) { strcpy(message, gettext("TR_INVALID_FIELDS")); if (VALID_IP(addressresult) == FALSE) { strcat(message, gettext("TR_IP_ADDRESS_CR")); error = 1; newtFormSetCurrent(networkform, addressentry); } if (VALID_IP(netmaskresult) == FALSE) { strcat(message, gettext("TR_NETWORK_MASK_CR")); error = 1; newtFormSetCurrent(networkform, netmaskentry); } // TODO: additional network mask validation if (error) { errorbox(message); } else { /* all is well, calc netaddress and store everything */ unsigned long int intaddress; unsigned long int intnetaddress; unsigned long int intnetmask; struct in_addr i_addr; char *netaddress; update_kv(ð_kv, addresskey, (char *) addressresult); update_kv(ð_kv, netmaskkey, (char *) netmaskresult); /* calculate netaddress */ intaddress = inet_addr(addressresult); intnetmask = inet_addr(netmaskresult); intnetaddress = intaddress & intnetmask; i_addr.s_addr = intnetaddress; netaddress = inet_ntoa(i_addr); update_kv(ð_kv, netaddresskey, (char *) netaddress); changed_config = 1; *changed_flag = 1; } } } while (error); newtFormDestroy(networkform); newtPopWindow(); }