+#include "wincontrol.h" /* for init_winconfs(), init_wins(), free_winconfs(),
+ * sorted_wintoggle_and_activate()
+ */
+#include "windows.h" /* for suspend_win() */
+
+
+extern char * trouble_msg(struct World * w, char * parent, char * child)
+{
+ char * p1 = "Trouble in ";
+ char * p2 = " with ";
+ char * p3 = ".";
+ uint16_t size = strlen(p1) + strlen(parent) + strlen(p2) + strlen(child)
+ + strlen(p3) + 1;
+ char * msg = malloc(size);
+ exit_err(NULL == msg, w, "malloc() in trouble_msg() failed.");
+ sprintf(msg, "%s%s%s%s%s", p1, parent, p2, child, p3);
+ return msg;
+}
+
+
+
+extern void * try_malloc(size_t size, struct World * w, char * f)
+{
+ char * msg = trouble_msg(w, f, "malloc()");
+ void * p = malloc(size);
+ exit_err(NULL == p, w, msg);
+ free(msg);
+ return p;
+}
+
+
+
+extern void * try_calloc(size_t size1, size_t size2, struct World * w, char * f)
+{
+ char * msg = trouble_msg(w, f, "calloc()");
+ void * p = calloc(size1, size2);
+ exit_err(NULL == p, w, msg);
+ free(msg);
+ return p;
+}
+
+
+
+extern void check_files_xor(char * p1, char * p2, struct World * w)
+{
+ char * msg1 = "A file '";
+ char * msg2 = "' exists, but no file '";
+ char * msg3 = "'. If everything was in order, both or noe would exist. "
+ "The game won't start until this is corrected.";
+ uint16_t size = strlen(msg1) + strlen(p1) + strlen(msg2) + strlen(p2)
+ + strlen(msg3);
+ char msg[size];
+ if (!access(p1, F_OK) && access(p2, F_OK))
+ {
+ sprintf(msg, "%s%s%s%s%s", msg1, p1, msg2, p2, msg3);
+ errno = 0;
+ exit_err(1, w, msg);
+ }
+ else if (access(p1, F_OK) && !access(p2, F_OK))
+ {
+ sprintf(msg, "%s%s%s%s%s", msg1, p2, msg2, p1, msg3);
+ errno = 0;
+ exit_err(1, w, msg);
+ }
+}
+
+
+
+extern void check_tempfile(char * path, struct World * w)
+{
+ char * msg1 = "A file '";
+ char * msg2 = "' exists, probably from a corrupted previous file saving "
+ "process. To avoid corruption of game files, the game won't "
+ "start until it is removed or renamed.";
+ uint16_t size = strlen(msg1) + strlen(path) + strlen(msg2);
+ char msg[size];
+ sprintf(msg, "%s%s%s", msg1, path, msg2);
+ exit_err(!access(path, F_OK), w, msg);
+}
+
+
+
+extern void save_interface_conf(struct World * world)
+{
+ save_keybindings(world, "config/keybindings_global", &world->kb_global);
+ save_keybindings(world, "config/keybindings_wingeom", &world->kb_wingeom);
+ save_keybindings(world, "config/keybindings_winkeys", &world->kb_winkeys);
+ save_win_configs(world);
+}
+
+
+
+extern void load_interface_conf(struct World * world)
+{
+ init_keybindings(world, "config/keybindings_global", &world->kb_global);
+ init_keybindings(world, "config/keybindings_wingeom", &world->kb_wingeom);
+ init_keybindings(world, "config/keybindings_winkeys", &world->kb_winkeys);
+ init_winconfs(world);
+ init_wins(world);
+ sorted_wintoggle_and_activate(world);
+}
+
+
+
+extern void unload_interface_conf(struct World * world)
+{
+ free_keybindings(world->kb_global.kbs);
+ free_keybindings(world->kb_wingeom.kbs);
+ free_keybindings(world->kb_winkeys.kbs);
+ while (0 != world->wmeta->active)
+ {
+ suspend_win(world->wmeta, world->wmeta->active);
+ }
+ free_winconfs(world);
+}