|
Packit |
4d380f |
#include <errno.h>
|
|
Packit |
4d380f |
#include <stdarg.h>
|
|
Packit |
4d380f |
#include <stdio.h>
|
|
Packit |
4d380f |
#include <stdlib.h>
|
|
Packit |
4d380f |
#include <string.h>
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
#include "errno.h"
|
|
Packit |
4d380f |
#include "newt.h"
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
static void * newtvwindow(char * title, char * button1, char * button2,
|
|
Packit |
4d380f |
char * button3, char * message, va_list args) {
|
|
Packit |
4d380f |
newtComponent b1, b2 = NULL, b3 = NULL, t, f, answer;
|
|
Packit |
4d380f |
char * buf = NULL;
|
|
Packit |
4d380f |
int size = 0;
|
|
Packit |
4d380f |
int i = 0;
|
|
Packit |
4d380f |
int scroll = 0;
|
|
Packit |
4d380f |
int width, height;
|
|
Packit |
4d380f |
char * flowedText;
|
|
Packit |
4d380f |
newtGrid grid, buttonGrid;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
do {
|
|
Packit |
4d380f |
va_list argscopy;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
va_copy(argscopy, args);
|
|
Packit |
4d380f |
size += 1000;
|
|
Packit |
4d380f |
if (buf) free(buf);
|
|
Packit |
4d380f |
buf = malloc(size);
|
|
Packit |
4d380f |
i = vsnprintf(buf, size, message, argscopy);
|
|
Packit |
4d380f |
va_end(argscopy);
|
|
Packit |
4d380f |
} while (i >= size || i == -1);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
flowedText = newtReflowText(buf, 35, 5, 5, &width, &height);
|
|
Packit |
4d380f |
if (height > 6) {
|
|
Packit |
4d380f |
free(flowedText);
|
|
Packit |
4d380f |
flowedText = newtReflowText(buf, 60, 5, 5, &width, &height);
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
free(buf);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (height > 12) {
|
|
Packit |
4d380f |
height = 12;
|
|
Packit |
4d380f |
scroll = NEWT_FLAG_SCROLL;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
t = newtTextbox(-1, -1, width, height, NEWT_TEXTBOX_WRAP | scroll);
|
|
Packit |
4d380f |
newtTextboxSetText(t, flowedText);
|
|
Packit |
4d380f |
free(flowedText);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (button3) {
|
|
Packit |
4d380f |
buttonGrid = newtButtonBar(button1, &b1, button2, &b2,
|
|
Packit |
4d380f |
button3, &b3, NULL);
|
|
Packit |
4d380f |
} else if (button2) {
|
|
Packit |
4d380f |
buttonGrid = newtButtonBar(button1, &b1, button2, &b2, NULL);
|
|
Packit |
4d380f |
} else {
|
|
Packit |
4d380f |
buttonGrid = newtButtonBar(button1, &b1, NULL);
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
newtGridSetField(buttonGrid, 0, 0, NEWT_GRID_COMPONENT, b1,
|
|
Packit |
4d380f |
0, 0, button2 ? 1 : 0, 0, 0, 0);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
grid = newtCreateGrid(1, 2);
|
|
Packit |
4d380f |
newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, t, 0, 0, 0, 0, 0, 0);
|
|
Packit |
4d380f |
newtGridSetField(grid, 0, 1, NEWT_GRID_SUBGRID, buttonGrid,
|
|
Packit |
4d380f |
0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX);
|
|
Packit |
4d380f |
newtGridWrappedWindow(grid, title);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
f = newtForm(NULL, NULL, 0);
|
|
Packit |
4d380f |
newtFormAddComponents(f, t, b1, NULL);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (button2)
|
|
Packit |
4d380f |
newtFormAddComponent(f, b2);
|
|
Packit |
4d380f |
if (button3)
|
|
Packit |
4d380f |
newtFormAddComponent(f, b3);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
answer = newtRunForm(f);
|
|
Packit |
4d380f |
newtGridFree(grid, 1);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
newtFormDestroy(f);
|
|
Packit |
4d380f |
newtPopWindow();
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (answer == f)
|
|
Packit |
4d380f |
return NULL;
|
|
Packit |
4d380f |
else if (answer == b1)
|
|
Packit |
4d380f |
return button1;
|
|
Packit |
4d380f |
else if (answer == b2)
|
|
Packit |
4d380f |
return button2;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
return button3;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
int newtWinChoice(char * title, char * button1, char * button2,
|
|
Packit |
4d380f |
char * message, ...) {
|
|
Packit |
4d380f |
va_list args;
|
|
Packit |
4d380f |
void * rc;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
va_start(args, message);
|
|
Packit |
4d380f |
rc = newtvwindow(title, button1, button2, NULL, message, args);
|
|
Packit |
4d380f |
va_end(args);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (rc == button1)
|
|
Packit |
4d380f |
return 1;
|
|
Packit |
4d380f |
else if (rc == button2)
|
|
Packit |
4d380f |
return 2;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
return 0;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
void newtWinMessage(char * title, char * buttonText, char * text, ...) {
|
|
Packit |
4d380f |
va_list args;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
va_start(args, text);
|
|
Packit |
4d380f |
newtvwindow(title, buttonText, NULL, NULL, text, args);
|
|
Packit |
4d380f |
va_end(args);
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
void newtWinMessagev(char * title, char * buttonText, char * text,
|
|
Packit |
4d380f |
va_list argv) {
|
|
Packit |
4d380f |
newtvwindow(title, buttonText, NULL, NULL, text, argv);
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
int newtWinTernary(char * title, char * button1, char * button2,
|
|
Packit |
4d380f |
char * button3, char * message, ...) {
|
|
Packit |
4d380f |
va_list args;
|
|
Packit |
4d380f |
void * rc;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
va_start(args, message);
|
|
Packit |
4d380f |
rc = newtvwindow(title, button1, button2, button3, message, args);
|
|
Packit |
4d380f |
va_end(args);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (rc == button1)
|
|
Packit |
4d380f |
return 1;
|
|
Packit |
4d380f |
else if (rc == button2)
|
|
Packit |
4d380f |
return 2;
|
|
Packit |
4d380f |
else if (rc == button3)
|
|
Packit |
4d380f |
return 3;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
return 0;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
int newtWinMenu(char * title, char * text, int suggestedWidth, int flexDown,
|
|
Packit |
4d380f |
int flexUp, int maxListHeight, char ** items, int * listItem,
|
|
Packit |
4d380f |
char * button1, ...) {
|
|
Packit |
4d380f |
newtComponent textbox, listbox, result, form;
|
|
Packit |
4d380f |
va_list args;
|
|
Packit |
4d380f |
newtComponent *buttons = NULL;
|
|
Packit |
4d380f |
newtGrid grid, buttonBar;
|
|
Packit |
4d380f |
size_t totalButtons = 0, numButtons = 0;
|
|
Packit |
4d380f |
int i, rc;
|
|
Packit |
4d380f |
int needScroll;
|
|
Packit |
4d380f |
char * buttonName;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
textbox = newtTextboxReflowed(-1, -1, text, suggestedWidth, flexDown,
|
|
Packit |
4d380f |
flexUp, 0);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
for (i = 0; items[i]; i++) ;
|
|
Packit |
4d380f |
if (i < maxListHeight) maxListHeight = i;
|
|
Packit |
4d380f |
needScroll = i > maxListHeight;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
listbox = newtListbox(-1, -1, maxListHeight,
|
|
Packit |
4d380f |
(needScroll ? NEWT_FLAG_SCROLL : 0) | NEWT_FLAG_RETURNEXIT);
|
|
Packit |
4d380f |
for (i = 0; items[i]; i++) {
|
|
Packit |
4d380f |
newtListboxAddEntry(listbox, items[i], (void *)(long) i);
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
newtListboxSetCurrent(listbox, *listItem);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
va_start(args, button1);
|
|
Packit |
4d380f |
for (buttonName = button1; buttonName; buttonName = va_arg(args, char *))
|
|
Packit |
4d380f |
++totalButtons;
|
|
Packit |
4d380f |
va_end(args);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
buttons = (newtComponent *)alloca(sizeof(newtComponent)*(totalButtons));
|
|
Packit |
4d380f |
va_start(args, button1);
|
|
Packit |
4d380f |
for (buttonName = button1; buttonName; buttonName = va_arg(args, char *))
|
|
Packit |
4d380f |
buttons[numButtons++] = newtButton(-1, -1, buttonName);
|
|
Packit |
4d380f |
va_end(args);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
buttonBar = newtCreateGrid(numButtons ? numButtons : 1, 1);
|
|
Packit |
4d380f |
for (i = 0; i < numButtons; i++) {
|
|
Packit |
4d380f |
newtGridSetField(buttonBar, i, 0, NEWT_GRID_COMPONENT,
|
|
Packit |
4d380f |
buttons[i],
|
|
Packit |
4d380f |
i ? 1 : 0, 0, 0, 0, 0, 0);
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
grid = newtGridSimpleWindow(textbox, listbox, buttonBar);
|
|
Packit |
4d380f |
newtGridWrappedWindow(grid, title);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
form = newtForm(NULL, 0, 0);
|
|
Packit |
4d380f |
newtGridAddComponentsToForm(grid, form, 1);
|
|
Packit |
4d380f |
newtGridFree(grid, 1);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
result = newtRunForm(form);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
*listItem = ((long) newtListboxGetCurrent(listbox));
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
for (rc = 0; rc < numButtons && result != buttons[rc]; rc++)
|
|
Packit |
4d380f |
;
|
|
Packit |
4d380f |
if (rc == numButtons)
|
|
Packit |
4d380f |
rc = 0; /* F12 or return-on-exit (which are the same for us) */
|
|
Packit |
4d380f |
else
|
|
Packit |
4d380f |
rc++;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
newtFormDestroy(form);
|
|
Packit |
4d380f |
newtPopWindow();
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
return rc;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
int newtWinEntries(char * title, char * text, int suggestedWidth, int flexDown,
|
|
Packit |
4d380f |
int flexUp, int dataWidth,
|
|
Packit |
4d380f |
struct newtWinEntry * items, char * button1, ...) {
|
|
Packit |
4d380f |
newtComponent *buttons, result, form, textw;
|
|
Packit |
4d380f |
newtGrid grid, buttonBar, subgrid;
|
|
Packit |
4d380f |
int numItems;
|
|
Packit |
4d380f |
int rc, i;
|
|
Packit |
4d380f |
size_t numButtons = 0, totalButtons = 0;
|
|
Packit |
4d380f |
char * buttonName;
|
|
Packit |
4d380f |
va_list args;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
textw = newtTextboxReflowed(-1, -1, text, suggestedWidth, flexDown,
|
|
Packit |
4d380f |
flexUp, 0);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
for (numItems = 0; items[numItems].text; numItems++);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
buttonName = button1;
|
|
Packit |
4d380f |
va_start(args, button1);
|
|
Packit |
4d380f |
for (buttonName = button1; buttonName; buttonName = va_arg(args, char *))
|
|
Packit |
4d380f |
++totalButtons;
|
|
Packit |
4d380f |
va_end(args);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
buttons = (newtComponent *)alloca(sizeof(newtComponent)*(totalButtons));
|
|
Packit |
4d380f |
va_start(args, button1);
|
|
Packit |
4d380f |
for (buttonName = button1; buttonName; buttonName = va_arg(args, char *))
|
|
Packit |
4d380f |
buttons[numButtons++] = newtButton(-1, -1, buttonName);
|
|
Packit |
4d380f |
va_end(args);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
buttonBar = newtCreateGrid(numButtons ? numButtons : 1, 1);
|
|
Packit |
4d380f |
for (i = 0; i < numButtons; i++) {
|
|
Packit |
4d380f |
newtGridSetField(buttonBar, i, 0, NEWT_GRID_COMPONENT,
|
|
Packit |
4d380f |
buttons[i],
|
|
Packit |
4d380f |
i ? 1 : 0, 0, 0, 0, 0, 0);
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
subgrid = newtCreateGrid(2, numItems ? numItems : 1);
|
|
Packit |
4d380f |
for (i = 0; i < numItems; i++) {
|
|
Packit |
4d380f |
newtGridSetField(subgrid, 0, i, NEWT_GRID_COMPONENT,
|
|
Packit |
4d380f |
newtLabel(-1, -1, items[i].text),
|
|
Packit |
4d380f |
0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0);
|
|
Packit |
4d380f |
newtGridSetField(subgrid, 1, i, NEWT_GRID_COMPONENT,
|
|
Packit |
4d380f |
newtEntry(-1, -1, items[i].value ?
|
|
Packit |
4d380f |
*items[i].value : NULL, dataWidth,
|
|
Packit |
4d380f |
(const char **)items[i].value, items[i].flags),
|
|
Packit |
4d380f |
1, 0, 0, 0, 0, 0);
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
grid = newtCreateGrid(1, 3);
|
|
Packit |
4d380f |
form = newtForm(NULL, 0, 0);
|
|
Packit |
4d380f |
newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, textw,
|
|
Packit |
4d380f |
0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0);
|
|
Packit |
4d380f |
newtGridSetField(grid, 0, 1, NEWT_GRID_SUBGRID, subgrid,
|
|
Packit |
4d380f |
0, 1, 0, 0, 0, 0);
|
|
Packit |
4d380f |
newtGridSetField(grid, 0, 2, NEWT_GRID_SUBGRID, buttonBar,
|
|
Packit |
4d380f |
0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX);
|
|
Packit |
4d380f |
newtGridAddComponentsToForm(grid, form, 1);
|
|
Packit |
4d380f |
newtGridWrappedWindow(grid, title);
|
|
Packit |
4d380f |
newtGridFree(grid, 1);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
result = newtRunForm(form);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
for (rc = 0; rc < numItems; rc++)
|
|
Packit |
4d380f |
*items[rc].value = strdup(*items[rc].value);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
for (rc = 0; rc < numButtons && result != buttons[rc]; rc++)
|
|
Packit |
4d380f |
;
|
|
Packit |
4d380f |
if (rc == numButtons)
|
|
Packit |
4d380f |
rc = 0; /* F12 */
|
|
Packit |
4d380f |
else
|
|
Packit |
4d380f |
rc++;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
newtFormDestroy(form);
|
|
Packit |
4d380f |
newtPopWindow();
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
return rc;
|
|
Packit |
4d380f |
}
|