home · contact · privacy
f20f37a09366e40c505888cf87341288e37f7409
[plomrogue] / src / wincontrol.c
1 /* wincontrol.c */
2
3 #include "wincontrol.h"
4 #include <stdlib.h> /* for malloc(), free() */
5 #include <string.h> /* for strlen() */
6 #include <stdint.h> /* for uint8_t, uint16_t */
7 #include "windows.h" /* for suspend_win(), append_win(), reset_pad_offset(),
8                       * resize_active_win(), init_win(), free_win(),
9                       * structs Win, WinMeta
10                       */
11 #include "yx_uint16.h" /* for yx_uint16 struct */
12 #include "main.h" /* for Wins struct */
13 #include "misc.h" /* for textfile_sizes() */
14 #include "rexit.h" /* for exit_err() */
15 #include "main.h" /* for World, Wins structs */
16 #include "draw_wins.h" /* for draw_keys_win(), draw_info_win(), draw_log_win(),
17                         * draw_map_win
18                         */
19
20
21
22 /* Initialize Winconf of "id" from appropriate config file.*/
23 static void init_winconf_from_file(struct World * world, char id);
24
25 /* Wrapper around init_win() called with values from appropriate Winconf. */
26 static void init_win_from_winconf(struct World * world, char id);
27
28
29
30 static void init_winconf_from_file(struct World * world, char id)
31 {
32     char * err_m = "Trouble in init_win_from_file() with malloc().";
33     char * prefix = "config/windows/Win_";
34     uint8_t size = strlen(prefix) + 2;
35     char * path = malloc(size);
36     exit_err(NULL == path, world, err_m);
37     sprintf(path, "%s_", prefix);
38     path[size - 2] = id;
39     char * err = "Trouble in init_win_from_file() with fopen().";
40     FILE * file = fopen(path, "r");
41     exit_err(NULL == file, world, err);
42     free(path);
43
44     struct WinConf * winconf = get_winconf_by_id(world, id);
45     uint16_t linemax;
46     err = "Trouble in init_win_from_file() with textfile_sizes().";
47     exit_err(textfile_sizes(file, &linemax, NULL), world, err);
48     char * line = malloc(linemax);
49     exit_err(NULL == line, world, err_m);
50     err = "Trouble in init_win_from_file() with fgets().";
51
52     exit_err(NULL == fgets(line, linemax, file), world, err);
53     winconf->title = malloc(strlen(line));
54     exit_err(NULL == winconf->title, world, err_m);
55     memcpy(winconf->title, line, strlen(line) - 1); /* Eliminate newline char */
56     winconf->title[strlen(line) - 1] = '\0';        /* char at end of string. */
57     exit_err(NULL == fgets(line, linemax, file), world, err);
58     winconf->height = atoi(line);
59     exit_err(NULL == fgets(line, linemax, file), world, err);
60     winconf->width = atoi(line);
61
62     free(line);
63     err = "Trouble in init_win_from_file() with fclose().";
64     exit_err(fclose(file), world, err);
65 }
66
67
68
69 static void init_win_from_winconf(struct World * world, char id)
70 {
71     struct WinConf * winconf = get_winconf_by_id(world, id);
72     char * err = "Trouble in init_win_from_file() with init_win().";
73     exit_err(init_win(world->wmeta, &winconf->win, winconf->title,
74                       winconf->height, winconf->width, world, winconf->draw),
75              world, err);
76 }
77
78
79
80 extern void create_winconfs(struct World * world)
81 {
82     char * err = "Trouble with malloc() in init_winconfs().";
83     struct WinConf * winconfs = malloc(4 * sizeof(struct WinConf));
84     exit_err(NULL == winconfs, world, err);
85     winconfs[0].id = 'i';
86     winconfs[0].draw = draw_info_win;
87     winconfs[1].id = 'k';
88     winconfs[1].draw = draw_keys_win;
89     winconfs[2].id = 'l';
90     winconfs[2].draw = draw_log_win;
91     winconfs[3].id = 'm';
92     winconfs[3].draw = draw_map_win;
93     world->winconfs = winconfs;
94 }
95
96
97
98 extern void init_winconfs(struct World * world)
99 {
100     init_winconf_from_file(world, 'i');
101     init_winconf_from_file(world, 'k');
102     init_winconf_from_file(world, 'l');
103     init_winconf_from_file(world, 'm');
104 }
105
106
107
108 extern void free_winconf(struct World * world, char id)
109 {
110     struct WinConf * wc = get_winconf_by_id(world, id);
111     free(wc->title);
112 }
113
114
115
116 extern void free_winconfs(struct World * world)
117 {
118     free_winconf(world, 'i');
119     free_winconf(world, 'k');
120     free_winconf(world, 'l');
121     free_winconf(world, 'm');
122     free(world->winconfs);
123 }
124
125
126
127 extern void init_wins(struct World * world)
128 {
129     init_win_from_winconf(world, 'i');
130     init_win_from_winconf(world, 'k');
131     init_win_from_winconf(world, 'l');
132     init_win_from_winconf(world, 'm');
133 }
134
135
136
137 extern void free_wins(struct World * world)
138 {
139     free_win(get_win_by_id(world, 'i'));
140     free_win(get_win_by_id(world, 'k'));
141     free_win(get_win_by_id(world, 'l'));
142     free_win(get_win_by_id(world, 'm'));
143 }
144
145
146
147 extern void reload_win_config(struct World * world)
148 {
149     while (0 != world->wmeta->active)
150     {
151         suspend_win(world->wmeta, world->wmeta->active);
152     }
153     free_wins(world);
154     free_winconfs(world);
155     create_winconfs(world);
156     init_winconfs(world);
157     init_wins(world);
158     sorted_wintoggle(world);
159 }
160
161
162
163 extern struct WinConf * get_winconf_by_id(struct World * world, char id)
164 {
165     uint8_t i = 0;
166     while (1)
167     {
168         if (id == world->winconfs[i].id)
169         {
170             return &world->winconfs[i];
171         }
172         i++;
173     }
174 }
175
176
177
178 extern struct Win * get_win_by_id(struct World * world, char id)
179 {
180     struct WinConf * wc = get_winconf_by_id(world, id);
181     return wc->win;
182 }
183
184
185
186 extern void sorted_wintoggle(struct World * world)
187 {
188     char * err = "Trouble in sorted_wintoggle() with fopen().";
189     FILE * file = fopen("config/windows/toggle_order", "r");
190     exit_err(NULL == file, world, err);
191     uint16_t linemax;
192     err = "Trouble in sorted_wintoggle() with textfile_sizes().";
193     exit_err(textfile_sizes(file, &linemax, NULL), world, err);
194     char win_order[linemax];
195     err = "Trouble in sorted_wintoggle() with fgets().";
196     exit_err(NULL == fgets(win_order, linemax, file), world, err);
197     err = "Trouble in sorted_wintoggle() with fclose().";
198     exit_err(fclose(file), world, err);
199     uint8_t i = 0;
200     for (; i < linemax - 2; i++)
201     {
202         toggle_window(world->wmeta, get_win_by_id(world, win_order[i]));
203     }
204 }
205
206
207
208
209 extern uint8_t toggle_window(struct WinMeta * win_meta, struct Win * win)
210 {
211     if (0 != win->frame.curses_win)
212     {
213         return suspend_win(win_meta, win);
214     }
215     else
216     {
217         return append_win(win_meta, win);
218     }
219 }
220
221
222
223 extern void scroll_pad(struct WinMeta * win_meta, char dir)
224 {
225     if      ('+' == dir)
226     {
227         reset_pad_offset(win_meta, win_meta->pad_offset + 1);
228     }
229     else if ('-' == dir)
230     {
231         reset_pad_offset(win_meta, win_meta->pad_offset - 1);
232     }
233 }
234
235
236
237 extern uint8_t growshrink_active_window(struct WinMeta * win_meta, char change)
238 {
239     if (0 != win_meta->active)
240     {
241         struct yx_uint16 size = win_meta->active->frame.size;
242         if      (change == '-')
243         {
244             size.y--;
245         }
246         else if (change == '+')
247         {
248             size.y++;
249         }
250         else if (change == '_')
251         {
252             size.x--;
253         }
254         else if (change == '*')
255         {
256             size.x++;
257         }
258         return resize_active_win (win_meta, size);
259     }
260     return 0;
261 }