X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d08d71a8441b5a8d20ab1f71cc76d5486e667543..71185527a05c27931cd65359c1b23f0018b646ed:/src/msw/snglinst.cpp diff --git a/src/msw/snglinst.cpp b/src/msw/snglinst.cpp index b18f44c64b..1c81a9b398 100644 --- a/src/msw/snglinst.cpp +++ b/src/msw/snglinst.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: msw/snglinst.cpp +// Name: src/msw/snglinst.cpp // Purpose: implements wxSingleInstanceChecker class for Win32 using // named mutexes // Author: Vadim Zeitlin @@ -7,7 +7,7 @@ // Created: 08.06.01 // RCS-ID: $Id$ // Copyright: (c) 2001 Vadim Zeitlin -// License: wxWindows license +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -18,10 +18,6 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "snglinst.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -40,42 +36,11 @@ #include "wx/msw/private.h" -//variables held in common by the callback and wxSingleInstanceCheckerImpl -static HWND FirsthWnd; -static wxString s_Title; - -// callback to look for windows whose titles include the search string -// BCC (at least) does not like the callback to be part of the class :-(( -bool CALLBACK EnumWindowsProc ( HWND hwnd, LPARAM lParam ) -{ - // Get the title of this window - int iTitleLen = ::GetWindowTextLength(hwnd); - // possible UNICODE/ANSI bug here, see SDK documentation, - // so allow extra space - char * cTitle = new char [iTitleLen*2+10] ; - ::GetWindowText(hwnd, cTitle, iTitleLen*2+10); - - bool bSuccess = wxString(cTitle).Contains(s_Title) ; - delete [] cTitle ; - - if (bSuccess) - { - FirsthWnd = hwnd ; - return FALSE ; - } - else - { - //not this window - return TRUE; - } - -} - // ---------------------------------------------------------------------------- // wxSingleInstanceCheckerImpl: the real implementation class // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxSingleInstanceCheckerImpl +class WXDLLIMPEXP_BASE wxSingleInstanceCheckerImpl { public: wxSingleInstanceCheckerImpl() @@ -87,74 +52,26 @@ public: bool Create(const wxString& name) { - m_hMutex = ::CreateMutex(NULL, FALSE, name); + m_hMutex = ::CreateMutex(NULL, FALSE, name.t_str()); if ( !m_hMutex ) { - wxLogLastError(_T("CreateMutex")); + wxLogLastError(wxT("CreateMutex")); - return FALSE; + return false; } // mutex was either created or opened - see what really happened m_wasOpened = ::GetLastError() == ERROR_ALREADY_EXISTS; - return TRUE; + return true; } bool WasOpened() const { - wxCHECK_MSG( m_hMutex, FALSE, - _T("can't be called if mutex creation failed") ); + wxCHECK_MSG( m_hMutex, false, + wxT("can't be called if mutex creation failed") ); return m_wasOpened; - }; - - - - // Activates Previous Instance if a window matching Title is found - bool ActivatePrevInstance(const wxString & sSearch) - { - //store search text and window handle for use by callback - s_Title = sSearch ; - FirsthWnd = 0; - - EnumWindows (WNDENUMPROC(&EnumWindowsProc), 0L); - if (FirsthWnd == 0) - { - //no matching window found - return FALSE; - } - - if (::IsIconic(FirsthWnd)) - { - ::ShowWindow(FirsthWnd, SW_SHOWDEFAULT); - } - ::SetForegroundWindow(FirsthWnd); - - // now try to deal with any active children - // Handles to child of previous instance - HWND FirstChildhWnd; - - FirstChildhWnd = ::GetLastActivePopup(FirsthWnd); - if (FirsthWnd != FirstChildhWnd) - { - // A pop-up is active so bring it to the top too. - ::BringWindowToTop(FirstChildhWnd); - } - return TRUE; - } - - // Activates Previous Instance and passes CommandLine to wxCommandLineEvent - // if a window matching Title is found - bool PassCommandLineToPrevInstance(const wxString & sTitle, const wxString & sCmdLine) - { - // this stores a string of up to 255 bytes - //ATOM myAtom = GlobalAddAtom ( sCmdLine ); - - // this would create a call to wxWindow::OnCommandLine(wxCommandLineEvent & event) - // which should retrieve the commandline, and then delete the atom, GlobalDeleteAtom( myAtom ); - //::SendMessage (FirsthWnd, wxCOMMANDLINE_MESSAGE, 0, myAtom) ; - return FALSE; } ~wxSingleInstanceCheckerImpl() @@ -163,7 +80,7 @@ public: { if ( !::CloseHandle(m_hMutex) ) { - wxLogLastError(_T("CloseHandle(mutex)")); + wxLogLastError(wxT("CloseHandle(mutex)")); } } } @@ -174,7 +91,8 @@ private: // the mutex handle, may be NULL HANDLE m_hMutex; - + + wxDECLARE_NO_COPY_CLASS(wxSingleInstanceCheckerImpl); }; // ============================================================================ @@ -185,46 +103,25 @@ bool wxSingleInstanceChecker::Create(const wxString& name, const wxString& WXUNUSED(path)) { wxASSERT_MSG( !m_impl, - _T("calling wxSingleInstanceChecker::Create() twice?") ); + wxT("calling wxSingleInstanceChecker::Create() twice?") ); // creating unnamed mutex doesn't have the same semantics! - wxASSERT_MSG( !name.empty(), _T("mutex name can't be empty") ); + wxASSERT_MSG( !name.empty(), wxT("mutex name can't be empty") ); m_impl = new wxSingleInstanceCheckerImpl; return m_impl->Create(name); } -bool wxSingleInstanceChecker::IsAnotherRunning() const +bool wxSingleInstanceChecker::DoIsAnotherRunning() const { - wxCHECK_MSG( m_impl, FALSE, _T("must call Create() first") ); + wxCHECK_MSG( m_impl, false, wxT("must call Create() first") ); // if the mutex had been opened, another instance is running - otherwise we // would have created it return m_impl->WasOpened(); } - // Activates Previous Instance if a window whose Title contains the search string is found -bool wxSingleInstanceChecker::ActivatePrevInstance(const wxString & sSearch) -{ - if (!IsAnotherRunning()) - { - return FALSE; - } - return m_impl->ActivatePrevInstance(sSearch) ; -} - - // Activates Previous Instance and passes CommandLine to wxCommandLineEvent - // if a window matching Title is found -bool wxSingleInstanceChecker::PassCommandLineToPrevInstance(const wxString & sSearch, const wxString & sCmdLine) -{ - if (!ActivatePrevInstance(sSearch)) - { - return FALSE; - } - return m_impl->PassCommandLineToPrevInstance(sSearch, sCmdLine); -} - wxSingleInstanceChecker::~wxSingleInstanceChecker() { delete m_impl;