-static char * string_prefixed_id(char * prefix, char id)
-{
- uint8_t size = strlen(prefix) + 2;
- char * path = try_malloc(size, "string_prefixed_id()");
- sprintf(path, "%s_", prefix);
- path[size - 2] = id;
- return path;
-}
-
-
-
-static void init_winconf_from_file(char id, struct WinConf * winconf)
-{
- /* Assign WinConf id to filename path, error message context, winconf->id.*/
- char * tmp = "init_winconf_from_file() on window id '_'";
- char * context = try_malloc(strlen(tmp) + 1, "init_winconf_from_file()");
- memcpy(context, tmp, strlen(tmp) + 1);
- context[strlen(tmp) - 2] = id;
- char * path = string_prefixed_id("confclient/windows/Win_", id);
- winconf->id = id;
-
- /* Prepare reading in file line by line into "line" array. */
- FILE * file = try_fopen(path, "r", context);
- free(path);
- uint32_t linemax = textfile_sizes(file, NULL);
- char line[linemax + 1];
-
- /* Read/determine winconf->title, ->draw, ->height(_type),->width(_type). */
- try_fgets(line, linemax + 1, file, context);
- winconf->title = try_malloc(strlen(line), context);
- memcpy(winconf->title, line, strlen(line) - 1); /* Eliminate newline char */
- winconf->title[strlen(line) - 1] = '\0'; /* char at end of string. */
- try_fgets(line, linemax + 1, file, context);
- winconf->draw = line[0];
- try_fgets(line, linemax + 1, file, context);
- winconf->height = atoi(line);
- winconf->height_type = (0 >= winconf->height);
- try_fgets(line, linemax + 1, file, context);
- winconf->width = atoi(line);
- winconf->width_type = (0 >= winconf->width);
-
- /* Read in window-specific keybindings (winconf->kb). */
- char command[linemax + 1];
- char * cmdptr;
- struct KeyBinding ** loc_last_ptr = &winconf->kb.kbs;
- * loc_last_ptr = 0;
- while (try_fgets(command, linemax + 1, file, context))
- {
- if ('\n' == command[0] || 0 == command[0])
- {
- break;
- }
- * loc_last_ptr = try_malloc(sizeof(struct KeyBinding), context);
- struct KeyBinding * kb_p = * loc_last_ptr;
- kb_p->next = 0;
- kb_p->key = atoi(command);
- cmdptr = strchr(command, ' ') + 1;
- cmdptr[strlen(cmdptr) - 1] = '\0';
- kb_p->command = get_command(cmdptr);
- loc_last_ptr = & kb_p->next;
- }
-
- /* Init remaining values to zero and cleaning up. */
- winconf->view = 0;
- winconf->kb.edit = 0;
- winconf->kb.select = 0;
- try_fclose(file, context);
- free(context);
-}
-
-
-
-static void init_win_from_winconf(char id)
-{
- char * err = "get_drawfunc_by_char() returns NULL to init_win_from_file().";
- struct WinConf * winconf = get_winconf_by_id(id);
- void * f = get_drawfunc_by_char(winconf->draw);
- exit_err(NULL == f, err);
- init_win(&winconf->win, winconf->title, winconf->height, winconf->width, f);
-}
-
-
-
-static void save_win_config(char id)
-{
- char * f_name = "save_win_config()";
-
- /* Prepare atomic file saving. */
- char * path_tmp = string_prefixed_id("confclient/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->command->dsc_short) > linemax)
- {
- linemax = strlen(kb_p->command->dsc_short);
- }
- 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->command->dsc_short);
- 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("confclient/windows/Win_", id);
- try_fclose_unlink_rename(file, path_tmp, path, f_name);
- free(path);
- free(path_tmp);
-}
-
-
-