richwin.c (2185B)
1 #include <stdlib.h> // for malloc() and free() 2 #include <string.h> // for memcpy() 3 #include <assert.h> 4 5 #include <curses.h> 6 #include "fun_menu.h" 7 #include "richwin.h" 8 9 /* richwin_new */ 10 struct RichWin * 11 richwin_new(int lines, int cols, int begy, int begx, 12 struct WinBorders *winborders) 13 { 14 assert(lines >= 0); 15 assert(cols >= 0); 16 assert(begy >= 0); 17 assert(begx >= 0); 18 // create a temporary struct for initializing const members of 'richwin' 19 struct RichWin richwin_init = { 20 .lines = lines, .cols = cols, 21 .begy = begy, .begx = begx, 22 }; 23 24 // ask curses for a window 25 richwin_init.win = newwin(lines, cols, begy, begx); 26 if (richwin_init.win == NULL) { 27 richwin_error_code = ERROR_WINDOW_CREATION; 28 return NULL; 29 } 30 // allocate window borders struct if user asked for it 31 if (winborders != NULL) { 32 richwin_init.winborders = malloc(sizeof *richwin_init.winborders); 33 if (richwin_init.winborders == NULL) { 34 richwin_error_code = ERROR_MEMORY_ALLOCATION; 35 return NULL; 36 } 37 *richwin_init.winborders = *winborders; 38 } 39 40 // allocate rich window struct 41 struct RichWin *richwin = malloc(sizeof *richwin); 42 if (richwin == NULL) { 43 richwin_error_code = ERROR_MEMORY_ALLOCATION; 44 return NULL; 45 } 46 // initialize 'richwin' from 'richwin_init' 47 memcpy(richwin, &richwin_init, sizeof *richwin); 48 return richwin; 49 } 50 51 /* richwin_new_centered */ 52 struct RichWin * 53 richwin_new_centered(int lines, int cols, struct WinBorders *winborders) 54 { 55 assert(lines <= LINES); 56 assert(cols <= COLS); 57 // no need for asserting because this is a convenience wrapper 58 return richwin_new(lines, cols, (LINES-lines)/2, (COLS-cols)/2, 59 winborders); 60 } 61 62 /* richwin_border */ 63 int 64 richwin_border(struct RichWin *richwin) 65 { 66 assert(richwin != NULL); 67 assert(richwin->winborders != NULL); 68 struct WinBorders *winborders = richwin->winborders; 69 return wborder(richwin->win, 70 winborders->ls, winborders->rs, winborders->ts, winborders->bs, 71 winborders->tl, winborders->tr, winborders->bl, winborders->br); 72 } 73 74 /* richwin_del */ 75 int 76 richwin_del(struct RichWin *richwin) 77 { 78 assert(richwin != NULL); 79 if (delwin(richwin->win) == ERR) { 80 return ERR; 81 } 82 free(richwin->winborders); 83 free(richwin); 84 return OK; 85 }