1 /* vim:tw=78:ts=8:sw=4:set ft=c: */
3 Copyright (C) 2002-2018 Ben Kibbey <bjk@luxsci.net>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31 * Creates a new window on the 'wins' stack. Returns the newly create window
32 * structure. The 'func' parameter is a function pointer that is called from
33 * game_loop(). 'efunc' is called just before the window is destroyed.
36 window_create (const char *title
, int h
, int w
, int y
, int x
,
37 window_func func
, void *data
, window_exit_func efunc
,
38 window_resize_func rfunc
)
43 for (i
= 0; wins
[i
]; i
++);
45 wins
= Realloc (wins
, (i
+ 2) * sizeof (WIN
*));
46 wins
[i
] = Calloc (1, sizeof (WIN
));
47 wins
[i
]->w
= newwin (h
, w
, y
, x
);
48 wins
[i
]->p
= new_panel (wins
[i
]->w
);
53 wins
[i
]->efunc
= efunc
;
54 wins
[i
]->rfunc
= rfunc
;
55 wins
[i
]->title
= (title
) ? strdup (title
) : NULL
;
61 window_destroy (WIN
* win
)
69 for (i
= 0; wins
[i
]; i
++);
71 while (i
> 0 && wins
[--i
]->keep
)
73 if (win
&& win
== wins
[i
])
76 free (wins
[i
]->title
);
78 del_panel (wins
[i
]->p
);
82 if (wins
[i
]->freedata
&& wins
[i
]->data
)
89 for (i
= n
= 0; wins
[i
]; i
++)
91 if (win
&& !win
->keep
&& win
== wins
[i
])
103 if (win
&& win
->keep
&& win
== wins
[i
])
109 new = Realloc (new, (n
+ 2) * sizeof (WIN
*));
124 window_draw_title (WINDOW
* win
, const char *title
, int width
, chtype attr
,
135 for (i
= 1; i
< width
- 1; i
++)
136 mvwaddch (win
, 1, i
, ' ');
138 if (mblen (title
, strlen (title
)) > width
)
140 p
= str_etc (title
, width
- 2, 1);
143 p
= str_to_wchar (title
);
145 mvwaddwstr (win
, 1, CENTERX (width
, p
), p
);
146 wattroff (win
, attr
);
150 wattron (win
, battr
);
151 box (win
, ACS_VLINE
, ACS_HLINE
);
152 wattroff (win
, battr
);
156 window_draw_prompt (WINDOW
* win
, int y
, int width
, const char *str
,
163 for (i
= 1; i
< width
- 1; i
++)
164 mvwaddch (win
, y
, i
, ' ');
166 wchar_t *promptw
= str_to_wchar (str
);
167 mvwprintw (win
, y
, CENTERX (width
, promptw
), "%ls", promptw
);
169 wattroff (win
, attr
);
180 for (i
= 0; wins
[i
]; i
++)
184 if (!w
->keep
&& w
->rfunc
)