]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/utilsgtk.cpp
added HasExtraStyle()
[wxWidgets.git] / src / gtk / utilsgtk.cpp
index 7f2f15d92cb5f204054537364f62df89cfa038f9..2ce48b8fb1ca19dae25f4be50873dd70148074b8 100644 (file)
@@ -24,6 +24,8 @@
 
 #include "wx/unix/execute.h"
 
+#include "wx/gtk/private/timer.h"
+
 #ifdef __WXDEBUG__
     #include "wx/gtk/assertdlg_gtk.h"
     #if wxUSE_STACKWALKER
@@ -185,54 +187,65 @@ wxWindow* wxFindWindowAtPoint(const wxPoint& pt)
 
 wxCharBuffer wxConvertToGTK(const wxString& s, wxFontEncoding enc)
 {
-    wxCharBuffer buf;
-    if ( enc == wxFONTENCODING_UTF8 )
+    wxWCharBuffer wbuf;
+    if ( enc == wxFONTENCODING_SYSTEM || enc == wxFONTENCODING_DEFAULT )
     {
-        // no need for conversion at all, but do check that we have a valid
-        // UTF-8 string because passing invalid UTF-8 to GTK+ is going to
-        // result in a GTK+ error message and, especially, loss of data which
-        // was supposed to be shown in the GUI
-        if ( wxConvUTF8.ToWChar(NULL, 0, s, s.length()) == wxCONV_FAILED )
-        {
-            // warn the programmer that something is probably wrong in his code
-            //
-            // NB: don't include the string in output because chances are that
-            //     this invalid UTF-8 string could result in more errors itself
-            //     if the application shows logs in the GUI and so we get into
-            //     an infinite loop
-            wxLogDebug(_T("Invalid UTF-8 string in wxConvertToGTK()"));
-
-            // but still try to show at least something on the screen
-            wxMBConvUTF8 utf8permissive(wxMBConvUTF8::MAP_INVALID_UTF8_TO_OCTAL);
-            wxWCharBuffer wbuf(utf8permissive.cMB2WC(s));
-            buf = wxConvUTF8.cWC2MB(wbuf);
-        }
-        else // valid UTF-8 string, no need to convert
-        {
-            buf = wxCharBuffer(s);
-        }
+        wbuf = wxConvUI->cMB2WC(s);
     }
-    else // !UTF-8
+    else // another encoding, use generic conversion class
     {
-        wxWCharBuffer wbuf;
-        if ( enc == wxFONTENCODING_SYSTEM || enc == wxFONTENCODING_DEFAULT )
-        {
-            wbuf = wxConvUI->cMB2WC(s);
-        }
-        else // another encoding, use generic conversion class
-        {
-            wbuf = wxCSConv(enc).cMB2WC(s);
-        }
+        wbuf = wxCSConv(enc).cMB2WC(s);
+    }
 
-        if ( wbuf )
-            buf = wxConvUTF8.cWC2MB(wbuf);
+    if ( !wbuf && !s.empty() )
+    {
+        // conversion failed, but we still want to show something to the user
+        // even if it's going to be wrong it is better than nothing
+        //
+        // we choose ISO8859-1 here arbitrarily, it's just the most common
+        // encoding probably and, also importantly here, conversion from it
+        // never fails as it's done internally by wxCSConv
+        wbuf = wxCSConv(wxFONTENCODING_ISO8859_1).cMB2WC(s);
     }
 
-    return buf;
+    return wxConvUTF8.cWC2MB(wbuf);
+}
+
+wxCharBuffer wxConvertFromGTK(const wxString& s, wxFontEncoding enc)
+{
+    // this conversion should never fail as GTK+ always uses UTF-8 internally
+    // so there are no complications here
+    const wxWCharBuffer wbuf(wxConvUTF8.cMB2WC(s));
+    if ( enc == wxFONTENCODING_SYSTEM )
+        return wxConvUI->cWC2MB(wbuf);
+
+    return wxCSConv(enc).cWC2MB(wbuf);
 }
 
 #endif // !wxUSE_UNICODE
 
+// Returns false if version is certainly greater or equal than major.minor.micro
+// Returns true if version is lower than major.minor.micro OR it cannot be
+// determined and one should not rely on the availability of pango version
+// major.minor.micro, nor the non-availability
+const gchar *wx_pango_version_check (int major, int minor, int micro)
+{
+#ifdef PANGO_VERSION_MAJOR
+    if (!gtk_check_version (2,11,0))
+    {
+        // GTK+ 2.11 requires Pango >= 1.15.3 and pango_version_check
+        // was added in Pango 1.15.2 thus we know for sure the pango lib we're
+        // using has the pango_version_check function:
+        return pango_version_check (major, minor, micro);
+    }
+
+    return "can't check";
+#else // !PANGO_VERSION_MAJOR
+    return "too old headers";
+#endif
+}
+
+
 // ----------------------------------------------------------------------------
 // subprocess routines
 // ----------------------------------------------------------------------------
@@ -297,6 +310,11 @@ wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
     return wxPORT_GTK;
 }
 
+wxTimerImpl *wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
+{
+    return new wxGTKTimerImpl(timer);
+}
+
 #if wxUSE_DETECT_SM
 static wxString GetSM()
 {
@@ -340,6 +358,13 @@ static wxString GetSM()
 // wxGUIAppTraits
 //-----------------------------------------------------------------------------
 
+#if wxUSE_INTL
+void wxGUIAppTraits::SetLocale()
+{
+    gtk_set_locale();
+}
+#endif
+
 #ifdef __WXDEBUG__
 
 #if wxUSE_STACKWALKER
@@ -386,7 +411,8 @@ extern "C"
 {
     void get_stackframe_callback(StackDump *dump)
     {
-        dump->ProcessFrames(2); // don't show ShowAssertDialog() call itself
+        // skip over frames up to including wxOnAssert()
+        dump->ProcessFrames(3);
     }
 }