diff --git a/src/pw3270/windows/config.c b/src/pw3270/windows/config.c index 6fb769d..0f5cd71 100644 --- a/src/pw3270/windows/config.c +++ b/src/pw3270/windows/config.c @@ -64,8 +64,10 @@ /// @brief Open registry for read-only access. static enum REG_KEY search_for_registry_key(const gchar *group, const gchar *key, HKEY *hKey) { - g_autofree gchar * path = g_strdup_printf("%s\\%s\\%s",WINDOWS_REGISTRY_PATH,g_get_application_name(),group); size_t ix; + g_autofree gchar * path = g_strjoin("\\",WINDOWS_REGISTRY_PATH,g_get_application_name(),group,NULL); + + trace("%s(%s)",__FUNCTION__,path); for(ix=0;ix < G_N_ELEMENTS(predefined);ix++) { @@ -88,7 +90,9 @@ gboolean pw3270_win32_registry_open(const gchar *group, HKEY *hKey, REGSAM samDesired) { size_t ix; - g_autofree gchar * path = g_strdup_printf("%s\\%s\\%s",WINDOWS_REGISTRY_PATH,g_get_application_name(),group); + g_autofree gchar * path = g_strjoin("\\",WINDOWS_REGISTRY_PATH,g_get_application_name(),group,NULL); + + trace("%s(%s)",__FUNCTION__,path); for(ix=0;ix < G_N_ELEMENTS(predefined);ix++) { @@ -308,7 +312,19 @@ void set_string_to_config(const gchar *group, const gchar *key, const gchar *fmt } } + else if(pw3270_win32_registry_open(group, &hKey, KEY_ALL_ACCESS)) + { + if(str) + { + RegSetValueEx(hKey,key,0,REG_SZ,(const BYTE *) str,strlen(str)+1); + } + else + { + RegDeleteKey(hKey,key); + } + RegCloseKey(hKey); + } } @@ -320,7 +336,21 @@ void set_boolean_to_config(const gchar *group, const gchar *key, gboolean val) { g_key_file_set_boolean(keyfile,group,key,val); } + else if(pw3270_win32_registry_open(group, &hKey, KEY_ALL_ACCESS)) + { + DWORD value = val ? 1 : 0; + LONG rc = RegSetValueEx(hKey, key, 0, REG_DWORD,(const BYTE *) &value,sizeof(value)); + + SetLastError(rc); + if(rc != ERROR_SUCCESS) + { + g_autofree gchar *msg = g_win32_error_message(GetLastError()); + g_warning("Error \"%s\" when setting key HKCU\\%s\\%s\\%s",msg,WINDOWS_REGISTRY_PATH,g_get_application_name(),group,key); + } + + RegCloseKey(hKey); + } } void set_integer_to_config(const gchar *group, const gchar *key, gint val) @@ -331,6 +361,21 @@ void set_integer_to_config(const gchar *group, const gchar *key, gint val) { g_key_file_set_integer(keyfile,group,key,val); } + else if(pw3270_win32_registry_open(group, &hKey, KEY_ALL_ACCESS)) + { + DWORD value = val; + LONG rc = RegSetValueEx(hKey, key, 0, REG_DWORD,(const BYTE *) &value,sizeof(value)); + + SetLastError(rc); + + if(rc != ERROR_SUCCESS) + { + g_autofree gchar *msg = g_win32_error_message(GetLastError()); + g_warning("Error \"%s\" when setting key HKCU\\%s\\%s\\%s",msg,WINDOWS_REGISTRY_PATH,g_get_application_name(),group,key); + } + + RegCloseKey(hKey); + } } @@ -358,7 +403,6 @@ void pw3270_session_config_save() g_file_set_contents(filename,text,-1,&error); } - if(error) { g_message( _( "Can't save session settings: %s" ), error->message); g_error_free(error); @@ -440,6 +484,23 @@ GKeyFile * pw3270_session_config_get(gboolean create) return keyfile; } + void pw3270_session_save_terminal(GtkWidget *terminal) + { + HKEY hKey; + + if(keyfile) + { + v3270_to_key_file(terminal, keyfile, "terminal"); + pw3270_session_config_save(); + } + else if(pw3270_win32_registry_open(NULL, &hKey, KEY_ALL_ACCESS)) + { + v3270_to_registry(terminal, hKey, "terminal"); + RegCloseKey(hKey); + } + + } + static const struct _WindowState { const char *name; @@ -452,33 +513,121 @@ GKeyFile * pw3270_session_config_get(gboolean create) { "Sticky", GDK_WINDOW_STATE_STICKY, gtk_window_stick } }; - void pw3270_session_save_terminal(GtkWidget *terminal) + void save_window_state_to_config(const gchar *group, const gchar *key, GdkWindowState CurrentState) { + size_t f; HKEY hKey; - GKeyFile * keyfile = pw3270_session_config_get(FALSE); - - if(keyfile) + if(keyfile) { - v3270_to_key_file(terminal, keyfile, "terminal"); - pw3270_session_config_save(); - } + g_autofree gchar * id = g_strconcat(group,".",key,NULL); + for(f=0;f