Merge branch 'safe-show-message'
Show message box from wxSafeShowMessage() in the other ports too, if possible. Currently this is done using wxMessageBox() if it can be sure that it's safe to call and only MSW uses native function which is always safe to call. Ideal would be to also use a native function under Mac, where it should also be the case, but this doesn't seem to work for whichever reason. See https://github.com/wxWidgets/wxWidgets/pull/2270
This commit is contained in:
@@ -622,6 +622,10 @@ public:
|
|||||||
// there are none, will return NULL)
|
// there are none, will return NULL)
|
||||||
virtual wxWindow *GetTopWindow() const;
|
virtual wxWindow *GetTopWindow() const;
|
||||||
|
|
||||||
|
// convenient helper which is safe to use even if there is no wxApp at
|
||||||
|
// all, it will just return NULL in this case
|
||||||
|
static wxWindow *GetMainTopWindow();
|
||||||
|
|
||||||
// control the exit behaviour: by default, the program will exit the
|
// control the exit behaviour: by default, the program will exit the
|
||||||
// main loop (and so, usually, terminate) when the last top-level
|
// main loop (and so, usually, terminate) when the last top-level
|
||||||
// program window is deleted. Beware that if you disable this behaviour
|
// program window is deleted. Beware that if you disable this behaviour
|
||||||
|
@@ -88,6 +88,16 @@ public:
|
|||||||
// return true to suppress subsequent asserts, false to continue as before
|
// return true to suppress subsequent asserts, false to continue as before
|
||||||
virtual bool ShowAssertDialog(const wxString& msg) = 0;
|
virtual bool ShowAssertDialog(const wxString& msg) = 0;
|
||||||
|
|
||||||
|
// show the message safely to the user, i.e. show it in a message box if
|
||||||
|
// possible (even in a console application!) or return false if we can't do
|
||||||
|
// it (e.g. GUI is not initialized at all)
|
||||||
|
//
|
||||||
|
// note that this function can be called even when wxApp doesn't exist, as
|
||||||
|
// it's supposed to be always safe to call -- hence the name
|
||||||
|
//
|
||||||
|
// return true if the message box was shown, false if nothing was done
|
||||||
|
virtual bool SafeMessageBox(const wxString& text, const wxString& title) = 0;
|
||||||
|
|
||||||
// return true if fprintf(stderr) goes somewhere, false otherwise
|
// return true if fprintf(stderr) goes somewhere, false otherwise
|
||||||
virtual bool HasStderr() = 0;
|
virtual bool HasStderr() = 0;
|
||||||
|
|
||||||
@@ -208,6 +218,8 @@ public:
|
|||||||
|
|
||||||
virtual bool ShowAssertDialog(const wxString& msg) wxOVERRIDE;
|
virtual bool ShowAssertDialog(const wxString& msg) wxOVERRIDE;
|
||||||
virtual bool HasStderr() wxOVERRIDE;
|
virtual bool HasStderr() wxOVERRIDE;
|
||||||
|
virtual bool SafeMessageBox(const wxString& text,
|
||||||
|
const wxString& title) wxOVERRIDE;
|
||||||
|
|
||||||
// the GetToolkitVersion for console application is always the same
|
// the GetToolkitVersion for console application is always the same
|
||||||
wxPortId GetToolkitVersion(int *verMaj = NULL,
|
wxPortId GetToolkitVersion(int *verMaj = NULL,
|
||||||
@@ -248,6 +260,13 @@ public:
|
|||||||
virtual bool ShowAssertDialog(const wxString& msg) wxOVERRIDE;
|
virtual bool ShowAssertDialog(const wxString& msg) wxOVERRIDE;
|
||||||
virtual bool HasStderr() wxOVERRIDE;
|
virtual bool HasStderr() wxOVERRIDE;
|
||||||
|
|
||||||
|
// Win32 has its own implementation using native message box directly in
|
||||||
|
// the base class, don't override it.
|
||||||
|
#ifndef __WIN32__
|
||||||
|
virtual bool SafeMessageBox(const wxString& text,
|
||||||
|
const wxString& title) wxOVERRIDE;
|
||||||
|
#endif // !__WIN32__
|
||||||
|
|
||||||
virtual bool IsUsingUniversalWidgets() const wxOVERRIDE
|
virtual bool IsUsingUniversalWidgets() const wxOVERRIDE
|
||||||
{
|
{
|
||||||
#ifdef __WXUNIVERSAL__
|
#ifdef __WXUNIVERSAL__
|
||||||
|
@@ -1459,7 +1459,7 @@ inline void wxLogNop() { }
|
|||||||
|
|
||||||
// wxLogFatalError helper: show the (fatal) error to the user in a safe way,
|
// wxLogFatalError helper: show the (fatal) error to the user in a safe way,
|
||||||
// i.e. without using wxMessageBox() for example because it could crash
|
// i.e. without using wxMessageBox() for example because it could crash
|
||||||
void WXDLLIMPEXP_BASE
|
bool WXDLLIMPEXP_BASE
|
||||||
wxSafeShowMessage(const wxString& title, const wxString& text);
|
wxSafeShowMessage(const wxString& title, const wxString& text);
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@@ -58,6 +58,13 @@ public:
|
|||||||
// write text to the console, return true if ok or false on error
|
// write text to the console, return true if ok or false on error
|
||||||
virtual bool WriteToStderr(const wxString& text) = 0;
|
virtual bool WriteToStderr(const wxString& text) = 0;
|
||||||
|
|
||||||
|
// return the main application window or 0 if none
|
||||||
|
virtual WXHWND GetMainHWND() const = 0;
|
||||||
|
|
||||||
|
// implement this base class function for both console and GUI applications
|
||||||
|
virtual bool SafeMessageBox(const wxString& text,
|
||||||
|
const wxString& title) wxOVERRIDE;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
#if wxUSE_THREADS
|
#if wxUSE_THREADS
|
||||||
// implementation of WaitForThread() for the console applications which is
|
// implementation of WaitForThread() for the console applications which is
|
||||||
|
@@ -30,6 +30,7 @@ public:
|
|||||||
#endif // wxUSE_THREADS
|
#endif // wxUSE_THREADS
|
||||||
virtual bool CanUseStderr() wxOVERRIDE { return true; }
|
virtual bool CanUseStderr() wxOVERRIDE { return true; }
|
||||||
virtual bool WriteToStderr(const wxString& text) wxOVERRIDE;
|
virtual bool WriteToStderr(const wxString& text) wxOVERRIDE;
|
||||||
|
virtual WXHWND GetMainHWND() const wxOVERRIDE { return NULL; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#if wxUSE_GUI
|
#if wxUSE_GUI
|
||||||
@@ -55,6 +56,7 @@ public:
|
|||||||
|
|
||||||
virtual bool CanUseStderr() wxOVERRIDE;
|
virtual bool CanUseStderr() wxOVERRIDE;
|
||||||
virtual bool WriteToStderr(const wxString& text) wxOVERRIDE;
|
virtual bool WriteToStderr(const wxString& text) wxOVERRIDE;
|
||||||
|
virtual WXHWND GetMainHWND() const wxOVERRIDE;
|
||||||
};
|
};
|
||||||
|
|
||||||
#elif defined(__WXGTK__)
|
#elif defined(__WXGTK__)
|
||||||
@@ -85,6 +87,7 @@ public:
|
|||||||
|
|
||||||
virtual bool CanUseStderr() { return false; }
|
virtual bool CanUseStderr() { return false; }
|
||||||
virtual bool WriteToStderr(const wxString& WXUNUSED(text)) { return false; }
|
virtual bool WriteToStderr(const wxString& WXUNUSED(text)) { return false; }
|
||||||
|
virtual WXHWND GetMainHWND() const wxOVERRIDE { return NULL; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#elif defined(__WXQT__)
|
#elif defined(__WXQT__)
|
||||||
@@ -110,6 +113,7 @@ public:
|
|||||||
|
|
||||||
virtual bool CanUseStderr() { return false; }
|
virtual bool CanUseStderr() { return false; }
|
||||||
virtual bool WriteToStderr(const wxString&) { return false; }
|
virtual bool WriteToStderr(const wxString&) { return false; }
|
||||||
|
virtual WXHWND GetMainHWND() const wxOVERRIDE { return NULL; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -859,6 +859,18 @@ public:
|
|||||||
*/
|
*/
|
||||||
bool GetUseBestVisual() const;
|
bool GetUseBestVisual() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns a pointer to the top application window if any.
|
||||||
|
|
||||||
|
This function is safe to call even before creating, or after
|
||||||
|
destroying, the application object, as it simply returns @NULL if it
|
||||||
|
doesn't exist. Otherwise it's equivalent to calling
|
||||||
|
@c wxTheApp->GetTopWindow().
|
||||||
|
|
||||||
|
@since 3.1.5
|
||||||
|
*/
|
||||||
|
static wxWindow* GetMainTopWindow();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns a pointer to the top window.
|
Returns a pointer to the top window.
|
||||||
|
|
||||||
|
@@ -133,5 +133,28 @@ public:
|
|||||||
Returns @true to suppress subsequent asserts, @false to continue as before.
|
Returns @true to suppress subsequent asserts, @false to continue as before.
|
||||||
*/
|
*/
|
||||||
virtual bool ShowAssertDialog(const wxString& msg) = 0;
|
virtual bool ShowAssertDialog(const wxString& msg) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Shows a message box with the given text and title if possible.
|
||||||
|
|
||||||
|
In some ports, e.g. wxMSW, a message box will always be shown, while in
|
||||||
|
the other ones it will be only done if the GUI is available (e.g. X11
|
||||||
|
display was successfully opened for X11-based ports) and the function
|
||||||
|
simply returns @false without doing anything otherwise.
|
||||||
|
|
||||||
|
This function is safe in the sense that it can always be called, even
|
||||||
|
before creating wxApp, similarly to wxSafeShowMessage() which is
|
||||||
|
implemented by calling this function and then logging the message to
|
||||||
|
standard error stream if it returned @false.
|
||||||
|
|
||||||
|
@since 3.1.5
|
||||||
|
|
||||||
|
@param text
|
||||||
|
The text to show to the user.
|
||||||
|
@param title
|
||||||
|
The title of the message box shown to the user.
|
||||||
|
@return @true if the message box was shown or @false otherwise.
|
||||||
|
*/
|
||||||
|
virtual bool SafeMessageBox(const wxString& text, const wxString& title) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -1268,12 +1268,17 @@ public:
|
|||||||
message string.
|
message string.
|
||||||
@param text
|
@param text
|
||||||
The text to show to the user.
|
The text to show to the user.
|
||||||
|
@return
|
||||||
|
@true If a message box was actually shown or @false if the message was
|
||||||
|
logged to the console because there is no safe to show it currently
|
||||||
|
(the return value is only available since wxWidgets 3.1.5, the function
|
||||||
|
doesn't return anything in the previous versions).
|
||||||
|
|
||||||
@see wxLogFatalError()
|
@see wxLogFatalError()
|
||||||
|
|
||||||
@header{wx/log.h}
|
@header{wx/log.h}
|
||||||
*/
|
*/
|
||||||
void wxSafeShowMessage(const wxString& title, const wxString& text);
|
bool wxSafeShowMessage(const wxString& title, const wxString& text);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns the error code from the last system call. This function uses
|
Returns the error code from the last system call. This function uses
|
||||||
|
@@ -358,7 +358,7 @@ wxAppTraits *wxAppConsoleBase::GetTraitsIfExists()
|
|||||||
wxAppTraits& wxAppConsoleBase::GetValidTraits()
|
wxAppTraits& wxAppConsoleBase::GetValidTraits()
|
||||||
{
|
{
|
||||||
static wxConsoleAppTraits s_traitsConsole;
|
static wxConsoleAppTraits s_traitsConsole;
|
||||||
wxAppTraits* const traits = (wxTheApp ? wxTheApp->GetTraits() : NULL);
|
wxAppTraits* const traits = GetTraitsIfExists();
|
||||||
|
|
||||||
return *(traits ? traits : &s_traitsConsole);
|
return *(traits ? traits : &s_traitsConsole);
|
||||||
}
|
}
|
||||||
@@ -944,6 +944,14 @@ bool wxConsoleAppTraitsBase::HasStderr()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool wxConsoleAppTraitsBase::SafeMessageBox(const wxString& WXUNUSED(text),
|
||||||
|
const wxString& WXUNUSED(title))
|
||||||
|
{
|
||||||
|
// console applications don't show message boxes by default, although this
|
||||||
|
// can be done in platform-specific cases
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxAppTraits
|
// wxAppTraits
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@@ -25,6 +25,7 @@
|
|||||||
#include "wx/window.h"
|
#include "wx/window.h"
|
||||||
#include "wx/bitmap.h"
|
#include "wx/bitmap.h"
|
||||||
#include "wx/log.h"
|
#include "wx/log.h"
|
||||||
|
#include "wx/module.h"
|
||||||
#include "wx/msgdlg.h"
|
#include "wx/msgdlg.h"
|
||||||
#include "wx/confbase.h"
|
#include "wx/confbase.h"
|
||||||
#include "wx/utils.h"
|
#include "wx/utils.h"
|
||||||
@@ -189,6 +190,14 @@ wxWindow* wxAppBase::GetTopWindow() const
|
|||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* static */
|
||||||
|
wxWindow* wxAppBase::GetMainTopWindow()
|
||||||
|
{
|
||||||
|
const wxAppBase* const app = static_cast<wxAppBase*>(GetInstance());
|
||||||
|
|
||||||
|
return app ? app->GetTopWindow() : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
wxVideoMode wxAppBase::GetDisplayMode() const
|
wxVideoMode wxAppBase::GetDisplayMode() const
|
||||||
{
|
{
|
||||||
return wxVideoMode();
|
return wxVideoMode();
|
||||||
@@ -576,3 +585,21 @@ bool wxGUIAppTraitsBase::HasStderr()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef __WIN32__
|
||||||
|
|
||||||
|
bool wxGUIAppTraitsBase::SafeMessageBox(const wxString& text,
|
||||||
|
const wxString& title)
|
||||||
|
{
|
||||||
|
// The modules are initialized only after a successful call to
|
||||||
|
// wxApp::Initialize() in wxEntryStart, so it can be used as a proxy for
|
||||||
|
// GUI availability (note that the mere existence of wxTheApp is not enough
|
||||||
|
// for this).
|
||||||
|
if ( !wxModule::AreInitialized() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
wxMessageBox(text, title, wxOK | wxICON_ERROR);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // !__WIN32__
|
||||||
|
@@ -1430,9 +1430,8 @@ wxString wxCmdLineParser::GetUsageString() const
|
|||||||
count = namesOptions.size();
|
count = namesOptions.size();
|
||||||
|
|
||||||
// get option names & descriptions for standard options, if any:
|
// get option names & descriptions for standard options, if any:
|
||||||
wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
|
|
||||||
wxString stdDesc;
|
wxString stdDesc;
|
||||||
if ( traits )
|
if ( wxAppTraits *traits = wxApp::GetTraitsIfExists() )
|
||||||
stdDesc = traits->GetStandardCmdLineOptions(namesOptions, descOptions);
|
stdDesc = traits->GetStandardCmdLineOptions(namesOptions, descOptions);
|
||||||
|
|
||||||
// now construct the detailed help message
|
// now construct the detailed help message
|
||||||
|
@@ -98,7 +98,7 @@ wxConfigBase *wxConfigBase::Set(wxConfigBase *pConfig)
|
|||||||
wxConfigBase *wxConfigBase::Create()
|
wxConfigBase *wxConfigBase::Create()
|
||||||
{
|
{
|
||||||
if ( ms_bAutoCreate && ms_pConfig == NULL ) {
|
if ( ms_bAutoCreate && ms_pConfig == NULL ) {
|
||||||
wxAppTraits * const traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
|
wxAppTraits * const traits = wxApp::GetTraitsIfExists();
|
||||||
wxCHECK_MSG( traits, NULL, wxT("create wxApp before calling this") );
|
wxCHECK_MSG( traits, NULL, wxT("create wxApp before calling this") );
|
||||||
|
|
||||||
ms_pConfig = traits->CreateConfig();
|
ms_pConfig = traits->CreateConfig();
|
||||||
|
@@ -183,8 +183,8 @@ wxDialogBase::GetParentForModalDialog(wxWindow *parent, long style) const
|
|||||||
wxGetTopLevelParent(wxGetActiveWindow()));
|
wxGetTopLevelParent(wxGetActiveWindow()));
|
||||||
|
|
||||||
// and finally the application main window
|
// and finally the application main window
|
||||||
if ( !parent && wxTheApp )
|
if ( !parent )
|
||||||
parent = CheckIfCanBeUsedAsParent(wxTheApp->GetTopWindow());
|
parent = CheckIfCanBeUsedAsParent(wxApp::GetMainTopWindow());
|
||||||
|
|
||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
|
@@ -413,7 +413,7 @@ wxFontMapperBase *wxFontMapperBase::Get()
|
|||||||
{
|
{
|
||||||
if ( !sm_instance )
|
if ( !sm_instance )
|
||||||
{
|
{
|
||||||
wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
|
wxAppTraits *traits = wxApp::GetTraitsIfExists();
|
||||||
if ( traits )
|
if ( traits )
|
||||||
{
|
{
|
||||||
sm_instance = traits->CreateFontMapper();
|
sm_instance = traits->CreateFontMapper();
|
||||||
|
@@ -264,7 +264,7 @@ wxIcon wxIconBundle::GetIcon(const wxSize& size, int flags) const
|
|||||||
sysY = 0;
|
sysY = 0;
|
||||||
if ( flags & FALLBACK_SYSTEM )
|
if ( flags & FALLBACK_SYSTEM )
|
||||||
{
|
{
|
||||||
wxWindow* win = wxTheApp ? wxTheApp->GetTopWindow() : NULL;
|
wxWindow* win = wxApp::GetMainTopWindow();
|
||||||
sysX = wxSystemSettings::GetMetric(wxSYS_ICON_X, win);
|
sysX = wxSystemSettings::GetMetric(wxSYS_ICON_X, win);
|
||||||
sysY = wxSystemSettings::GetMetric(wxSYS_ICON_Y, win);
|
sysY = wxSystemSettings::GetMetric(wxSYS_ICON_Y, win);
|
||||||
}
|
}
|
||||||
|
@@ -180,14 +180,17 @@ private:
|
|||||||
// helper global functions
|
// helper global functions
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
void wxSafeShowMessage(const wxString& title, const wxString& text)
|
bool wxSafeShowMessage(const wxString& title, const wxString& text)
|
||||||
{
|
{
|
||||||
#ifdef __WINDOWS__
|
if ( !wxApp::GetValidTraits().SafeMessageBox(text, title) )
|
||||||
::MessageBox(NULL, text.t_str(), title.t_str(), MB_OK | MB_ICONSTOP);
|
{
|
||||||
#else
|
wxFprintf(stderr, wxS("%s: %s\n"), title.c_str(), text.c_str());
|
||||||
wxFprintf(stderr, wxS("%s: %s\n"), title.c_str(), text.c_str());
|
fflush(stderr);
|
||||||
fflush(stderr);
|
return false;
|
||||||
#endif
|
}
|
||||||
|
|
||||||
|
// Message box actually shown.
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -892,7 +895,7 @@ void wxLogStderr::DoLogText(const wxString& msg)
|
|||||||
// simply lost
|
// simply lost
|
||||||
if ( m_fp == stderr )
|
if ( m_fp == stderr )
|
||||||
{
|
{
|
||||||
wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
|
wxAppTraits *traits = wxApp::GetTraitsIfExists();
|
||||||
if ( traits && !traits->HasStderr() )
|
if ( traits && !traits->HasStderr() )
|
||||||
{
|
{
|
||||||
wxMessageOutputDebug().Output(msg + wxS('\n'));
|
wxMessageOutputDebug().Output(msg + wxS('\n'));
|
||||||
|
@@ -105,7 +105,7 @@ void wxMessageOutputBest::Output(const wxString& str)
|
|||||||
{
|
{
|
||||||
#ifdef __WINDOWS__
|
#ifdef __WINDOWS__
|
||||||
// decide whether to use console output or not
|
// decide whether to use console output or not
|
||||||
wxAppTraits * const traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
|
wxAppTraits * const traits = wxApp::GetTraitsIfExists();
|
||||||
const bool hasStderr = traits ? traits->CanUseStderr() : false;
|
const bool hasStderr = traits ? traits->CanUseStderr() : false;
|
||||||
|
|
||||||
if ( !(m_flags & wxMSGOUT_PREFER_MSGBOX) )
|
if ( !(m_flags & wxMSGOUT_PREFER_MSGBOX) )
|
||||||
|
@@ -174,7 +174,7 @@ void wxPlatformInfo::InitForCurrentPlatform()
|
|||||||
m_initializedForCurrentPlatform = true;
|
m_initializedForCurrentPlatform = true;
|
||||||
|
|
||||||
// autodetect all informations
|
// autodetect all informations
|
||||||
const wxAppTraits * const traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
|
const wxAppTraits * const traits = wxApp::GetTraitsIfExists();
|
||||||
if ( !traits )
|
if ( !traits )
|
||||||
{
|
{
|
||||||
wxFAIL_MSG( wxT("failed to initialize wxPlatformInfo") );
|
wxFAIL_MSG( wxT("failed to initialize wxPlatformInfo") );
|
||||||
|
@@ -65,8 +65,7 @@ private:
|
|||||||
|
|
||||||
void DoInit()
|
void DoInit()
|
||||||
{
|
{
|
||||||
wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
|
if ( wxAppTraits *traits = wxApp::GetTraitsIfExists() )
|
||||||
if ( traits )
|
|
||||||
{
|
{
|
||||||
// ask the traits object to create a renderer for us
|
// ask the traits object to create a renderer for us
|
||||||
reset(traits->CreateRenderer());
|
reset(traits->CreateRenderer());
|
||||||
|
@@ -104,7 +104,7 @@ float wxSizerFlags::DoGetDefaultBorderInPx()
|
|||||||
// We also have to use the DPI for the monitor showing the top window here
|
// We also have to use the DPI for the monitor showing the top window here
|
||||||
// as we don't have any associated window -- but, again, without changes
|
// as we don't have any associated window -- but, again, without changes
|
||||||
// in the API, there is nothing we can do about this.
|
// in the API, there is nothing we can do about this.
|
||||||
const wxWindow* const win = wxTheApp ? wxTheApp->GetTopWindow() : NULL;
|
const wxWindow* const win = wxApp::GetMainTopWindow();
|
||||||
static wxPrivate::DpiDependentValue<float> s_defaultBorderInPx;
|
static wxPrivate::DpiDependentValue<float> s_defaultBorderInPx;
|
||||||
if ( s_defaultBorderInPx.HasChanged(win) )
|
if ( s_defaultBorderInPx.HasChanged(win) )
|
||||||
{
|
{
|
||||||
|
@@ -55,7 +55,7 @@ static wxStandardPathsDefault gs_stdPaths;
|
|||||||
/* static */
|
/* static */
|
||||||
wxStandardPaths& wxStandardPathsBase::Get()
|
wxStandardPaths& wxStandardPathsBase::Get()
|
||||||
{
|
{
|
||||||
wxAppTraits * const traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
|
wxAppTraits * const traits = wxApp::GetTraitsIfExists();
|
||||||
wxCHECK_MSG( traits, gs_stdPaths, wxT("create wxApp before calling this") );
|
wxCHECK_MSG( traits, gs_stdPaths, wxT("create wxApp before calling this") );
|
||||||
|
|
||||||
return traits->GetStandardPaths();
|
return traits->GetStandardPaths();
|
||||||
|
@@ -54,7 +54,7 @@ wxTimer::~wxTimer()
|
|||||||
|
|
||||||
void wxTimer::Init()
|
void wxTimer::Init()
|
||||||
{
|
{
|
||||||
wxAppTraits * const traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
|
wxAppTraits * const traits = wxApp::GetTraitsIfExists();
|
||||||
m_impl = traits ? traits->CreateTimerImpl(this) : NULL;
|
m_impl = traits ? traits->CreateTimerImpl(this) : NULL;
|
||||||
if ( !m_impl )
|
if ( !m_impl )
|
||||||
{
|
{
|
||||||
|
@@ -81,10 +81,10 @@ wxString wxAboutDialogInfo::GetDescriptionAndCredits() const
|
|||||||
wxIcon wxAboutDialogInfo::GetIcon() const
|
wxIcon wxAboutDialogInfo::GetIcon() const
|
||||||
{
|
{
|
||||||
wxIcon icon = m_icon;
|
wxIcon icon = m_icon;
|
||||||
if ( !icon.IsOk() && wxTheApp )
|
if ( !icon.IsOk() )
|
||||||
{
|
{
|
||||||
const wxTopLevelWindow * const
|
const wxTopLevelWindow * const
|
||||||
tlw = wxDynamicCast(wxTheApp->GetTopWindow(), wxTopLevelWindow);
|
tlw = wxDynamicCast(wxApp::GetMainTopWindow(), wxTopLevelWindow);
|
||||||
if ( tlw )
|
if ( tlw )
|
||||||
icon = tlw->GetIcon();
|
icon = tlw->GetIcon();
|
||||||
}
|
}
|
||||||
|
@@ -691,8 +691,8 @@ TAG_HANDLER_BEGIN(IMG, "IMG,MAP,AREA")
|
|||||||
#if defined(__WXOSX_COCOA__)
|
#if defined(__WXOSX_COCOA__)
|
||||||
// Try to find a 2x resolution image with @2x appended before the file extension.
|
// Try to find a 2x resolution image with @2x appended before the file extension.
|
||||||
wxWindow* win = m_WParser->GetWindowInterface() ? m_WParser->GetWindowInterface()->GetHTMLWindow() : NULL;
|
wxWindow* win = m_WParser->GetWindowInterface() ? m_WParser->GetWindowInterface()->GetHTMLWindow() : NULL;
|
||||||
if (!win && wxTheApp)
|
if (!win)
|
||||||
win = wxTheApp->GetTopWindow();
|
win = wxApp::GetMainTopWindow();
|
||||||
if (win && win->GetContentScaleFactor() > 1.0)
|
if (win && win->GetContentScaleFactor() > 1.0)
|
||||||
{
|
{
|
||||||
if (tmp.Find('.') != wxNOT_FOUND)
|
if (tmp.Find('.') != wxNOT_FOUND)
|
||||||
|
@@ -603,6 +603,12 @@ bool wxGUIAppTraits::WriteToStderr(const wxString& WXUNUSED(text))
|
|||||||
|
|
||||||
#endif // wxUSE_DYNLIB_CLASS/!wxUSE_DYNLIB_CLASS
|
#endif // wxUSE_DYNLIB_CLASS/!wxUSE_DYNLIB_CLASS
|
||||||
|
|
||||||
|
WXHWND wxGUIAppTraits::GetMainHWND() const
|
||||||
|
{
|
||||||
|
const wxWindow* const w = wxApp::GetMainTopWindow();
|
||||||
|
return w ? w->GetHWND() : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
// wxApp implementation
|
// wxApp implementation
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
|
@@ -326,7 +326,7 @@ wxBitmap wxWindowsArtProvider::CreateBitmap(const wxArtID& id,
|
|||||||
/*static*/
|
/*static*/
|
||||||
wxSize wxArtProvider::GetNativeSizeHint(const wxArtClient& client)
|
wxSize wxArtProvider::GetNativeSizeHint(const wxArtClient& client)
|
||||||
{
|
{
|
||||||
const wxWindow* win = wxTheApp ? wxTheApp->GetTopWindow() : NULL;
|
const wxWindow* win = wxApp::GetMainTopWindow();
|
||||||
if ( client == wxART_TOOLBAR )
|
if ( client == wxART_TOOLBAR )
|
||||||
{
|
{
|
||||||
return wxWindow::FromDIP(wxSize(24, 24), win);
|
return wxWindow::FromDIP(wxSize(24, 24), win);
|
||||||
|
@@ -39,6 +39,35 @@
|
|||||||
// wxAppTraits implementation
|
// wxAppTraits implementation
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
|
bool wxAppTraits::SafeMessageBox(const wxString& text,
|
||||||
|
const wxString& title)
|
||||||
|
{
|
||||||
|
const HWND hwndParent = GetMainHWND();
|
||||||
|
int flags = MB_OK | MB_ICONSTOP;
|
||||||
|
|
||||||
|
// Using MB_TASKMODAL with valid parent doesn't work well because it
|
||||||
|
// prevents the typical behaviour of modal message boxes, e.g. the message
|
||||||
|
// box doesn't come up to front when the parent is clicked. But if we don't
|
||||||
|
// have any parent anyhow, we can just as well use it, as we don't lose
|
||||||
|
// anything and it has a useful side effect of disabling any existing TLWs
|
||||||
|
// if there are any.
|
||||||
|
//
|
||||||
|
// Note that we also might have chosen to always use MB_TASKMODAL and NULL
|
||||||
|
// parent. This would have the advantage of always disabling all the window
|
||||||
|
// which, but at the cost of the behaviour mentioned above and other
|
||||||
|
// related problems, e.g. showing ugly default icon in Alt-Tab list and an
|
||||||
|
// extra taskbar button for the message box, so we don't do this, although
|
||||||
|
// perhaps we still should, at least in case when there is more than one
|
||||||
|
// TLW (but we can't check for this easily as this is non-GUI code and
|
||||||
|
// wxTopLevelWindows is not accessible from it).
|
||||||
|
if ( !hwndParent )
|
||||||
|
flags |= MB_TASKMODAL;
|
||||||
|
|
||||||
|
::MessageBox(hwndParent, text.t_str(), title.t_str(), flags);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
#if wxUSE_THREADS
|
#if wxUSE_THREADS
|
||||||
WXDWORD wxAppTraits::DoSimpleWaitForThread(WXHANDLE hThread)
|
WXDWORD wxAppTraits::DoSimpleWaitForThread(WXHANDLE hThread)
|
||||||
{
|
{
|
||||||
|
@@ -109,13 +109,13 @@ public:
|
|||||||
|
|
||||||
wxCoord wxCursorRefData::GetStandardWidth()
|
wxCoord wxCursorRefData::GetStandardWidth()
|
||||||
{
|
{
|
||||||
const wxWindow* win = wxTheApp ? wxTheApp->GetTopWindow() : NULL;
|
const wxWindow* win = wxApp::GetMainTopWindow();
|
||||||
return wxSystemSettings::GetMetric(wxSYS_CURSOR_X, win);
|
return wxSystemSettings::GetMetric(wxSYS_CURSOR_X, win);
|
||||||
}
|
}
|
||||||
|
|
||||||
wxCoord wxCursorRefData::GetStandardHeight()
|
wxCoord wxCursorRefData::GetStandardHeight()
|
||||||
{
|
{
|
||||||
const wxWindow* win = wxTheApp ? wxTheApp->GetTopWindow() : NULL;
|
const wxWindow* win = wxApp::GetMainTopWindow();
|
||||||
return wxSystemSettings::GetMetric(wxSYS_CURSOR_Y, win);
|
return wxSystemSettings::GetMetric(wxSYS_CURSOR_Y, win);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -471,7 +471,7 @@ bool wxICOFileHandler::LoadIcon(wxIcon *icon,
|
|||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
// were we asked for a large icon?
|
// were we asked for a large icon?
|
||||||
const wxWindow* win = wxTheApp ? wxTheApp->GetTopWindow() : NULL;
|
const wxWindow* win = wxApp::GetMainTopWindow();
|
||||||
if ( desiredWidth == wxGetSystemMetrics(SM_CXICON, win) &&
|
if ( desiredWidth == wxGetSystemMetrics(SM_CXICON, win) &&
|
||||||
desiredHeight == wxGetSystemMetrics(SM_CYICON, win) )
|
desiredHeight == wxGetSystemMetrics(SM_CYICON, win) )
|
||||||
{
|
{
|
||||||
@@ -666,7 +666,7 @@ wxSize wxGetHiconSize(HICON hicon)
|
|||||||
if ( !size.x )
|
if ( !size.x )
|
||||||
{
|
{
|
||||||
// use default icon size on this hardware
|
// use default icon size on this hardware
|
||||||
const wxWindow* win = wxTheApp ? wxTheApp->GetTopWindow() : NULL;
|
const wxWindow* win = wxApp::GetMainTopWindow();
|
||||||
size.x = wxGetSystemMetrics(SM_CXICON, win);
|
size.x = wxGetSystemMetrics(SM_CXICON, win);
|
||||||
size.y = wxGetSystemMetrics(SM_CYICON, win);
|
size.y = wxGetSystemMetrics(SM_CYICON, win);
|
||||||
}
|
}
|
||||||
|
@@ -69,8 +69,8 @@ HTMLHELP GetHtmlHelpFunction()
|
|||||||
// fall back to the top level app window and then the desktop if it's NULL
|
// fall back to the top level app window and then the desktop if it's NULL
|
||||||
static HWND GetSuitableHWND(wxWindow *win)
|
static HWND GetSuitableHWND(wxWindow *win)
|
||||||
{
|
{
|
||||||
if ( !win && wxTheApp )
|
if ( !win )
|
||||||
win = wxTheApp->GetTopWindow();
|
win = wxApp::GetMainTopWindow();
|
||||||
|
|
||||||
return win ? GetHwndOf(win) : ::GetDesktopWindow();
|
return win ? GetHwndOf(win) : ::GetDesktopWindow();
|
||||||
}
|
}
|
||||||
|
@@ -393,7 +393,7 @@ void wxMessageDialog::AdjustButtonLabels()
|
|||||||
/* static */
|
/* static */
|
||||||
wxFont wxMessageDialog::GetMessageFont()
|
wxFont wxMessageDialog::GetMessageFont()
|
||||||
{
|
{
|
||||||
const wxWindow* win = wxTheApp ? wxTheApp->GetTopWindow() : NULL;
|
const wxWindow* win = wxApp::GetMainTopWindow();
|
||||||
const wxNativeFontInfo
|
const wxNativeFontInfo
|
||||||
info(wxMSWImpl::GetNonClientMetrics(win).lfMessageFont, win);
|
info(wxMSWImpl::GetNonClientMetrics(win).lfMessageFont, win);
|
||||||
|
|
||||||
|
@@ -179,7 +179,7 @@ wxFont wxSystemSettingsNative::GetFont(wxSystemFont index)
|
|||||||
// for most (simple) controls, e.g. buttons and such but other
|
// for most (simple) controls, e.g. buttons and such but other
|
||||||
// controls may prefer to use lfStatusFont or lfCaptionFont if it
|
// controls may prefer to use lfStatusFont or lfCaptionFont if it
|
||||||
// is more appropriate for them
|
// is more appropriate for them
|
||||||
const wxWindow* win = wxTheApp ? wxTheApp->GetTopWindow() : NULL;
|
const wxWindow* win = wxApp::GetMainTopWindow();
|
||||||
const wxNativeFontInfo
|
const wxNativeFontInfo
|
||||||
info(wxMSWImpl::GetNonClientMetrics(win).lfMessageFont, win);
|
info(wxMSWImpl::GetNonClientMetrics(win).lfMessageFont, win);
|
||||||
|
|
||||||
@@ -337,7 +337,7 @@ extern wxFont wxGetCCDefaultFont()
|
|||||||
// font which is also used for the icon titles and not the stock default
|
// font which is also used for the icon titles and not the stock default
|
||||||
// GUI font
|
// GUI font
|
||||||
LOGFONT lf;
|
LOGFONT lf;
|
||||||
const wxWindow* win = wxTheApp ? wxTheApp->GetTopWindow() : NULL;
|
const wxWindow* win = wxApp::GetMainTopWindow();
|
||||||
if ( wxSystemParametersInfo
|
if ( wxSystemParametersInfo
|
||||||
(
|
(
|
||||||
SPI_GETICONTITLELOGFONT,
|
SPI_GETICONTITLELOGFONT,
|
||||||
|
@@ -1018,7 +1018,7 @@ long wxExecute(const wxString& cmd, int flags, wxProcess *handler,
|
|||||||
return pi.dwProcessId;
|
return pi.dwProcessId;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
|
wxAppTraits *traits = wxApp::GetTraitsIfExists();
|
||||||
wxCHECK_MSG( traits, -1, wxT("no wxAppTraits in wxExecute()?") );
|
wxCHECK_MSG( traits, -1, wxT("no wxAppTraits in wxExecute()?") );
|
||||||
|
|
||||||
void *cookie = NULL;
|
void *cookie = NULL;
|
||||||
|
@@ -4236,7 +4236,7 @@ bool wxWindowMSW::HandleEndSession(bool endSession, long logOff)
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// only send once
|
// only send once
|
||||||
if ( (this != wxTheApp->GetTopWindow()) )
|
if ( this != wxApp::GetMainTopWindow() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
wxCloseEvent event(wxEVT_END_SESSION, wxID_ANY);
|
wxCloseEvent event(wxEVT_END_SESSION, wxID_ANY);
|
||||||
@@ -4773,10 +4773,11 @@ static wxSize GetWindowDPI(HWND hwnd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*extern*/
|
/*extern*/
|
||||||
int wxGetSystemMetrics(int nIndex, const wxWindow* win)
|
int wxGetSystemMetrics(int nIndex, const wxWindow* window)
|
||||||
{
|
{
|
||||||
#if wxUSE_DYNLIB_CLASS
|
#if wxUSE_DYNLIB_CLASS
|
||||||
const wxWindow* window = (!win && wxTheApp) ? wxTheApp->GetTopWindow() : win;
|
if ( !window )
|
||||||
|
window = wxApp::GetMainTopWindow();
|
||||||
|
|
||||||
if ( window )
|
if ( window )
|
||||||
{
|
{
|
||||||
@@ -4798,14 +4799,14 @@ int wxGetSystemMetrics(int nIndex, const wxWindow* win)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
wxUnusedVar(win);
|
wxUnusedVar(window);
|
||||||
#endif // wxUSE_DYNLIB_CLASS
|
#endif // wxUSE_DYNLIB_CLASS
|
||||||
|
|
||||||
return ::GetSystemMetrics(nIndex);
|
return ::GetSystemMetrics(nIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*extern*/
|
/*extern*/
|
||||||
bool wxSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni, const wxWindow* win)
|
bool wxSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni, const wxWindow* window)
|
||||||
{
|
{
|
||||||
// Note that we can't use SystemParametersInfoForDpi() in non-Unicode build
|
// Note that we can't use SystemParametersInfoForDpi() in non-Unicode build
|
||||||
// because it always works with wide strings and we'd have to check for all
|
// because it always works with wide strings and we'd have to check for all
|
||||||
@@ -4813,7 +4814,8 @@ bool wxSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWi
|
|||||||
// for them, and convert the returned value to ANSI after the call. Instead
|
// for them, and convert the returned value to ANSI after the call. Instead
|
||||||
// of doing all this, just don't use it at all in the deprecated ANSI build.
|
// of doing all this, just don't use it at all in the deprecated ANSI build.
|
||||||
#if wxUSE_DYNLIB_CLASS && wxUSE_UNICODE
|
#if wxUSE_DYNLIB_CLASS && wxUSE_UNICODE
|
||||||
const wxWindow* window = (!win && wxTheApp) ? wxTheApp->GetTopWindow() : win;
|
if ( !window )
|
||||||
|
window = wxApp::GetMainTopWindow();
|
||||||
|
|
||||||
if ( window )
|
if ( window )
|
||||||
{
|
{
|
||||||
@@ -4838,7 +4840,7 @@ bool wxSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
wxUnusedVar(win);
|
wxUnusedVar(window);
|
||||||
#endif // wxUSE_DYNLIB_CLASS
|
#endif // wxUSE_DYNLIB_CLASS
|
||||||
|
|
||||||
return ::SystemParametersInfo(uiAction, uiParam, pvParam, fWinIni) == TRUE;
|
return ::SystemParametersInfo(uiAction, uiParam, pvParam, fWinIni) == TRUE;
|
||||||
|
Reference in New Issue
Block a user