diff options
| author | C. McEnroe | 2020-02-07 01:55:26 -0500 | 
|---|---|---|
| committer | C. McEnroe | 2020-02-07 01:56:23 -0500 | 
| commit | af244ad3cd19fb50bf9b9855f02d81e61441ab50 (patch) | |
| tree | 4ecd69f0d6fc8f041823e4d5846467ce0b7c1709 | |
| parent | 5470254fa5fd0f6108b1f075d9ac2dd24afa7fdc (diff) | |
Add some real line editing operations
| -rw-r--r-- | chat.h | 5 | ||||
| -rw-r--r-- | edit.c | 28 | ||||
| -rw-r--r-- | ui.c | 12 | 
3 files changed, 41 insertions, 4 deletions
@@ -133,7 +133,12 @@ void uiFormat(  ) __attribute__((format(printf, 4, 5)));  enum Edit { +	EditHome, +	EditEnd, +	EditLeft, +	EditRight,  	EditKill, +	EditErase,  	EditInsert,  	EditEnter,  }; @@ -45,13 +45,33 @@ char *editTail(void) {  	return mbs;  } +static void reserve(size_t index, size_t count) { +	if (len + count > Cap) return; +	memmove(&buf[index + count], &buf[index], sizeof(*buf) * (len - index)); +	len += count; +} + +static void delete(size_t index, size_t count) { +	if (index + count > len) return; +	memmove( +		&buf[index], &buf[index + count], sizeof(*buf) * (len - index - count) +	); +	len -= count; +} +  void edit(size_t id, enum Edit op, wchar_t ch) {  	switch (op) { -		break; case EditKill: len = pos = 0; +		break; case EditHome:  pos = 0; +		break; case EditEnd:   pos = len; +		break; case EditLeft:  if (pos) pos--; +		break; case EditRight: if (pos < len) pos++; + +		break; case EditKill:  len = pos = 0; +		break; case EditErase: if (pos) delete(--pos, 1); +  		break; case EditInsert: { -			if (len == Cap) break; -			buf[pos++] = ch; -			len++; +			reserve(pos, 1); +			if (pos < Cap) buf[pos++] = ch;  		}  		break; case EditEnter: {  			pos = 0; @@ -546,12 +546,20 @@ void uiShowNum(size_t num) {  }  static void keyCode(int code) { +	size_t id = windows.active->id;  	switch (code) {  		break; case KEY_RESIZE:  resize();  		break; case KeyFocusIn:  unmark();  		break; case KeyFocusOut: windows.active->mark = true;  		break; case KeyPasteOn:; // TODO  		break; case KeyPasteOff:; // TODO + +		break; case KEY_BACKSPACE: edit(id, EditErase, 0); +		break; case KEY_END: edit(id, EditEnd, 0); +		break; case KEY_ENTER: edit(id, EditEnter, 0); +		break; case KEY_HOME: edit(id, EditHome, 0); +		break; case KEY_LEFT: edit(id, EditLeft, 0); +		break; case KEY_RIGHT: edit(id, EditRight, 0);  	}  } @@ -567,6 +575,10 @@ static void keyMeta(wchar_t ch) {  static void keyCtrl(wchar_t ch) {  	size_t id = windows.active->id;  	switch (ch) { +		break; case L'?': edit(id, EditErase, 0); +		break; case L'A': edit(id, EditHome, 0); +		break; case L'E': edit(id, EditEnd, 0); +		break; case L'H': edit(id, EditErase, 0);  		break; case L'J': edit(id, EditEnter, 0);  		break; case L'L': clearok(curscr, true);  		break; case L'U': edit(id, EditKill, 0);  | 
