home · contact · privacy
Cleaned up memory allocation by Win initialization.
[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(), structs Win, WinMeta
9                       */
10 #include "yx_uint16.h" /* for yx_uint16 struct */
11 #include "main.h" /* for Wins struct */
12 #include "misc.h" /* for textfile_sizes() */
13 #include "rexit.h" /* for exit_err() */
14 #include "main.h" /* for World, Wins structs */
15
16
17
18 extern void free_win(struct Win * win)
19 {
20     free(win->_title);
21     free(win);
22 }
23
24
25
26 extern struct Win * init_win_from_file(struct World * world, char * w_name,
27                                        void (* f) (struct Win *))
28 {
29     char * err = "Trouble in init_win_from_file() with malloc().";
30     char * prefix = "config/windows/";
31     uint8_t size = strlen(prefix) + strlen(w_name) + 1;
32     char * path = malloc(size);
33     exit_err(NULL == path, world, err);
34     sprintf(path, "%s%s", prefix, w_name);
35
36     err = "Trouble in init_win_from_file() with fopen().";
37     FILE * file = fopen(path, "r");
38     free(path);
39     exit_err(NULL == file, world, err);
40     uint16_t linemax;
41     textfile_sizes(file, &linemax, NULL);
42     char * line = malloc(linemax);
43     err = "Trouble in init_win_from_file() with fgets().";
44     exit_err(NULL == fgets(line, linemax, file), world, err);
45     char * title = malloc(strlen(line));
46     memcpy(title, line, strlen(line) - 1);
47     exit_err(NULL == fgets(line, linemax, file), world, err);
48     int16_t height = atoi(line);
49     exit_err(NULL == fgets(line, linemax, file), world, err);
50     int16_t width = atoi(line);
51     free(line);
52     err = "Trouble in init_win_from_file() with fclose().";
53     exit_err(fclose(file), world, err);
54
55     struct WinMeta * wmeta = world->wins.meta;
56     struct Win * w = malloc(sizeof(struct Win));
57     init_win(wmeta, w, title, height, width, world, f);
58     free(title);
59     return w;
60 }
61
62
63
64 extern void sorted_wintoggle(struct World * world)
65 {
66     char * err = "Trouble in sorted_wintoggle() with fopen() on file "
67                  "'config/toggle_win_order'.";
68     FILE * file = fopen("config/windows/toggle_order", "r");
69     exit_err(NULL == file, world, err);
70     uint16_t linemax;
71     textfile_sizes(file, &linemax, NULL);
72     char win_order[linemax];
73     err = "Trouble in sorted_wintoggle() with fgets() on file "
74           "'config/toggle_win_order'.";
75     exit_err(NULL == fgets(win_order, linemax, file), world, err);
76     err = "Trouble in sorted_wintoggle() with fclose() on file "
77           "'toggle_win_order'.";
78     exit_err(fclose(file), world, err);
79
80     char c;
81     uint8_t i = 0;
82     for (; i < linemax; i++)
83     {
84         c = win_order[i];
85         if      ('k' == c)
86         {
87             toggle_window(world->wins.meta, world->wins.keys);
88         }
89         else if ('m' == c)
90         {
91             toggle_window(world->wins.meta, world->wins.map);
92         }
93         else if ('i' == c)
94         {
95             toggle_window(world->wins.meta, world->wins.info);
96         }
97         else if ('l' == c)
98         {
99             toggle_window(world->wins.meta, world->wins.log);
100         }
101     }
102 }
103
104
105
106
107 extern uint8_t toggle_window(struct WinMeta * win_meta, struct Win * win)
108 {
109     if (0 != win->frame.curses_win)
110     {
111         return suspend_win(win_meta, win);
112     }
113     else
114     {
115         return append_win(win_meta, win);
116     }
117 }
118
119
120
121 extern void scroll_pad(struct WinMeta * win_meta, char dir)
122 {
123     if      ('+' == dir)
124     {
125         reset_pad_offset(win_meta, win_meta->pad_offset + 1);
126     }
127     else if ('-' == dir)
128     {
129         reset_pad_offset(win_meta, win_meta->pad_offset - 1);
130     }
131 }
132
133
134
135 extern uint8_t growshrink_active_window(struct WinMeta * win_meta, char change)
136 {
137     if (0 != win_meta->active)
138     {
139         struct yx_uint16 size = win_meta->active->frame.size;
140         if      (change == '-')
141         {
142             size.y--;
143         }
144         else if (change == '+')
145         {
146             size.y++;
147         }
148         else if (change == '_')
149         {
150             size.x--;
151         }
152         else if (change == '*')
153         {
154             size.x++;
155         }
156         return resize_active_win (win_meta, size);
157     }
158     return 0;
159 }
160