- char * err = "Trouble with malloc() in init_winconfs().";
- struct WinConf * winconfs = malloc(4 * sizeof(struct WinConf));
- exit_err(NULL == winconfs, world, err);
- winconfs[0].id = 'i';
- winconfs[0].draw = draw_info_win;
- winconfs[1].id = 'k';
- winconfs[1].draw = draw_keys_win;
- winconfs[2].id = 'l';
- winconfs[2].draw = draw_log_win;
- winconfs[3].id = 'm';
- winconfs[3].draw = draw_map_win;
- world->winconfs = winconfs;
+ char * f_name = "save_win_config()";
+
+ /* Prepare atomic file saving. */
+ char * path_tmp = string_prefixed_id("config/windows/Win_tmp_", id);
+ FILE * file = try_fopen(path_tmp, "w", f_name);
+
+ /* Save, line by line, ->title, ->draw, ->height and ->width. */
+ struct WinConf * wc = get_winconf_by_id(id);
+ uint8_t size = strlen(wc->title) + 2;
+ if (size < 7) /* Ensure that at least 5 + 2 char fit into line so that */
+ { /* the digit representation of any uint16_t may be stored. */
+ size = 7;
+ }
+ char line[size];
+ sprintf(line, "%s\n", wc->title);
+ try_fwrite(line, sizeof(char), strlen(line), file, f_name);
+ sprintf(line, "%c\n", wc->draw);
+ try_fwrite(line, sizeof(char), strlen(line), file, f_name);
+ sprintf(line, "%d\n", wc->height);
+ try_fwrite(line, sizeof(char), strlen(line), file, f_name);
+ sprintf(line, "%d\n", wc->width);
+ try_fwrite(line, sizeof(char), strlen(line), file, f_name);
+
+ /* Save window-specific keybindings (->kb.kbs). */
+ uint16_t linemax = 0;
+ struct KeyBinding * kb_p = wc->kb.kbs;
+ while (0 != kb_p)
+ {
+ if (strlen(kb_p->name) > linemax)
+ {
+ linemax = strlen(kb_p->name);
+ }
+ kb_p = kb_p->next;
+ }
+ linemax = linemax + 6; /* + 6: + 3 digits + whitespace + \n + \0 */
+ char kb_line[linemax];
+ kb_p = wc->kb.kbs;
+ while (0 != kb_p)
+ {
+ sprintf(kb_line, "%d %s\n", kb_p->key, kb_p->name);
+ try_fwrite(kb_line, sizeof(char), strlen(kb_line), file, f_name);
+ kb_p = kb_p->next;
+ }
+
+ /* Finish atomic file saving and clean up. */
+ char * path = string_prefixed_id("config/windows/Win_", id);
+ try_fclose_unlink_rename(file, path_tmp, path, f_name);
+ free(path);
+ free(path_tmp);