|
Packit |
4d380f |
#include "config.h"
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
#ifdef HAVE_ALLOCA_H
|
|
Packit |
4d380f |
#include <alloca.h>
|
|
Packit |
4d380f |
#endif
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
#include <ctype.h>
|
|
Packit |
4d380f |
#include <slang.h>
|
|
Packit |
4d380f |
#include <stdlib.h>
|
|
Packit |
4d380f |
#include <string.h>
|
|
Packit |
4d380f |
#include <wchar.h>
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
#include "newt.h"
|
|
Packit |
4d380f |
#include "newt_pr.h"
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
struct entry {
|
|
Packit |
4d380f |
int flags;
|
|
Packit |
4d380f |
char * buf;
|
|
Packit |
4d380f |
const char ** resultPtr;
|
|
Packit |
4d380f |
int bufAlloced;
|
|
Packit |
4d380f |
int bufUsed; /* amount of the buffer that's been used */
|
|
Packit |
4d380f |
int cursorPosition; /* cursor *in the string* on on screen */
|
|
Packit |
4d380f |
int firstChar; /* first character position being shown */
|
|
Packit |
4d380f |
newtEntryFilter filter;
|
|
Packit |
4d380f |
void * filterData;
|
|
Packit |
4d380f |
int cs;
|
|
Packit |
4d380f |
int csDisabled;
|
|
Packit |
4d380f |
};
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
static int previous_char(const char *buf, int pos);
|
|
Packit |
4d380f |
static int next_char(const char *buf, int pos);
|
|
Packit |
4d380f |
static void entryDraw(newtComponent co);
|
|
Packit |
4d380f |
static void entryDestroy(newtComponent co);
|
|
Packit |
4d380f |
static struct eventResult entryEvent(newtComponent co,
|
|
Packit |
4d380f |
struct event ev);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
static struct eventResult entryHandleKey(newtComponent co, int key);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
static struct componentOps entryOps = {
|
|
Packit |
4d380f |
entryDraw,
|
|
Packit |
4d380f |
entryEvent,
|
|
Packit |
4d380f |
entryDestroy,
|
|
Packit |
4d380f |
newtDefaultPlaceHandler,
|
|
Packit |
4d380f |
newtDefaultMappedHandler,
|
|
Packit |
4d380f |
} ;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
void newtEntrySet(newtComponent co, const char * value, int cursorAtEnd) {
|
|
Packit |
4d380f |
struct entry * en = co->data;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if ((strlen(value) + 1) > (unsigned int)en->bufAlloced) {
|
|
Packit |
4d380f |
free(en->buf);
|
|
Packit |
4d380f |
en->bufAlloced = strlen(value) + 1;
|
|
Packit |
4d380f |
en->buf = malloc(en->bufAlloced);
|
|
Packit |
4d380f |
if (en->resultPtr) *en->resultPtr = en->buf;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
memset(en->buf, 0, en->bufAlloced); /* clear the buffer */
|
|
Packit |
4d380f |
strcpy(en->buf, value);
|
|
Packit |
4d380f |
en->bufUsed = strlen(value);
|
|
Packit |
4d380f |
en->firstChar = 0;
|
|
Packit |
4d380f |
if (cursorAtEnd)
|
|
Packit |
4d380f |
en->cursorPosition = en->bufUsed;
|
|
Packit |
4d380f |
else
|
|
Packit |
4d380f |
en->cursorPosition = 0;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
entryDraw(co);
|
|
Packit |
4d380f |
} ;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
newtComponent newtEntry(int left, int top, const char * initialValue, int width,
|
|
Packit |
4d380f |
const char ** resultPtr, int flags) {
|
|
Packit |
4d380f |
newtComponent co;
|
|
Packit |
4d380f |
struct entry * en;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
co = malloc(sizeof(*co));
|
|
Packit |
4d380f |
en = malloc(sizeof(struct entry));
|
|
Packit |
4d380f |
co->data = en;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
co->top = top;
|
|
Packit |
4d380f |
co->left = left;
|
|
Packit |
4d380f |
co->height = 1;
|
|
Packit |
4d380f |
co->width = width;
|
|
Packit |
4d380f |
co->isMapped = 0;
|
|
Packit |
4d380f |
co->callback = NULL;
|
|
Packit |
4d380f |
co->destroyCallback = NULL;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
co->ops = &entryOps;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
en->flags = flags;
|
|
Packit |
4d380f |
en->cursorPosition = 0;
|
|
Packit |
4d380f |
en->firstChar = 0;
|
|
Packit |
4d380f |
en->bufUsed = 0;
|
|
Packit |
4d380f |
en->bufAlloced = width + 1;
|
|
Packit |
4d380f |
en->filter = NULL;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (!(en->flags & NEWT_FLAG_DISABLED))
|
|
Packit |
4d380f |
co->takesFocus = 1;
|
|
Packit |
4d380f |
else
|
|
Packit |
4d380f |
co->takesFocus = 0;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (initialValue && strlen(initialValue) > (unsigned int)width) {
|
|
Packit |
4d380f |
en->bufAlloced = strlen(initialValue) + 1;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
en->buf = malloc(en->bufAlloced);
|
|
Packit |
4d380f |
en->resultPtr = resultPtr;
|
|
Packit |
4d380f |
if (en->resultPtr) *en->resultPtr = en->buf;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
memset(en->buf, 0, en->bufAlloced);
|
|
Packit |
4d380f |
if (initialValue) {
|
|
Packit |
4d380f |
strcpy(en->buf, initialValue);
|
|
Packit |
4d380f |
en->bufUsed = strlen(initialValue);
|
|
Packit |
4d380f |
en->cursorPosition = en->bufUsed;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
/* move cursor back if entry is full */
|
|
Packit |
4d380f |
if (en->cursorPosition && !(en->flags & NEWT_FLAG_SCROLL ||
|
|
Packit |
4d380f |
wstrlen(en->buf, -1) < co->width))
|
|
Packit |
4d380f |
en->cursorPosition = previous_char(en->buf, en->cursorPosition);
|
|
Packit |
4d380f |
} else {
|
|
Packit |
4d380f |
*en->buf = '\0';
|
|
Packit |
4d380f |
en->bufUsed = 0;
|
|
Packit |
4d380f |
en->cursorPosition = 0;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
en->cs = NEWT_COLORSET_ENTRY;
|
|
Packit |
4d380f |
en->csDisabled = NEWT_COLORSET_DISENTRY;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
return co;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
static void scroll(struct entry *en, int width)
|
|
Packit |
4d380f |
{
|
|
Packit |
4d380f |
int r, lv, rv, cntx, cw, cn, nc, pc, ncw, pcw;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (width <= 1) {
|
|
Packit |
4d380f |
en->firstChar = en->cursorPosition;
|
|
Packit |
4d380f |
return;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
cntx = width / 4;
|
|
Packit |
4d380f |
if (cntx > 5)
|
|
Packit |
4d380f |
cntx = 5;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (en->cursorPosition < en->firstChar)
|
|
Packit |
4d380f |
en->firstChar = en->cursorPosition;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
cn = next_char(en->buf, en->cursorPosition);
|
|
Packit |
4d380f |
cw = en->cursorPosition >= en->bufUsed ? 1 :
|
|
Packit |
4d380f |
wstrlen(en->buf + en->cursorPosition, cn - en->cursorPosition);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
r = wstrlen(en->buf + cn, -1);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
lv = wstrlen(en->buf + en->firstChar, en->cursorPosition - en->firstChar);
|
|
Packit |
4d380f |
rv = width - lv - cw;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
#define RC (ncw > 0 && (r > rv && lv - ncw >= cntx && rv < cntx))
|
|
Packit |
4d380f |
#define LC (pcw > 0 && (r + pcw <= rv || (lv < cntx && rv - pcw >= cntx)))
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
nc = next_char(en->buf, en->firstChar);
|
|
Packit |
4d380f |
ncw = wstrlen(en->buf + en->firstChar, nc - en->firstChar);
|
|
Packit |
4d380f |
if (RC) {
|
|
Packit |
4d380f |
do {
|
|
Packit |
4d380f |
lv -= ncw;
|
|
Packit |
4d380f |
rv += ncw;
|
|
Packit |
4d380f |
en->firstChar = nc;
|
|
Packit |
4d380f |
nc = next_char(en->buf, en->firstChar);
|
|
Packit |
4d380f |
ncw = wstrlen(en->buf + en->firstChar, nc - en->firstChar);
|
|
Packit |
4d380f |
} while (RC);
|
|
Packit |
4d380f |
return;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
pc = previous_char(en->buf, en->firstChar);
|
|
Packit |
4d380f |
pcw = wstrlen(en->buf + pc, en->firstChar - pc);
|
|
Packit |
4d380f |
if (LC) {
|
|
Packit |
4d380f |
do {
|
|
Packit |
4d380f |
lv += pcw;
|
|
Packit |
4d380f |
rv -= pcw;
|
|
Packit |
4d380f |
en->firstChar = pc;
|
|
Packit |
4d380f |
pc = previous_char(en->buf, en->firstChar);
|
|
Packit |
4d380f |
pcw = wstrlen(en->buf + pc, en->firstChar - pc);
|
|
Packit |
4d380f |
} while (LC);
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
static void entryDraw(newtComponent co) {
|
|
Packit |
4d380f |
struct entry * en = co->data;
|
|
Packit |
4d380f |
int i;
|
|
Packit |
4d380f |
char * chptr;
|
|
Packit |
4d380f |
int len;
|
|
Packit |
4d380f |
char *tmpptr = NULL;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (!co->isMapped) return;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (en->flags & NEWT_FLAG_DISABLED)
|
|
Packit |
4d380f |
SLsmg_set_color(en->csDisabled);
|
|
Packit |
4d380f |
else
|
|
Packit |
4d380f |
SLsmg_set_color(en->cs);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (en->flags & NEWT_FLAG_HIDDEN) {
|
|
Packit |
4d380f |
newtGotorc(co->top, co->left);
|
|
Packit |
4d380f |
for (i = 0; i < co->width; i++)
|
|
Packit |
4d380f |
SLsmg_write_char('_');
|
|
Packit |
4d380f |
newtGotorc(co->top, co->left);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
return;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
newtTrashScreen();
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
/* scroll if necessary */
|
|
Packit |
4d380f |
scroll(en, co->width);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
chptr = en->buf + en->firstChar;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (en->flags & NEWT_FLAG_PASSWORD) {
|
|
Packit |
4d380f |
len = wstrlen(chptr, -1);
|
|
Packit |
4d380f |
tmpptr = alloca(len + 1);
|
|
Packit |
4d380f |
for (i = 0; i < len; i++)
|
|
Packit |
4d380f |
memset(tmpptr, '*', len);
|
|
Packit |
4d380f |
tmpptr[len] = '\0';
|
|
Packit |
4d380f |
chptr = tmpptr;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
len = wstrlen(chptr, -1);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
/* workaround for double width characters */
|
|
Packit |
4d380f |
if (co->width > 1) {
|
|
Packit |
4d380f |
i = len < co->width ? len : co->width;
|
|
Packit |
4d380f |
i = i > 2 ? i - 2 : 0;
|
|
Packit |
4d380f |
newtGotorc(co->top, co->left + i);
|
|
Packit |
4d380f |
SLsmg_write_char('_');
|
|
Packit |
4d380f |
SLsmg_write_char('_');
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
newtGotorc(co->top, co->left);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (len <= co->width) {
|
|
Packit |
4d380f |
i = len;
|
|
Packit |
4d380f |
SLsmg_write_string(chptr);
|
|
Packit |
4d380f |
while (i < co->width) {
|
|
Packit |
4d380f |
SLsmg_write_char('_');
|
|
Packit |
4d380f |
i++;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
} else
|
|
Packit |
4d380f |
SLsmg_write_nstring(chptr, co->width);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
newtGotorc(co->top, co->left + wstrlen(en->buf+en->firstChar, en->cursorPosition - en->firstChar));
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
void newtEntrySetFlags(newtComponent co, int flags, enum newtFlagsSense sense) {
|
|
Packit |
4d380f |
struct entry * en = co->data;
|
|
Packit |
4d380f |
int row, col;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
en->flags = newtSetFlags(en->flags, flags, sense);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (!(en->flags & NEWT_FLAG_DISABLED))
|
|
Packit |
4d380f |
co->takesFocus = 1;
|
|
Packit |
4d380f |
else
|
|
Packit |
4d380f |
co->takesFocus = 0;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
newtGetrc(&row, &col);
|
|
Packit |
4d380f |
entryDraw(co);
|
|
Packit |
4d380f |
newtGotorc(row, col);
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
void newtEntrySetColors(newtComponent co, int normal, int disabled) {
|
|
Packit |
4d380f |
struct entry * en = co->data;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
en->cs = normal;
|
|
Packit |
4d380f |
en->csDisabled = disabled;
|
|
Packit |
4d380f |
entryDraw(co);
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
static void entryDestroy(newtComponent co) {
|
|
Packit |
4d380f |
struct entry * en = co->data;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
free(en->buf);
|
|
Packit |
4d380f |
free(en);
|
|
Packit |
4d380f |
free(co);
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
static struct eventResult entryEvent(newtComponent co,
|
|
Packit |
4d380f |
struct event ev) {
|
|
Packit |
4d380f |
struct entry * en = co->data;
|
|
Packit |
4d380f |
struct eventResult er;
|
|
Packit |
4d380f |
int ch;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
er.result = ER_IGNORED;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (ev.when == EV_NORMAL) {
|
|
Packit |
4d380f |
switch (ev.event) {
|
|
Packit |
4d380f |
case EV_FOCUS:
|
|
Packit |
4d380f |
newtCursorOn();
|
|
Packit |
4d380f |
if (en->flags & NEWT_FLAG_HIDDEN)
|
|
Packit |
4d380f |
newtGotorc(co->top, co->left);
|
|
Packit |
4d380f |
else
|
|
Packit |
4d380f |
newtGotorc(co->top, co->left +
|
|
Packit |
4d380f |
wstrlen(en->buf + en->firstChar, en->cursorPosition - en->firstChar));
|
|
Packit |
4d380f |
er.result = ER_SWALLOWED;
|
|
Packit |
4d380f |
break;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
case EV_UNFOCUS:
|
|
Packit |
4d380f |
newtCursorOff();
|
|
Packit |
4d380f |
newtGotorc(0, 0);
|
|
Packit |
4d380f |
er.result = ER_SWALLOWED;
|
|
Packit |
4d380f |
if (co->callback)
|
|
Packit |
4d380f |
co->callback(co, co->callbackData);
|
|
Packit |
4d380f |
break;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
case EV_KEYPRESS:
|
|
Packit |
4d380f |
ch = ev.u.key;
|
|
Packit |
4d380f |
if (en->filter)
|
|
Packit |
4d380f |
ch = en->filter(co, en->filterData, ch, en->cursorPosition);
|
|
Packit |
4d380f |
if (ch) er = entryHandleKey(co, ch);
|
|
Packit |
4d380f |
break;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
case EV_MOUSE:
|
|
Packit |
4d380f |
if ((ev.u.mouse.type == MOUSE_BUTTON_DOWN) &&
|
|
Packit |
4d380f |
(en->flags ^ NEWT_FLAG_HIDDEN)) {
|
|
Packit |
4d380f |
if (strlen(en->buf) >= ev.u.mouse.x - co->left) {
|
|
Packit |
4d380f |
en->cursorPosition = ev.u.mouse.x - co->left;
|
|
Packit |
4d380f |
newtGotorc(co->top,
|
|
Packit |
4d380f |
co->left +(en->cursorPosition - en->firstChar));
|
|
Packit |
4d380f |
} else {
|
|
Packit |
4d380f |
en->cursorPosition = strlen(en->buf);
|
|
Packit |
4d380f |
newtGotorc(co->top,
|
|
Packit |
4d380f |
co->left +(en->cursorPosition - en->firstChar));
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
break;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
return er;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
static int previous_char(const char *buf, int pos)
|
|
Packit |
4d380f |
{
|
|
Packit |
4d380f |
int len = 0;
|
|
Packit |
4d380f |
int off = 0;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
while (off < pos) {
|
|
Packit |
4d380f |
len = mblen(buf+off, MB_CUR_MAX);
|
|
Packit |
4d380f |
if (len <= 0)
|
|
Packit |
4d380f |
return pos;
|
|
Packit |
4d380f |
off+=len;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
return off-len;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
static int next_char(const char *buf, int pos)
|
|
Packit |
4d380f |
{
|
|
Packit |
4d380f |
int len = mblen(buf + pos, MB_CUR_MAX);
|
|
Packit |
4d380f |
if (len <= 0)
|
|
Packit |
4d380f |
return pos;
|
|
Packit |
4d380f |
return pos+len;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
static struct eventResult entryHandleKey(newtComponent co, int key) {
|
|
Packit |
4d380f |
struct entry * en = co->data;
|
|
Packit |
4d380f |
struct eventResult er;
|
|
Packit |
4d380f |
char * chptr;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
er.result = ER_SWALLOWED;
|
|
Packit |
4d380f |
switch (key) {
|
|
Packit |
4d380f |
case '\r': /* Return */
|
|
Packit |
4d380f |
if (en->flags & NEWT_FLAG_RETURNEXIT) {
|
|
Packit |
4d380f |
newtCursorOff();
|
|
Packit |
4d380f |
er.result = ER_EXITFORM;
|
|
Packit |
4d380f |
} else {
|
|
Packit |
4d380f |
er.result = ER_NEXTCOMP;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
break;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
case '\001': /* ^A */
|
|
Packit |
4d380f |
case NEWT_KEY_HOME:
|
|
Packit |
4d380f |
en->cursorPosition = 0;
|
|
Packit |
4d380f |
break;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
case '\005': /* ^E */
|
|
Packit |
4d380f |
case NEWT_KEY_END:
|
|
Packit |
4d380f |
en->cursorPosition = en->bufUsed;
|
|
Packit |
4d380f |
break;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
case '\013': /* ^K */
|
|
Packit |
4d380f |
en->bufUsed = en->cursorPosition;
|
|
Packit |
4d380f |
memset(en->buf + en->bufUsed, 0, en->bufAlloced - en->bufUsed);
|
|
Packit |
4d380f |
break;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
case '\025': /* ^U */
|
|
Packit |
4d380f |
en->bufUsed -= en->cursorPosition;
|
|
Packit |
4d380f |
memmove(en->buf, en->buf + en->cursorPosition, en->bufUsed);
|
|
Packit |
4d380f |
en->cursorPosition = 0;
|
|
Packit |
4d380f |
memset(en->buf + en->bufUsed, 0, en->bufAlloced - en->bufUsed);
|
|
Packit |
4d380f |
break;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
case '\002': /* ^B */
|
|
Packit |
4d380f |
case NEWT_KEY_LEFT:
|
|
Packit |
4d380f |
if (en->cursorPosition)
|
|
Packit |
4d380f |
en->cursorPosition = previous_char(en->buf, en->cursorPosition);
|
|
Packit |
4d380f |
break;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
case '\004':
|
|
Packit |
4d380f |
case NEWT_KEY_DELETE:
|
|
Packit |
4d380f |
chptr = en->buf + en->cursorPosition;
|
|
Packit |
4d380f |
if (*chptr) {
|
|
Packit |
4d380f |
int delta = next_char(en->buf, en->cursorPosition)-en->cursorPosition;
|
|
Packit |
4d380f |
if (delta) {
|
|
Packit |
4d380f |
chptr+=delta;
|
|
Packit |
4d380f |
while (*chptr) {
|
|
Packit |
4d380f |
*(chptr - delta) = *chptr;
|
|
Packit |
4d380f |
chptr++;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
memset(chptr - delta, 0, delta);
|
|
Packit |
4d380f |
en->bufUsed-=delta;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
break;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
case NEWT_KEY_BKSPC: {
|
|
Packit |
4d380f |
int prev = previous_char(en->buf, en->cursorPosition);
|
|
Packit |
4d380f |
if (en->cursorPosition != prev) {
|
|
Packit |
4d380f |
/* if this isn't true, there's nothing to erase */
|
|
Packit |
4d380f |
int delta = en->cursorPosition - prev;
|
|
Packit |
4d380f |
chptr = en->buf + en->cursorPosition;
|
|
Packit |
4d380f |
en->bufUsed-=delta;
|
|
Packit |
4d380f |
en->cursorPosition-=delta;
|
|
Packit |
4d380f |
while (*chptr) {
|
|
Packit |
4d380f |
*(chptr - delta) = *chptr;
|
|
Packit |
4d380f |
chptr++;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
memset(chptr - delta, 0, delta);
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
break;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
case '\006': /* ^B */
|
|
Packit |
4d380f |
case NEWT_KEY_RIGHT:
|
|
Packit |
4d380f |
if (en->cursorPosition < en->bufUsed)
|
|
Packit |
4d380f |
en->cursorPosition = next_char(en->buf, en->cursorPosition);
|
|
Packit |
4d380f |
break;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
default:
|
|
Packit |
4d380f |
if ((key >= 0x20 && key <= 0x7e) || (key >= 0x80 && key <= 0xff)) {
|
|
Packit |
4d380f |
char s[MB_CUR_MAX];
|
|
Packit |
4d380f |
mbstate_t ps;
|
|
Packit |
4d380f |
int i, l;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
for (i = 1, s[0] = key; ; i++) {
|
|
Packit |
4d380f |
memset(&ps, 0, sizeof (ps));
|
|
Packit |
4d380f |
l = mbrtowc(NULL, s, i, &ps);
|
|
Packit |
4d380f |
if (l == -1) /* invalid sequence */
|
|
Packit |
4d380f |
i = 0;
|
|
Packit |
4d380f |
if (l != -2) /* not incomplete sequence */
|
|
Packit |
4d380f |
break;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
/* read next byte */
|
|
Packit |
4d380f |
if (i == MB_CUR_MAX || !SLang_input_pending(1)) {
|
|
Packit |
4d380f |
i = 0;
|
|
Packit |
4d380f |
break;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
s[i] = SLang_getkey();
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (!i || (!(en->flags & NEWT_FLAG_SCROLL) && wstrlen(en->buf, -1) + wstrlen(s, i) > co->width)) {
|
|
Packit |
4d380f |
/* FIXME this is broken */
|
|
Packit |
4d380f |
SLtt_beep();
|
|
Packit |
4d380f |
break;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if ((en->bufUsed + i) >= en->bufAlloced) {
|
|
Packit |
4d380f |
en->bufAlloced += 20;
|
|
Packit |
4d380f |
en->buf = realloc(en->buf, en->bufAlloced);
|
|
Packit |
4d380f |
if (en->resultPtr) *en->resultPtr = en->buf;
|
|
Packit |
4d380f |
memset(en->buf + en->bufAlloced - 20, 0, 20);
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (en->cursorPosition != en->bufUsed) {
|
|
Packit |
4d380f |
/* insert the new character */
|
|
Packit |
4d380f |
memmove(en->buf + en->cursorPosition + i, en->buf + en->cursorPosition, en->bufUsed - en->cursorPosition);
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
en->bufUsed += i;
|
|
Packit |
4d380f |
for (l = 0; l < i; l++)
|
|
Packit |
4d380f |
en->buf[en->cursorPosition++] = s[l];
|
|
Packit |
4d380f |
} else {
|
|
Packit |
4d380f |
er.result = ER_IGNORED;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
if (en->cursorPosition == en->bufUsed && en->cursorPosition &&
|
|
Packit |
4d380f |
!(en->flags & NEWT_FLAG_SCROLL || wstrlen(en->buf, -1) < co->width))
|
|
Packit |
4d380f |
en->cursorPosition = previous_char(en->buf, en->cursorPosition);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
entryDraw(co);
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
return er;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
char * newtEntryGetValue(newtComponent co) {
|
|
Packit |
4d380f |
struct entry * en = co->data;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
return en->buf;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
void newtEntrySetFilter(newtComponent co, newtEntryFilter filter, void * data) {
|
|
Packit |
4d380f |
struct entry * en = co->data;
|
|
Packit |
4d380f |
en->filter = filter;
|
|
Packit |
4d380f |
en->filterData = data;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
int newtEntryGetCursorPosition (newtComponent co) {
|
|
Packit |
4d380f |
struct entry * en = co->data;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
return en->cursorPosition;
|
|
Packit |
4d380f |
}
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
void newtEntrySetCursorPosition (newtComponent co, int position) {
|
|
Packit |
4d380f |
struct entry * en = co->data;
|
|
Packit |
4d380f |
|
|
Packit |
4d380f |
en->cursorPosition = position;
|
|
Packit |
4d380f |
}
|