// Created: 08.06.01
// RCS-ID: $Id$
// Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
-// License: wxWindows license
+// License: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
// headers
// ----------------------------------------------------------------------------
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "snglinst.h"
#endif
#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
// ----------------------------------------------------------------------------
_T("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()
// the mutex handle, may be NULL
HANDLE m_hMutex;
-
+
+ DECLARE_NO_COPY_CLASS(wxSingleInstanceCheckerImpl)
};
// ============================================================================
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;