comparison src/config.c @ 10:42ac054c0231

*: huge refactoring dirtools now uses wchar (wayyy overdue) the timer doesn't have a stupid design anymore we don't use windows.h at all now ...
author Paper <paper@paper.us.eu.org>
date Sun, 11 Feb 2024 19:43:31 -0500
parents 07f0e2f43204
children e6a594f16403
comparison
equal deleted inserted replaced
9:07f0e2f43204 10:42ac054c0231
9 * 9 *
10 * ----- wgsdk config ---- 10 * ----- wgsdk config ----
11 * display_title=1 11 * display_title=1
12 * show_elapsed_time=1 12 * show_elapsed_time=1
13 **/ 13 **/
14 #include "dirtools.h"
15 #include "config.h"
16 #include "resource.h"
17 #include "utils.h"
18
19 #include <shlobj.h>
20 #include <shlwapi.h>
21
14 #include <assert.h> 22 #include <assert.h>
15 #include <stdio.h> 23 #include <stdio.h>
16 #include <stdlib.h> 24 #include <stdlib.h>
17 #include <string.h> 25 #include <string.h>
18 #include "dirtools.h" 26
19 #include "config.h" 27 #define MAX_LINE_LENGTH 256
20 #include "resource.h"
21 #include "utils.h"
22 #ifndef WIN32_LEAN_AND_MEAN
23 # define WIN32_LEAN_AND_MEAN
24 #endif
25 #include <windows.h>
26 #include <windowsx.h>
27 #define MAX_LINE_LENGTH 128
28 28
29 /* from main */ 29 /* from main */
30 extern void update_rich_presence_details(void); 30 extern void update_rich_presence_details(void);
31 extern struct config config; 31 extern struct config config;
32 32
33 /* must be free'd by the caller */
34 LPWSTR cfg_get_path() {
35 /* get location of appdata folder */
36 LPWSTR appdata_folder;
37 SHGetKnownFolderPath(&FOLDERID_RoamingAppData, 0, NULL, &appdata_folder);
38
39 /* compatibility with WACUP, falls back to Winamp */
40 WCHAR exe_name[MAX_PATH] = {L'\0'};
41 if (GetModuleFileNameW(NULL, (LPWSTR)&exe_name, MAX_PATH)) {
42 PathStripPathW(exe_name);
43 PathRemoveExtensionW(exe_name);
44 } else { // fail
45 memset(exe_name, '\0', MAX_PATH * sizeof(WCHAR));
46 wcscpy(exe_name, L"Winamp");
47 }
48
49 /* concat until we get the final path */
50 LPWSTR path = dirtools_concat_paths(appdata_folder, exe_name);
51 CoTaskMemFree(appdata_folder);
52
53 LPWSTR final = dirtools_concat_paths(path, L"Plugins\\wgsdk");
54 free(path);
55
56 return final;
57 }
58
33 int cfg_load(struct config* restrict config) { 59 int cfg_load(struct config* restrict config) {
34 char line[MAX_LINE_LENGTH] = {0}, 60 LPWSTR fold_path = cfg_get_path();
35 *path = dirtools_concat_paths(getenv("APPDATA"), "Winamp\\Plugins\\wgsdk\\config.txt"); 61 LPWSTR path = dirtools_concat_paths(fold_path, L"config.txt");
36 FILE* config_fp = fopen(path, "r"); 62 free(fold_path);
63
64 /* find some real win32 replacement for this */
65 FILE* config_fp = _wfopen(path, L"r");
37 if (config_fp == NULL) { 66 if (config_fp == NULL) {
38 free(path); 67 free(path);
39 return 1; 68 return 1;
40 } 69 }
70
41 /* parse the config */ 71 /* parse the config */
72 char line[MAX_LINE_LENGTH] = {0};
42 while (fgets(line, MAX_LINE_LENGTH, config_fp)) { 73 while (fgets(line, MAX_LINE_LENGTH, config_fp)) {
74 /* strtok is okay here. */
43 switch (crc32b((unsigned char*)strtok(line, "="))) { 75 switch (crc32b((unsigned char*)strtok(line, "="))) {
44 case 0x2a666380: // display_title 76 case 0x2a666380: // display_title
45 config->display_title = !!atoi(strtok(NULL, "=")); 77 config->display_title = !!atoi(strtok(NULL, "="));
46 break; 78 break;
47 case 0xbb631f7f: // show_elapsed_time 79 case 0xbb631f7f: // show_elapsed_time
49 break; 81 break;
50 default: 82 default:
51 break; 83 break;
52 } 84 }
53 } 85 }
86
54 free(path); 87 free(path);
55 return 0; 88 return 0;
56 } 89 }
57 90
58 int cfg_save(struct config config) { 91 int cfg_save(struct config config) {
59 char* path = dirtools_concat_paths(getenv("APPDATA"), "Winamp\\Plugins\\wgsdk"); 92 LPWSTR fold_path = cfg_get_path();
60 assert(!dirtools_create_directory(path)); 93 assert(!dirtools_create_directory(fold_path));
61 free(path);
62 94
63 path = dirtools_concat_paths(getenv("APPDATA"), "Winamp\\Plugins\\wgsdk\\config.txt"); 95 LPWSTR path = dirtools_concat_paths(fold_path, L"config.txt");
64 FILE* config_fp = fopen(path, "w"); 96 free(fold_path);
65 if (config_fp == NULL) 97
98 FILE* config_fp = _wfopen(path, L"w");
99 if (config_fp == NULL) {
100 free(path);
66 return 1; 101 return 1;
102 }
103
67 fprintf(config_fp, "----- wgsdk config ----\n"); 104 fprintf(config_fp, "----- wgsdk config ----\n");
68 fprintf(config_fp, "display_title=%d\n", config.display_title); 105 fprintf(config_fp, "display_title=%d\n", config.display_title);
69 fprintf(config_fp, "show_elapsed_time=%d\n", config.show_elapsed_time); 106 fprintf(config_fp, "show_elapsed_time=%d\n", config.show_elapsed_time);
70 fclose(config_fp); 107 fclose(config_fp);
108 free(path);
71 return 0; 109 return 0;
72 } 110 }
73 111
74 /* --------------------------------- */ 112 /* --------------------------------- */
75 113
76 #define conf_item_to_dlg(cons, var) \ 114 #define conf_item_to_dlg(hwnd, cons, var) \
77 checkboxHwnd = GetDlgItem(hWnd, cons); \ 115 { \
78 Button_SetCheck(checkboxHwnd, var) 116 HWND checkboxHwnd = GetDlgItem(hwnd, cons); \
79 #define dlg_item_to_conf(cons, var) \ 117 SendMessage(checkboxHwnd, BM_SETCHECK, (var) ? BST_CHECKED : BST_UNCHECKED, 0); \
80 checkboxHwnd = GetDlgItem(hWnd, cons); \ 118 }
81 var = Button_GetCheck(checkboxHwnd) 119 #define dlg_item_to_conf(hwnd, cons, var) \
120 { \
121 HWND checkboxHwnd = GetDlgItem(hwnd, cons); \
122 (var) = (SendMessage(checkboxHwnd, BM_GETCHECK, 0, 0) == BST_CHECKED); \
123 }
82 void cfg_get_controls(HWND hWnd) { 124 void cfg_get_controls(HWND hWnd) {
83 HWND checkboxHwnd; 125 dlg_item_to_conf(hWnd, TITLE_CHECK, config.display_title);
84 126 dlg_item_to_conf(hWnd, ELAPSED_TIME_CHECK, config.show_elapsed_time);
85 dlg_item_to_conf(TITLE_CHECK, config.display_title);
86 dlg_item_to_conf(ELAPSED_TIME_CHECK, config.show_elapsed_time);
87 } 127 }
88 128
89 void cfg_set_controls(HWND hWnd) { 129 void cfg_set_controls(HWND hWnd) {
90 HWND checkboxHwnd; 130 conf_item_to_dlg(hWnd, TITLE_CHECK, config.display_title);
91 131 conf_item_to_dlg(hWnd, ELAPSED_TIME_CHECK, config.show_elapsed_time);
92 conf_item_to_dlg(TITLE_CHECK, config.display_title);
93 conf_item_to_dlg(ELAPSED_TIME_CHECK, config.show_elapsed_time);
94 } 132 }
95 #undef conf_item_to_dlg 133 #undef conf_item_to_dlg
96 #undef dlg_item_to_conf 134 #undef dlg_item_to_conf
97 135
98 void cfg_on_confirm_settings_dialog(HWND hWnd) { 136 void cfg_on_confirm_settings_dialog(HWND hWnd) {