diff options
| author | Joursoir <chat@joursoir.net> | 2021-10-24 20:43:39 +0000 | 
|---|---|---|
| committer | Joursoir <chat@joursoir.net> | 2021-10-24 20:43:39 +0000 | 
| commit | 249b0f92ba53a2fe0d1d17c90c99d934769ca4e5 (patch) | |
| tree | 0a0d6e104d1e95aec70a77e5be526e54a0729b51 /lib/tbi/win.c | |
| parent | f6603e4d0f0f689cbeafd09ab07dc34c6e889efd (diff) | |
| download | ufm-249b0f92ba53a2fe0d1d17c90c99d934769ca4e5.tar.gz ufm-249b0f92ba53a2fe0d1d17c90c99d934769ca4e5.tar.bz2 ufm-249b0f92ba53a2fe0d1d17c90c99d934769ca4e5.zip  | |
implement a window entity
Diffstat (limited to 'lib/tbi/win.c')
| -rw-r--r-- | lib/tbi/win.c | 90 | 
1 files changed, 90 insertions, 0 deletions
diff --git a/lib/tbi/win.c b/lib/tbi/win.c new file mode 100644 index 0000000..69ba895 --- /dev/null +++ b/lib/tbi/win.c @@ -0,0 +1,90 @@ +#include <Uefi.h> +#include <Library/UefiLib.h> +#include <Library/DebugLib.h> +#include <Library/ShellLib.h> +#include <Library/MemoryAllocationLib.h> + +#include "screen.h" +#include "win.h" + +struct window *newwin(struct screen *s,  +	INT32 ncols, INT32 nlines, INT32 begin_x, INT32 begin_y) +{ +	INTN x, y; +	struct window *win; + +	ASSERT(s != NULL); + +	if(ncols <= 0 || nlines <= 0 || begin_x < 0 || begin_y < 0) +		return NULL; + +	if((begin_x + ncols) > s->columns || (begin_y + nlines) > s->lines) +		return NULL; + +	win = AllocateZeroPool(sizeof(struct window)); +	if(!win) +		return NULL; + +	win->text = AllocatePool(nlines * sizeof(CHAR16 *)); +	if(!win->text) { +		delwin(win); +		return NULL; +	} + +	win->attr = AllocatePool(nlines * sizeof(INT32 *)); +	if(!win->attr) { +		delwin(win); +		return NULL; +	} + +	win->scr = s; +	win->curx = 0; +	win->cury = 0; +	win->begx = begin_x; +	win->begy = begin_y; +	win->width = ncols; +	win->height = nlines; +	win->cur_attr = s->attr; + +	for(y = 0; y < nlines; y++) { +		win->text[y] = AllocatePool((ncols + 1) * sizeof(CHAR16)); +		win->attr[y] = AllocatePool((ncols + 1) * sizeof(INT32)); +		if(!win->text[y] || !win->attr[y]) { +			delwin(win); +			return NULL; +		} + +		for(x = 0; x < ncols; x++) { +			win->text[y][x] = L' '; +			win->attr[y][x] = win->cur_attr; +		} +		win->text[y][x] = CHAR_NULL; +		win->attr[y][x] = win->cur_attr; +	} + +	return win; +} + +VOID delwin(struct window *w) +{ +	INTN i; +	ASSERT(w != NULL); + +	if(w->text) { +		for(i = 0; i < w->height; i++) { +			if(w->text[i]) +				FreePool(w->text[i]); +		} +		FreePool(w->text); +	} + +	if(w->attr) { +		for(i = 0; i < w->height; i++) { +			if(w->attr[i]) +				FreePool(w->attr[i]); +		} +		FreePool(w->attr); +	} + +	FreePool(w); +}  | 
