Allow creating wxSingleInstanceChecker with default name.
This makes it easier to use in common cases: there is no need to come up with a unique name for the checker any more as sufficiently unique combination of wxApp::GetAppName() and wxGetUserId() is used if no name was explicitly given. This is done by calling the new CreateDefault() on demand from IsAnotherRunning() instead of simply creating the checker with the default name in the default ctor for compatibility (you had to call Create() after using the default ctor before and it can only be called once) and because wxTheApp might not exist yet when wxSingleInstanceChecker is created. Closes #11166. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61945 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -15,6 +15,9 @@
|
||||
|
||||
#if wxUSE_SNGLINST_CHECKER
|
||||
|
||||
#include "wx/app.h"
|
||||
#include "wx/utils.h"
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxSingleInstanceChecker
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -33,9 +36,11 @@ public:
|
||||
Create(name, path);
|
||||
}
|
||||
|
||||
// name must be given and be as unique as possible, it is used as the mutex
|
||||
// name under Win32 and the lock file name under Unix -
|
||||
// wxTheApp->GetAppName() may be a good value for this parameter
|
||||
// notice that calling Create() is optional now, if you don't do it before
|
||||
// calling IsAnotherRunning(), CreateDefault() is used automatically
|
||||
//
|
||||
// name it is used as the mutex name under Win32 and the lock file name
|
||||
// under Unix so it should be as unique as possible and must be non-empty
|
||||
//
|
||||
// path is optional and is ignored under Win32 and used as the directory to
|
||||
// create the lock file in under Unix (default is wxGetHomeDir())
|
||||
@@ -44,8 +49,32 @@ public:
|
||||
// instance is running - use IsAnotherRunning() to check it
|
||||
bool Create(const wxString& name, const wxString& path = wxEmptyString);
|
||||
|
||||
// use the default name, which is a combination of wxTheApp->GetAppName()
|
||||
// and wxGetUserId() for mutex/lock file
|
||||
//
|
||||
// this is called implicitly by IsAnotherRunning() if the checker hadn't
|
||||
// been created until then
|
||||
bool CreateDefault()
|
||||
{
|
||||
wxCHECK_MSG( wxTheApp, false, "must have application instance" );
|
||||
return Create(wxTheApp->GetAppName() + '-' + wxGetUserId());
|
||||
}
|
||||
|
||||
// is another copy of this program already running?
|
||||
bool IsAnotherRunning() const;
|
||||
bool IsAnotherRunning() const
|
||||
{
|
||||
if ( !m_impl )
|
||||
{
|
||||
if ( !const_cast<wxSingleInstanceChecker *>(this)->CreateDefault() )
|
||||
{
|
||||
// if creation failed, return false as it's better to not
|
||||
// prevent this instance from starting up if there is an error
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return DoIsAnotherRunning();
|
||||
}
|
||||
|
||||
// dtor is not virtual, this class is not meant to be used polymorphically
|
||||
~wxSingleInstanceChecker();
|
||||
@@ -54,6 +83,9 @@ private:
|
||||
// common part of all ctors
|
||||
void Init() { m_impl = NULL; }
|
||||
|
||||
// do check if another instance is running, called only if m_impl != NULL
|
||||
bool DoIsAnotherRunning() const;
|
||||
|
||||
// the implementation details (platform specific)
|
||||
class WXDLLIMPEXP_FWD_BASE wxSingleInstanceCheckerImpl *m_impl;
|
||||
|
||||
|
Reference in New Issue
Block a user