diff --git a/include/server.h b/include/server.h index 7860e0616e0..d30d839833f 100644 --- a/include/server.h +++ b/include/server.h @@ -963,6 +963,7 @@ struct set_registry_levels_request { IN int current; /* new current level */ IN int saving; /* new saving level */ + IN int version; /* file format version for saving */ }; diff --git a/misc/registry.c b/misc/registry.c index fbbe7e8781b..cf0b15d782b 100644 --- a/misc/registry.c +++ b/misc/registry.c @@ -47,6 +47,7 @@ #include "winreg.h" #include "winversion.h" #include "server.h" +#include "services.h" DEFAULT_DEBUG_CHANNEL(reg) @@ -333,6 +334,7 @@ void SHELL_SaveRegistry( void ) /* set saving level (0 for saving everything, 1 for saving only modified keys) */ req->current = 1; req->saving = !all; + req->version = PROFILE_GetWineIniBool( "registry", "UseNewFormat", 0 ) ? 2 : 1; server_call( REQ_SET_REGISTRY_LEVELS ); SHELL_SaveRegistryBranch(HKEY_CURRENT_USER); @@ -340,6 +342,11 @@ void SHELL_SaveRegistry( void ) SHELL_SaveRegistryBranch(HKEY_USERS); } +/* Periodic save callback */ +static void CALLBACK periodic_save( ULONG_PTR dummy ) +{ + SHELL_SaveRegistry(); +} /************************ LOAD Registry Function ****************************/ @@ -1275,6 +1282,7 @@ void _w31_loadreg(void) { void SHELL_LoadRegistry( void ) { struct set_registry_levels_request *req = get_req_buffer(); + int save_timeout; char *fn, *home; HKEY hkey; @@ -1285,6 +1293,7 @@ void SHELL_LoadRegistry( void ) /* set level to 0 for loading system files */ req->current = 0; req->saving = 0; + req->version = 1; server_call( REQ_SET_REGISTRY_LEVELS ); if (PROFILE_GetWineIniBool ("registry", "LoadWindowsRegistryFiles", 1)) @@ -1313,6 +1322,7 @@ void SHELL_LoadRegistry( void ) /* set level to 1 for loading user files */ req->current = 1; req->saving = 0; + req->version = 1; server_call( REQ_SET_REGISTRY_LEVELS ); /* @@ -1442,6 +1452,11 @@ void SHELL_LoadRegistry( void ) RegCloseKey(hkey); } + + if ((save_timeout = PROFILE_GetWineIniInt( "registry", "PeriodicSave", 0 ))) + { + SERVICE_AddTimer( save_timeout * 1000000, periodic_save, 0 ); + } } diff --git a/server/registry.c b/server/registry.c index 5175ebebd35..c33561f8341 100644 --- a/server/registry.c +++ b/server/registry.c @@ -1532,5 +1532,6 @@ DECL_HANDLER(set_registry_levels) { current_level = req->current; saving_level = req->saving; + saving_version = req->version; } diff --git a/server/trace.c b/server/trace.c index 8fd31d0a110..69786c90d8c 100644 --- a/server/trace.c +++ b/server/trace.c @@ -990,7 +990,8 @@ static void dump_save_registry_request( struct save_registry_request *req ) static void dump_set_registry_levels_request( struct set_registry_levels_request *req ) { fprintf( stderr, " current=%d,", req->current ); - fprintf( stderr, " saving=%d", req->saving ); + fprintf( stderr, " saving=%d,", req->saving ); + fprintf( stderr, " version=%d", req->version ); } static const dump_func req_dumpers[REQ_NB_REQUESTS] = { diff --git a/wine.ini b/wine.ini index ada10dda7b0..1296ed5f068 100644 --- a/wine.ini +++ b/wine.ini @@ -152,6 +152,10 @@ LoadAltRegistryFiles=Y WritetoHomeRegistryFiles=Y ; TRY to write all changes to alt registries WritetoAltRegistryFiles=Y +; Use new file format +UseNewFormat=N +; Registry periodic save timeout in seconds +; PeriodicSave=600 [Tweak.Layout] ;; WineLook=xxx (supported styles are 'Win31'(default), 'Win95', 'Win98')