+ char * f_name = "init_win_meta()";
+ char * err_s = "init_win_meta() creates virtual screen beyond legal size.";
+ char * err_m = "init_win_meta() triggers memory alloc error via newpad().";
+ world.wmeta = try_malloc(sizeof(struct WinMeta), f_name);
+ world.wmeta->screen = screen;
+ uint32_t maxy_test = getmaxy(screen);
+ uint32_t maxx_test = getmaxx(screen);
+ uint8_t test = (maxy_test > UINT16_MAX || maxx_test > UINT16_MAX);
+ exit_err(test, err_s);
+ world.wmeta->padsize.y = maxy_test;
+ world.wmeta->padsize.x = maxx_test;
+ world.wmeta->chain_start = 0;
+ world.wmeta->chain_end = 0;
+ world.wmeta->pad_offset = 0;
+ world.wmeta->pad = newpad(world.wmeta->padsize.y, 1);
+ exit_err(NULL == world.wmeta->pad, err_m);
+ world.wmeta->active = 0;
+}
+
+
+
+extern void init_win(struct Win ** wp, char * title, int16_t height,
+ int16_t width, void * func)
+{
+ char * f_name = "init_win()";
+ struct Win * w = try_malloc(sizeof(struct Win), f_name);
+ w->prev = 0;
+ w->next = 0;
+ w->winmapsize.y = 0;
+ w->winmapsize.x = 0;
+ w->winmap = NULL;
+ w->title = try_malloc(strlen(title) + 1, f_name);
+ sprintf(w->title, "%s", title);
+ w->draw = func;
+ w->center.y = 0;
+ w->center.x = 0;
+ if (0 < width)
+ {
+ w->framesize.x = width;
+ }
+ else if (0 >= width)
+ {
+ w->framesize.x = world.wmeta->padsize.x + width;
+ }
+ if (0 < height && height <= world.wmeta->padsize.y - 1)
+ {
+ w->framesize.y = height;
+ }
+ else if (0 >= height && world.wmeta->padsize.y + (height - 1) > 0)
+ {
+ w->framesize.y = world.wmeta->padsize.y + (height - 1);
+ }
+ *wp = w;
+}
+
+
+
+extern void free_winmeta()
+{
+ delwin(world.wmeta->pad);
+ free(world.wmeta);
+}
+
+
+
+extern void free_win(struct Win * win)
+{
+ free(win->title);
+ free(win);
+}
+
+
+
+extern void append_win(struct Win * w)
+{
+ if (0 != world.wmeta->chain_start)
+ {
+ w->prev = world.wmeta->chain_end;
+ world.wmeta->chain_end->next = w;
+ }
+ else
+ {
+ world.wmeta->active = w;
+ world.wmeta->chain_start = w;
+ }
+ world.wmeta->chain_end = w;
+ update_wins(w);
+}