X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/42e69d6b435a4dd5415caf3750db62cf45b6f373..4438caf41af49f00f3c8137ac801871f59cce386:/src/msw/app.cpp diff --git a/src/msw/app.cpp b/src/msw/app.cpp index 33f10ba51a..13b1806806 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -43,12 +43,14 @@ #include "wx/msgdlg.h" #include "wx/intl.h" #include "wx/dynarray.h" + #include "wx/wxchar.h" #endif -#include "wx/msw/private.h" #include "wx/log.h" #include "wx/module.h" +#include "wx/msw/private.h" + #if wxUSE_THREADS #include "wx/thread.h" @@ -88,8 +90,8 @@ // global variables // --------------------------------------------------------------------------- -extern char *wxBuffer; -extern char *wxOsVersion; +extern wxChar *wxBuffer; +extern wxChar *wxOsVersion; extern wxList *wxWinHandleList; extern wxList WXDLLEXPORT wxPendingDelete; #if wxUSE_THREADS @@ -104,11 +106,11 @@ MSG s_currentMsg; wxApp *wxTheApp = NULL; // FIXME why not const? and not static? -char wxFrameClassName[] = "wxFrameClass"; -char wxMDIFrameClassName[] = "wxMDIFrameClass"; -char wxMDIChildFrameClassName[] = "wxMDIChildFrameClass"; -char wxPanelClassName[] = "wxPanelClass"; -char wxCanvasClassName[] = "wxCanvasClass"; +wxChar wxFrameClassName[] = _T("wxFrameClass"); +wxChar wxMDIFrameClassName[] = _T("wxMDIFrameClass"); +wxChar wxMDIChildFrameClassName[] = _T("wxMDIChildFrameClass"); +wxChar wxPanelClassName[] = _T("wxPanelClass"); +wxChar wxCanvasClassName[] = _T("wxCanvasClass"); HICON wxSTD_FRAME_ICON = (HICON) NULL; HICON wxSTD_MDICHILDFRAME_ICON = (HICON) NULL; @@ -159,12 +161,12 @@ bool wxApp::Initialize() // wxRedirectIOToConsole(); #endif - wxBuffer = new char[1500]; // FIXME + wxBuffer = new wxChar[1500]; // FIXME wxClassInfo::InitializeClasses(); #if wxUSE_RESOURCES - wxGetResource("wxWindows", "OsVersion", &wxOsVersion); + wxGetResource(_T("wxWindows"), _T("OsVersion"), &wxOsVersion); #endif // I'm annoyed ... I don't know where to put this and I don't want to @@ -190,7 +192,7 @@ bool wxApp::Initialize() InitCommonControls(); #if wxUSE_RICHEDIT - gs_hRichEdit = LoadLibrary("RICHED32.DLL"); + gs_hRichEdit = LoadLibrary(_T("RICHED32.DLL")); if (gs_hRichEdit == (HINSTANCE) NULL) { @@ -212,20 +214,20 @@ bool wxApp::Initialize() #if wxUSE_CTL3D if (!Ctl3dRegister(wxhInstance)) - wxLogError("Cannot register CTL3D"); + wxLogError(_T("Cannot register CTL3D")); Ctl3dAutoSubclass(wxhInstance); #endif g_globalCursor = new wxCursor; - wxSTD_FRAME_ICON = LoadIcon(wxhInstance, "wxSTD_FRAME"); - wxSTD_MDIPARENTFRAME_ICON = LoadIcon(wxhInstance, "wxSTD_MDIPARENTFRAME"); - wxSTD_MDICHILDFRAME_ICON = LoadIcon(wxhInstance, "wxSTD_MDICHILDFRAME"); + wxSTD_FRAME_ICON = LoadIcon(wxhInstance, _T("wxSTD_FRAME")); + wxSTD_MDIPARENTFRAME_ICON = LoadIcon(wxhInstance, _T("wxSTD_MDIPARENTFRAME")); + wxSTD_MDICHILDFRAME_ICON = LoadIcon(wxhInstance, _T("wxSTD_MDICHILDFRAME")); - wxDEFAULT_FRAME_ICON = LoadIcon(wxhInstance, "wxDEFAULT_FRAME"); - wxDEFAULT_MDIPARENTFRAME_ICON = LoadIcon(wxhInstance, "wxDEFAULT_MDIPARENTFRAME"); - wxDEFAULT_MDICHILDFRAME_ICON = LoadIcon(wxhInstance, "wxDEFAULT_MDICHILDFRAME"); + wxDEFAULT_FRAME_ICON = LoadIcon(wxhInstance, _T("wxDEFAULT_FRAME")); + wxDEFAULT_MDIPARENTFRAME_ICON = LoadIcon(wxhInstance, _T("wxDEFAULT_MDIPARENTFRAME")); + wxDEFAULT_MDICHILDFRAME_ICON = LoadIcon(wxhInstance, _T("wxDEFAULT_MDICHILDFRAME")); RegisterWindowClasses(); @@ -233,9 +235,13 @@ bool wxApp::Initialize() LOGBRUSH lb; lb.lbStyle = BS_PATTERN; - lb.lbHatch = (int)LoadBitmap( wxhInstance, "wxDISABLE_BUTTON_BITMAP" ); - wxDisableButtonBrush = ::CreateBrushIndirect( & lb ); - ::DeleteObject( (HGDIOBJ)lb.lbHatch ); + lb.lbHatch = (int)LoadBitmap( wxhInstance, _T("wxDISABLE_BUTTON_BITMAP") ); + if ( lb.lbHatch ) + { + wxDisableButtonBrush = ::CreateBrushIndirect( & lb ); + ::DeleteObject( (HGDIOBJ)lb.lbHatch ); + } + //else: wxWindows resources are probably not linked in #if wxUSE_PENWINDOWS wxRegisterPenWin(); @@ -349,13 +355,13 @@ void wxApp::ConvertToStandardCommandArgs(char* lpCmdLine) int count = 0; // Get application name - char name[260]; // 260 is MAX_PATH value from windef.h + wxChar name[260]; // 260 is MAX_PATH value from windef.h ::GetModuleFileName(wxhInstance, name, WXSIZEOF(name)); args.Add(name); count++; - strcpy(name, wxFileNameFromPath(name)); + wxStrcpy(name, wxFileNameFromPath(name)); wxStripExtension(name); wxTheApp->SetAppName(name); @@ -366,16 +372,16 @@ void wxApp::ConvertToStandardCommandArgs(char* lpCmdLine) while (i < len) { // Skip whitespace - while ((i < len) && isspace(cmdLine.GetChar(i))) + while ((i < len) && wxIsspace(cmdLine.GetChar(i))) i ++; if (i < len) { - if (cmdLine.GetChar(i) == '"') // We found the start of a string + if (cmdLine.GetChar(i) == _T('"')) // We found the start of a string { i ++; int first = i; - while ((i < len) && (cmdLine.GetChar(i) != '"')) + while ((i < len) && (cmdLine.GetChar(i) != _T('"'))) i ++; wxString arg(cmdLine.Mid(first, (i - first))); @@ -389,7 +395,7 @@ void wxApp::ConvertToStandardCommandArgs(char* lpCmdLine) else // Unquoted argument { int first = i; - while ((i < len) && !isspace(cmdLine.GetChar(i))) + while ((i < len) && !wxIsspace(cmdLine.GetChar(i))) i ++; wxString arg(cmdLine.Mid(first, (i - first))); @@ -400,11 +406,11 @@ void wxApp::ConvertToStandardCommandArgs(char* lpCmdLine) } } - wxTheApp->argv = new char*[count + 1]; + wxTheApp->argv = new wxChar*[count + 1]; for (i = 0; i < count; i++) { wxString arg(args[i]); - wxTheApp->argv[i] = copystring((const char*)arg); + wxTheApp->argv[i] = copystring((const wxChar*)arg); } wxTheApp->argv[count] = NULL; // argv[] is a NULL-terminated list wxTheApp->argc = count; @@ -416,6 +422,7 @@ void wxApp::CleanUp() { //// COMMON CLEANUP +#if wxUSE_LOG // flush the logged messages if any and install a 'safer' log target: the // default one (wxLogGui) can't be used after the resources are freed just // below and the user suppliedo ne might be even more unsafe (using any @@ -424,6 +431,7 @@ void wxApp::CleanUp() // this will flush the old messages if any delete wxLog::SetActiveTarget(new wxLogStderr); +#endif // wxUSE_LOG // One last chance for pending objects to be cleaned up wxTheApp->DeletePendingObjects(); @@ -522,15 +530,17 @@ void wxApp::CleanUp() // wxDebugContext, too. if (wxDebugContext::CountObjectsLeft(TRUE) > 0) { - wxLogDebug("There were memory leaks."); + wxLogDebug(_T("There were memory leaks.")); wxDebugContext::Dump(); wxDebugContext::PrintStatistics(); } // wxDebugContext::SetStream(NULL, NULL); #endif +#if wxUSE_LOG // do it as the very last thing because everything else can log messages delete wxLog::SetActiveTarget(NULL); +#endif // wxUSE_LOG } #if !defined(_WINDLL) || (defined(_WINDLL) && defined(WXMAKINGDLL)) @@ -577,12 +587,12 @@ int wxEntry(WXHINSTANCE hInstance, // the IMPLEMENT_APP macro is used instead, which sets an initializer // function for delayed, dynamic app object construction. wxCHECK_MSG( wxApp::GetInitializerFunction(), 0, - "No initializer - use IMPLEMENT_APP macro." ); + _T("No initializer - use IMPLEMENT_APP macro.") ); wxTheApp = (*wxApp::GetInitializerFunction()) (); } - wxCHECK_MSG( wxTheApp, 0, "You have to define an instance of wxApp!" ); + wxCHECK_MSG( wxTheApp, 0, _T("You have to define an instance of wxApp!") ); // save the WinMain() parameters wxTheApp->ConvertToStandardCommandArgs(lpCmdLine); @@ -760,7 +770,7 @@ bool wxApp::DoMessage() { #if wxUSE_THREADS wxASSERT_MSG( wxThread::IsMain(), - "only the main thread can process Windows messages" ); + _T("only the main thread can process Windows messages") ); static bool s_hadGuiLock = TRUE; static wxMsgArray s_aSavedMessages; @@ -913,6 +923,15 @@ bool wxApp::ProcessMessage(WXMSG *wxmsg) HWND hWnd = msg->hwnd; wxWindow *wndThis = wxFindWinFromHandle((WXHWND)hWnd), *wnd; + // for some composite controls (like a combobox), wndThis might be NULL + // because the subcontrol is not a wxWindow, but only the control itself + // is - try to catch this case + while ( hWnd && !wndThis ) + { + hWnd = ::GetParent(hWnd); + wndThis = wxFindWinFromHandle((WXHWND)hWnd); + } + // Try translations first; find the youngest window with // a translation table. for ( wnd = wndThis; wnd; wnd = wnd->GetParent() ) @@ -944,10 +963,12 @@ void wxApp::OnIdle(wxIdleEvent& event) // 'Garbage' collection of windows deleted with Close(). DeletePendingObjects(); +#if wxUSE_LOG // flush the logged messages if any wxLog *pLog = wxLog::GetActiveTarget(); if ( pLog != NULL && pLog->HasPendingMessages() ) pLog->Flush(); +#endif // wxUSE_LOG // Send OnIdle events to all windows if ( SendIdleEvents() ) @@ -1058,7 +1079,7 @@ wxWindow* wxApp::GetTopWindow() const int wxApp::GetComCtl32Version() const { // have we loaded COMCTL32 yet? - HMODULE theModule = ::GetModuleHandle("COMCTL32"); + HMODULE theModule = ::GetModuleHandle(_T("COMCTL32")); int version = 0; // if so, then we can check for the version @@ -1111,7 +1132,11 @@ bool wxYield() MSG msg; // We want to go back to the main message loop // if we see a WM_QUIT. (?) +#ifdef __WXWINE__ + while (PeekMessage(&msg, (HWND)NULL, 0, 0, PM_NOREMOVE) && msg.message != WM_QUIT) +#else while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) && msg.message != WM_QUIT) +#endif { if ( !wxTheApp->DoMessage() ) break;