Commit 47a63a657e7fbf67f4eee81bd7b37de124f92ec2

Authored by Perry Werneck
1 parent fae87c18
Exists in v5.2

Refactoring windows session settings save/load engine.

src/pw3270/common.h
@@ -60,7 +60,8 @@ @@ -60,7 +60,8 @@
60 LIB3270_EXPORT void pw3270_session_config_load(const gchar *filename); 60 LIB3270_EXPORT void pw3270_session_config_load(const gchar *filename);
61 LIB3270_EXPORT void pw3270_session_config_save(); 61 LIB3270_EXPORT void pw3270_session_config_save();
62 LIB3270_EXPORT void pw3270_session_config_free(void); 62 LIB3270_EXPORT void pw3270_session_config_free(void);
63 - LIB3270_EXPORT GKeyFile * pw3270_session_config_get(gboolean create); 63 + LIB3270_EXPORT GKeyFile * pw3270_session_config_get(gboolean create);
  64 + LIB3270_EXPORT void pw3270_session_save_terminal(GtkWidget *terminal);
64 65
65 gchar * get_string_from_config(const gchar *group, const gchar *key, const gchar *def); 66 gchar * get_string_from_config(const gchar *group, const gchar *key, const gchar *def);
66 gboolean get_boolean_from_config(const gchar *group, const gchar *key, gboolean def); 67 gboolean get_boolean_from_config(const gchar *group, const gchar *key, gboolean def);
@@ -79,11 +80,10 @@ @@ -79,11 +80,10 @@
79 void restore_window_from_config(const gchar *group, const gchar *key, GtkWidget *hwnd); 80 void restore_window_from_config(const gchar *group, const gchar *key, GtkWidget *hwnd);
80 81
81 #ifdef ENABLE_WINDOWS_REGISTRY 82 #ifdef ENABLE_WINDOWS_REGISTRY
82 - gboolean get_registry_handle(const gchar *group, HKEY *hKey, REGSAM samDesired); 83 + gboolean pw3270_win32_registry_open(const gchar *group, HKEY *hKey, REGSAM samDesired);
  84 + void pw3270_win32_registry_foreach(HKEY parent, const gchar *name,void (*cbk)(const gchar *key, const gchar *val, gpointer *user_data), gpointer *user_data);
  85 +
83 HKEY get_application_registry(REGSAM samDesired); 86 HKEY get_application_registry(REGSAM samDesired);
84 - void registry_foreach(HKEY parent, const gchar *name,void (*cbk)(const gchar *key, const gchar *val, gpointer *user_data), gpointer *user_data);  
85 - void registry_set_double(HKEY hKey, const gchar *key, gdouble value);  
86 - gboolean registry_get_double(HKEY hKey, const gchar *key, gdouble *value);  
87 #endif // ENABLE_WINDOWS_REGISTRY 87 #endif // ENABLE_WINDOWS_REGISTRY
88 88
89 89
src/pw3270/linux/config.c
@@ -435,3 +435,15 @@ void restore_window_from_config(const gchar *group, const gchar *key, GtkWidget @@ -435,3 +435,15 @@ void restore_window_from_config(const gchar *group, const gchar *key, GtkWidget
435 435
436 } 436 }
437 437
  438 +void pw3270_session_save_terminal(GtkWidget *terminal)
  439 +{
  440 + GKeyFile * keyfile = pw3270_session_config_get(TRUE);
  441 +
  442 + debug("%s keyfile=%p",__FUNCTION__,keyfile);
  443 + if(keyfile)
  444 + {
  445 + v3270_to_key_file(widget, keyfile, "terminal");
  446 + pw3270_session_config_save();
  447 + }
  448 +
  449 +}
src/pw3270/window.c
@@ -407,7 +407,6 @@ static GtkWidget * trace_window = NULL; @@ -407,7 +407,6 @@ static GtkWidget * trace_window = NULL;
407 407
408 GKeyFile * keyfile = pw3270_session_config_get(FALSE); 408 GKeyFile * keyfile = pw3270_session_config_get(FALSE);
409 409
410 - debug("%s keyfile=%p",__FUNCTION__,keyfile);  
411 if(keyfile) 410 if(keyfile)
412 { 411 {
413 v3270_to_key_file(widget, keyfile, "terminal"); 412 v3270_to_key_file(widget, keyfile, "terminal");
@@ -418,7 +417,7 @@ static GtkWidget * trace_window = NULL; @@ -418,7 +417,7 @@ static GtkWidget * trace_window = NULL;
418 { 417 {
419 HKEY hKey; 418 HKEY hKey;
420 419
421 - if(get_registry_handle(NULL, &hKey, KEY_SET_VALUE)) 420 + if(pw3270_win32_registry_open(NULL, &hKey, KEY_SET_VALUE))
422 { 421 {
423 v3270_to_registry(widget, hKey, "terminal"); 422 v3270_to_registry(widget, hKey, "terminal");
424 RegCloseKey(hKey); 423 RegCloseKey(hKey);
@@ -872,7 +871,7 @@ static GtkWidget * trace_window = NULL; @@ -872,7 +871,7 @@ static GtkWidget * trace_window = NULL;
872 g_signal_connect(widget->terminal,"field_clicked",G_CALLBACK(field_clicked),widget); 871 g_signal_connect(widget->terminal,"field_clicked",G_CALLBACK(field_clicked),widget);
873 g_signal_connect(widget->terminal,"toggle_changed",G_CALLBACK(toggle_changed),widget); 872 g_signal_connect(widget->terminal,"toggle_changed",G_CALLBACK(toggle_changed),widget);
874 g_signal_connect(widget->terminal,"session_changed",G_CALLBACK(session_changed),widget); 873 g_signal_connect(widget->terminal,"session_changed",G_CALLBACK(session_changed),widget);
875 - g_signal_connect(widget->terminal,"save_settings",G_CALLBACK(save_terminal_settings),widget); 874 + g_signal_connect(widget->terminal,"save_settings",G_CALLBACK(pw3270_session_save_terminal),NULL);
876 875
877 //g_signal_connect(widget->terminal,"print",G_CALLBACK(print_all),widget); 876 //g_signal_connect(widget->terminal,"print",G_CALLBACK(print_all),widget);
878 877
src/pw3270/windows/config.c
@@ -24,51 +24,36 @@ @@ -24,51 +24,36 @@
24 * 24 *
25 * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) 25 * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
26 * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) 26 * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
27 - * licinio@bb.com.br (Licínio Luis Branco)  
28 - * kraucer@bb.com.br (Kraucer Fernandes Mazuco)  
29 * 27 *
30 */ 28 */
31 29
32 -#ifdef _WIN32  
33 - #include <windows.h>  
34 -#endif // _WIN32 30 + #include <windows.h>
35 31
36 #include "../pw3270/private.h" 32 #include "../pw3270/private.h"
37 33
38 - #include "common.h" 34 + #include "../common.h"
39 #include <stdarg.h> 35 #include <stdarg.h>
40 #include <glib/gstdio.h> 36 #include <glib/gstdio.h>
  37 + #include <v3270/settings.h>
41 38
42 -#ifdef _WIN32 39 + #ifndef KEY_WOW64_64KEY
  40 + #define KEY_WOW64_64KEY 0x0100
  41 + #endif // KEY_WOW64_64KEY
43 42
44 - #include <windows.h>  
45 -  
46 - #ifndef KEY_WOW64_64KEY  
47 - #define KEY_WOW64_64KEY 0x0100  
48 - #endif // KEY_WOW64_64KEY  
49 -  
50 - #ifndef KEY_WOW64_32KEY  
51 - #define KEY_WOW64_32KEY 0x0200  
52 - #endif // KEY_WOW64_64KEY  
53 -  
54 -#endif // _WIN32 43 + #ifndef KEY_WOW64_32KEY
  44 + #define KEY_WOW64_32KEY 0x0200
  45 + #endif // KEY_WOW64_64KEY
55 46
56 /*--[ Globals ]--------------------------------------------------------------------------------------*/ 47 /*--[ Globals ]--------------------------------------------------------------------------------------*/
57 48
58 -#ifdef ENABLE_WINDOWS_REGISTRY  
59 -  
60 - static const gchar * registry_path = "SOFTWARE";  
61 -  
62 -#else 49 + static GKeyFile * keyfile = NULL;
  50 + static gchar * keyfilename = NULL;
  51 + static const HKEY predefined[] = { HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE };
63 52
64 - static GKeyFile * program_config = NULL;  
65 -  
66 -#endif // ENABLE_WINDOWS_REGISTRY 53 + #define WINDOWS_REGISTRY_PATH "software"
67 54
68 /*--[ Implement ]------------------------------------------------------------------------------------*/ 55 /*--[ Implement ]------------------------------------------------------------------------------------*/
69 56
70 -#ifdef ENABLE_WINDOWS_REGISTRY  
71 -  
72 enum REG_KEY 57 enum REG_KEY
73 { 58 {
74 REG_KEY_USER, 59 REG_KEY_USER,
@@ -76,53 +61,46 @@ @@ -76,53 +61,46 @@
76 REG_KEY_INEXISTENT 61 REG_KEY_INEXISTENT
77 }; 62 };
78 63
79 - static enum REG_KEY registry_query(const gchar *group, const gchar *key, HKEY *hKey) 64 + /// @brief Open registry for read-only access.
  65 + static enum REG_KEY search_for_registry_key(const gchar *group, const gchar *key, HKEY *hKey)
80 { 66 {
81 - static HKEY predefined[] = { HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE };  
82 - gchar * path = g_strdup_printf("%s\\%s\\%s",registry_path,g_get_application_name(),group);  
83 - int f; 67 + g_autofree gchar * path = g_strdup_printf("%s\\%s\\%s",WINDOWS_REGISTRY_PATH,g_get_application_name(),group);
  68 + size_t ix;
84 69
85 - for(f=0;f<G_N_ELEMENTS(predefined);f++) 70 + for(ix=0;ix < G_N_ELEMENTS(predefined);ix++)
86 { 71 {
87 - if(RegOpenKeyEx(predefined[f],path,0,KEY_READ,hKey) == ERROR_SUCCESS) 72 + if(RegOpenKeyEx(predefined[ix],path,0,KEY_READ,hKey) == ERROR_SUCCESS)
88 { 73 {
89 if(RegQueryValueExA(*hKey,key,NULL,NULL,NULL,NULL) == ERROR_SUCCESS) 74 if(RegQueryValueExA(*hKey,key,NULL,NULL,NULL,NULL) == ERROR_SUCCESS)
90 { 75 {
91 - trace("Key\"%s\\%s\" found at id %d",path,key,f);  
92 - g_free(path);  
93 - return f; 76 + trace("Key\"%s\\%s\" found at id %d",path,key,ix);
  77 + return (enum REG_KEY) ix;
94 } 78 }
95 RegCloseKey(*hKey); 79 RegCloseKey(*hKey);
96 } 80 }
97 } 81 }
98 82
99 - trace("Key \"%s\\%s\""" not found",path,key,f);  
100 - g_free(path); 83 + trace("Key \"%s\\%s\""" not found",path,key);
101 84
102 - return -1; 85 + return REG_KEY_INEXISTENT;
103 } 86 }
104 87
105 - static BOOL registry_open_key(const gchar *group, const gchar *key, REGSAM samDesired, HKEY *hKey) 88 + gboolean pw3270_win32_registry_open(const gchar *group, HKEY *hKey, REGSAM samDesired)
106 { 89 {
107 - static HKEY predefined[] = { HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE };  
108 - int f;  
109 - gchar * path = g_strdup_printf("%s\\%s\\%s",registry_path,g_get_application_name(),group); 90 + size_t ix;
  91 + g_autofree gchar * path = g_strdup_printf("%s\\%s\\%s",WINDOWS_REGISTRY_PATH,g_get_application_name(),group);
110 92
111 - for(f=0;f<G_N_ELEMENTS(predefined);f++) 93 + for(ix=0;ix < G_N_ELEMENTS(predefined);ix++)
112 { 94 {
113 - if(RegOpenKeyEx(predefined[f],path,0,samDesired,hKey) == ERROR_SUCCESS)  
114 - {  
115 - g_free(path); 95 + if(RegOpenKeyEx(predefined[ix],path,0,samDesired,hKey) == ERROR_SUCCESS)
116 return TRUE; 96 return TRUE;
117 - }  
118 } 97 }
119 98
120 - g_free(path);  
121 -  
122 return FALSE; 99 return FALSE;
  100 +
123 } 101 }
124 102
125 - void registry_foreach(HKEY parent, const gchar *name,void (*cbk)(const gchar *key, const gchar *val, gpointer *user_data), gpointer *user_data) 103 + void pw3270_win32_registry_foreach(HKEY parent, const gchar *name,void (*cbk)(const gchar *key, const gchar *val, gpointer *user_data), gpointer *user_data)
126 { 104 {
127 HKEY hKey = 0; 105 HKEY hKey = 0;
128 106
@@ -152,218 +130,94 @@ @@ -152,218 +130,94 @@
152 } 130 }
153 } 131 }
154 132
155 - void registry_set_double(HKEY hKey, const gchar *key, gdouble value)  
156 - {  
157 - // Reference: http://git.gnome.org/browse/glib/tree/glib/gkeyfile.c  
158 - gchar result[G_ASCII_DTOSTR_BUF_SIZE];  
159 - g_ascii_dtostr (result, sizeof (result), value);  
160 -  
161 - RegSetValueEx(hKey,key,0,REG_SZ,(const BYTE *) result,strlen(result)+1);  
162 - }  
163 133
164 - gboolean registry_get_double(HKEY hKey, const gchar *key, gdouble *value) 134 + /*
  135 + static BOOL registry_open_key(const gchar *group, const gchar *key, REGSAM samDesired, HKEY *hKey)
165 { 136 {
166 -// GError * error = NULL;  
167 - BYTE data[4096];  
168 - unsigned long datatype;  
169 - unsigned long datalen = sizeof(data);  
170 - gchar * end_of_valid_d;  
171 -  
172 - if(RegQueryValueExA(hKey,key,NULL,&datatype,data,&datalen) != ERROR_SUCCESS)  
173 - return FALSE;  
174 -  
175 - data[datalen] = 0;  
176 -  
177 - * value = g_ascii_strtod((const gchar *) data, &end_of_valid_d); 137 + static HKEY predefined[] = { HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE };
  138 + int f;
  139 + gchar * path = g_strdup_printf("%s\\%s\\%s",registry_path,g_get_application_name(),group);
178 140
179 - if(*end_of_valid_d != '\0' || end_of_valid_d == ((gchar *) data)) 141 + for(f=0;f<G_N_ELEMENTS(predefined);f++)
180 { 142 {
181 - g_warning("Key %s on registry isnt a valid double value",key);  
182 - return FALSE; 143 + if(RegOpenKeyEx(predefined[f],path,0,samDesired,hKey) == ERROR_SUCCESS)
  144 + {
  145 + g_free(path);
  146 + return TRUE;
  147 + }
183 } 148 }
184 149
185 - return TRUE;  
186 - }  
187 - 150 + g_free(path);
188 151
  152 + return FALSE;
  153 + }
  154 + */
189 155
190 -#else  
191 156
192 - static gchar * search_for_ini(void) 157 + gboolean get_boolean_from_config(const gchar *group, const gchar *key, gboolean def)
193 { 158 {
194 - static const gchar * (*dir[])(void) =  
195 - {  
196 - g_get_user_config_dir,  
197 - g_get_user_data_dir,  
198 - g_get_home_dir,  
199 - };  
200 -  
201 - size_t f;  
202 - g_autofree gchar * name = g_strconcat(g_get_application_name(),".conf",NULL);  
203 -  
204 - //  
205 - // First search the user data  
206 - //  
207 -  
208 - for(f=0;f<G_N_ELEMENTS(dir);f++)  
209 - {  
210 - gchar *filename = g_build_filename(dir[f](),name,NULL);  
211 -  
212 - trace("Checking for %s",filename);  
213 -  
214 - if(g_file_test(filename,G_FILE_TEST_IS_REGULAR))  
215 - return filename;  
216 - g_free(filename);  
217 -  
218 - } 159 + HKEY hKey;
219 160
220 -#ifdef DATADIR  
221 - //  
222 - // Search the application DATADIR  
223 - // 161 + if(keyfile)
224 { 162 {
225 - gchar *filename = g_build_filename(DATAROOTDIR,G_STRINGIFY(PRODUCT_NAME),name,NULL);  
226 -  
227 - trace("Checking for default config \"%s\"",filename);  
228 -  
229 - if(g_file_test(filename,G_FILE_TEST_IS_REGULAR))  
230 - return filename;  
231 -  
232 - g_message("Can't find default config (%s)",filename);  
233 -  
234 - g_free(filename);  
235 -  
236 - }  
237 -#endif // DATADIR  
238 -  
239 - //  
240 - // Search the system config folders  
241 - //  
242 - const gchar * const * sysconfig = g_get_system_config_dirs();  
243 - for(f=0;sysconfig[f];f++)  
244 - {  
245 - gchar *filename = g_build_filename(sysconfig[f],name,NULL);  
246 - trace("Checking for %s",filename);  
247 - if(g_file_test(filename,G_FILE_TEST_IS_REGULAR))  
248 - return filename;  
249 - g_free(filename);  
250 - }  
251 -  
252 - //  
253 - // Search the system data folders  
254 - //  
255 - const gchar * const * sysdata = g_get_system_data_dirs();  
256 - for(f=0;sysdata[f];f++)  
257 - {  
258 - gchar *filename;  
259 -  
260 - // Check for product dir  
261 - filename = g_build_filename(sysdata[f],G_STRINGIFY(PRODUCT_NAME),name,NULL);  
262 - trace("Checking for system data \"%s\"",filename);  
263 - if(g_file_test(filename,G_FILE_TEST_IS_REGULAR))  
264 - return filename;  
265 - g_free(filename);  
266 -  
267 - // Check for file  
268 - filename = g_build_filename(sysdata[f],name,NULL);  
269 - trace("Checking for system data \"%s\"",filename);  
270 - if(g_file_test(filename,G_FILE_TEST_IS_REGULAR))  
271 - return filename;  
272 - g_free(filename);  
273 -  
274 -  
275 - 163 + GError * err = NULL;
  164 + gboolean val = g_key_file_get_boolean(keyfile,group,key,&err);
  165 + if(err)
  166 + g_error_free(err);
  167 + else
  168 + return val;
276 } 169 }
277 -  
278 - //  
279 - // Can't find, use user config dir  
280 - //  
281 - g_message("No config, defaulting to %s/%s",g_get_user_config_dir(),name);  
282 - return g_build_filename(g_get_user_config_dir(),name,NULL);  
283 -  
284 - }  
285 -#endif // #ifdef ENABLE_WINDOWS_REGISTRY  
286 -  
287 - gboolean get_boolean_from_config(const gchar *group, const gchar *key, gboolean def)  
288 - {  
289 -#ifdef ENABLE_WINDOWS_REGISTRY  
290 - gboolean ret = def;  
291 - HKEY hKey;  
292 -  
293 - if(registry_query(group,key,&hKey) != REG_KEY_INEXISTENT) 170 + else if(search_for_registry_key(group,key,&hKey) != REG_KEY_INEXISTENT)
294 { 171 {
295 - DWORD data;  
296 - unsigned long datalen = sizeof(data);  
297 - unsigned long datatype; 172 + DWORD data;
  173 + unsigned long datalen = sizeof(data);
  174 + unsigned long datatype;
298 175
299 if(RegQueryValueExA(hKey,key,NULL,&datatype,(BYTE *) &data,&datalen) == ERROR_SUCCESS) 176 if(RegQueryValueExA(hKey,key,NULL,&datatype,(BYTE *) &data,&datalen) == ERROR_SUCCESS)
300 { 177 {
301 if(datatype == REG_DWORD) 178 if(datatype == REG_DWORD)
302 - ret = data ? TRUE : FALSE; 179 + def = data ? TRUE : FALSE;
303 else 180 else
304 - g_warning("Unexpected registry data type in %s\\%s\\%s\\%s",registry_path,g_get_application_name(),group,key); 181 + g_warning("Unexpected registry data type in %s\\%s\\%s\\%s",WINDOWS_REGISTRY_PATH,g_get_application_name(),group,key);
305 } 182 }
306 183
307 RegCloseKey(hKey); 184 RegCloseKey(hKey);
  185 +
308 } 186 }
309 187
310 - return ret; 188 + return def;
  189 + }
311 190
312 -#else 191 + gint get_integer_from_config(const gchar *group, const gchar *key, gint def)
  192 + {
  193 + HKEY hKey;
313 194
314 - if(program_config) 195 + if(keyfile)
315 { 196 {
316 - GError * err = NULL;  
317 - gboolean val = g_key_file_get_boolean(program_config,group,key,&err); 197 + GError * err = NULL;
  198 + gint val = g_key_file_get_integer(keyfile,group,key,&err);
318 if(err) 199 if(err)
319 g_error_free(err); 200 g_error_free(err);
320 else 201 else
321 return val; 202 return val;
322 } 203 }
323 -#endif // ENABLE_WINDOWS_REGISTRY  
324 -  
325 - return def;  
326 - }  
327 -  
328 - gint get_integer_from_config(const gchar *group, const gchar *key, gint def)  
329 - {  
330 -#ifdef ENABLE_WINDOWS_REGISTRY  
331 -  
332 - HKEY key_handle;  
333 -  
334 - if(registry_open_key(group,key,KEY_READ,&key_handle)) 204 + else if(search_for_registry_key(group,key,&hKey) != REG_KEY_INEXISTENT)
335 { 205 {
336 DWORD data; 206 DWORD data;
337 gint ret = def; 207 gint ret = def;
338 unsigned long datalen = sizeof(data); 208 unsigned long datalen = sizeof(data);
339 unsigned long datatype; 209 unsigned long datatype;
340 210
341 - if(RegQueryValueExA(key_handle,key,NULL,&datatype,(BYTE *) &data,&datalen) == ERROR_SUCCESS) 211 + if(RegQueryValueExA(hKey,key,NULL,&datatype,(BYTE *) &data,&datalen) == ERROR_SUCCESS)
342 { 212 {
343 if(datatype == REG_DWORD) 213 if(datatype == REG_DWORD)
344 - ret = (gint) data; 214 + def = (gint) data;
345 else 215 else
346 - g_warning("Unexpected registry data type in %s\\%s\\%s\\%s",registry_path,g_get_application_name(),group,key); 216 + g_warning("Unexpected registry data type in %s\\%s\\%s\\%s",WINDOWS_REGISTRY_PATH,g_get_application_name(),group,key);
347 } 217 }
348 218
349 - RegCloseKey(key_handle);  
350 -  
351 - return ret;  
352 -  
353 - }  
354 -  
355 -#else  
356 -  
357 - if(program_config)  
358 - {  
359 - GError * err = NULL;  
360 - gint val = g_key_file_get_integer(program_config,group,key,&err);  
361 - if(err)  
362 - g_error_free(err);  
363 - else  
364 - return val; 219 + RegCloseKey(hKey);
365 } 220 }
366 -#endif // ENABLE_WINDOWS_REGISTRY  
367 221
368 return def; 222 return def;
369 } 223 }
@@ -371,46 +225,28 @@ @@ -371,46 +225,28 @@
371 225
372 gchar * get_string_from_config(const gchar *group, const gchar *key, const gchar *def) 226 gchar * get_string_from_config(const gchar *group, const gchar *key, const gchar *def)
373 { 227 {
374 -#ifdef ENABLE_WINDOWS_REGISTRY  
375 -  
376 - HKEY key_handle;  
377 - unsigned long datalen = 4096;  
378 - unsigned long datatype;  
379 - gchar * ret = NULL;  
380 - BYTE * data;  
381 -  
382 - if(!registry_open_key(group,key,KEY_READ,&key_handle))  
383 - {  
384 - if(def)  
385 - return g_strdup(def);  
386 - return NULL;  
387 - } 228 + HKEY hKey;
388 229
389 - data = (BYTE *) g_malloc0(datalen+2);  
390 -  
391 - if(RegQueryValueExA(key_handle,key,NULL,&datatype,data,&datalen) == ERROR_SUCCESS) 230 + if(keyfile)
392 { 231 {
393 - data[datalen+1] = 0;  
394 - ret = g_strdup((const gchar *) data); 232 + gchar *ret = g_key_file_get_string(keyfile,group,key,NULL);
  233 + if(ret)
  234 + return ret;
395 } 235 }
396 - else if(def) 236 + else if(search_for_registry_key(group,key,&hKey) != REG_KEY_INEXISTENT)
397 { 237 {
398 - ret = g_strdup(def);  
399 - }  
400 -  
401 - g_free(data); 238 + unsigned long datalen = 4096;
  239 + g_autofree gchar * data = g_malloc0(datalen+2);
  240 + unsigned long datatype;
402 241
403 - RegCloseKey(key_handle);  
404 -  
405 - return ret;  
406 -  
407 -#else 242 + if(RegQueryValueExA(hKey,key,NULL,&datatype,data,&datalen) == ERROR_SUCCESS)
  243 + {
  244 + RegCloseKey(hKey);
  245 + data[datalen+1] = 0;
  246 + return g_strdup((const gchar *) data);
  247 + }
408 248
409 - if(program_config)  
410 - {  
411 - gchar *ret = g_key_file_get_string(program_config,group,key,NULL);  
412 - if(ret)  
413 - return ret; 249 + RegCloseKey(hKey);
414 } 250 }
415 251
416 if(def) 252 if(def)
@@ -418,207 +254,128 @@ @@ -418,207 +254,128 @@
418 254
419 return NULL; 255 return NULL;
420 256
421 -#endif // ENABLE_WINDOWS_REGISTRY  
422 } 257 }
423 258
424 -void configuration_init(void) 259 +void pw3270_session_config_load(const gchar *filename)
425 { 260 {
426 -#ifndef ENABLE_WINDOWS_REGISTRY  
427 - gchar *filename = search_for_ini();  
428 -  
429 - if(program_config)  
430 - g_key_file_free(program_config); 261 + if(keyfilename)
  262 + {
  263 + g_free(keyfilename);
  264 + keyfilename = NULL;
  265 + }
431 266
432 - program_config = g_key_file_new(); 267 + if(keyfile)
  268 + {
  269 + g_key_file_free(keyfile);
  270 + keyfile = NULL;
  271 + }
433 272
434 if(filename) 273 if(filename)
435 { 274 {
  275 + // Has file name, load it.
436 g_message(_("Loading %s"),filename); 276 g_message(_("Loading %s"),filename);
437 - g_key_file_load_from_file(program_config,filename,G_KEY_FILE_NONE,NULL);  
438 - g_free(filename); 277 + keyfile = g_key_file_new();
  278 + g_key_file_load_from_file(keyfile,filename,G_KEY_FILE_NONE,NULL);
  279 + keyfilename = g_strdup(filename);
439 } 280 }
440 281
441 -#endif // ENABLE_WINDOWS_REGISTRY  
442 } 282 }
443 283
444 -static void set_string(const gchar *group, const gchar *key, const gchar *fmt, va_list args)  
445 -{  
446 - gchar * value = g_strdup_vprintf(fmt,args);  
447 -  
448 -#ifdef ENABLE_WINDOWS_REGISTRY  
449 -  
450 - gchar * path = g_strdup_printf("%s\\%s\\%s",registry_path,g_get_application_name(),group);  
451 - HKEY hKey;  
452 - DWORD disp;  
453 -  
454 - if(RegCreateKeyEx(HKEY_CURRENT_USER,path,0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hKey,&disp) == ERROR_SUCCESS)  
455 - {  
456 - RegSetValueEx(hKey,key,0,REG_SZ,(const BYTE *) value,strlen(value)+1);  
457 - RegCloseKey(hKey);  
458 - }  
459 -  
460 - g_free(path);  
461 -  
462 -#else  
463 -  
464 - g_key_file_set_string(program_config,group,key,value);  
465 -  
466 -#endif  
467 -  
468 - g_free(value);  
469 -}  
470 284
471 void set_string_to_config(const gchar *group, const gchar *key, const gchar *fmt, ...) 285 void set_string_to_config(const gchar *group, const gchar *key, const gchar *fmt, ...)
472 { 286 {
  287 + HKEY hKey;
  288 + g_autofree gchar * str = NULL;
  289 +
473 if(fmt) 290 if(fmt)
474 { 291 {
475 va_list args; 292 va_list args;
476 va_start(args, fmt); 293 va_start(args, fmt);
477 - set_string(group,key,fmt,args); 294 + str = g_strdup_vprintf(fmt,args);
478 va_end(args); 295 va_end(args);
479 } 296 }
480 -#ifdef ENABLE_WINDOWS_REGISTRY  
481 - else  
482 - {  
483 297
484 - gchar * path = g_strdup_printf("%s\\%s\\%s",registry_path,g_get_application_name(),group);  
485 - HKEY hKey;  
486 - DWORD disp;  
487 -  
488 - if(RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) 298 + if(keyfile)
  299 + {
  300 + // Update keyfile
  301 + if(str)
489 { 302 {
490 - RegDeleteKey(hKey,key);  
491 - RegCloseKey(hKey); 303 + g_key_file_set_string(keyfile,group,key,str);
  304 + }
  305 + else
  306 + {
  307 + g_key_file_remove_key(keyfile,group,key,NULL);
492 } 308 }
493 309
494 - g_free(path);  
495 -  
496 - }  
497 -#else  
498 - else if(g_key_file_has_key(program_config,group,key,NULL))  
499 - {  
500 - g_key_file_remove_key(program_config,group,key,NULL);  
501 } 310 }
502 -#endif 311 +
  312 +
503 } 313 }
504 314
505 void set_boolean_to_config(const gchar *group, const gchar *key, gboolean val) 315 void set_boolean_to_config(const gchar *group, const gchar *key, gboolean val)
506 { 316 {
507 -#ifdef ENABLE_WINDOWS_REGISTRY  
508 -  
509 - HKEY hKey;  
510 - DWORD disp;  
511 - gchar * path = g_strdup_printf("%s\\%s\\%s",registry_path,g_get_application_name(),group);  
512 -  
513 -// trace("Creating key %s",path);  
514 - if(RegCreateKeyEx(HKEY_CURRENT_USER,path,0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hKey,&disp) == ERROR_SUCCESS)  
515 - {  
516 - DWORD value = val ? 1 : 0;  
517 - LONG rc = RegSetValueEx(hKey, key, 0, REG_DWORD,(const BYTE *) &value,sizeof(value)); 317 + HKEY hKey;
518 318
519 - SetLastError(rc);  
520 -  
521 - if(rc != ERROR_SUCCESS)  
522 - {  
523 - gchar *msg = g_win32_error_message(GetLastError());  
524 - g_warning("Error \"%s\" when setting key HKCU\\%s\\%s",msg,path,key);  
525 - g_free(msg);  
526 - }  
527 - RegCloseKey(hKey);  
528 - }  
529 - else 319 + if(keyfile)
530 { 320 {
531 - gchar *msg = g_win32_error_message(GetLastError());  
532 - g_warning("Error \"%s\" when creating key HKCU\\%s",msg,path);  
533 - g_free(msg); 321 + g_key_file_set_boolean(keyfile,group,key,val);
534 } 322 }
535 323
536 - g_free(path);  
537 -  
538 -#else  
539 -  
540 - if(program_config)  
541 - g_key_file_set_boolean(program_config,group,key,val);  
542 -  
543 -#endif // ENABLE_WINDOWS_REGISTRY  
544 -  
545 } 324 }
546 325
547 void set_integer_to_config(const gchar *group, const gchar *key, gint val) 326 void set_integer_to_config(const gchar *group, const gchar *key, gint val)
548 { 327 {
549 -#ifdef ENABLE_WINDOWS_REGISTRY 328 + HKEY hKey;
550 329
551 - HKEY hKey;  
552 - DWORD disp;  
553 - gchar * path = g_strdup_printf("%s\\%s\\%s",registry_path,g_get_application_name(),group);  
554 -  
555 - trace("Creating key %s",path);  
556 - if(RegCreateKeyEx(HKEY_CURRENT_USER,path,0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hKey,&disp) == ERROR_SUCCESS)  
557 - {  
558 - DWORD value = (DWORD) val;  
559 - LONG rc = RegSetValueEx(hKey, key, 0, REG_DWORD,(const BYTE *) &value,sizeof(value));  
560 -  
561 - SetLastError(rc);  
562 -  
563 - if(rc != ERROR_SUCCESS)  
564 - {  
565 - gchar *msg = g_win32_error_message(GetLastError());  
566 - g_warning("Error \"%s\" when setting key HKCU\\%s\\%s",msg,path,key);  
567 - g_free(msg);  
568 - }  
569 - RegCloseKey(hKey);  
570 - }  
571 - else 330 + if(keyfile)
572 { 331 {
573 - gchar *msg = g_win32_error_message(GetLastError());  
574 - g_warning("Error \"%s\" when creating key HKCU\\%s",msg,path);  
575 - g_free(msg); 332 + g_key_file_set_integer(keyfile,group,key,val);
576 } 333 }
577 334
578 - g_free(path);  
579 -  
580 -#else  
581 -  
582 - if(program_config)  
583 - g_key_file_set_integer(program_config,group,key,val);  
584 -  
585 -#endif // ENABLE_WINDOWS_REGISTRY  
586 -  
587 } 335 }
588 336
589 -void configuration_deinit(void) 337 +void pw3270_session_config_save()
590 { 338 {
591 -#if !defined(ENABLE_WINDOWS_REGISTRY)  
592 -  
593 - if(!program_config) 339 + if(!keyfile)
594 return; 340 return;
595 341
596 - g_autofree gchar * text = g_key_file_to_data(program_config,NULL,NULL); 342 + g_autofree gchar * text = g_key_file_to_data(keyfile,NULL,NULL);
597 343
598 if(text) 344 if(text)
599 { 345 {
600 GError * error = NULL; 346 GError * error = NULL;
601 347
602 - g_autofree gchar * name = g_strconcat(g_get_application_name(),".conf",NULL);  
603 - g_autofree gchar * filename = g_build_filename(g_get_user_config_dir(),name,NULL);  
604 -  
605 - g_mkdir_with_parents(g_get_user_config_dir(),S_IRUSR|S_IWUSR);  
606 -  
607 - g_message( _("Saving %s"), filename); 348 + if(keyfilename)
  349 + {
  350 + g_message( _("Saving %s"), keyfilename);
  351 + g_file_set_contents(keyfilename,text,-1,&error);
  352 + }
  353 + else
  354 + {
  355 + g_autofree gchar * name = g_strconcat(g_get_application_name(),".conf",NULL);
  356 + g_autofree gchar * filename = g_build_filename(g_get_user_config_dir(),name,NULL);
  357 + g_mkdir_with_parents(g_get_user_config_dir(),S_IRUSR|S_IWUSR);
  358 + g_file_set_contents(filename,text,-1,&error);
  359 + }
608 360
609 - g_file_set_contents(filename,text,-1,&error);  
610 361
611 if(error) { 362 if(error) {
612 - g_message( _( "Can't save \"%s\": %s" ), filename, error->message); 363 + g_message( _( "Can't save session settings: %s" ), error->message);
613 g_error_free(error); 364 g_error_free(error);
614 } 365 }
615 366
616 } 367 }
617 368
618 - g_key_file_free(program_config);  
619 - program_config = NULL; 369 +}
620 370
621 -#endif // ENABLE_WINDOWS_REGISTRY 371 +void pw3270_session_config_free(void)
  372 +{
  373 + if(keyfile)
  374 + {
  375 + pw3270_session_config_save();
  376 + g_key_file_free(keyfile);
  377 + keyfile = NULL;
  378 + }
622 } 379 }
623 380
624 gchar * build_data_filename(const gchar *first_element, ...) 381 gchar * build_data_filename(const gchar *first_element, ...)
@@ -648,52 +405,6 @@ gchar * filename_from_va(const gchar *first_element, va_list args) @@ -648,52 +405,6 @@ gchar * filename_from_va(const gchar *first_element, va_list args)
648 405
649 g_autofree gchar * suffix = g_string_free(result, FALSE); 406 g_autofree gchar * suffix = g_string_free(result, FALSE);
650 407
651 -#if defined( ENABLE_WINDOWS_REGISTRY )  
652 - for(p=0;p<G_N_ELEMENTS(appname) && !result;p++)  
653 - {  
654 - g_autofree gchar * path = g_strconcat("Software\\",appname[p],NULL);  
655 -  
656 - HKEY hKey = 0;  
657 - LONG rc = 0;  
658 -  
659 - // Note: This could be needed: http://support.microsoft.com/kb/556009  
660 - // http://msdn.microsoft.com/en-us/library/windows/desktop/aa384129(v=vs.85).aspx  
661 -  
662 - rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE,path,0,KEY_QUERY_VALUE,&hKey);  
663 - SetLastError(rc);  
664 -  
665 - if(rc == ERROR_SUCCESS)  
666 - {  
667 - char data[4096];  
668 - unsigned long datalen = sizeof(data); // data field length(in), data returned length(out)  
669 - unsigned long datatype; // #defined in winnt.h (predefined types 0-11)  
670 -  
671 - rc = RegQueryValueExA(hKey,"datadir",NULL,&datatype,(LPBYTE) data,&datalen);  
672 - if(rc == ERROR_SUCCESS)  
673 - {  
674 - gchar * path = g_build_filename(data,appname[p],suffix,NULL);  
675 - trace("searching \"%s\"",path);  
676 - if(g_file_test(path,G_FILE_TEST_EXISTS))  
677 - return path;  
678 - g_free(path);  
679 - }  
680 - RegCloseKey(hKey);  
681 - }  
682 -  
683 - }  
684 -#endif // ENABLE_WINDOWS_REGISTRY  
685 -  
686 -#ifdef _WIN32  
687 - for(p=0;p<G_N_ELEMENTS(appname) && !result;p++)  
688 - {  
689 - gchar * path = g_build_filename(g_win32_get_package_installation_directory_of_module(NULL),appname[p],suffix,NULL);  
690 - trace("searching \"%s\"",path);  
691 - if(g_file_test(path,G_FILE_TEST_EXISTS))  
692 - return path;  
693 - g_free(path);  
694 - }  
695 -#endif // _WIN32  
696 -  
697 // Check system data dirs 408 // Check system data dirs
698 const gchar * const * system_data_dirs = g_get_system_data_dirs(); 409 const gchar * const * system_data_dirs = g_get_system_data_dirs();
699 for(p=0;p<G_N_ELEMENTS(appname);p++) 410 for(p=0;p<G_N_ELEMENTS(appname);p++)
@@ -722,36 +433,12 @@ gchar * filename_from_va(const gchar *first_element, va_list args) @@ -722,36 +433,12 @@ gchar * filename_from_va(const gchar *first_element, va_list args)
722 return g_build_filename(".",suffix,NULL); 433 return g_build_filename(".",suffix,NULL);
723 } 434 }
724 435
725 -#ifdef ENABLE_WINDOWS_REGISTRY  
726 -gboolean get_registry_handle(const gchar *group, HKEY *hKey, REGSAM samDesired)  
727 -{  
728 - gboolean ret;  
729 - gchar * path;  
730 - DWORD disp;  
731 -  
732 - if(group)  
733 - path = g_strdup_printf("%s\\%s\\%s",registry_path,g_get_application_name(),group);  
734 - else  
735 - path = g_strdup_printf("%s\\%s",registry_path,g_get_application_name());  
736 -  
737 - if(RegCreateKeyEx(HKEY_CURRENT_USER,path,0,NULL,REG_OPTION_NON_VOLATILE,samDesired,NULL,hKey,&disp) == ERROR_SUCCESS)  
738 - ret = TRUE;  
739 - else  
740 - ret = FALSE;  
741 -  
742 - g_free(path);  
743 -  
744 - return ret;  
745 -}  
746 -#else  
747 -#error Replace it!  
748 -GKeyFile * get_application_keyfile(void) 436 +GKeyFile * pw3270_session_config_get(gboolean create)
749 { 437 {
750 - if(!program_config)  
751 - configuration_init();  
752 - return program_config; 438 + if(!keyfile && create)
  439 + pw3270_session_config_load(NULL);
  440 + return keyfile;
753 } 441 }
754 -#endif // ENABLE_WINDOWS_REGISTRY  
755 442
756 static const struct _WindowState 443 static const struct _WindowState
757 { 444 {
@@ -765,175 +452,33 @@ GKeyFile * get_application_keyfile(void) @@ -765,175 +452,33 @@ GKeyFile * get_application_keyfile(void)
765 { "Sticky", GDK_WINDOW_STATE_STICKY, gtk_window_stick } 452 { "Sticky", GDK_WINDOW_STATE_STICKY, gtk_window_stick }
766 }; 453 };
767 454
768 -void save_window_state_to_config(const gchar *group, const gchar *key, GdkWindowState CurrentState)  
769 -{  
770 -#if defined( ENABLE_WINDOWS_REGISTRY )  
771 -  
772 - gchar * path = g_strdup_printf("%s\\%s\\%s\\%s",registry_path,g_get_application_name(),group,key);  
773 -  
774 - HKEY hKey;  
775 - DWORD disp;  
776 -  
777 - if(RegCreateKeyEx(HKEY_CURRENT_USER,path,0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hKey,&disp) == ERROR_SUCCESS)  
778 - {  
779 - int f;  
780 - for(f=0;f<G_N_ELEMENTS(WindowState);f++)  
781 - {  
782 - DWORD value = (CurrentState & WindowState[f].flag) ? 1 : 0;  
783 -// trace("%s=%s",WindowState[f].name,value ? "Yes" : "No");  
784 - RegSetValueEx(hKey, WindowState[f].name, 0, REG_DWORD,(const BYTE *) &value,sizeof(value));  
785 - }  
786 -  
787 - RegCloseKey(hKey);  
788 - }  
789 -  
790 - g_free(path);  
791 -  
792 -#else  
793 - int f;  
794 - GKeyFile * conf = get_application_keyfile();  
795 - gchar * id = g_strconcat(group,".",key,NULL);  
796 -  
797 - for(f=0;f<G_N_ELEMENTS(WindowState);f++)  
798 - g_key_file_set_boolean(conf,id,WindowState[f].name,CurrentState & WindowState[f].flag);  
799 -  
800 - g_free(id);  
801 -  
802 -#endif // ENABLE_WINDOWS_REGISTRY  
803 -}  
804 -  
805 -void save_window_size_to_config(const gchar *group, const gchar *key, GtkWidget *hwnd)  
806 -{  
807 -#if defined( ENABLE_WINDOWS_REGISTRY )  
808 -  
809 - gchar * path = g_strdup_printf("%s\\%s\\%s\\%s",registry_path,g_get_application_name(),group,key);  
810 -  
811 - HKEY hKey;  
812 - DWORD disp;  
813 -  
814 - if(RegCreateKeyEx(HKEY_CURRENT_USER,path,0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hKey,&disp) == ERROR_SUCCESS)  
815 - {  
816 - int pos[2];  
817 -  
818 - gtk_window_get_size(GTK_WINDOW(hwnd),&pos[0],&pos[1]);  
819 -  
820 - RegSetValueEx(hKey, "Size", 0, REG_BINARY,(const BYTE *) pos,sizeof(pos));  
821 -  
822 - RegCloseKey(hKey);  
823 - }  
824 -  
825 - g_free(path);  
826 -  
827 -#else  
828 - int pos[2];  
829 - GKeyFile * conf = get_application_keyfile();  
830 - gchar * id = g_strconcat(group,".",key,NULL);  
831 -  
832 - gtk_window_get_size(GTK_WINDOW(hwnd),&pos[0],&pos[1]);  
833 - g_key_file_set_integer_list(conf,id,"size",pos,2);  
834 -  
835 - g_free(id);  
836 -  
837 -#endif // ENABLE_WINDOWS_REGISTRY  
838 -}  
839 -  
840 -#if defined( ENABLE_WINDOWS_REGISTRY )  
841 -static void restore_window_from_regkey(GtkWidget *hwnd, HKEY hKey, const gchar *path)  
842 -{  
843 - int f;  
844 - int pos[2];  
845 - unsigned long datalen;  
846 - unsigned long datatype;  
847 -  
848 -  
849 - datalen = sizeof(pos);  
850 - if(RegQueryValueExA(hKey,"Size",NULL,&datatype,(BYTE *) pos,&datalen) == ERROR_SUCCESS)  
851 - {  
852 - if(datatype == REG_BINARY && datalen == sizeof(pos))  
853 - {  
854 - gtk_window_resize(GTK_WINDOW(hwnd),pos[0],pos[1]);  
855 - }  
856 - else  
857 - {  
858 - g_warning("Unexpected registry data in %s\\Size",path);  
859 - }  
860 - }  
861 -  
862 -  
863 - for(f=0;f<G_N_ELEMENTS(WindowState);f++)  
864 - {  
865 - DWORD data;  
866 -  
867 - datalen = sizeof(data);  
868 -  
869 - if(RegQueryValueExA(hKey,WindowState[f].name,NULL,&datatype,(BYTE *) &data,&datalen) == ERROR_SUCCESS)  
870 - {  
871 - if(datatype == REG_DWORD)  
872 - {  
873 - if(data)  
874 - WindowState[f].activate(GTK_WINDOW(hwnd));  
875 -  
876 - }  
877 - else  
878 - {  
879 - g_warning("Unexpected registry data type in %s\\%s",path,WindowState[f].name);  
880 - }  
881 - }  
882 - }  
883 -  
884 -  
885 -}  
886 -#endif // ENABLE_WINDOWS_REGISTRY  
887 -  
888 -void restore_window_from_config(const gchar *group, const gchar *key, GtkWidget *hwnd)  
889 -{  
890 -#if defined( ENABLE_WINDOWS_REGISTRY ) 455 + void pw3270_session_save_terminal(GtkWidget *terminal)
  456 + {
  457 + HKEY hKey;
891 458
892 - gchar * path = g_strdup_printf("%s\\%s\\%s\\%s",registry_path,g_get_application_name(),group,key);  
893 - HKEY hKey; 459 + GKeyFile * keyfile = pw3270_session_config_get(FALSE);
894 460
895 - if(RegOpenKeyEx(HKEY_CURRENT_USER,path,0,KEY_READ,&hKey) == ERROR_SUCCESS)  
896 - {  
897 - // Load user settings  
898 - restore_window_from_regkey(hwnd,hKey,path);  
899 - RegCloseKey(hKey);  
900 - }  
901 - else if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,path,0,KEY_READ,&hKey) == ERROR_SUCCESS) 461 + if(keyfile)
902 { 462 {
903 - // Load system defaults  
904 - restore_window_from_regkey(hwnd,hKey,path);  
905 - RegCloseKey(hKey); 463 + v3270_to_key_file(terminal, keyfile, "terminal");
  464 + pw3270_session_config_save();
906 } 465 }
907 466
908 - g_free(path);  
909 -  
910 -#else  
911 - gchar * id = g_strconcat(group,".",key,NULL);  
912 - GKeyFile * conf = get_application_keyfile();  
913 467
914 - if(g_key_file_has_key(conf,id,"size",NULL))  
915 - {  
916 - gsize sz = 2;  
917 - gint * vlr = g_key_file_get_integer_list(conf,id,"size",&sz,NULL);  
918 - int f; 468 + }
919 469
920 - if(vlr)  
921 - {  
922 - gtk_window_resize(GTK_WINDOW(hwnd),vlr[0],vlr[1]);  
923 - g_free(vlr);  
924 - } 470 + void save_window_state_to_config(const gchar *group, const gchar *key, GdkWindowState CurrentState)
  471 + {
925 472
926 - for(f=0;f<G_N_ELEMENTS(WindowState);f++)  
927 - {  
928 - if(g_key_file_get_boolean(conf,id,WindowState[f].name,NULL))  
929 - WindowState[f].activate(GTK_WINDOW(hwnd));  
930 - } 473 + }
931 474
932 - } 475 + void save_window_size_to_config(const gchar *group, const gchar *key, GtkWidget *hwnd)
  476 + {
933 477
934 - g_free(id); 478 + }
935 479
936 -#endif // ENABLE_WINDOWS_REGISTRY 480 + void restore_window_from_config(const gchar *group, const gchar *key, GtkWidget *hwnd)
  481 + {
937 482
938 -} 483 + }
939 484
src/pw3270/windows/print.c
@@ -100,6 +100,29 @@ static gchar * enum_to_string(GType type, guint enum_value) @@ -100,6 +100,29 @@ static gchar * enum_to_string(GType type, guint enum_value)
100 } 100 }
101 } 101 }
102 102
  103 + gboolean registry_get_double(HKEY hKey, const gchar *key, gdouble *value)
  104 + {
  105 + BYTE data[4096];
  106 + unsigned long datatype;
  107 + unsigned long datalen = sizeof(data);
  108 + gchar * end_of_valid_d;
  109 +
  110 + if(RegQueryValueExA(hKey,key,NULL,&datatype,data,&datalen) != ERROR_SUCCESS)
  111 + return FALSE;
  112 +
  113 + data[datalen] = 0;
  114 +
  115 + * value = g_ascii_strtod((const gchar *) data, &end_of_valid_d);
  116 +
  117 + if(*end_of_valid_d != '\0' || end_of_valid_d == ((gchar *) data))
  118 + {
  119 + g_warning("Key %s on registry isnt a valid double value",key);
  120 + return FALSE;
  121 + }
  122 +
  123 + return TRUE;
  124 + }
  125 +
103 void load_print_operation_settings(GtkPrintOperation * operation) 126 void load_print_operation_settings(GtkPrintOperation * operation)
104 { 127 {
105 GtkPrintSettings * settings = gtk_print_settings_new(); 128 GtkPrintSettings * settings = gtk_print_settings_new();
@@ -122,12 +145,12 @@ static gchar * enum_to_string(GType type, guint enum_value) @@ -122,12 +145,12 @@ static gchar * enum_to_string(GType type, guint enum_value)
122 145
123 HKEY registry; 146 HKEY registry;
124 147
125 - if(get_registry_handle("print",&registry,KEY_READ)) 148 + if(pw3270_win32_registry_open("print",&registry,KEY_READ))
126 { 149 {
127 HKEY hKey; 150 HKEY hKey;
128 DWORD disp; 151 DWORD disp;
129 152
130 - registry_foreach(registry,"settings",update_settings,(gpointer) settings); 153 + pw3270_win32_registry_foreach(registry,"settings",update_settings,(gpointer) settings);
131 154
132 if(RegCreateKeyEx(registry,"pagesetup",0,NULL,REG_OPTION_NON_VOLATILE,KEY_READ,NULL,&hKey,&disp) == ERROR_SUCCESS) 155 if(RegCreateKeyEx(registry,"pagesetup",0,NULL,REG_OPTION_NON_VOLATILE,KEY_READ,NULL,&hKey,&disp) == ERROR_SUCCESS)
133 { 156 {
@@ -234,6 +257,15 @@ static gchar * enum_to_string(GType type, guint enum_value) @@ -234,6 +257,15 @@ static gchar * enum_to_string(GType type, guint enum_value)
234 257
235 } 258 }
236 259
  260 + static void registry_set_double(HKEY hKey, const gchar *key, gdouble value)
  261 + {
  262 + // Reference: http://git.gnome.org/browse/glib/tree/glib/gkeyfile.c
  263 + gchar result[G_ASCII_DTOSTR_BUF_SIZE];
  264 + g_ascii_dtostr (result, sizeof (result), value);
  265 +
  266 + RegSetValueEx(hKey,key,0,REG_SZ,(const BYTE *) result,strlen(result)+1);
  267 + }
  268 +
237 void save_print_operation_settings(GtkPrintOperation * operation) 269 void save_print_operation_settings(GtkPrintOperation * operation)
238 { 270 {
239 // Save settings 271 // Save settings
@@ -246,7 +278,7 @@ static gchar * enum_to_string(GType type, guint enum_value) @@ -246,7 +278,7 @@ static gchar * enum_to_string(GType type, guint enum_value)
246 #ifdef ENABLE_WINDOWS_REGISTRY 278 #ifdef ENABLE_WINDOWS_REGISTRY
247 HKEY registry; 279 HKEY registry;
248 280
249 - if(get_registry_handle("print",&registry,KEY_SET_VALUE)) 281 + if(pw3270_win32_registry_open("print",&registry,KEY_SET_VALUE))
250 { 282 {
251 HKEY hKey; 283 HKEY hKey;
252 DWORD disp; 284 DWORD disp;