home · contact · privacy
Read in initial window sizes from files below config/.
[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/Win_";
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     int16_t height = atoi(line);
38     exit_err(NULL == fgets(line, linemax, file), world, err);
39     int16_t width = atoi(line);
40     free(line);
41     err = "Trouble in init_win_from_file() with fclose().";
42     exit_err(fclose(file), world, err);
43
44     struct WinMeta * wmeta = world->wins.meta;
45     return init_win(wmeta, w_name, height, width, world, f);
46 }
47
48
49
50 extern void sorted_wintoggle(struct World * world)
51 {
52     char * err = "Trouble in sorted_wintoggle() with fopen() on file "
53                  "'config/toggle_win_order'.";
54     FILE * file = fopen("config/toggle_win_order", "r");
55     exit_err(NULL == file, world, err);
56     uint16_t linemax;
57     textfile_sizes(file, &linemax, NULL);
58     char win_order[linemax];
59     err = "Trouble in sorted_wintoggle() with fgets() on file "
60           "'config/toggle_win_order'.";
61     exit_err(NULL == fgets(win_order, linemax, file), world, err);
62     err = "Trouble in sorted_wintoggle() with fclose() on file "
63           "'toggle_win_order'.";
64     exit_err(fclose(file), world, err);
65
66     char c;
67     uint8_t i = 0;
68     for (; i < linemax; i++)
69     {
70         c = win_order[i];
71         if      ('k' == c)
72         {
73             toggle_window(world->wins.meta, world->wins.keys);
74         }
75         else if ('m' == c)
76         {
77             toggle_window(world->wins.meta, world->wins.map);
78         }
79         else if ('i' == c)
80         {
81             toggle_window(world->wins.meta, world->wins.info);
82         }
83         else if ('l' == c)
84         {
85             toggle_window(world->wins.meta, world->wins.log);
86         }
87     }
88 }
89
90
91
92
93 extern uint8_t toggle_window(struct WinMeta * win_meta, struct Win * win)
94 {
95     if (0 != win->frame.curses_win)
96     {
97         return suspend_win(win_meta, win);
98     }
99     else
100     {
101         return append_win(win_meta, win);
102     }
103 }
104
105
106
107 extern void scroll_pad(struct WinMeta * win_meta, char dir)
108 {
109     if      ('+' == dir)
110     {
111         reset_pad_offset(win_meta, win_meta->pad_offset + 1);
112     }
113     else if ('-' == dir)
114     {
115         reset_pad_offset(win_meta, win_meta->pad_offset - 1);
116     }
117 }
118
119
120
121 extern uint8_t growshrink_active_window(struct WinMeta * win_meta, char change)
122 {
123     if (0 != win_meta->active)
124     {
125         struct yx_uint16 size = win_meta->active->frame.size;
126         if      (change == '-')
127         {
128             size.y--;
129         }
130         else if (change == '+')
131         {
132             size.y++;
133         }
134         else if (change == '_')
135         {
136             size.x--;
137         }
138         else if (change == '*')
139         {
140             size.x++;
141         }
142         return resize_active_win (win_meta, size);
143     }
144     return 0;
145 }
146