// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "app.h"
#endif
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
#ifdef __VMS
#define XtParent XTPARENT
#define XtDisplay XTDISPLAY
#include "wx/intl.h"
#include "wx/evtloop.h"
#include "wx/hash.h"
-#include "wx/hashmap.h"
#if wxUSE_THREADS
#include "wx/thread.h"
#pragma message disable nosimpint
#endif
#include <Xm/Xm.h>
+#include <Xm/Label.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xresource.h>
struct wxPerDisplayData
{
wxPerDisplayData()
- { m_visualInfo = NULL; m_topLevelWidget = NULL; }
+ {
+ m_visualInfo = NULL;
+ m_topLevelWidget = NULL;
+ m_topLevelRealizedWidget = NULL;
+ }
wxXVisualInfo* m_visualInfo;
- Widget m_topLevelWidget;
+ Widget m_topLevelWidget, m_topLevelRealizedWidget;
};
-WX_DECLARE_VOIDPTR_HASH_MAP( wxPerDisplayData, wxPerDisplayDataMap );
-
static void wxTLWidgetDestroyCallback(Widget w, XtPointer clientData,
XtPointer ptr);
static WXWidget wxCreateTopLevelWidget( WXDisplay* display );
argc = 0;
argv = NULL;
- m_eventLoop = new wxEventLoop;
+ m_mainLoop = new wxEventLoop;
m_mainColormap = (WXColormap) NULL;
m_appContext = (WXAppContext) NULL;
m_initialDisplay = (WXDisplay*) 0;
wxApp::~wxApp()
{
- delete m_eventLoop;
+ delete m_mainLoop;
for( wxPerDisplayDataMap::iterator it = m_perDisplayData->begin(),
end = m_perDisplayData->end();
it != end; ++it )
{
- delete it->second.m_visualInfo;
- XtDestroyWidget( it->second.m_topLevelWidget );
+ delete it->second->m_visualInfo;
+ XtDestroyWidget( it->second->m_topLevelWidget );
+ delete it->second;
}
delete m_perDisplayData;
- wxTheApp = NULL;
-}
-
-bool wxApp::Initialized()
-{
- if (GetTopWindow())
- return TRUE;
- else
- return FALSE;
+ wxApp::SetInstance(NULL);
}
int wxApp::MainLoop()
XDefaultRootWindow(XtDisplay((Widget) wxTheApp->GetTopLevelWidget())),
PropertyChangeMask);
- m_eventLoop->Run();
+ m_mainLoop->Run();
return 0;
}
-void wxApp::ExitMainLoop()
-{
- if( m_eventLoop->IsRunning() )
- m_eventLoop->Exit();
-}
-
-// Is a message/event pending?
-bool wxApp::Pending()
-{
- return m_eventLoop->Pending();
-#if 0
- XFlush(XtDisplay( (Widget) wxTheApp->GetTopLevelWidget() ));
-
- // Fix by Doug from STI, to prevent a stall if non-X event
- // is found.
- return ((XtAppPending( (XtAppContext) GetAppContext() ) & XtIMXEvent) != 0) ;
-#endif
-}
-
-// Dispatch a message.
-void wxApp::Dispatch()
-{
- m_eventLoop->Dispatch();
-}
-
// This should be redefined in a derived class for
// handling property change events for XAtom IPC.
void wxApp::HandlePropertyChange(WXEvent *event)
// if you don't log to stderr, nothing will be shown...
delete wxLog::SetActiveTarget(new wxLogStderr);
wxString className(wxTheApp->GetClassName());
- wxLogError(_("wxWindows could not open display for '%s': exiting."),
+ wxLogError(_("wxWidgets could not open display for '%s': exiting."),
className.c_str());
exit(-1);
}
return (WXColormap) c;
}
-wxXVisualInfo* wxApp::GetVisualInfo( WXDisplay* display )
+static inline wxPerDisplayData& GetOrCreatePerDisplayData
+ ( wxPerDisplayDataMap& m, WXDisplay* display )
{
- wxPerDisplayDataMap::iterator it = m_perDisplayData->find( display );
+ wxPerDisplayDataMap::iterator it = m.find( display );
+ if( it != m.end() && it->second != NULL )
+ return *(it->second);
- if( it != m_perDisplayData->end() && it->second.m_visualInfo )
- return it->second.m_visualInfo;
+ wxPerDisplayData* nData = new wxPerDisplayData();
+ m[display] = nData;
+
+ return *nData;
+}
+
+wxXVisualInfo* wxApp::GetVisualInfo( WXDisplay* display )
+{
+ wxPerDisplayData& data = GetOrCreatePerDisplayData( *m_perDisplayData,
+ display );
+ if( data.m_visualInfo )
+ return data.m_visualInfo;
wxXVisualInfo* vi = new wxXVisualInfo;
wxFillXVisualInfo( vi, (Display*)display );
- (*m_perDisplayData)[display].m_visualInfo = vi;
+ data.m_visualInfo = vi;
return vi;
}
XtPointer ptr)
{
if( wxTheApp )
+ {
wxTheApp->SetTopLevelWidget( (WXDisplay*)XtDisplay(w),
(WXWidget)NULL );
+ wxTheApp->SetTopLevelRealizedWidget( (WXDisplay*)XtDisplay(w),
+ (WXWidget)NULL );
+ }
}
WXWidget wxCreateTopLevelWidget( WXDisplay* display )
applicationShellWidgetClass,
(Display*)display,
NULL, 0 );
- XtSetMappedWhenManaged( tlw, False );
- XtRealizeWidget( tlw );
+ XtVaSetValues( tlw,
+ XmNoverrideRedirect, True,
+ NULL );
XtAddCallback( tlw, XmNdestroyCallback,
(XtCallbackProc)wxTLWidgetDestroyCallback,
return (WXWidget)tlw;
}
+WXWidget wxCreateTopLevelRealizedWidget( WXDisplay* display )
+{
+ Widget rTlw = XtVaCreateWidget( "dummy_widget", xmLabelWidgetClass,
+ (Widget)wxTheApp->GetTopLevelWidget(),
+ NULL);
+ XtSetMappedWhenManaged( rTlw, False );
+ XtRealizeWidget( rTlw );
+
+ return (WXWidget)rTlw;
+}
+
WXWidget wxApp::GetTopLevelWidget()
{
WXDisplay* display = wxGetDisplay();
- wxPerDisplayDataMap::iterator it = m_perDisplayData->find( display );
-
- if( it != m_perDisplayData->end() && it->second.m_topLevelWidget )
- return (WXWidget)it->second.m_topLevelWidget;
+ wxPerDisplayData& data = GetOrCreatePerDisplayData( *m_perDisplayData,
+ display );
+ if( data.m_topLevelWidget )
+ return (WXWidget)data.m_topLevelWidget;
WXWidget tlw = wxCreateTopLevelWidget( display );
SetTopLevelWidget( display, tlw );
return tlw;
}
+WXWidget wxApp::GetTopLevelRealizedWidget()
+{
+ WXDisplay* display = wxGetDisplay();
+ wxPerDisplayDataMap::iterator it = m_perDisplayData->find( display );
+
+ if( it != m_perDisplayData->end() && it->second->m_topLevelRealizedWidget )
+ return (WXWidget)it->second->m_topLevelRealizedWidget;
+
+ WXWidget rTlw = wxCreateTopLevelRealizedWidget( display );
+ SetTopLevelRealizedWidget( display, rTlw );
+
+ return rTlw;
+}
+
void wxApp::SetTopLevelWidget(WXDisplay* display, WXWidget widget)
{
- (*m_perDisplayData)[display].m_topLevelWidget = (Widget)widget;
+ GetOrCreatePerDisplayData( *m_perDisplayData, display )
+ .m_topLevelWidget = (Widget)widget;
+}
+
+void wxApp::SetTopLevelRealizedWidget(WXDisplay* display, WXWidget widget)
+{
+ GetOrCreatePerDisplayData( *m_perDisplayData, display )
+ .m_topLevelRealizedWidget = (Widget)widget;
}
// Yield to other processes
bool wxApp::Yield(bool onlyIfNeeded)
{
- bool s_inYield = FALSE;
+ static bool s_inYield = FALSE;
if ( s_inYield )
{