about summary refs log tree commit diff homepage
path: root/client.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--client.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/client.c b/client.c
index c52d3bf..dbe49d6 100644
--- a/client.c
+++ b/client.c
@@ -197,9 +197,11 @@ static struct {
 		MODE_NORMAL,
 		MODE_INSERT,
 		MODE_REPLACE,
+		MODE_DRAW,
 	} mode;
 	uint8_t color;
 	uint8_t shift;
+	uint8_t draw;
 } input = {
 	.color = COLOR_WHITE,
 };
@@ -245,7 +247,7 @@ static void inputSwap(int8_t dx, int8_t dy) {
 }
 
 static uint8_t inputCell(wchar_t ch) {
-	if (ch < 0x7F) return (uint8_t)ch + input.shift;
+	if (ch < 0x80) return (uint8_t)ch + input.shift;
 	for (size_t i = 0; i < ARRAY_LEN(CP437); ++i) {
 		if (ch == CP437[i]) return i;
 	}
@@ -328,6 +330,7 @@ static void inputNormal(wchar_t ch) {
 		break; case 'i': insertMode(1, 0);
 		break; case 'a': clientMove(1, 0); insertMode(1, 0);
 		break; case 'r': input.mode = MODE_REPLACE;
+		break; case 'R': input.mode = MODE_DRAW; input.draw = 0;
 	}
 }
 
@@ -358,11 +361,27 @@ static void inputInsert(wchar_t ch) {
 }
 
 static void inputReplace(wchar_t ch) {
-	uint8_t cell = inputCell(ch);
-	if (ch != ESC && cell) clientPut(tile.colors[cellY][cellX], cell);
+	if (ch != ESC) {
+		uint8_t cell = inputCell(ch);
+		if (!cell) return;
+		clientPut(tile.colors[cellY][cellX], cell);
+	}
 	input.mode = MODE_NORMAL;
 }
 
+static void inputDraw(wchar_t ch) {
+	if (ch == ESC) {
+		input.mode = MODE_NORMAL;
+		return;
+	}
+	if (input.draw) {
+		inputNormal(ch);
+	} else {
+		input.draw = inputCell(ch);
+	}
+	clientPut(input.color, input.draw);
+}
+
 static void readInput(void) {
 	wint_t ch;
 	if (KEY_CODE_YES == get_wch(&ch)) {
@@ -373,6 +392,7 @@ static void readInput(void) {
 		break; case MODE_NORMAL:  inputNormal(ch);
 		break; case MODE_INSERT:  inputInsert(ch);
 		break; case MODE_REPLACE: inputReplace(ch);
+		break; case MODE_DRAW:    inputDraw(ch);
 	}
 }