Module: wine Branch: master Commit: c627a81a76f0853190702f95b73b8b42d07a8f92 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c627a81a76f0853190702f95b7...
Author: Rob Shearman rob@codeweavers.com Date: Wed Feb 13 21:30:53 2008 +0000
shell32: Fix the logic in Control_LoadApplet determining when to use CPL_INQUIRE and when to use CPL_NEWINQUIRE.
Previously, the code would fail to get the name of an applet that didn't return an icon for CPL_NEWINQUIRE and didn't return set either idName or idIcon to a non-zero value for CPL_INQUIRE.
Fix this by sending CPL_INQUIRE first and loading any strings or icon specified and then only fall back to CPL_NEWINQUIRE if any of the required members were zero (i.e. CPL_DYNAMIC_RES) and then only fill in these fields.
---
dlls/shell32/control.c | 75 +++++++++++++++++++++++++++--------------------- 1 files changed, 42 insertions(+), 33 deletions(-)
diff --git a/dlls/shell32/control.c b/dlls/shell32/control.c index f38a920..1f17016 100644 --- a/dlls/shell32/control.c +++ b/dlls/shell32/control.c @@ -92,45 +92,54 @@ CPlApplet* Control_LoadApplet(HWND hWnd, LPCWSTR cmd, CPanel* panel) ZeroMemory(&newinfo, sizeof(newinfo)); newinfo.dwSize = sizeof(NEWCPLINFOA); applet->info[i].dwSize = sizeof(NEWCPLINFOW); + applet->info[i].dwFlags = 0; + applet->info[i].dwHelpContext = 0; + applet->info[i].szHelpFile[0] = '\0'; /* proc is supposed to return a null value upon success for * CPL_INQUIRE and CPL_NEWINQUIRE * However, real drivers don't seem to behave like this * So, use introspection rather than return value */ - applet->proc(hWnd, CPL_NEWINQUIRE, i, (LPARAM)&newinfo); - if (newinfo.hIcon == 0) { - applet->proc(hWnd, CPL_INQUIRE, i, (LPARAM)&info); - if (info.idIcon == 0 || info.idName == 0) { - WARN("Couldn't get info from sp %u\n", i); - applet->info[i].dwSize = 0; - } else { - /* convert the old data into the new structure */ - applet->info[i].dwFlags = 0; - applet->info[i].dwHelpContext = 0; - applet->info[i].lData = info.lData; - applet->info[i].hIcon = LoadIconW(applet->hModule, - MAKEINTRESOURCEW(info.idIcon)); - LoadStringW(applet->hModule, info.idName, - applet->info[i].szName, sizeof(applet->info[i].szName) / sizeof(WCHAR)); - LoadStringW(applet->hModule, info.idInfo, - applet->info[i].szInfo, sizeof(applet->info[i].szInfo) / sizeof(WCHAR)); - applet->info[i].szHelpFile[0] = '\0'; + applet->proc(hWnd, CPL_INQUIRE, i, (LPARAM)&info); + applet->info[i].lData = info.lData; + if (info.idIcon != CPL_DYNAMIC_RES) + applet->info[i].hIcon = LoadIconW(applet->hModule, + MAKEINTRESOURCEW(info.idIcon)); + if (info.idName != CPL_DYNAMIC_RES) + LoadStringW(applet->hModule, info.idName, + applet->info[i].szName, sizeof(applet->info[i].szName) / sizeof(WCHAR)); + if (info.idInfo != CPL_DYNAMIC_RES) + LoadStringW(applet->hModule, info.idInfo, + applet->info[i].szInfo, sizeof(applet->info[i].szInfo) / sizeof(WCHAR)); + + if ((info.idIcon == CPL_DYNAMIC_RES) || (info.idName == CPL_DYNAMIC_RES) || + (info.idInfo == CPL_DYNAMIC_RES)) { + applet->proc(hWnd, CPL_NEWINQUIRE, i, (LPARAM)&newinfo); + + applet->info[i].dwFlags = newinfo.dwFlags; + applet->info[i].dwHelpContext = newinfo.dwHelpContext; + applet->info[i].lData = newinfo.lData; + if (info.idIcon == CPL_DYNAMIC_RES) { + if (!newinfo.hIcon) WARN("couldn't get icon for applet %u\n", i); + applet->info[i].hIcon = newinfo.hIcon; } - } - else - { - CopyMemory(&applet->info[i], &newinfo, newinfo.dwSize); - if (newinfo.dwSize != sizeof(NEWCPLINFOW)) - { - applet->info[i].dwSize = sizeof(NEWCPLINFOW); - MultiByteToWideChar(CP_ACP, 0, ((LPNEWCPLINFOA)&newinfo)->szName, - sizeof(((LPNEWCPLINFOA)&newinfo)->szName) / sizeof(CHAR), - applet->info[i].szName, - sizeof(applet->info[i].szName) / sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, ((LPNEWCPLINFOA)&newinfo)->szInfo, - sizeof(((LPNEWCPLINFOA)&newinfo)->szInfo) / sizeof(CHAR), - applet->info[i].szInfo, - sizeof(applet->info[i].szInfo) / sizeof(WCHAR)); + if (newinfo.dwSize == sizeof(NEWCPLINFOW)) { + if (info.idName == CPL_DYNAMIC_RES) + memcpy(applet->info[i].szName, newinfo.szName, sizeof(newinfo.szName)); + if (info.idInfo == CPL_DYNAMIC_RES) + memcpy(applet->info[i].szInfo, newinfo.szInfo, sizeof(newinfo.szInfo)); + memcpy(applet->info[i].szHelpFile, newinfo.szHelpFile, sizeof(newinfo.szHelpFile)); + } else { + if (info.idName == CPL_DYNAMIC_RES) + MultiByteToWideChar(CP_ACP, 0, ((LPNEWCPLINFOA)&newinfo)->szName, + sizeof(((LPNEWCPLINFOA)&newinfo)->szName) / sizeof(CHAR), + applet->info[i].szName, + sizeof(applet->info[i].szName) / sizeof(WCHAR)); + if (info.idInfo == CPL_DYNAMIC_RES) + MultiByteToWideChar(CP_ACP, 0, ((LPNEWCPLINFOA)&newinfo)->szInfo, + sizeof(((LPNEWCPLINFOA)&newinfo)->szInfo) / sizeof(CHAR), + applet->info[i].szInfo, + sizeof(applet->info[i].szInfo) / sizeof(WCHAR)); MultiByteToWideChar(CP_ACP, 0, ((LPNEWCPLINFOA)&newinfo)->szHelpFile, sizeof(((LPNEWCPLINFOA)&newinfo)->szHelpFile) / sizeof(CHAR), applet->info[i].szHelpFile,