// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
+#ifdef __GNUG__
+ #pragma implementation "app.h"
+#endif
+
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#include "wx/os2/private.h"
-#if defined(__VISAGECPP__) && __IBMCPP__ < 400
-#include <machine\endian.h>
-#include <ioctl.h>
-#include <select.h>
-#include <unistd.h>
+#ifdef __EMX__
+
+#include <sys/ioctl.h>
+#include <sys/select.h>
+
#else
-#include <sys\ioctl.h>
-#include <sys\select.h>
+
+#include <nerrno.h>
+#include <sys/ioctl.h>
+#include <sys/select.h>
+#include <sys/time.h>
+
+#endif //
+
#ifndef __EMX__
+
#define select(a,b,c,d,e) bsdselect(a,b,c,d,e)
-int _System bsdselect(int,
- struct fd_set *,
- struct fd_set *,
- struct fd_set *,
- struct timeval *);
-#endif
+extern "C" int _System bsdselect(int,
+ struct fd_set *,
+ struct fd_set *,
+ struct fd_set *,
+ struct timeval *);
#endif
#if wxUSE_THREADS
QMSG svCurrentMsg;
wxApp* wxTheApp = NULL;
-// NB: all "NoRedraw" classes must have the same names as the "normal" classes
-// with NR suffix - wxWindow::OS2Create() supposes this
-wxChar wxFrameClassName[] = wxT("wxFrameClass");
-wxChar wxFrameClassNameNoRedraw[] = wxT("wxFrameClassNR");
-wxChar wxMDIFrameClassName[] = wxT("wxMDIFrameClass");
-wxChar wxMDIFrameClassNameNoRedraw[] = wxT("wxMDIFrameClassNR");
-wxChar wxMDIChildFrameClassName[] = wxT("wxMDIChildFrameClass");
-wxChar wxMDIChildFrameClassNameNoRedraw[] = wxT("wxMDIChildFrameClassNR");
-wxChar wxPanelClassName[] = wxT("wxPanelClass");
-wxChar wxCanvasClassName[] = wxT("wxCanvasClass");
HICON wxSTD_FRAME_ICON = (HICON) NULL;
HICON wxSTD_MDICHILDFRAME_ICON = (HICON) NULL;
#define wxSockReadMask 0x01
#define wxSockWriteMask 0x02
+#ifdef __EMX__
extern "C"
int wxAppAddSocketHandler(int handle, int mask,
- void (*callback)(void*), void * gsock)
+ void (*callback)(void*), void * gsock)
{
return wxTheApp->AddSocketHandler(handle, mask, callback, gsock);
}
-
extern "C"
void wxAppRemoveSocketHandler(int handle)
{
wxTheApp->RemoveSocketHandler(handle);
}
+#else
+// Linkage mode problems using callbacks with extern C in a .cpp module
+int wxAppAddSocketHandler(int handle, int mask,
+ void (*callback)(void*), void * gsock)
+{
+ return wxTheApp->AddSocketHandler(handle, mask, callback, gsock);
+}
+void wxAppRemoveSocketHandler(int handle)
+{
+ wxTheApp->RemoveSocketHandler(handle);
+}
+#endif
void wxApp::HandleSockets()
{
- bool pendingEvent = false;
+ bool pendingEvent = FALSE;
// Check whether it's time for Gsocket operation
if (m_maxSocketHandles > 0 && m_maxSocketNr > 0)
if (r < m_maxSocketHandles)
{
CallbackInfo[r].proc(CallbackInfo[r].gsock);
- pendingEvent = true;
+ pendingEvent = TRUE;
wxYield();
}
}
if (r < m_maxSocketHandles)
{
CallbackInfo[r].proc(CallbackInfo[r].gsock);
- pendingEvent = true;
+ pendingEvent = TRUE;
wxYield();
}
}
#endif //wxUSE_CONSOLEDEBUG
#endif
- //
- // OS2 has to have an anchorblock
- //
- vHab = WinInitialize(0);
-
- if (!vHab)
- return FALSE;
- else
- vHabmain = vHab;
-
- // Some people may wish to use this, but
- // probably it shouldn't be here by default.
-#ifdef __WXDEBUG__
- // wxRedirectIOToConsole();
-#endif
-
wxBuffer = new wxChar[1500]; // FIXME; why?
wxClassInfo::InitializeClasses();
wxBitmap::InitStandardHandlers();
- RegisterWindowClasses(vHab);
+ //
+ // OS2 has to have an anchorblock
+ //
+ vHab = WinInitialize(0);
+
+ if (!vHab)
+ return FALSE;
+ else
+ vHabmain = vHab;
+
+ // Some people may wish to use this, but
+ // probably it shouldn't be here by default.
+#ifdef __WXDEBUG__
+ // wxRedirectIOToConsole();
+#endif
+
wxWinHandleList = new wxList(wxKEY_INTEGER);
// This is to foil optimizations in Visual C++ that throw out dummy.obj.
wxModule::RegisterModules();
if (!wxModule::InitializeModules())
return FALSE;
+ RegisterWindowClasses(vHab);
return TRUE;
} // end of wxApp::Initialize
HAB vHab
)
{
- APIRET rc;
ERRORID vError = 0L;
wxString sError;
if (!::WinRegisterClass( vHab
,wxFrameClassName
,wxFrameWndProc
- ,CS_SIZEREDRAW | CS_MOVENOTIFY | CS_SYNCPAINT | CS_CLIPCHILDREN
+ ,CS_SIZEREDRAW | CS_SYNCPAINT
,sizeof(ULONG)
))
{
if (!::WinRegisterClass( vHab
,wxCanvasClassName
,wxWndProc
- ,CS_MOVENOTIFY | CS_SIZEREDRAW | CS_HITTEST | CS_SAVEBITS | CS_SYNCPAINT | CS_CLIPCHILDREN
+ ,CS_SIZEREDRAW | CS_HITTEST | CS_SYNCPAINT
+ ,sizeof(ULONG)
+ ))
+ {
+ vError = ::WinGetLastError(vHab);
+ sError = wxPMErrorToStr(vError);
+ wxLogLastError(sError);
+ return FALSE;
+ }
+ if (!::WinRegisterClass( vHab
+ ,wxCanvasClassNameNR
+ ,wxWndProc
+ ,CS_HITTEST | CS_SYNCPAINT
,sizeof(ULONG)
))
{
{
if (wxTheApp->OnInit())
{
- nRetValue = wxTheApp->OnRun();
+ wxTheApp->OnRun();
}
// Normal exit
wxWindow* pTopWindow = wxTheApp->GetTopWindow();
printf("wxTheApp->OnExit ");
fflush(stdout);
#endif
- wxTheApp->OnExit();
+ nRetValue = wxTheApp->OnExit();
#if wxUSE_CONSOLEDEBUG
printf("wxApp::CleanUp ");
fflush(stdout);
ERRORID vError;
wxString sError;
+ if (!wxAppBase::OnInitGui())
+ return FALSE;
+
m_hMq = ::WinCreateMsgQueue(vHabmain, 0);
if (!m_hMq)
{
wxLogDebug(sError);
return FALSE;
}
+
return TRUE;
} // end of wxApp::OnInitGui
{
m_topWindow = NULL;
wxTheApp = this;
- m_wantDebugOutput = TRUE;
argc = 0;
argv = NULL;
m_nPrintMode = wxPRINT_WINDOWS;
- m_exitOnFrameDelete = TRUE;
m_bAuto3D = TRUE;
m_hMq = 0;
m_maxSocketHandles = 0;
{
QMSG vMsg = svSavedMessages[n];
- if ( !ProcessMessage((WXMSG *)&vMsg) )
- {
- ::WinDispatchMsg(vHabmain, &vMsg);
- }
+ DoMessage((WXMSG*)&vMsg);
}
svSavedMessages.Empty();
}
}
#endif // wxUSE_THREADS
+ //
// Process the message
- if (!ProcessMessage((WXMSG *)&svCurrentMsg))
- {
- ::WinDispatchMsg(vHabmain, (PQMSG)&svCurrentMsg);
- }
+ //
+ DoMessage((WXMSG *)&svCurrentMsg);
}
return TRUE;
} // end of wxApp::DoMessage
+void wxApp::DoMessage(
+ WXMSG* pMsg
+)
+{
+ if (!ProcessMessage((WXMSG *)&svCurrentMsg))
+ {
+ ::WinDispatchMsg(vHabmain, (PQMSG)&svCurrentMsg);
+ }
+} // end of wxApp::DoMessage
+
//////////////////////////////////////////////////////////////////////////////
//
// Keep trying to process messages until WM_QUIT
void wxApp::ExitMainLoop()
{
- m_bKeepGoing = FALSE;
-}
+ ::WinPostMsg(NULL, WM_QUIT, 0, 0);
+} // end of wxApp::ExitMainLoop
bool wxApp::Pending()
{
return (::WinPeekMsg(vHabmain, (PQMSG)&svCurrentMsg, (HWND)NULL, 0, 0, PM_NOREMOVE) != 0);
-}
+} // end of wxApp::Pending
void wxApp::Dispatch()
{
wxWindow* pWndThis = wxFindWinFromHandle((WXHWND)hWnd);
wxWindow* pWnd;
-#if wxUSE_TOOLTIPS
//
- // We must relay WM_MOUSEMOVE events to the tooltip ctrl if we want it to
- // popup the tooltip bubbles
+ // Pass non-system timer messages to the wxTimerProc
//
- if (pWndThis && (pMsg->msg == WM_MOUSEMOVE))
- {
- wxToolTip* pToolTip = pWndThis->GetToolTip();
- if (pToolTip)
- {
- pToolTip->RelayEvent(pWxmsg);
- }
- }
-#endif // wxUSE_TOOLTIPS
+ if (pMsg->msg == WM_TIMER &&
+ (SHORT1FROMMP(pMsg->mp1) != TID_CURSOR &&
+ SHORT1FROMMP(pMsg->mp1) != TID_FLASHWINDOW &&
+ SHORT1FROMMP(pMsg->mp1) != TID_SCROLL &&
+ SHORT1FROMMP(pMsg->mp1) != 0x0000
+ ))
+ wxTimerProc(NULL, 0, (int)pMsg->mp1, 0);
//
- // We must relay Timer events to wxTimer's processing function
+ // Allow the window to prevent certain messages from being
+ // translated/processed (this is currently used by wxTextCtrl to always
+ // grab Ctrl-C/V/X, even if they are also accelerators in some parent)
//
- if (pMsg->msg == WM_TIMER)
- wxTimerProc(NULL, 0, (int)pMsg->mp1, 0);
+ if (pWndThis && !pWndThis->OS2ShouldPreProcessMessage(pWxmsg))
+ {
+ return FALSE;
+ }
//
// For some composite controls (like a combobox), wndThis might be NULL
return FALSE;
} // end of wxApp::ProcessMessage
+bool gbInOnIdle = FALSE;
+
void wxApp::OnIdle(
wxIdleEvent& rEvent
)
{
- static bool sbInOnIdle = FALSE;
//
// Avoid recursion (via ProcessEvent default case)
//
- if (sbInOnIdle)
+ if (gbInOnIdle)
return;
- sbInOnIdle = TRUE;
+ gbInOnIdle = TRUE;
//
// If there are pending events, we must process them: pending events
wxLog::FlushActive();
#endif // wxUSE_LOG
+#if wxUSE_DC_CACHEING
+ // automated DC cache management: clear the cached DCs and bitmap
+ // if it's likely that the app has finished with them, that is, we
+ // get an idle event and we're not dragging anything.
+ if (!::WinGetKeyState(HWND_DESKTOP, VK_BUTTON1) &&
+ !::WinGetKeyState(HWND_DESKTOP, VK_BUTTON3) &&
+ !::WinGetKeyState(HWND_DESKTOP, VK_BUTTON2))
+ wxDC::ClearCache();
+#endif // wxUSE_DC_CACHEING
+
//
// Send OnIdle events to all windows
//
//
rEvent.RequestMore(TRUE);
}
- sbInOnIdle = FALSE;
+ gbInOnIdle = FALSE;
} // end of wxApp::OnIdle
// Send idle event to all top-level windows
wxApp::CleanUp();
} // end of wxExit
-static bool gs_inYield = FALSE;
-
//
// Yield to incoming messages
//
-bool wxYield()
+bool wxApp::Yield(bool onlyIfNeeded)
{
+ static bool s_inYield = FALSE;
+
+ if ( s_inYield )
+ {
+ if ( !onlyIfNeeded )
+ {
+ wxFAIL_MSG( _T("wxYield() called recursively") );
+ }
+
+ return FALSE;
+ }
+
HAB vHab = 0;
QMSG vMsg;
//
wxLog::Suspend();
- gs_inYield = TRUE;
+ s_inYield = TRUE;
//
// We want to go back to the main message loop
// Let the logs be flashed again
//
wxLog::Resume();
- gs_inYield = FALSE;
+ s_inYield = FALSE;
return TRUE;
} // end of wxYield
-// Yield to incoming messages; but fail silently if recursion is detected.
-bool wxYieldIfNeeded()
-{
- if (gs_inYield)
- return FALSE;
-
- return wxYield();
-}
-
-wxIcon wxApp::GetStdIcon(
- int nWhich
-) const
-{
- switch(nWhich)
- {
- case wxICON_INFORMATION:
- return wxIcon("wxICON_INFO");
-
- case wxICON_QUESTION:
- return wxIcon("wxICON_QUESTION");
-
- case wxICON_EXCLAMATION:
- return wxIcon("wxICON_WARNING");
-
- default:
- wxFAIL_MSG(wxT("requested non existent standard icon"));
- // still fall through
-
- case wxICON_HAND:
- return wxIcon("wxICON_ERROR");
- }
- return wxIcon("wxICON_ERROR");
-} // end of wxApp::GetStdIcon
-
int wxApp::AddSocketHandler(int handle, int mask,
void (*callback)(void*), void * gsock)
{