X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/550343399aa1355469ffed72c8cf84c732dcf98b..ae6a64b6af83a95769363424e09d117a96a15a4c:/src/motif/app.cpp diff --git a/src/motif/app.cpp b/src/motif/app.cpp index 30f5e9b98f..4fa8fbcc8f 100644 --- a/src/motif/app.cpp +++ b/src/motif/app.cpp @@ -18,20 +18,24 @@ #endif #include "wx/app.h" -#include "wx/utils.h" -#include "wx/module.h" -#include "wx/memory.h" -#include "wx/log.h" -#include "wx/intl.h" + +#ifndef WX_PRECOMP + #include "wx/hash.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/utils.h" + #include "wx/memory.h" + #include "wx/font.h" +#endif + #include "wx/evtloop.h" -#include "wx/hash.h" #if wxUSE_THREADS #include "wx/thread.h" #endif #ifdef __VMS__ -#pragma message disable nosimpint + #pragma message disable nosimpint #endif #include #include @@ -39,7 +43,7 @@ #include #include #ifdef __VMS__ -#pragma message enable nosimpint + #pragma message enable nosimpint #endif #include "wx/motif/private.h" @@ -63,7 +67,6 @@ static void wxTLWidgetDestroyCallback(Widget w, XtPointer clientData, XtPointer ptr); static WXWidget wxCreateTopLevelWidget( WXDisplay* display ); -extern wxList wxPendingDelete; extern bool wxAddIdleCallback(); wxHashTable *wxWidgetHashTable = NULL; @@ -122,7 +125,11 @@ void wxApp::CleanUp() 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; } @@ -206,13 +213,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 @@ -326,7 +377,7 @@ WXWidget wxCreateTopLevelRealizedWidget( WXDisplay* WXUNUSED(display) ) { Widget rTlw = XtVaCreateWidget( "dummy_widget", topLevelShellWidgetClass, (Widget)wxTheApp->GetTopLevelWidget(), - NULL, 0 ); + NULL ); XtSetMappedWhenManaged( rTlw, False ); XtRealizeWidget( rTlw );