third unicode fix for issue #496. please go away.

This commit is contained in:
zeromus 2022-01-11 22:32:57 -05:00
parent af06cc4aca
commit 747f369483
6 changed files with 60 additions and 27 deletions

View File

@ -129,20 +129,20 @@ void MakeBitmapPseudoTransparent(HBITMAP hBmp, COLORREF cKeyColor, COLORREF cNew
// Window class handling // Window class handling
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
vector<string> ReggedWndClasses; vector<wstring> ReggedWndClasses;
bool RegWndClass(string name, WNDPROC wndProc, UINT style, int extraSize) bool RegWndClass(wstring name, WNDPROC wndProc, UINT style, int extraSize)
{ {
return RegWndClass(name, wndProc, style, NULL, extraSize); return RegWndClass(name, wndProc, style, NULL, extraSize);
} }
bool RegWndClass(string name, WNDPROC wndProc, UINT style, HICON icon, int extraSize) bool RegWndClass(wstring name, WNDPROC wndProc, UINT style, HICON icon, int extraSize)
{ {
// If the class is already regged, don't re-reg it // If the class is already regged, don't re-reg it
if (find(ReggedWndClasses.begin(), ReggedWndClasses.end(), name) != ReggedWndClasses.end()) if (find(ReggedWndClasses.begin(), ReggedWndClasses.end(), name) != ReggedWndClasses.end())
return true; return true;
WNDCLASSEX wc; WNDCLASSEXW wc;
wc.cbSize = sizeof(wc); wc.cbSize = sizeof(wc);
wc.lpszClassName = name.c_str(); wc.lpszClassName = name.c_str();
@ -157,7 +157,7 @@ bool RegWndClass(string name, WNDPROC wndProc, UINT style, HICON icon, int extra
wc.cbWndExtra = DWLP_USER + extraSize; wc.cbWndExtra = DWLP_USER + extraSize;
wc.hIconSm = 0; wc.hIconSm = 0;
if (RegisterClassEx(&wc) != 0) if (RegisterClassExW(&wc) != 0)
{ {
// If registration succeeded, add the class name into the list // If registration succeeded, add the class name into the list
ReggedWndClasses.push_back(name); ReggedWndClasses.push_back(name);
@ -167,9 +167,9 @@ bool RegWndClass(string name, WNDPROC wndProc, UINT style, HICON icon, int extra
return false; return false;
} }
void UnregWndClass(string name) void UnregWndClass(wstring name)
{ {
vector<string>::iterator it = find(ReggedWndClasses.begin(), ReggedWndClasses.end(), name); vector<wstring>::iterator it = find(ReggedWndClasses.begin(), ReggedWndClasses.end(), name);
// If the class wasn't regged, we can't unreg it :P // If the class wasn't regged, we can't unreg it :P
if (it == ReggedWndClasses.end()) if (it == ReggedWndClasses.end())
@ -178,7 +178,7 @@ void UnregWndClass(string name)
// Otherwise unreg the class and remove its name from the list // Otherwise unreg the class and remove its name from the list
// ONLY if unregging was successful. Unregging will fail if one // ONLY if unregging was successful. Unregging will fail if one
// or more windows using the class still exist. // or more windows using the class still exist.
if (UnregisterClass(name.c_str(), hAppInst) != 0) if (UnregisterClassW(name.c_str(), hAppInst) != 0)
ReggedWndClasses.erase(it); ReggedWndClasses.erase(it);
} }
@ -553,6 +553,18 @@ WINCLASS::WINCLASS(LPSTR rclass, HINSTANCE hInst)
minHeight = 0; minHeight = 0;
} }
WINCLASS::WINCLASS(LPWSTR rclass, HINSTANCE hInst)
{
wcscpy(regclassW,rclass);
hwnd = NULL;
hmenu = NULL;
hInstance = hInst;
minWidth = 0;
minHeight = 0;
}
WINCLASS::~WINCLASS() WINCLASS::~WINCLASS()
{ {
} }
@ -567,6 +579,16 @@ bool WINCLASS::create(LPSTR caption, int x, int y, int width, int height, int st
return false; return false;
} }
bool WINCLASS::createW(LPWSTR caption, int x, int y, int width, int height, int style, HMENU menu)
{
if (hwnd != NULL) return false;
hwnd = CreateWindowW(regclassW, caption, style, x, y, width, height, NULL, menu, hInstance, NULL);
if (hwnd != NULL) return true;
return false;
}
bool WINCLASS::createEx(LPSTR caption, int x, int y, int width, int height, int style, int styleEx, HMENU menu) bool WINCLASS::createEx(LPSTR caption, int x, int y, int width, int height, int style, int styleEx, HMENU menu)
{ {
if (hwnd != NULL) return false; if (hwnd != NULL) return false;

View File

@ -84,14 +84,14 @@ void MakeBitmapPseudoTransparent(HBITMAP hBmp, COLORREF cKeyColor, COLORREF cNew
// Incase the class was already registered, the function // Incase the class was already registered, the function
// just does nothing and returns true. // just does nothing and returns true.
// Returns false if registration failed. // Returns false if registration failed.
bool RegWndClass(string name, WNDPROC wndProc, UINT style, int extraSize = 0); bool RegWndClass(wstring wname, WNDPROC wndProc, UINT style, int extraSize = 0);
bool RegWndClass(string name, WNDPROC wndProc, UINT style, HICON icon, int extraSize = 0); bool RegWndClass(wstring wname, WNDPROC wndProc, UINT style, HICON icon, int extraSize = 0);
// UnregWndClass() // UnregWndClass()
// Unregisters a previously registered window class. // Unregisters a previously registered window class.
// This function will silently fail if one or more windows // This function will silently fail if one or more windows
// using the class still exist. // using the class still exist.
void UnregWndClass(string name); void UnregWndClass(wstring name);
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Base toolwindow class // Base toolwindow class
@ -228,13 +228,17 @@ private:
HMENU hmenu; HMENU hmenu;
HINSTANCE hInstance; HINSTANCE hInstance;
char regclass[256]; char regclass[256];
wchar_t regclassW[256];
int minWidth, minHeight; int minWidth, minHeight;
public: public:
WINCLASS(LPSTR rclass, HINSTANCE hInst); WINCLASS(LPSTR rclass, HINSTANCE hInst);
WINCLASS(LPWSTR rclass, HINSTANCE hInst);
~WINCLASS(); ~WINCLASS();
bool create(LPSTR caption, int x, int y, int width, int height, int style, bool create(LPSTR caption, int x, int y, int width, int height, int style,
HMENU menu); HMENU menu);
bool createW(LPWSTR caption, int x, int y, int width, int height, int style,
HMENU menu);
bool createEx(LPSTR caption, int x, int y, int width, int height, int style, int styleEx, bool createEx(LPSTR caption, int x, int y, int width, int height, int style, int styleEx,
HMENU menu); HMENU menu);

View File

@ -312,7 +312,7 @@ CIORegView::CIORegView()
CIORegView::~CIORegView() CIORegView::~CIORegView()
{ {
DestroyWindow(hWnd); DestroyWindow(hWnd);
UnregWndClass("DeSmuME_IORegView"); UnregWndClass(L"DeSmuME_IORegView");
//TODO - is this thread safe? which thread do these calls come from //TODO - is this thread safe? which thread do these calls come from
liveIORegViews.erase(std::find(liveIORegViews.begin(),liveIORegViews.end(),this)); liveIORegViews.erase(std::find(liveIORegViews.begin(),liveIORegViews.end(),this));
if(liveIORegViews.size()==0) anyLiveIORegViews = false; if(liveIORegViews.size()==0) anyLiveIORegViews = false;
@ -608,7 +608,7 @@ LRESULT CALLBACK IORegView_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar
{ {
CIORegView* wnd = (CIORegView*)GetWindowLongPtr(hWnd, DWLP_USER); CIORegView* wnd = (CIORegView*)GetWindowLongPtr(hWnd, DWLP_USER);
if ((wnd == NULL) && (uMsg != WM_CREATE)) if ((wnd == NULL) && (uMsg != WM_CREATE))
return DefWindowProc(hWnd, uMsg, wParam, lParam); return DefWindowProcW(hWnd, uMsg, wParam, lParam);
switch (uMsg) switch (uMsg)
{ {

View File

@ -251,7 +251,7 @@ BOOL CALLBACK ViewFSNitroProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
case ID_FSNITRO_VIEW: case ID_FSNITRO_VIEW:
if (currentFileID < 0xF000) if (currentFileID < 0xF000)
{ {
if (RegWndClass("MemView_ViewBox", MemView_ViewBoxProc, 0, sizeof(CMemView*))) if (RegWndClass(L"MemView_ViewBox", MemView_ViewBoxProc, 0, sizeof(CMemView*)))
OpenToolWindow(new CMemView(MEMVIEW_ROM, fs->getStartAddrById(currentFileID))); OpenToolWindow(new CMemView(MEMVIEW_ROM, fs->getStartAddrById(currentFileID)));
return TRUE; return TRUE;
} }
@ -310,7 +310,7 @@ BOOL CALLBACK ViewFSNitroProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
case NM_DBLCLK: case NM_DBLCLK:
if (currentFileID < 0xF000) if (currentFileID < 0xF000)
{ {
if (RegWndClass("MemView_ViewBox", MemView_ViewBoxProc, 0, sizeof(CMemView*))) if (RegWndClass(L"MemView_ViewBox", MemView_ViewBoxProc, 0, sizeof(CMemView*)))
OpenToolWindow(new CMemView(MEMVIEW_ROM, fs->getStartAddrById(currentFileID))); OpenToolWindow(new CMemView(MEMVIEW_ROM, fs->getStartAddrById(currentFileID)));
return TRUE; return TRUE;
} }

View File

@ -1,4 +1,4 @@
/* /*
Copyright (C) 2006 Theo Berkau Copyright (C) 2006 Theo Berkau
Copyright (C) 2006-2019 DeSmuME team Copyright (C) 2006-2019 DeSmuME team
@ -1490,7 +1490,7 @@ bool NDS_Pause(bool showMsg)
while (!paused) {} while (!paused) {}
if (showMsg) INFO("Emulation paused\n"); if (showMsg) INFO("Emulation paused\n");
SetWindowText(MainWindow->getHWnd(), "Paused"); SetWindowTextW(MainWindow->getHWnd(), L"Paused");
MainWindowToolbar->ChangeButtonBitmap(IDM_PAUSE, IDB_PLAY); MainWindowToolbar->ChangeButtonBitmap(IDM_PAUSE, IDB_PLAY);
return true; return true;
} }
@ -1978,7 +1978,7 @@ int _main()
CommonSettings.backupSave = GetPrivateProfileBool("General", "backupSave", false, IniName); CommonSettings.backupSave = GetPrivateProfileBool("General", "backupSave", false, IniName);
ColorCtrl_Register(); ColorCtrl_Register();
if (!RegWndClass("DeSmuME", WindowProcedure, CS_DBLCLKS, LoadIcon(hAppInst, MAKEINTRESOURCE(ICONDESMUME)))) if (!RegWndClass(L"DeSmuME", WindowProcedure, CS_DBLCLKS, LoadIcon(hAppInst, MAKEINTRESOURCE(ICONDESMUME))))
{ {
MessageBox(NULL, "Error registering windows class", DESMUME_NAME, MB_OK); MessageBox(NULL, "Error registering windows class", DESMUME_NAME, MB_OK);
exit(-1); exit(-1);
@ -2114,8 +2114,15 @@ int _main()
if(CommonSettings.single_core()) if(CommonSettings.single_core())
SetProcessAffinityMask(GetCurrentProcess(),1); SetProcessAffinityMask(GetCurrentProcess(),1);
MainWindow = new WINCLASS("DeSmuME", hAppInst); wchar_t boffo[256];
if (!MainWindow->create((char*)EMU_DESMUME_NAME_AND_VERSION(), WndX, WndY, video.width,video.height+video.screengap, const char* emu_desmume_name_and_version = EMU_DESMUME_NAME_AND_VERSION();
size_t len = strlen(emu_desmume_name_and_version);
for(int i=0;i<len;i++)
boffo[i] = emu_desmume_name_and_version[i];
boffo[len] = 0;
MainWindow = new WINCLASS(L"DeSmuME", hAppInst);
if (!MainWindow->createW(boffo, WndX, WndY, video.width,video.height+video.screengap,
WS_CAPTION | WS_SYSMENU | WS_SIZEBOX | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, WS_CAPTION | WS_SYSMENU | WS_SIZEBOX | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
NULL)) NULL))
{ {
@ -2607,7 +2614,7 @@ int _main()
ddraw.release(); ddraw.release();
UnregWndClass("DeSmuME"); UnregWndClass(L"DeSmuME");
return 0; return 0;
} }
@ -4996,7 +5003,7 @@ DOKEYDOWN:
return 0; return 0;
case IDM_IOREG: case IDM_IOREG:
//ViewRegisters->open(); //ViewRegisters->open();
if (!RegWndClass("DeSmuME_IORegView", IORegView_Proc, CS_DBLCLKS, LoadIcon(hAppInst, MAKEINTRESOURCE(ICONDESMUME)), sizeof(CIORegView*))) if (!RegWndClass(L"DeSmuME_IORegView", IORegView_Proc, CS_DBLCLKS, LoadIcon(hAppInst, MAKEINTRESOURCE(ICONDESMUME)), sizeof(CIORegView*)))
return 0; return 0;
OpenToolWindow(new CIORegView()); OpenToolWindow(new CIORegView());
@ -5004,7 +5011,7 @@ DOKEYDOWN:
case IDM_MEMORY: case IDM_MEMORY:
//if(!MemView_IsOpened(ARMCPU_ARM9)) MemView_DlgOpen(HWND_DESKTOP, "ARM9 memory", ARMCPU_ARM9); //if(!MemView_IsOpened(ARMCPU_ARM9)) MemView_DlgOpen(HWND_DESKTOP, "ARM9 memory", ARMCPU_ARM9);
//if(!MemView_IsOpened(ARMCPU_ARM7)) MemView_DlgOpen(HWND_DESKTOP, "ARM7 memory", ARMCPU_ARM7); //if(!MemView_IsOpened(ARMCPU_ARM7)) MemView_DlgOpen(HWND_DESKTOP, "ARM7 memory", ARMCPU_ARM7);
if (!RegWndClass("MemView_ViewBox", MemView_ViewBoxProc, 0, sizeof(CMemView*))) if (!RegWndClass(L"MemView_ViewBox", MemView_ViewBoxProc, 0, sizeof(CMemView*)))
return 0; return 0;
OpenToolWindow(new CMemView()); OpenToolWindow(new CMemView());
@ -5735,7 +5742,7 @@ DOKEYDOWN:
} }
return 0; return 0;
} }
return DefWindowProc (hwnd, message, wParam, lParam); return DefWindowProcW (hwnd, message, wParam, lParam);
} }
void Change3DCoreWithFallbackAndSave(int newCore) void Change3DCoreWithFallbackAndSave(int newCore)

View File

@ -229,7 +229,7 @@ CMemView::~CMemView()
DestroyWindow(hWnd); DestroyWindow(hWnd);
hWnd = NULL; hWnd = NULL;
UnregWndClass("MemView_ViewBox"); UnregWndClass(L"MemView_ViewBox");
} }
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
@ -1217,7 +1217,7 @@ LRESULT CALLBACK MemView_ViewBoxProc(HWND hCtl, UINT uMsg, WPARAM wParam, LPARAM
if(((ch >= '0') && (ch <= '9')) || ((ch >= 'A') && (ch <= 'F')) || ((ch >= 'a') && (ch <= 'f'))) if(((ch >= '0') && (ch <= '9')) || ((ch >= 'A') && (ch <= 'F')) || ((ch >= 'a') && (ch <= 'f')))
{ {
if (!memIsAvailable((MemRegionType)wnd->region, wnd->selAddress)) if (!memIsAvailable((MemRegionType)wnd->region, wnd->selAddress))
return DefWindowProc(hCtl, uMsg, wParam, lParam); return DefWindowProcW(hCtl, uMsg, wParam, lParam);
u8 maxSelPart[3] = {2, 4, 8}; u8 maxSelPart[3] = {2, 4, 8};
@ -1328,7 +1328,7 @@ LRESULT CALLBACK MemView_ViewBoxProc(HWND hCtl, UINT uMsg, WPARAM wParam, LPARAM
return 1; return 1;
} }
return DefWindowProc(hCtl, uMsg, wParam, lParam); return DefWindowProcW(hCtl, uMsg, wParam, lParam);
} }
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////