]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/app.cpp
[#1577388] - fix for scaling in wxImage.
[wxWidgets.git] / src / motif / app.cpp
index ef63f6206ebc740d6db803bb8b919e7fe70508cb..4fa8fbcc8fb0043433150e09d1149989e5c8a9ff 100644 (file)
@@ -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"
 
 #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 <Xm/Label.h>
 #include <X11/Xlib.h>
 #include <X11/Xutil.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"
@@ -68,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;
@@ -80,33 +78,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()
@@ -134,19 +161,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);
 }
 
@@ -177,10 +191,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
 };
 
@@ -190,12 +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
@@ -220,7 +288,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);
 
@@ -275,8 +343,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 )
     {
@@ -305,11 +373,11 @@ WXWidget wxCreateTopLevelWidget( WXDisplay* display )
     return (WXWidget)tlw;
 }
 
-WXWidget wxCreateTopLevelRealizedWidget( WXDisplay* display )
+WXWidget wxCreateTopLevelRealizedWidget( WXDisplay* WXUNUSED(display) )
 {
-    Widget rTlw = XtVaCreateWidget( "dummy_widget", xmLabelWidgetClass,
+    Widget rTlw = XtVaCreateWidget( "dummy_widget", topLevelShellWidgetClass,
                                     (Widget)wxTheApp->GetTopLevelWidget(),
-                                    NULL);
+                                     NULL );
     XtSetMappedWhenManaged( rTlw, False );
     XtRealizeWidget( rTlw );