From 0fbd4f2423d3f09764d0f0b31131683dc7522092 Mon Sep 17 00:00:00 2001
From: Joursoir <chat@joursoir.net>
Date: Fri, 10 Dec 2021 21:14:43 +0300
Subject: tbi/win: make waddch(), mvwaddch()

---
 Library/UefiShellUfmCommandLib/tbi/win.c | 31 +++++++++++++++++++++++++++++++
 Library/UefiShellUfmCommandLib/tbi/win.h | 26 ++++++++++++++++++++++++++
 2 files changed, 57 insertions(+)

(limited to 'Library')

diff --git a/Library/UefiShellUfmCommandLib/tbi/win.c b/Library/UefiShellUfmCommandLib/tbi/win.c
index bada79e..13183b2 100644
--- a/Library/UefiShellUfmCommandLib/tbi/win.c
+++ b/Library/UefiShellUfmCommandLib/tbi/win.c
@@ -216,6 +216,37 @@ BOOLEAN whline(struct window *w, INT32 x, INT32 y, CHAR16 ch, INT32 attr, UINTN
 	return TRUE;
 }
 
+VOID waddch(struct window *w, CHAR16 ch, INT32 attr)
+{
+	INT32 x = w->curx
+	INT32 y = w->cury;
+
+	if(x >= w->width) {
+		w->curx = 0;
+		if(++w->cury >= w->height)
+			w->cury = 0;
+	}
+	else
+		w->curx += 1;
+
+	if(ch != 0)
+		w->text[y][x] = ch;
+	if(attr != -1)
+		w->attr[y][x] = attr;
+}
+
+BOOLEAN mvwaddch(struct window *w, INT32 x, INT32 y, CHAR16 ch, INT32 attr)
+{
+	BOOLEAN moved;
+
+	moved = wmove(w, x, y);
+	if(moved == FALSE)
+		return FALSE;
+
+	waddch(w, ch, attr);
+	return TRUE;
+}
+
 UINTN EFIAPI wprintf(struct window *w, CONST CHAR16 *fmt, ...)
 {
 	VA_LIST arg;
diff --git a/Library/UefiShellUfmCommandLib/tbi/win.h b/Library/UefiShellUfmCommandLib/tbi/win.h
index a5aacce..3efa3c1 100644
--- a/Library/UefiShellUfmCommandLib/tbi/win.h
+++ b/Library/UefiShellUfmCommandLib/tbi/win.h
@@ -157,6 +157,32 @@ BOOLEAN wvline(struct window *w, INT32 x, INT32 y, CHAR16 ch, INT32 attr, UINTN
 */
 BOOLEAN whline(struct window *w, INT32 x, INT32 y, CHAR16 ch, INT32 attr, UINTN n);
 
+/*
+ * Puts the character and attributes on the cursor coordinates of the
+ * given window. Doesn't support control characters
+ *
+ * w: the window on which to operate
+ * ch: the character used to print. If 0, then a char won't changed
+ * attr: the attributes used to print. If -1, then attrs won't changed
+ *
+ * return: FALSE upon failure and TRUE upon successful completion
+*/
+VOID waddch(struct window *w, CHAR16 ch, INT32 attr);
+
+/*
+ * Moves to specified coordinates, puts the character and attributes into the
+ * given window. Doesn't support control characters
+ *
+ * w: the window on which to operate
+ * x: the X(column) coordinate to move
+ * y: the Y(row) coordinate to move
+ * ch: the character used to print. If 0, then a char won't changed
+ * attr: the attributes used to print. If -1, then attrs won't changed
+ *
+ * return: FALSE upon failure and TRUE upon successful completion
+*/
+BOOLEAN mvwaddch(struct window *w, INT32 x, INT32 y, CHAR16 ch, INT32 attr);
+
 /*
  * Prints formatted output on the cursor coordinates
  *
-- 
cgit v1.2.3-18-g5258