diff options
| author | C. McEnroe | 2020-02-09 01:28:24 -0500 | 
|---|---|---|
| committer | C. McEnroe | 2020-02-09 01:28:24 -0500 | 
| commit | 2d62ea9e30e7249e7f3e5bc3e60f5c8e97b3e2cc (patch) | |
| tree | 98e9370d66dfd03bbc2139d345fb35b757593c99 | |
| parent | a212a7ae2c93092068c8a9c483c4575cc65e7491 (diff) | |
Simplify edit buffer conversion and input rendering
| -rw-r--r-- | chat.h | 3 | ||||
| -rw-r--r-- | edit.c | 25 | ||||
| -rw-r--r-- | ui.c | 76 | 
3 files changed, 55 insertions, 49 deletions
| @@ -156,8 +156,7 @@ enum Edit {  	EditEnter,  };  void edit(size_t id, enum Edit op, wchar_t ch); -char *editHead(void); -char *editTail(void); +char *editBuffer(size_t *pos);  const char *complete(size_t id, const char *prefix);  void completeAccept(void); @@ -27,21 +27,22 @@ static wchar_t buf[Cap];  static size_t len;  static size_t pos; -char *editHead(void) { +char *editBuffer(size_t *mbsPos) {  	static char mbs[MB_LEN_MAX * Cap]; +  	const wchar_t *ptr = buf; -	size_t n = wcsnrtombs(mbs, &ptr, pos, sizeof(mbs) - 1, NULL); -	assert(n != (size_t)-1); -	mbs[n] = '\0'; -	return mbs; -} +	size_t mbsLen = wcsnrtombs(mbs, &ptr, pos, sizeof(mbs) - 1, NULL); +	assert(mbsLen != (size_t)-1); +	if (mbsPos) *mbsPos = mbsLen; -char *editTail(void) { -	static char mbs[MB_LEN_MAX * Cap]; -	const wchar_t *ptr = &buf[pos]; -	size_t n = wcsnrtombs(mbs, &ptr, len - pos, sizeof(mbs) - 1, NULL); +	ptr = &buf[pos]; +	size_t n = wcsnrtombs( +		&mbs[mbsLen], &ptr, len - pos, sizeof(mbs) - mbsLen - 1, NULL +	);  	assert(n != (size_t)-1); -	mbs[n] = '\0'; +	mbsLen += n; + +	mbs[mbsLen] = '\0';  	return mbs;  } @@ -78,7 +79,7 @@ void edit(size_t id, enum Edit op, wchar_t ch) {  		}  		break; case EditEnter: {  			pos = 0; -			command(id, editTail()); +			command(id, editBuffer(NULL));  			len = 0;  		}  	} @@ -507,48 +507,54 @@ static void inputAdd(struct Style *style, const char *str) {  static void inputUpdate(void) {  	size_t id = windows.active->id; -	const char *nick = self.nick; -	const char *head = editHead(); +	size_t pos; +	char *buf = editBuffer(&pos); +  	const char *skip = NULL; -	const char *pre = ""; -	const char *suf = " "; -	struct Style style = { .fg = self.color, .bg = Default }; -	struct Style reset = Reset; -	if (NULL != (skip = commandIsPrivmsg(id, head))) { -		pre = "<"; -		suf = "> "; -	} else if (NULL != (skip = commandIsNotice(id, head))) { -		pre = "-"; -		suf = "- "; -		reset.fg = LightGray; -	} else if (NULL != (skip = commandIsAction(id, head))) { -		style.attr |= A_ITALIC; -		pre = "* "; -		reset.attr |= A_ITALIC; +	struct Style init = { .fg = self.color, .bg = Default }; +	struct Style rest = Reset; +	const char *prefix = ""; +	const char *prompt = (self.nick ? self.nick : ""); +	const char *suffix = ""; +	if (NULL != (skip = commandIsPrivmsg(id, buf))) { +		prefix = "<"; suffix = "> "; +	} else if (NULL != (skip = commandIsNotice(id, buf))) { +		prefix = "-"; suffix = "- "; +		rest.fg = LightGray; +	} else if (NULL != (skip = commandIsAction(id, buf))) { +		init.attr |= A_ITALIC; +		prefix = "* "; suffix = " "; +		rest.attr |= A_ITALIC;  	} else if (id == Debug) { -		skip = head; -		style.fg = Gray; -		pre = "<<"; -		nick = NULL; +		skip = buf; +		init.fg = Gray; +		prompt = "<< "; +	} else { +		prompt = ""; +	} +	if (skip && skip > &buf[pos]) { +		skip = NULL; +		prefix = prompt = suffix = "";  	}  	int y, x;  	wmove(input, 0, 0); -	if (skip) { -		wattr_set( -			input, -			style.attr | colorAttr(mapColor(style.fg)), -			colorPair(mapColor(style.fg), mapColor(style.bg)), -			NULL -		); -		waddstr(input, pre); -		if (nick) waddstr(input, nick); -		waddstr(input, suf); -	} -	style = reset; -	inputAdd(&style, (skip ? skip : head)); +	wattr_set( +		input, +		init.attr | colorAttr(mapColor(init.fg)), +		colorPair(mapColor(init.fg), mapColor(init.bg)), +		NULL +	); +	waddstr(input, prefix); +	waddstr(input, prompt); +	waddstr(input, suffix); +	struct Style style = rest; +	char p = buf[pos]; +	buf[pos] = '\0'; +	inputAdd(&style, (skip ? skip : buf));  	getyx(input, y, x); -	inputAdd(&style, editTail()); +	buf[pos] = p; +	inputAdd(&style, &buf[pos]);  	wclrtoeol(input);  	wmove(input, y, x);  } | 
