Blame entry.c

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
}