]> git.saurik.com Git - wxWidgets.git/blobdiff - src/x11/app.cpp
fix compilation for GTK1
[wxWidgets.git] / src / x11 / app.cpp
index 90daa58df0c2f04d597b343b70fd37565717349a..5c2371a2bb91eb345b0bd94659de2d6e5be21485 100644 (file)
@@ -26,6 +26,8 @@
 #include "wx/intl.h"
 #include "wx/evtloop.h"
 #include "wx/timer.h"
+#include "wx/filename.h"
+#include "wx/hash.h"
 
 #include "wx/univ/theme.h"
 #include "wx/univ/renderer.h"
@@ -57,8 +59,6 @@ wxApp *wxTheApp = NULL;
 
 // This is set within wxEntryStart -- too early on
 // to put these in wxTheApp
-static int g_newArgc = 0;
-static wxChar** g_newArgv = NULL;
 static bool g_showIconic = FALSE;
 static wxSize g_initialSize = wxDefaultSize;
 
@@ -136,10 +136,6 @@ bool wxApp::Initialize()
 
 void wxApp::CleanUp()
 {
-    if (g_newArgv)
-        delete[] g_newArgv;
-    g_newArgv = NULL;
-
     delete wxWidgetHashTable;
     wxWidgetHashTable = NULL;
     delete wxClientWidgetHashTable;
@@ -197,20 +193,13 @@ int wxEntryStart( int& argc, char *argv[] )
 #endif
 #endif // __WXDEBUG__
 
-    wxString displayName;
+    char *displayName = NULL;
     bool syncDisplay = FALSE;
 
-    // Parse the arguments.
-    // We can't use wxCmdLineParser or OnInitCmdLine and friends because
-    // we have to create the Display earlier. If we can find a way to
-    // use the wxAppBase API then I'll be quite happy to change it.
-    g_newArgv = new wxChar*[argc];
-    g_newArgc = 0;
     int i;
     for (i = 0; i < argc; i++)
     {
-        wxString arg(argv[i]);
-        if (arg == wxT("-display"))
+        if (strcmp( argv[i], "-display") == 0)
         {
             if (i < (argc - 1))
             {
@@ -219,16 +208,15 @@ int wxEntryStart( int& argc, char *argv[] )
                 continue;
             }
         }
-        else if (arg == wxT("-geometry"))
+        else if (strcmp( argv[i], "-geometry") == 0)
         {
             if (i < (argc - 1))
             {
                 i ++;
-                wxString windowGeometry = argv[i];
                 int w, h;
-                if (wxSscanf(windowGeometry.c_str(), _T("%dx%d"), &w, &h) != 2)
+                if (sscanf(argv[i], "%dx%d", &w, &h) != 2)
                 {
-                    wxLogError(_("Invalid geometry specification '%s'"), windowGeometry.c_str());
+                    wxLogError( _("Invalid geometry specification '%s'"), wxString::FromAscii(argv[i]).c_str() );
                 }
                 else
                 {
@@ -237,29 +225,22 @@ int wxEntryStart( int& argc, char *argv[] )
                 continue;
             }
         }
-        else if (arg == wxT("-sync"))
+        else if (strcmp( argv[i], "-sync") == 0)
         {
             syncDisplay = TRUE;
             continue;
         }
-        else if (arg == wxT("-iconic"))
+        else if (strcmp( argv[i], "-iconic") == 0)
         {
             g_showIconic = TRUE;
 
             continue;
         }
 
-        // Not eaten by wxWindows, so pass through
-        g_newArgv[g_newArgc] = argv[i];
-        g_newArgc ++;
     }
 
-    Display* xdisplay = NULL;
-    if (displayName.IsEmpty())
-        xdisplay = XOpenDisplay(NULL);
-    else
-        xdisplay = XOpenDisplay((char*) displayName.c_str());
-
+    // X11 display stuff    
+    Display* xdisplay = XOpenDisplay( displayName );
     if (!xdisplay)
     {
         wxLogError( _("wxWindows could not open display. Exiting.") );
@@ -267,16 +248,20 @@ int wxEntryStart( int& argc, char *argv[] )
     }
 
     if (syncDisplay)
-    {
         XSynchronize(xdisplay, True);
-    }
 
     wxApp::ms_display = (WXDisplay*) xdisplay;
-
+    
     XSelectInput( xdisplay, XDefaultRootWindow(xdisplay), PropertyChangeMask);
 
+    // Misc.
     wxSetDetectableAutoRepeat( TRUE );
 
+#if wxUSE_UNICODE
+    // Glib's type system required by Pango
+    g_type_init();
+#endif    
+
     if (!wxApp::Initialize())
         return -1;
 
@@ -315,32 +300,39 @@ int wxEntry( int argc, char *argv[] )
         {
             printf( "wxWindows error: No initializer - use IMPLEMENT_APP macro.\n" );
             return 0;
-        };
+        }
 
         wxTheApp = (wxApp*) (* wxApp::GetInitializerFunction()) ();
-    };
+    }
 
     if (!wxTheApp)
     {
         printf( "wxWindows error: wxTheApp == NULL\n" );
         return 0;
-    };
-
-    wxTheApp->SetClassName(wxFileNameFromPath(argv[0]));
-    wxTheApp->SetAppName(wxFileNameFromPath(argv[0]));
+    }
 
-    // The command line may have been changed
-    // by stripping out -display etc.
-    if (g_newArgc > 0)
+    // Command line argument stuff
+    wxTheApp->argc = argc;
+#if wxUSE_UNICODE
+    wxTheApp->argv = new wxChar*[argc+1];
+    int mb_argc = 0;
+    while (mb_argc < argc)
     {
-        wxTheApp->argc = g_newArgc;
-        wxTheApp->argv = g_newArgv;
+        wxString tmp = wxString::FromAscii( argv[mb_argc] );
+        wxTheApp->argv[mb_argc] = wxStrdup( tmp.c_str() );
+        mb_argc++;
     }
-    else
+    wxTheApp->argv[mb_argc] = (wxChar *)NULL;
+#else
+    wxTheApp->argv = argv;
+#endif
+
+    if (wxTheApp->argc > 0)
     {
-        wxTheApp->argc = argc;
-        wxTheApp->argv = argv;
+        wxFileName fname( wxTheApp->argv[0] );
+        wxTheApp->SetAppName( fname.GetName() );
     }
+
     wxTheApp->m_showIconic = g_showIconic;
     wxTheApp->m_initialSize = g_initialSize;
 
@@ -602,6 +594,9 @@ bool wxApp::ProcessXEvent(WXEvent* _event)
                 return TRUE;
 
             keyEvent.SetEventType(wxEVT_CHAR);
+            // Do the translation again, retaining the ASCII
+            // code.
+            wxTranslateKeyEvent(keyEvent, win, window, event, TRUE);
             if (win->GetEventHandler()->ProcessEvent( keyEvent ))
                 return TRUE;
 
@@ -1111,6 +1106,42 @@ bool wxApp::OnInitGui()
     return TRUE;
 }
 
+#if wxUSE_UNICODE
+
+#include <pango/pango.h>
+#include <pango/pangox.h>
+#include <pango/pangoxft.h>
+
+PangoContext* wxApp::GetPangoContext()
+{
+    static PangoContext *ret = NULL;
+    if (ret)
+        return ret;
+    
+    Display *xdisplay = (Display*) wxApp::GetDisplay();
+    
+#if 1
+    int xscreen = DefaultScreen(xdisplay);
+    static int use_xft = -1;
+    if (use_xft == -1)
+    {
+        wxString val = wxGetenv( L"GDK_USE_XFT" );
+        use_xft = (val == L"1");
+    }
+  
+    if (use_xft)
+        ret = pango_xft_get_context( xdisplay, xscreen );
+    else
+#endif
+        ret = pango_x_get_context( xdisplay );
+        
+    if (!PANGO_IS_CONTEXT(ret))
+        wxLogError( wxT("No pango context.") );
+        
+    return ret;
+}
+#endif
+
 WXColormap wxApp::GetMainColormap(WXDisplay* display)
 {
     if (!display) /* Must be called first with non-NULL display */
@@ -1174,45 +1205,56 @@ void wxExit()
 
 bool wxApp::Yield(bool onlyIfNeeded)
 {
-    bool s_inYield = FALSE;
-
-    if ( s_inYield )
+    // Sometimes only 2 yields seem
+    // to do the trick, e.g. in the
+    // progress dialog
+    int i;
+    for (i = 0; i < 2; i++)
     {
-        if ( !onlyIfNeeded )
+        bool s_inYield = FALSE;
+
+        if ( s_inYield )
         {
-            wxFAIL_MSG( wxT("wxYield called recursively" ) );
-        }
+            if ( !onlyIfNeeded )
+            {
+                wxFAIL_MSG( wxT("wxYield called recursively" ) );
+            }
 
-        return FALSE;
-    }
+            return FALSE;
+        }
 
-    s_inYield = TRUE;
+        s_inYield = TRUE;
 
-    // Make sure we have an event loop object,
-    // or Pending/Dispatch will fail
-    wxEventLoop* eventLoop = wxEventLoop::GetActive();
-    wxEventLoop* newEventLoop = NULL;
-    if (!eventLoop)
-    {
-        newEventLoop = new wxEventLoop;
-        wxEventLoop::SetActive(newEventLoop);
-    }
+        // Make sure we have an event loop object,
+        // or Pending/Dispatch will fail
+        wxEventLoop* eventLoop = wxEventLoop::GetActive();
+        wxEventLoop* newEventLoop = NULL;
+        if (!eventLoop)
+        {
+            newEventLoop = new wxEventLoop;
+            wxEventLoop::SetActive(newEventLoop);
+        }
 
-    while (wxTheApp && wxTheApp->Pending())
+        // Call dispatch at least once so that sockets
+        // can be tested
         wxTheApp->Dispatch();
+        
+        while (wxTheApp && wxTheApp->Pending())
+            wxTheApp->Dispatch();
 
 #if wxUSE_TIMER
-    wxTimer::NotifyTimers();
+        wxTimer::NotifyTimers();
 #endif
-    ProcessIdle();
+        ProcessIdle();
 
-    if (newEventLoop)
-    {
-        wxEventLoop::SetActive(NULL);
-        delete newEventLoop;
-    }
+        if (newEventLoop)
+        {
+            wxEventLoop::SetActive(NULL);
+            delete newEventLoop;
+        }
 
-    s_inYield = FALSE;
+        s_inYield = FALSE;
+    }
 
     return TRUE;
 }