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