fun-menu

ncurses learning thing
git clone https://git.pastanoggin.com/fun-menu.git
Log | Files | Refs | README | LICENSE

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 }