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