home · contact · privacy
56c41fd4b132a34e37cf9c880065ec5af0bb035d
[plomrogue] / src / client / control.c
1 /* src/client/control.c */
2
3 #include "control.h"
4 #include <stdint.h> /* uint8_t, uint16_t */
5 #include <stdio.h> /* sprintf() */
6 #include <string.h> /* strlen() */
7 #include "command_db.h" /* get_command_data() */
8 #include "io.h" /* try_send() */
9 #include "keybindings.h" /* struct KeyBindingDB, get_command_to_keycode(),
10                           * get_keycode_to_command(), mod_selected_keyb(),
11                           * move_keyb_mod_selection()
12                           */
13 #include "map_window.h" /* for map_scroll(), map_center() */
14 #include "misc.h" /* reload_interface_conf(), save_interface_conf(),
15                    * nav_inventory()
16                    */
17 #include "wincontrol.h" /* struct WinConf, toggle_window(), toggle_winconfig(),
18                          * scroll_pad(), get_winconf_by_win(),
19                          * growshrink_active_window(), toggle_win_size_type()
20                          */
21 #include "windows.h" /* for cycle_active_win(), shift_active_win() */
22 #include "world.h" /* for global world */
23
24
25
26 /* If "keycode" matches "match" in get_available_keycode_to_command(), execute
27  * "f" with provided char arguments and return 1; else only return 0.
28  */
29 static uint8_t try_cmd_0args(int keycode, char * match, void (* f) ());
30 static uint8_t try_cmd_1args(int keycode, char * match,
31                              void (* f) (char), char c);
32 static uint8_t try_cmd_2args(int keycode, char * match,
33                              void (* f) (char, char), char c1, char c2);
34
35 /* Return keycode to "command" if it is available in current window config. */
36 static uint16_t get_available_keycode_to_command(char * command);
37
38 /* Return pointer to global keybindings or to keybindings for wingeometry config
39  * (c = "g") or winkeys config (c = "k") or active window's keybindings ("w").
40  */
41 static struct KeyBindingDB * select_keybindingdb_pointer(char c);
42
43 /* Wrappers to make some functions compatible to try_cmd_* single char args. */
44 static void wrap_mod_selected_keyb(char c);
45 static void wrap_mv_kb_mod(char c1, char c2);
46
47
48
49 static uint8_t try_cmd_0args(int keycode, char * match, void (* f) ())
50 {
51     if (keycode == get_available_keycode_to_command(match))
52     {
53         f();
54         return 1;
55     }
56     return 0;
57 }
58
59
60
61 static uint8_t try_cmd_1args(int keycode, char * match,
62                              void (* f) (char), char c)
63 {
64     if (keycode == get_available_keycode_to_command(match))
65     {
66         f(c);
67         return 1;
68     }
69     return 0;
70 }
71
72
73
74 static uint8_t try_cmd_2args(int keycode, char * match,
75                              void (* f) (char, char), char c1, char c2)
76 {
77     if (keycode == get_available_keycode_to_command(match))
78     {
79         f(c1, c2);
80         return 1;
81     }
82     return 0;
83 }
84
85
86
87 static uint16_t get_available_keycode_to_command(char * command)
88 {
89     uint16_t keycode = get_keycode_to_command(world.kb_global.kbs, command);
90     if (0 != keycode || 0 == world.wmeta.active)
91     {
92         return keycode;
93     }
94     struct WinConf * wc = get_winconf_by_win(world.wmeta.active);
95     if      (0 == wc->view)
96     {
97         keycode = get_keycode_to_command(wc->kb.kbs, command);
98     }
99     else if (1 == wc->view)
100     {
101         keycode = get_keycode_to_command(world.kb_wingeom.kbs, command);
102     }
103     else if (2 == wc->view)
104     {
105         keycode = get_keycode_to_command(world.kb_winkeys.kbs, command);
106     }
107     return keycode;
108 }
109
110
111
112 static struct KeyBindingDB * select_keybindingdb_pointer(char c)
113 {
114     struct KeyBindingDB * kbd;
115     kbd = &world.kb_global;
116     if      ('g' == c)
117     {
118         kbd = &world.kb_wingeom;
119     }
120     else if ('k' == c)
121     {
122         kbd = &world.kb_winkeys;
123     }
124     else if ('w' == c)
125     {
126         struct WinConf * wc = get_winconf_by_win(world.wmeta.active);
127         kbd = &wc->kb;
128     }
129     return kbd;
130 }
131
132
133
134 static void wrap_mod_selected_keyb(char c)
135 {
136         mod_selected_keyb(select_keybindingdb_pointer(c));
137 }
138
139
140
141 static void wrap_mv_kb_mod(char c1, char c2)
142 {
143         move_keyb_mod_selection(select_keybindingdb_pointer(c1), c2);
144 }
145
146
147
148 extern uint8_t player_control(int key)
149 {
150     char * cmd = get_command_to_keycode(world.kb_global.kbs, key);
151     if (NULL == cmd && 0 != world.wmeta.active)
152     {
153         struct WinConf * wc = get_winconf_by_win(world.wmeta.active);
154         cmd = get_command_to_keycode(wc->kb.kbs, key);
155     }
156     if (NULL != cmd)
157     {
158         struct Command * command_data = get_command_data(cmd);
159         uint8_t arg = (uint8_t) command_data->arg;
160         if ('i' == arg)
161         {
162             arg = world.player_inventory_select;
163         }
164         uint8_t command_size = strlen(command_data->server_msg);
165         uint8_t arg_size = 3;
166         char msg[command_size + 1 + arg_size + 1];
167         sprintf(msg, "%s %d", command_data->server_msg, arg);
168         try_send(msg);
169         return 1;
170     }
171     return 0;
172 }
173
174
175
176 extern uint8_t wingeom_control(int key)
177 {
178     if (   try_cmd_1args(key, "to_height_t", toggle_win_size_type, 'y')
179         || try_cmd_1args(key, "to_width_t", toggle_win_size_type, 'x')
180         || try_cmd_1args(key, "grow_h", growshrink_active_window, '*')
181         || try_cmd_1args(key, "shri_h", growshrink_active_window, '_')
182         || try_cmd_1args(key, "grow_v", growshrink_active_window, '+')
183         || try_cmd_1args(key, "shri_v", growshrink_active_window, '-')
184         || try_cmd_1args(key, "shift_f", shift_active_win, 'f')
185         || try_cmd_1args(key, "shift_b", shift_active_win, 'b'))
186     {
187         return 1;
188     }
189     return 0;
190 }
191
192
193
194 extern uint8_t winkeyb_control(int key)
195 {
196     if (   try_cmd_1args(key, "w_keys_m", wrap_mod_selected_keyb, 'w')
197         || try_cmd_2args(key, "w_keys_u", wrap_mv_kb_mod, 'w', 'u')
198         || try_cmd_2args(key, "w_keys_d", wrap_mv_kb_mod, 'w', 'd'))
199     {
200         return 1;
201     }
202     return 0;
203 }
204
205
206
207 extern uint8_t meta_control(int key)
208 {
209     uint8_t ret = 2 * (key == get_available_keycode_to_command("quit"));
210     if (   (0 == ret)
211         && (   try_cmd_0args(key, "winconf", toggle_winconfig)
212             || try_cmd_0args(key, "reload_conf", reload_interface_conf)
213             || try_cmd_0args(key, "save_conf", save_interface_conf)
214             || try_cmd_0args(key, "map_c", map_center)
215             || try_cmd_1args(key, "scrl_r", scroll_pad, '+')
216             || try_cmd_1args(key, "scrl_l", scroll_pad, '-')
217             || try_cmd_1args(key, "to_a_keywin", toggle_window, 'k')
218             || try_cmd_1args(key, "to_g_keywin", toggle_window, '0')
219             || try_cmd_1args(key, "to_wg_keywin", toggle_window, '1')
220             || try_cmd_1args(key, "to_wk_keywin", toggle_window, '2')
221             || try_cmd_1args(key, "to_mapwin", toggle_window, 'm')
222             || try_cmd_1args(key, "to_infowin", toggle_window, 'i')
223             || try_cmd_1args(key, "to_inv", toggle_window, 'c')
224             || try_cmd_1args(key, "to_logwin", toggle_window, 'l')
225             || try_cmd_1args(key, "cyc_win_f", cycle_active_win, 'f')
226             || try_cmd_1args(key, "cyc_win_b", cycle_active_win, 'b')
227             || try_cmd_1args(key, "g_keys_m", wrap_mod_selected_keyb, 'G')
228             || try_cmd_1args(key, "wg_keys_m", wrap_mod_selected_keyb, 'g')
229             || try_cmd_1args(key, "wk_keys_m", wrap_mod_selected_keyb, 'k')
230             || try_cmd_1args(key, "inv_u", nav_inventory, 'u')
231             || try_cmd_1args(key, "inv_d", nav_inventory, 'd')
232             || try_cmd_1args(key, "map_u", map_scroll, 'N')
233             || try_cmd_1args(key, "map_d", map_scroll, 'S')
234             || try_cmd_1args(key, "map_r", map_scroll, 'E')
235             || try_cmd_1args(key, "map_l", map_scroll, 'W')
236             || try_cmd_2args(key, "g_keys_u", wrap_mv_kb_mod, 'G', 'u')
237             || try_cmd_2args(key, "g_keys_d", wrap_mv_kb_mod, 'G', 'd')
238             || try_cmd_2args(key, "wg_keys_u", wrap_mv_kb_mod, 'g', 'u')
239             || try_cmd_2args(key, "wg_keys_d", wrap_mv_kb_mod, 'g', 'd')
240             || try_cmd_2args(key, "wk_keys_u", wrap_mv_kb_mod, 'k', 'u')
241             || try_cmd_2args(key, "wk_keys_d", wrap_mv_kb_mod, 'k', 'd')))
242     {
243         ret = 1;
244     }
245     return ret;
246 }