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