Alexandre Julliard : winecfg:
Determine the current Windows version from the standard registry keys.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Nov 30 13:40:55 CST 2006
Module: wine
Branch: master
Commit: 8de125803422bc4d68de1eaef2114631b7799b8e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8de125803422bc4d68de1eaef2114631b7799b8e
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Nov 30 15:16:41 2006 +0100
winecfg: Determine the current Windows version from the standard registry keys.
Also avoid setting the HKCU\Software\Wine version value when not needed.
---
programs/winecfg/appdefaults.c | 72 ++++++++++++++++++++++++++++++---------
1 files changed, 55 insertions(+), 17 deletions(-)
diff --git a/programs/winecfg/appdefaults.c b/programs/winecfg/appdefaults.c
index d3fb6e3..2330aee 100644
--- a/programs/winecfg/appdefaults.c
+++ b/programs/winecfg/appdefaults.c
@@ -27,6 +27,7 @@
#include <commdlg.h>
#include <wine/debug.h>
#include <stdio.h>
+#include <stdlib.h>
#include <assert.h>
#include "winecfg.h"
#include "resource.h"
@@ -62,14 +63,48 @@ static const struct
#define NB_VERSIONS (sizeof(win_versions)/sizeof(win_versions[0]))
-static void update_comboboxes(HWND dialog)
+static const char szKey9x[] = "Software\\Microsoft\\Windows\\CurrentVersion";
+static const char szKeyNT[] = "Software\\Microsoft\\Windows NT\\CurrentVersion";
+
+static int get_registry_version(void)
{
- int i;
+ int i, best = -1, platform, major, minor = 0;
+ char *p, *ver;
+
+ if ((ver = get_reg_key( HKEY_LOCAL_MACHINE, szKeyNT, "CurrentVersion", NULL )))
+ platform = VER_PLATFORM_WIN32_NT;
+ else if ((ver = get_reg_key( HKEY_LOCAL_MACHINE, szKey9x, "VersionNumber", NULL )))
+ platform = VER_PLATFORM_WIN32_WINDOWS;
+ else
+ return -1;
+
+ if ((p = strchr( ver, '.' )))
+ {
+ char *str = p;
+ *str++ = 0;
+ if ((p = strchr( str, '.' ))) *p = 0;
+ minor = atoi(str);
+ }
+ major = atoi(ver);
+
+ for (i = 0; i < NB_VERSIONS; i++)
+ {
+ if (win_versions[i].dwPlatformId != platform) continue;
+ if (win_versions[i].dwMajorVersion != major) continue;
+ best = i;
+ if (win_versions[i].dwMinorVersion == minor) return i;
+ }
+ return best;
+}
+static void update_comboboxes(HWND dialog)
+{
+ int i, ver;
char *winver;
-
+
/* retrieve the registry values */
winver = get_reg_key(config_key, keypath(""), "Version", "");
+ ver = get_registry_version();
if (*winver == '\0')
{
@@ -81,7 +116,8 @@ static void update_comboboxes(HWND dialo
SendDlgItemMessage (dialog, IDC_WINVER, CB_SETCURSEL, 0, 0);
return;
}
- winver = strdupA("win2k");
+ if (ver != -1) winver = strdupA( win_versions[ver].szVersion );
+ else winver = strdupA("win2k");
}
WINE_TRACE("winver is %s\n", winver);
@@ -336,22 +372,21 @@ static void on_winver_change(HWND dialog
{
int selection = SendDlgItemMessage(dialog, IDC_WINVER, CB_GETCURSEL, 0, 0);
- if (!selection && current_app)
- {
- WINE_TRACE("default selected so removing current setting\n");
- set_reg_key(config_key, keypath(""), "Version", NULL);
- }
- else
+ if (current_app)
{
- if (current_app) selection--;
- WINE_TRACE("setting Version key to value '%s'\n", win_versions[selection].szVersion);
- set_reg_key(config_key, keypath(""), "Version", win_versions[selection].szVersion);
+ if (!selection)
+ {
+ WINE_TRACE("default selected so removing current setting\n");
+ set_reg_key(config_key, keypath(""), "Version", NULL);
+ }
+ else
+ {
+ WINE_TRACE("setting Version key to value '%s'\n", win_versions[selection-1].szVersion);
+ set_reg_key(config_key, keypath(""), "Version", win_versions[selection-1].szVersion);
+ }
}
- /* global version only */
- if (!current_app)
+ else /* global version only */
{
- static const char szKey9x[] = "Software\\Microsoft\\Windows\\CurrentVersion";
- static const char szKeyNT[] = "Software\\Microsoft\\Windows NT\\CurrentVersion";
static const char szKeyProdNT[] = "System\\CurrentControlSet\\Control\\ProductOptions";
static const char szKeyWindNT[] = "System\\CurrentControlSet\\Control\\Windows";
static const char szKeyEnvNT[] = "System\\CurrentControlSet\\Control\\Session Manager\\Environment";
@@ -371,6 +406,7 @@ static void on_winver_change(HWND dialog
set_reg_key(HKEY_LOCAL_MACHINE, szKeyProdNT, "ProductType", NULL);
set_reg_key(HKEY_LOCAL_MACHINE, szKeyWindNT, "CSDVersion", NULL);
set_reg_key(HKEY_LOCAL_MACHINE, szKeyEnvNT, "OS", NULL);
+ set_reg_key(config_key, keypath(""), "Version", NULL);
break;
case VER_PLATFORM_WIN32_NT:
@@ -388,6 +424,7 @@ static void on_winver_change(HWND dialog
set_reg_key(HKEY_LOCAL_MACHINE, szKey9x, "VersionNumber", NULL);
set_reg_key(HKEY_LOCAL_MACHINE, szKey9x, "SubVersionNumber", NULL);
+ set_reg_key(config_key, keypath(""), "Version", NULL);
break;
case VER_PLATFORM_WIN32s:
@@ -399,6 +436,7 @@ static void on_winver_change(HWND dialog
set_reg_key(HKEY_LOCAL_MACHINE, szKeyEnvNT, "OS", NULL);
set_reg_key(HKEY_LOCAL_MACHINE, szKey9x, "VersionNumber", NULL);
set_reg_key(HKEY_LOCAL_MACHINE, szKey9x, "SubVersionNumber", NULL);
+ set_reg_key(config_key, keypath(""), "Version", win_versions[selection].szVersion);
break;
}
}
More information about the wine-cvs
mailing list