]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk1/app.cpp
Applied #15375 to stop event-sending in generic wxSpinCtrl ctor (eco)
[wxWidgets.git] / src / gtk1 / app.cpp
index 5858c7570cf1370b1f05e10a7710d0222933684c..5a862ee6e860fc3b2cba797fd56bc57e3523ce76 100644 (file)
@@ -2,17 +2,10 @@
 // Name:        src/gtk1/app.cpp
 // Purpose:
 // Author:      Robert Roebling
 // Name:        src/gtk1/app.cpp
 // Purpose:
 // Author:      Robert Roebling
-// Id:          $Id$
 // Copyright:   (c) 1998 Robert Roebling, Julian Smart
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // Copyright:   (c) 1998 Robert Roebling, Julian Smart
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __VMS
-// vms_jackets.h should for proper working be included before anything else
-# include <vms_jackets.h>
-#undef ConnectionNumber
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 
 #ifndef WX_PRECOMP
     #include "wx/intl.h"
 
 #ifndef WX_PRECOMP
     #include "wx/intl.h"
+    #include "wx/log.h"
+    #include "wx/utils.h"
+    #include "wx/dialog.h"
+    #include "wx/settings.h"
+    #include "wx/msgdlg.h"
+    #include "wx/memory.h"
+    #include "wx/font.h"
+    #include "wx/gdicmn.h"
+    #include "wx/image.h"
+    #include "wx/module.h"
 #endif
 
 #endif
 
-#include "wx/gdicmn.h"
-#include "wx/utils.h"
-#include "wx/log.h"
-#include "wx/memory.h"
-#include "wx/font.h"
-#include "wx/settings.h"
-#include "wx/dialog.h"
-#include "wx/msgdlg.h"
 #include "wx/file.h"
 #include "wx/filename.h"
 #include "wx/file.h"
 #include "wx/filename.h"
-#include "wx/module.h"
-#include "wx/image.h"
 #include "wx/thread.h"
 
 #ifdef __WXGPE__
 #include "wx/thread.h"
 
 #ifdef __WXGPE__
@@ -74,6 +67,9 @@
     #include <sys/types.h>
     #include <sys/time.h>
     #include <unistd.h>
     #include <sys/types.h>
     #include <sys/time.h>
     #include <unistd.h>
+    #ifdef HAVE_SYS_SELECT_H
+        #include <sys/select.h>
+    #endif
 #endif // HAVE_POLL/!HAVE_POLL
 
 #include "wx/unix/private.h"
 #endif // HAVE_POLL/!HAVE_POLL
 
 #include "wx/unix/private.h"
 // global data
 //-----------------------------------------------------------------------------
 
 // global data
 //-----------------------------------------------------------------------------
 
-bool   g_mainThreadLocked = FALSE;
+bool   g_mainThreadLocked = false;
 gint   g_pendingTag = 0;
 
 gint   g_pendingTag = 0;
 
-static GtkWidget *gs_RootWindow = (GtkWidget*) NULL;
+static GtkWidget *gs_RootWindow = NULL;
 
 //-----------------------------------------------------------------------------
 // idle system
 
 //-----------------------------------------------------------------------------
 // idle system
@@ -102,67 +98,6 @@ void wxapp_install_idle_handler();
 static wxMutex gs_idleTagsMutex;
 #endif
 
 static wxMutex gs_idleTagsMutex;
 #endif
 
-//-----------------------------------------------------------------------------
-// wxYield
-//-----------------------------------------------------------------------------
-
-// not static because used by textctrl.cpp
-//
-// MT-FIXME
-bool wxIsInsideYield = FALSE;
-
-bool wxApp::Yield(bool onlyIfNeeded)
-{
-    if ( wxIsInsideYield )
-    {
-        if ( !onlyIfNeeded )
-        {
-            wxFAIL_MSG( wxT("wxYield called recursively" ) );
-        }
-
-        return FALSE;
-    }
-
-#if wxUSE_THREADS
-    if ( !wxThread::IsMain() )
-    {
-        // can't call gtk_main_iteration() from other threads like this
-        return TRUE;
-    }
-#endif // wxUSE_THREADS
-
-    wxIsInsideYield = TRUE;
-
-    // We need to remove idle callbacks or the loop will
-    // never finish.
-    wxTheApp->RemoveIdleTag();
-
-#if wxUSE_LOG
-    // disable log flushing from here because a call to wxYield() shouldn't
-    // normally result in message boxes popping up &c
-    wxLog::Suspend();
-#endif
-
-    while (gtk_events_pending())
-        gtk_main_iteration();
-
-    // It's necessary to call ProcessIdle() to update the frames sizes which
-    // might have been changed (it also will update other things set from
-    // OnUpdateUI() which is a nice (and desired) side effect). But we
-    // call ProcessIdle() only once since this is not meant for longish
-    // background jobs (controlled by wxIdleEvent::RequestMore() and the
-    // return value of Processidle().
-    ProcessIdle();
-
-#if wxUSE_LOG
-    // let the logs be flashed again
-    wxLog::Resume();
-#endif
-
-    wxIsInsideYield = FALSE;
-
-    return TRUE;
-}
 
 //-----------------------------------------------------------------------------
 // wxWakeUpIdle
 
 //-----------------------------------------------------------------------------
 // wxWakeUpIdle
@@ -180,14 +115,14 @@ void wxApp::WakeUpIdle()
 #if wxUSE_THREADS
     if (!wxThread::IsMain())
         wxMutexGuiEnter();
 #if wxUSE_THREADS
     if (!wxThread::IsMain())
         wxMutexGuiEnter();
-#endif // wxUSE_THREADS_
+#endif // wxUSE_THREADS
 
     wxapp_install_idle_handler();
 
 #if wxUSE_THREADS
     if (!wxThread::IsMain())
         wxMutexGuiLeave();
 
     wxapp_install_idle_handler();
 
 #if wxUSE_THREADS
     if (!wxThread::IsMain())
         wxMutexGuiLeave();
-#endif // wxUSE_THREADS_
+#endif // wxUSE_THREADS
 }
 
 //-----------------------------------------------------------------------------
 }
 
 //-----------------------------------------------------------------------------
@@ -235,7 +170,7 @@ static gint wxapp_idle_callback( gpointer WXUNUSED(data) )
     if (!wxTheApp)
         return TRUE;
 
     if (!wxTheApp)
         return TRUE;
 
-#ifdef __WXDEBUG__
+#if wxDEBUG_LEVEL
     // don't generate the idle events while the assert modal dialog is shown,
     // this completely confuses the apps which don't expect to be reentered
     // from some safely-looking functions
     // don't generate the idle events while the assert modal dialog is shown,
     // this completely confuses the apps which don't expect to be reentered
     // from some safely-looking functions
@@ -250,7 +185,7 @@ static gint wxapp_idle_callback( gpointer WXUNUSED(data) )
         }
         return TRUE;
     }
         }
         return TRUE;
     }
-#endif // __WXDEBUG__
+#endif // wxDEBUG_LEVEL
 
     // When getting called from GDK's time-out handler
     // we are no longer within GDK's grab on the GUI
 
     // When getting called from GDK's time-out handler
     // we are no longer within GDK's grab on the GUI
@@ -310,7 +245,7 @@ int wxPoll(wxPollFd *ufds, unsigned int nfds, int timeout)
     unsigned int i;
     for ( i = 0; i < nfds; i++ )
     {
     unsigned int i;
     for ( i = 0; i < nfds; i++ )
     {
-        wxASSERT_MSG( ufds[i].fd < wxFD_SETSIZE, _T("fd out of range") );
+        wxASSERT_MSG( ufds[i].fd < FD_SETSIZE, wxT("fd out of range") );
 
         if ( ufds[i].events & G_IO_IN )
             wxFD_SET(ufds[i].fd, &readfds);
 
         if ( ufds[i].events & G_IO_IN )
             wxFD_SET(ufds[i].fd, &readfds);
@@ -353,14 +288,14 @@ static gint wxapp_poll_func( GPollFD *ufds, guint nfds, gint timeout )
     gdk_threads_enter();
 
     wxMutexGuiLeave();
     gdk_threads_enter();
 
     wxMutexGuiLeave();
-    g_mainThreadLocked = TRUE;
+    g_mainThreadLocked = true;
 
     // we rely on the fact that glib GPollFD struct is really just pollfd but
     // I wonder how wise is this in the long term (VZ)
     gint res = wxPoll( (wxPollFd *) ufds, nfds, timeout );
 
     wxMutexGuiEnter();
 
     // we rely on the fact that glib GPollFD struct is really just pollfd but
     // I wonder how wise is this in the long term (VZ)
     gint res = wxPoll( (wxPollFd *) ufds, nfds, timeout );
 
     wxMutexGuiEnter();
-    g_mainThreadLocked = FALSE;
+    g_mainThreadLocked = false;
 
     gdk_threads_leave();
 
 
     gdk_threads_leave();
 
@@ -389,7 +324,7 @@ void wxapp_install_idle_handler()
 
     wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") );
 
 
     wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") );
 
-    g_isIdle = FALSE;
+    g_isIdle = false;
 
     if (g_pendingTag == 0)
         g_pendingTag = gtk_idle_add_priority( 900, wxapp_pending_callback, (gpointer) NULL );
 
     if (g_pendingTag == 0)
         g_pendingTag = gtk_idle_add_priority( 900, wxapp_pending_callback, (gpointer) NULL );
@@ -402,6 +337,28 @@ void wxapp_install_idle_handler()
     wxTheApp->m_idleTag = gtk_idle_add_priority( 1000, wxapp_idle_callback, (gpointer) NULL );
 }
 
     wxTheApp->m_idleTag = gtk_idle_add_priority( 1000, wxapp_idle_callback, (gpointer) NULL );
 }
 
+static bool wxOKlibc()
+{
+#if defined(__UNIX__) && defined(__GLIBC__)
+    // glibc 2.0 uses UTF-8 even when it shouldn't
+    wchar_t res = 0;
+    if ((MB_CUR_MAX == 2) &&
+        (wxMB2WC(&res, "\xdd\xa5", 1) == 1) &&
+        (res==0x765))
+    {
+        // this is UTF-8 allright, check whether that's what we want
+        char *cur_locale = setlocale(LC_CTYPE, NULL);
+        if ((strlen(cur_locale) < 4) ||
+        (strcasecmp(cur_locale + strlen(cur_locale) - 4, "utf8")) ||
+        (strcasecmp(cur_locale + strlen(cur_locale) - 5, "utf-8"))) {
+        // nope, don't use libc conversion
+        return false;
+        }
+    }
+#endif
+    return true;
+}
+
 //-----------------------------------------------------------------------------
 // Access to the root window global
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 // Access to the root window global
 //-----------------------------------------------------------------------------
@@ -422,15 +379,9 @@ GtkWidget* wxGetRootWindow()
 
 IMPLEMENT_DYNAMIC_CLASS(wxApp,wxEvtHandler)
 
 
 IMPLEMENT_DYNAMIC_CLASS(wxApp,wxEvtHandler)
 
-BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
-    EVT_IDLE(wxAppBase::OnIdle)
-END_EVENT_TABLE()
-
 wxApp::wxApp()
 {
 wxApp::wxApp()
 {
-#ifdef __WXDEBUG__
-    m_isInAssert = FALSE;
-#endif // __WXDEBUG__
+    m_isInAssert = false;
 
     m_idleTag = 0;
     g_isIdle = TRUE;
 
     m_idleTag = 0;
     g_isIdle = TRUE;
@@ -443,8 +394,8 @@ wxApp::wxApp()
     m_colorCube = (unsigned char*) NULL;
 
     // this is NULL for a "regular" wxApp, but is set (and freed) by a wxGLApp
     m_colorCube = (unsigned char*) NULL;
 
     // this is NULL for a "regular" wxApp, but is set (and freed) by a wxGLApp
-    m_glVisualInfo = (void *) NULL;
-    m_glFBCInfo = (void *) NULL;
+    m_glVisualInfo = NULL;
+    m_glFBCInfo = NULL;
 }
 
 wxApp::~wxApp()
 }
 
 wxApp::~wxApp()
@@ -457,7 +408,7 @@ wxApp::~wxApp()
 bool wxApp::OnInitGui()
 {
     if ( !wxAppBase::OnInitGui() )
 bool wxApp::OnInitGui()
 {
     if ( !wxAppBase::OnInitGui() )
-        return FALSE;
+        return false;
 
     GdkVisual *visual = gdk_visual_get_system();
 
 
     GdkVisual *visual = gdk_visual_get_system();
 
@@ -541,7 +492,7 @@ bool wxApp::OnInitGui()
         }
     }
 
         }
     }
 
-    return TRUE;
+    return true;
 }
 
 GdkVisual *wxApp::GetGdkVisual()
 }
 
 GdkVisual *wxApp::GetGdkVisual()
@@ -579,14 +530,8 @@ bool wxApp::Initialize(int& argc, wxChar **argv)
 
     gtk_set_locale();
 
 
     gtk_set_locale();
 
-    // We should have the wxUSE_WCHAR_T test on the _outside_
-#if wxUSE_WCHAR_T
-        if (!wxOKlibc())
-            wxConvCurrent = &wxConvLocal;
-#else // !wxUSE_WCHAR_T
     if (!wxOKlibc())
     if (!wxOKlibc())
-        wxConvCurrent = (wxMBConv*) NULL;
-#endif // wxUSE_WCHAR_T/!wxUSE_WCHAR_T
+        wxConvCurrent = &wxConvLocal;
 
 #if wxUSE_UNICODE
     // gtk_init() wants UTF-8, not wchar_t, so convert
 
 #if wxUSE_UNICODE
     // gtk_init() wants UTF-8, not wchar_t, so convert
@@ -641,7 +586,7 @@ bool wxApp::Initialize(int& argc, wxChar **argv)
         return false;
     }
 
         return false;
     }
 
-    // we can not enter threads before gtk_init is done
+    // we cannot enter threads before gtk_init is done
     gdk_threads_enter();
 
     if ( !wxAppBase::Initialize(argc, argv) )
     gdk_threads_enter();
 
     if ( !wxAppBase::Initialize(argc, argv) )
@@ -667,19 +612,30 @@ void wxApp::CleanUp()
     wxAppBase::CleanUp();
 }
 
     wxAppBase::CleanUp();
 }
 
-#ifdef __WXDEBUG__
-
-void wxApp::OnAssert(const wxChar *file, int line, const wxChar* cond, const wxChar *msg)
+void wxApp::OnAssertFailure(const wxChar *file,
+                            int line,
+                            const wxChar* func,
+                            const wxChar* cond,
+                            const wxChar *msg)
 {
 {
-    m_isInAssert = TRUE;
-
-    wxAppBase::OnAssert(file, line, cond, msg);
-
-    m_isInAssert = FALSE;
+    // there is no need to do anything if asserts are disabled in this build
+    // anyhow
+#if wxDEBUG_LEVEL
+    // block wx idle events while assert dialog is showing
+    m_isInAssert = true;
+
+    wxAppBase::OnAssertFailure(file, line, func, cond, msg);
+
+    m_isInAssert = false;
+#else // !wxDEBUG_LEVEL
+    wxUnusedVar(file);
+    wxUnusedVar(line);
+    wxUnusedVar(func);
+    wxUnusedVar(cond);
+    wxUnusedVar(msg);
+#endif // wxDEBUG_LEVEL/!wxDEBUG_LEVEL
 }
 
 }
 
-#endif // __WXDEBUG__
-
 void wxApp::RemoveIdleTag()
 {
 #if wxUSE_THREADS
 void wxApp::RemoveIdleTag()
 {
 #if wxUSE_THREADS
@@ -689,6 +645,6 @@ void wxApp::RemoveIdleTag()
     {
         gtk_idle_remove( wxTheApp->m_idleTag );
         wxTheApp->m_idleTag = 0;
     {
         gtk_idle_remove( wxTheApp->m_idleTag );
         wxTheApp->m_idleTag = 0;
-        g_isIdle = TRUE;
+        g_isIdle = true;
     }
 }
     }
 }