X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d5bef0a32337a8e8b2666fd64f78dbbbf01cda3f..44d669c8806e956dd26f48acd46b792822511fe8:/src/gtk/utilsgtk.cpp diff --git a/src/gtk/utilsgtk.cpp b/src/gtk/utilsgtk.cpp index cb2455bbcd..ae645105e1 100644 --- a/src/gtk/utilsgtk.cpp +++ b/src/gtk/utilsgtk.cpp @@ -11,11 +11,14 @@ #include "wx/wxprec.h" #include "wx/utils.h" -#include "wx/string.h" + +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/intl.h" + #include "wx/log.h" +#endif #include "wx/apptrait.h" -#include "wx/intl.h" -#include "wx/log.h" #include "wx/process.h" @@ -69,12 +72,12 @@ bool wxSetDetectableAutoRepeat( bool flag ) { Bool result; XkbSetDetectableAutoRepeat( GDK_DISPLAY(), flag, &result ); - return result; /* TRUE if keyboard hardware supports this mode */ + return result; /* true if keyboard hardware supports this mode */ } #else bool wxSetDetectableAutoRepeat( bool WXUNUSED(flag) ) { - return FALSE; + return false; } #endif @@ -152,7 +155,7 @@ void wxGetMousePosition( int* x, int* y ) bool wxColourDisplay() { - return TRUE; + return true; } int wxDisplayDepth() @@ -160,21 +163,6 @@ int wxDisplayDepth() return gdk_drawable_get_visual( wxGetRootWindow()->window )->depth; } -wxToolkitInfo& wxGUIAppTraits::GetToolkitInfo() -{ - static wxToolkitInfo info; - info.shortName = _T("gtk2"); - info.name = _T("wxGTK"); -#ifdef __WXUNIVERSAL__ - info.shortName << _T("univ"); - info.name << _T("/wxUniversal"); -#endif - info.versionMajor = gtk_major_version; - info.versionMinor = gtk_minor_version; - info.os = wxGTK; - return info; -} - wxWindow* wxFindWindowAtPoint(const wxPoint& pt) { return wxGenericFindWindowAtPoint(pt); @@ -184,25 +172,48 @@ wxWindow* wxFindWindowAtPoint(const wxPoint& pt) wxCharBuffer wxConvertToGTK(const wxString& s, wxFontEncoding enc) { + wxCharBuffer buf; if ( enc == wxFONTENCODING_UTF8 ) { - // no need for conversion at all - return wxCharBuffer(s); - } - - wxWCharBuffer wbuf; - if ( enc == wxFONTENCODING_SYSTEM || enc == wxFONTENCODING_DEFAULT ) - { - wbuf = wxConvUI->cMB2WC(s); + // 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); + } } - else // another encoding, use generic conversion class + else // !UTF-8 { - wbuf = wxCSConv(enc).cMB2WC(s); - } + 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); + } - wxCharBuffer buf; - if ( wbuf ) - buf = wxConvUTF8.cWC2MB(wbuf); + if ( wbuf ) + buf = wxConvUTF8.cWC2MB(wbuf); + } return buf; } @@ -257,3 +268,18 @@ int wxAddProcessCallback(wxEndProcessData *proc_data, int fd) return tag; } + + +// ---------------------------------------------------------------------------- +// wxPlatformInfo-related +// ---------------------------------------------------------------------------- + +wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const +{ + if ( verMaj ) + *verMaj = gtk_major_version; + if ( verMin ) + *verMin = gtk_minor_version; + + return wxPORT_GTK; +}