char * line = malloc(linemax);
err = "Trouble in init_win_from_file() with fgets().";
exit_err(NULL == fgets(line, linemax, file), world, err);
+ char * title = malloc(strlen(line));
+ memcpy(title, line, strlen(line) - 1);
+ exit_err(NULL == fgets(line, linemax, file), world, err);
int16_t height = atoi(line);
exit_err(NULL == fgets(line, linemax, file), world, err);
int16_t width = atoi(line);
exit_err(fclose(file), world, err);
struct WinMeta * wmeta = world->wins.meta;
- return init_win(wmeta, w_name, height, width, world, f);
+ struct Win w;
+ init_win(wmeta, &w, title, height, width, world, f);
+ free(title);
+ return w;
}
-/* Wrapper around init_win() that reads the desired window size from a file
- * at the path prefixing the provided win name "w_name" with "config/windows/".
- * "f" is the window drawing function (Win._draw()).
+/* Wrapper around init_win() that reads the desired window size and title from a
+ * file at the path prefixing the provided win name "w_name" with
+ * "config/windows/". "f"() is the window drawing function (Win._draw()).
*/
extern struct Win init_win_from_file(struct World * world, char * w_name,
void (* f) (struct Win *));
-extern struct Win init_win(struct WinMeta * wmeta, char * title,
- int16_t height, int16_t width,
- void * data, void * func)
+extern uint8_t init_win(struct WinMeta * wmeta, struct Win * w, char * title,
+ int16_t height, int16_t width,
+ void * data, void * func)
{
- struct Win w;
- w._prev = 0;
- w._next = 0;
- w.frame.curses_win = 0;
- w._title = title;
- w.data = data;
- w._draw = func;
+ w->_prev = 0;
+ w->_next = 0;
+ w->frame.curses_win = 0;
+ w->_title = malloc(strlen(title) + 1);
+ if (NULL == w->_title)
+ {
+ return 1;
+ }
+ sprintf(w->_title, title, strlen(title));
+ w->data = data;
+ w->_draw = func;
if (0 < width)
{
- w.frame.size.x = width;
+ w->frame.size.x = width;
}
else if (0 > width)
{
- w.frame.size.x = wmeta->padframe.size.x + width;
+ w->frame.size.x = wmeta->padframe.size.x + width;
}
else
{
- w.frame.size.x = wmeta->padframe.size.x;
+ w->frame.size.x = wmeta->padframe.size.x;
}
if (0 < height && height <= wmeta->padframe.size.y - 1)
{
- w.frame.size.y = height;
+ w->frame.size.y = height;
}
else if (0 > height && wmeta->padframe.size.y + (height - 1) > 0)
{
- w.frame.size.y = wmeta->padframe.size.y + (height - 1);
+ w->frame.size.y = wmeta->padframe.size.y + (height - 1);
}
else
{
- w.frame.size.y = wmeta->padframe.size.y - 1;
+ w->frame.size.y = wmeta->padframe.size.y - 1;
}
- return w;
+ return 0;
}
*
* Functions that return uint8_t return these error codes:
* 0 - success
- * 1 - memory allocation error (of ncurses' pads/windows, or scroll hint texts)
+ * 1 - memory allocation error
* 2 - would force virtual screen to grow beyond width or height of 2^16 cells
*
* TODO: Expose less internals to the API.
-/* Create a window as child of "wmeta" titled "title" of "height" and "width"
- * and appointing "func"() to interpret and draw the content stored at "data"
- * if the window is visible.
+/* Initialize a window child of "wmeta" to "title", "height" and "width" and
+ * appointing "func"() to interpret and draw the content stored at "data" when
+ * the window is visible.
*
* Pass 0 for "width" to make the window as wide as the terminal screen. Pass
* negative values for "width" to make the size so many cells smaller than the
* allowed height is also applied for positive values that exceed it or negative
* values that would reduce the window height < 1 cell.
*
- * Other members of the Win struct are initialized to 0. The window will stay
- * invisible until appended to the chain of visible windows via append_win().
+ * Other members of the Win struct are initialized to 0.
*/
-extern struct Win init_win(struct WinMeta * wmeta, char * title,
- int16_t height, int16_t width,
- void * data, void * func);
+extern uint8_t init_win(struct WinMeta * wmeta, struct Win * w, char * title,
+ int16_t height, int16_t width,
+ void * data, void * func);