]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/app.cpp
use unsgined int instead of int for 1 bit bitfields (SGI CC warning fix)
[wxWidgets.git] / src / motif / app.cpp
index 41e76ef23ce2a5ebe5a89caf895ad5f7632c127e..ef00606e5fc75f266581495f6cae0525199fc06e 100644 (file)
@@ -13,6 +13,9 @@
     #pragma implementation "app.h"
 #endif
 
     #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
 #ifdef __VMS
 #define XtParent XTPARENT
 #define XtDisplay XTDISPLAY
@@ -26,7 +29,6 @@
 #include "wx/intl.h"
 #include "wx/evtloop.h"
 #include "wx/hash.h"
 #include "wx/intl.h"
 #include "wx/evtloop.h"
 #include "wx/hash.h"
-#include "wx/hashmap.h"
 
 #if wxUSE_THREADS
     #include "wx/thread.h"
 
 #if wxUSE_THREADS
     #include "wx/thread.h"
 struct wxPerDisplayData
 {
     wxPerDisplayData()
 struct wxPerDisplayData
 {
     wxPerDisplayData()
-        { m_visualInfo = NULL; m_topLevelWidget = NULL; }
+    {
+        m_visualInfo = NULL;
+        m_topLevelWidget = NULL;
+        m_topLevelRealizedWidget = NULL;
+    }
 
     wxXVisualInfo* m_visualInfo;
 
     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 );
 static void wxTLWidgetDestroyCallback(Widget w, XtPointer clientData,
                                       XtPointer ptr);
 static WXWidget wxCreateTopLevelWidget( WXDisplay* display );
@@ -75,33 +79,58 @@ BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
 END_EVENT_TABLE()
 
 #ifdef __WXDEBUG__
 END_EVENT_TABLE()
 
 #ifdef __WXDEBUG__
+extern "C"
+{
     typedef int (*XErrorHandlerFunc)(Display *, XErrorEvent *);
     typedef int (*XErrorHandlerFunc)(Display *, XErrorEvent *);
+}
 
 
-    XErrorHandlerFunc gs_pfnXErrorHandler = 0;
+XErrorHandlerFunc gs_pfnXErrorHandler = 0;
 
 
-    static int wxXErrorHandler(Display *dpy, XErrorEvent *xevent)
-    {
-        // just forward to the default handler for now
-        return gs_pfnXErrorHandler(dpy, xevent);
-    }
+extern "C"
+{
+
+static int wxXErrorHandler(Display *dpy, XErrorEvent *xevent)
+{
+    // just forward to the default handler for now
+    return gs_pfnXErrorHandler(dpy, xevent);
+}
+
+}
 #endif // __WXDEBUG__
 
 #endif // __WXDEBUG__
 
-bool wxApp::Initialize(int& argc, wxChar **argv)
+bool wxApp::Initialize(int& argcOrig, wxChar **argvOrig)
 {
 {
-    if ( !wxAppBase::Initialize(argc, argv) )
+    if ( !wxAppBase::Initialize(argcOrig, argvOrig) )
         return false;
 
     wxWidgetHashTable = new wxHashTable(wxKEY_INTEGER);
 
         return false;
 
     wxWidgetHashTable = new wxHashTable(wxKEY_INTEGER);
 
+#if wxUSE_INTL
+    wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding());
+#endif
+
     return true;
 }
 
 void wxApp::CleanUp()
 {
     return true;
 }
 
 void wxApp::CleanUp()
 {
+    wxAppBase::CleanUp();
+
     delete wxWidgetHashTable;
     wxWidgetHashTable = NULL;
 
     delete wxWidgetHashTable;
     wxWidgetHashTable = NULL;
 
-    wxAppBase::CleanUp();
+    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;
+    }
+
+    delete m_perDisplayData;
 }
 
 void wxApp::Exit()
 }
 
 void wxApp::Exit()
@@ -120,7 +149,7 @@ wxApp::wxApp()
     argc = 0;
     argv = NULL;
 
     argc = 0;
     argv = NULL;
 
-    m_eventLoop = new wxEventLoop;
+    m_mainLoop = new wxEventLoop;
     m_mainColormap = (WXColormap) NULL;
     m_appContext = (WXAppContext) NULL;
     m_initialDisplay = (WXDisplay*) 0;
     m_mainColormap = (WXColormap) NULL;
     m_appContext = (WXAppContext) NULL;
     m_initialDisplay = (WXDisplay*) 0;
@@ -129,18 +158,6 @@ wxApp::wxApp()
 
 wxApp::~wxApp()
 {
 
 wxApp::~wxApp()
 {
-    delete m_eventLoop;
-
-    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 m_perDisplayData;
-
     wxApp::SetInstance(NULL);
 }
 
     wxApp::SetInstance(NULL);
 }
 
@@ -157,7 +174,7 @@ int wxApp::MainLoop()
         XDefaultRootWindow(XtDisplay((Widget) wxTheApp->GetTopLevelWidget())),
         PropertyChangeMask);
 
         XDefaultRootWindow(XtDisplay((Widget) wxTheApp->GetTopLevelWidget())),
         PropertyChangeMask);
 
-    m_eventLoop->Run();
+    m_mainLoop->Run();
 
     return 0;
 }
 
     return 0;
 }
@@ -171,10 +188,19 @@ void wxApp::HandlePropertyChange(WXEvent *event)
 }
 
 static char *fallbackResources[] = {
 }
 
 static char *fallbackResources[] = {
-    "*menuBar.marginHeight: 0",
-    "*menuBar.shadowThickness: 1",
-    "*background: #c0c0c0",
-    "*foreground: black",
+    // better defaults for CDE under Irix
+    //
+    // TODO: do something similar for the other systems, the hardcoded defaults
+    //       below are ugly
+#ifdef __SGI__
+    wxMOTIF_STR("*sgiMode: True"),
+    wxMOTIF_STR("*useSchemes: all"),
+#else // !__SGI__
+    wxMOTIF_STR("*menuBar.marginHeight: 0"),
+    wxMOTIF_STR("*menuBar.shadowThickness: 1"),
+    wxMOTIF_STR("*background: #c0c0c0"),
+    wxMOTIF_STR("*foreground: black"),
+#endif // __SGI__/!__SGI__
     NULL
 };
 
     NULL
 };
 
@@ -182,8 +208,9 @@ static char *fallbackResources[] = {
 bool wxApp::OnInitGui()
 {
     if( !wxAppBase::OnInitGui() )
 bool wxApp::OnInitGui()
 {
     if( !wxAppBase::OnInitGui() )
-        return FALSE;
+        return false;
 
 
+    XtSetLanguageProc(NULL, NULL, NULL);
     XtToolkitInitialize() ;
     wxTheApp->m_appContext = (WXAppContext) XtCreateApplicationContext();
     XtAppSetFallbackResources((XtAppContext) wxTheApp->m_appContext, fallbackResources);
     XtToolkitInitialize() ;
     wxTheApp->m_appContext = (WXAppContext) XtCreateApplicationContext();
     XtAppSetFallbackResources((XtAppContext) wxTheApp->m_appContext, fallbackResources);
@@ -201,7 +228,7 @@ bool wxApp::OnInitGui()
          // if you don't log to stderr, nothing will be shown...
         delete wxLog::SetActiveTarget(new wxLogStderr);
         wxString className(wxTheApp->GetClassName());
          // 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);
     }
                    className.c_str());
         exit(-1);
     }
@@ -214,7 +241,7 @@ bool wxApp::OnInitGui()
 
     // Add general resize proc
     XtActionsRec rec;
 
     // Add general resize proc
     XtActionsRec rec;
-    rec.string = "resize";
+    rec.string = wxMOTIF_STR("resize");
     rec.proc = (XtActionProc)wxWidgetResizeProc;
     XtAppAddActions((XtAppContext) wxTheApp->m_appContext, &rec, 1);
 
     rec.proc = (XtActionProc)wxWidgetResizeProc;
     XtAppAddActions((XtAppContext) wxTheApp->m_appContext, &rec, 1);
 
@@ -222,7 +249,7 @@ bool wxApp::OnInitGui()
 
     wxAddIdleCallback();
 
 
     wxAddIdleCallback();
 
-    return TRUE;
+    return true;
 }
 
 WXColormap wxApp::GetMainColormap(WXDisplay* display)
 }
 
 WXColormap wxApp::GetMainColormap(WXDisplay* display)
@@ -241,17 +268,30 @@ WXColormap wxApp::GetMainColormap(WXDisplay* display)
     return (WXColormap) c;
 }
 
     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 );
 
 
     wxXVisualInfo* vi = new wxXVisualInfo;
     wxFillXVisualInfo( vi, (Display*)display );
 
-    (*m_perDisplayData)[display].m_visualInfo = vi;
+    data.m_visualInfo = vi;
 
     return vi;
 }
 
     return vi;
 }
@@ -260,8 +300,12 @@ static void wxTLWidgetDestroyCallback(Widget w, XtPointer clientData,
                                       XtPointer ptr)
 {
     if( wxTheApp )
                                       XtPointer ptr)
 {
     if( wxTheApp )
+    {
         wxTheApp->SetTopLevelWidget( (WXDisplay*)XtDisplay(w),
                                      (WXWidget)NULL );
         wxTheApp->SetTopLevelWidget( (WXDisplay*)XtDisplay(w),
                                      (WXWidget)NULL );
+        wxTheApp->SetTopLevelRealizedWidget( (WXDisplay*)XtDisplay(w),
+                                             (WXWidget)NULL );
+    }
 }
 
 WXWidget wxCreateTopLevelWidget( WXDisplay* display )
 }
 
 WXWidget wxCreateTopLevelWidget( WXDisplay* display )
@@ -271,8 +315,9 @@ WXWidget wxCreateTopLevelWidget( WXDisplay* display )
                                    applicationShellWidgetClass,
                                    (Display*)display,
                                    NULL, 0 );
                                    applicationShellWidgetClass,
                                    (Display*)display,
                                    NULL, 0 );
-    XtSetMappedWhenManaged( tlw, False );
-    XtRealizeWidget( tlw );
+    XtVaSetValues( tlw,
+                   XmNoverrideRedirect, True,
+                   NULL );
 
     XtAddCallback( tlw, XmNdestroyCallback,
                    (XtCallbackProc)wxTLWidgetDestroyCallback,
 
     XtAddCallback( tlw, XmNdestroyCallback,
                    (XtCallbackProc)wxTLWidgetDestroyCallback,
@@ -281,13 +326,24 @@ WXWidget wxCreateTopLevelWidget( WXDisplay* display )
     return (WXWidget)tlw;
 }
 
     return (WXWidget)tlw;
 }
 
+WXWidget wxCreateTopLevelRealizedWidget( WXDisplay* display )
+{
+    Widget rTlw = XtVaCreateWidget( "dummy_widget", topLevelShellWidgetClass,
+                                    (Widget)wxTheApp->GetTopLevelWidget(),
+                                     NULL, 0 );
+    XtSetMappedWhenManaged( rTlw, False );
+    XtRealizeWidget( rTlw );
+
+    return (WXWidget)rTlw;
+}
+
 WXWidget wxApp::GetTopLevelWidget()
 {
     WXDisplay* display = wxGetDisplay();
 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 );
 
     WXWidget tlw = wxCreateTopLevelWidget( display );
     SetTopLevelWidget( display, tlw );
@@ -295,16 +351,37 @@ WXWidget wxApp::GetTopLevelWidget()
     return 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)
 {
 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)
 {
 }
 
 // Yield to other processes
 
 bool wxApp::Yield(bool onlyIfNeeded)
 {
-    bool s_inYield = FALSE;
+    static bool s_inYield = false;
 
     if ( s_inYield )
     {
 
     if ( s_inYield )
     {
@@ -313,17 +390,17 @@ bool wxApp::Yield(bool onlyIfNeeded)
             wxFAIL_MSG( wxT("wxYield called recursively" ) );
         }
 
             wxFAIL_MSG( wxT("wxYield called recursively" ) );
         }
 
-        return FALSE;
+        return false;
     }
 
     }
 
-    s_inYield = TRUE;
+    s_inYield = true;
 
     while (wxTheApp && wxTheApp->Pending())
         wxTheApp->Dispatch();
 
 
     while (wxTheApp && wxTheApp->Pending())
         wxTheApp->Dispatch();
 
-    s_inYield = FALSE;
+    s_inYield = false;
 
 
-    return TRUE;
+    return true;
 }
 
 // ----------------------------------------------------------------------------
 }
 
 // ----------------------------------------------------------------------------