X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cb81f1a6f1d8454dd09edf46688ba55e5f2774d4..de63b922cadc81306a1905c81cfd0be7ae32adbb:/src/motif/app.cpp?ds=sidebyside diff --git a/src/motif/app.cpp b/src/motif/app.cpp index 4add04f7cf..90e6fc94b9 100644 --- a/src/motif/app.cpp +++ b/src/motif/app.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: app.cpp +// Name: src/motif/app.cpp // Purpose: wxApp // Author: Julian Smart // Modified by: @@ -9,10 +9,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "app.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -79,33 +75,62 @@ BEGIN_EVENT_TABLE(wxApp, wxEvtHandler) END_EVENT_TABLE() #ifdef __WXDEBUG__ +extern "C" +{ 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__ -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); +#if wxUSE_INTL + wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding()); +#endif + return true; } void wxApp::CleanUp() { + wxAppBase::CleanUp(); + 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; + // On Solaris 10 calling XtDestroyWidget on the top level widget + // dumps core if the locale is set to something other than "C" +#ifndef __SUN__ + XtDestroyWidget( it->second->m_topLevelWidget ); +#endif + delete it->second; + } + + delete m_perDisplayData; } void wxApp::Exit() @@ -133,19 +158,6 @@ wxApp::wxApp() wxApp::~wxApp() { - 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; - wxApp::SetInstance(NULL); } @@ -176,10 +188,19 @@ void wxApp::HandlePropertyChange(WXEvent *event) } 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 }; @@ -189,12 +210,57 @@ bool wxApp::OnInitGui() if( !wxAppBase::OnInitGui() ) return false; +#ifdef __HPUX__ + // under HP-UX creating XmFontSet fails when the system locale is C and + // we're using a remote DISPLAY, presumably because HP-UX uses its own + // names for C and ISO locales (roman8 and iso8859n respectively) and so + // its Motif libraries have troubles with non-HP X server + // + // whatever the reason, the fact is that without this hack any wxMotif + // program crashes on startup because it can't create any font (HP programs + // still work but they do spit out messages about failing to create font + // sets and failing back on "fixed" font too) + // + // notice that calling setlocale() here is not enough because X(m) init + // functions call setlocale() later so we really have to change environment + bool fixAll = false; // tweak LC_ALL (or just LC_CTYPE)? + const char *loc = getenv("LC_CTYPE"); + if ( !loc ) + { + loc = getenv("LC_ALL"); + if ( loc ) + fixAll = true; + } + + if ( !loc || + (loc[0] == 'C' && loc[1] == '\0') || + strcmp(loc, "POSIX") == 0 ) + { + // we're using C locale, "fix" it + wxLogDebug(_T("HP-UX fontset hack: forcing locale to en_US.iso88591")); + putenv(fixAll ? "LC_ALL=en_US.iso88591" : "LC_CTYPE=en_US.iso88591"); + } +#endif // __HPUX__ + + XtSetLanguageProc(NULL, NULL, NULL); XtToolkitInitialize() ; wxTheApp->m_appContext = (WXAppContext) XtCreateApplicationContext(); XtAppSetFallbackResources((XtAppContext) wxTheApp->m_appContext, fallbackResources); - Display *dpy = XtOpenDisplay((XtAppContext) wxTheApp->m_appContext,(String)NULL,NULL, - wxTheApp->GetClassName().c_str(), NULL, 0, + // we shouldn't pass empty application/class name as it results in + // immediate crash inside XOpenIM() (if XIM is used) under IRIX + wxString appname = wxTheApp->GetAppName(); + if ( appname.empty() ) + appname = _T("wxapp"); + wxString clsname = wxTheApp->GetClassName(); + if ( clsname.empty() ) + clsname = _T("wx"); + + Display *dpy = XtOpenDisplay((XtAppContext) wxTheApp->m_appContext, + (String)NULL, + appname.c_str(), + clsname.c_str(), + NULL, 0, // no options # if XtSpecificationRelease < 5 (Cardinal*) &argc, # else @@ -219,7 +285,7 @@ bool wxApp::OnInitGui() // 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); @@ -274,8 +340,8 @@ wxXVisualInfo* wxApp::GetVisualInfo( WXDisplay* display ) return vi; } -static void wxTLWidgetDestroyCallback(Widget w, XtPointer clientData, - XtPointer ptr) +static void wxTLWidgetDestroyCallback(Widget w, XtPointer WXUNUSED(clientData), + XtPointer WXUNUSED(ptr)) { if( wxTheApp ) { @@ -304,7 +370,7 @@ WXWidget wxCreateTopLevelWidget( WXDisplay* display ) return (WXWidget)tlw; } -WXWidget wxCreateTopLevelRealizedWidget( WXDisplay* display ) +WXWidget wxCreateTopLevelRealizedWidget( WXDisplay* WXUNUSED(display) ) { Widget rTlw = XtVaCreateWidget( "dummy_widget", topLevelShellWidgetClass, (Widget)wxTheApp->GetTopLevelWidget(),