# HG changeset patch # User Sam Lantinga # Date 1184218268 0 # Node ID cbe06fa842cdce751e79ba902356c85de37d87f3 # Parent 2590d4e5fb89975d67ce1c5b006c176f6f33c414 Fixed joystick name detection - merged from revision 3226 on SDL 1.2 branch diff -r 2590d4e5fb89 -r cbe06fa842cd src/joystick/win32/SDL_mmjoystick.c --- a/src/joystick/win32/SDL_mmjoystick.c Thu Jul 12 03:14:49 2007 +0000 +++ b/src/joystick/win32/SDL_mmjoystick.c Thu Jul 12 05:31:08 2007 +0000 @@ -78,59 +78,62 @@ index (1-16) listed in the registry */ char *name = NULL; + HKEY hTopKey; HKEY hKey; DWORD regsize; LONG regresult; - unsigned char regkey[256]; - unsigned char regvalue[256]; - unsigned char regname[256]; + char regkey[256]; + char regvalue[256]; + char regname[256]; + + SDL_snprintf(regkey, SDL_arraysize(regkey), "%s\\%s\\%s", + REGSTR_PATH_JOYCONFIG, szRegKey, REGSTR_KEY_JOYCURR); + hTopKey = HKEY_LOCAL_MACHINE; + regresult = RegOpenKeyExA(hTopKey, regkey, 0, KEY_READ, &hKey); + if (regresult != ERROR_SUCCESS) { + hTopKey = HKEY_CURRENT_USER; + regresult = RegOpenKeyExA(hTopKey, regkey, 0, KEY_READ, &hKey); + } + if (regresult != ERROR_SUCCESS) { + return NULL; + } - SDL_snprintf((char *) regkey, SDL_arraysize(regkey), "%s\\%s\\%s", - REGSTR_PATH_JOYCONFIG, szRegKey, REGSTR_KEY_JOYCURR); - regresult = RegOpenKeyExA(HKEY_LOCAL_MACHINE, - (LPTSTR) & regkey, 0, KEY_READ, &hKey); + /* find the registry key name for the joystick's properties */ + regsize = sizeof(regname); + SDL_snprintf(regvalue, SDL_arraysize(regvalue), "Joystick%d%s", index + 1, + REGSTR_VAL_JOYOEMNAME); + regresult = + RegQueryValueExA(hKey, regvalue, 0, 0, (LPBYTE) regname, ®size); + RegCloseKey(hKey); + + if (regresult != ERROR_SUCCESS) { + return NULL; + } + + /* open that registry key */ + SDL_snprintf(regkey, SDL_arraysize(regkey), "%s\\%s", REGSTR_PATH_JOYOEM, + regname); + regresult = RegOpenKeyExA(hTopKey, regkey, 0, KEY_READ, &hKey); + if (regresult != ERROR_SUCCESS) { + return NULL; + } + + /* find the size for the OEM name text */ + regsize = sizeof(regvalue); + regresult = + RegQueryValueExA(hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, NULL, ®size); if (regresult == ERROR_SUCCESS) { - /* - find the registry key name for the - joystick's properties - */ - regsize = sizeof(regname); - SDL_snprintf((char *) regvalue, SDL_arraysize(regvalue), - "Joystick%d%s", index + 1, REGSTR_VAL_JOYOEMNAME); - regresult = RegQueryValueExA(hKey, - (char *) regvalue, 0, 0, - (LPBYTE) & regname, (LPDWORD) & regsize); - RegCloseKey(hKey); - if (regresult == ERROR_SUCCESS) { - /* open that registry key */ - SDL_snprintf((char *) regkey, SDL_arraysize(regkey), - "%s\\%s", REGSTR_PATH_JOYOEM, regname); - regresult = - RegOpenKeyExA(HKEY_LOCAL_MACHINE, (char *) regkey, 0, - KEY_READ, &hKey); - if (regresult == ERROR_SUCCESS) { - /* find the size for the OEM name text */ - regsize = sizeof(regvalue); - regresult = - RegQueryValueExA(hKey, - REGSTR_VAL_JOYOEMNAME, - 0, 0, NULL, (LPDWORD) & regsize); - if (regresult == ERROR_SUCCESS) { - /* - allocate enough memory - for the OEM name text ... - */ - name = (char *) SDL_malloc(regsize); - /* ... and read it from the registry */ - regresult = - RegQueryValueExA(hKey, + /* allocate enough memory for the OEM name text ... */ + name = (char *) SDL_malloc(regsize); + if (name) { + /* ... and read it from the registry */ + regresult = RegQueryValueExA(hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, - (LPBYTE) name, (LPDWORD) & regsize); - RegCloseKey(hKey); - } - } + (LPBYTE) name, ®size); } } + RegCloseKey(hKey); + return (name); }