/////////////////////////////////////////////////////////////////////////////
-// Name: app.cpp
+// Name: src/motif/app.cpp
// Purpose: wxApp
// Author: Julian Smart
// Modified by:
#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 <Xm/Xm.h>
#include <X11/Xlib.h>
#include <X11/Xresource.h>
#include <X11/Xatom.h>
#ifdef __VMS__
-#pragma message enable nosimpint
+ #pragma message enable nosimpint
#endif
#include "wx/motif/private.h"
XtPointer ptr);
static WXWidget wxCreateTopLevelWidget( WXDisplay* display );
-extern wxList wxPendingDelete;
extern bool wxAddIdleCallback();
wxHashTable *wxWidgetHashTable = NULL;
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;
}
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
return vi;
}
-static void wxTLWidgetDestroyCallback(Widget w, XtPointer clientData,
- XtPointer ptr)
+static void wxTLWidgetDestroyCallback(Widget w, XtPointer WXUNUSED(clientData),
+ XtPointer WXUNUSED(ptr))
{
if( wxTheApp )
{
return (WXWidget)tlw;
}
-WXWidget wxCreateTopLevelRealizedWidget( WXDisplay* display )
+WXWidget wxCreateTopLevelRealizedWidget( WXDisplay* WXUNUSED(display) )
{
Widget rTlw = XtVaCreateWidget( "dummy_widget", topLevelShellWidgetClass,
(Widget)wxTheApp->GetTopLevelWidget(),
- NULL, 0 );
+ NULL );
XtSetMappedWhenManaged( rTlw, False );
XtRealizeWidget( rTlw );