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); +} |