X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8bb6b2c057edbcc5b87f00a8af6ac70f6fd69727..a6c82d64cea683018dfab0f65c1e26ec07eab0c3:/src/gtk/utilsgtk.cpp diff --git a/src/gtk/utilsgtk.cpp b/src/gtk/utilsgtk.cpp index 4ffa937042..1144d39c3a 100644 --- a/src/gtk/utilsgtk.cpp +++ b/src/gtk/utilsgtk.cpp @@ -47,6 +47,12 @@ #undef explicit #endif // HAVE_X11_XKBLIB_H + +#if wxUSE_DETECT_SM + #include "X11/Xlib.h" + #include "X11/SM/SMlib.h" +#endif + //----------------------------------------------------------------------------- // data //----------------------------------------------------------------------------- @@ -172,25 +178,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; } @@ -260,3 +289,59 @@ wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const return wxPORT_GTK; } + +#if wxUSE_DETECT_SM +static wxString GetSM() +{ + class Dpy + { + public: + Dpy() { m_dpy = XOpenDisplay(NULL); } + ~Dpy() { if ( m_dpy ) XCloseDisplay(m_dpy); } + + operator Display *() const { return m_dpy; } + private: + Display *m_dpy; + } dpy; + + if ( !dpy ) + return wxEmptyString; + + char *client_id; + SmcConn smc_conn = SmcOpenConnection(NULL, NULL, + 999, 999, + 0 /* mask */, NULL /* callbacks */, + NULL, &client_id, + 0, NULL); + + if ( !smc_conn ) + return wxEmptyString; + + char *vendor = SmcVendor(smc_conn); + wxString ret = wxString::FromAscii( vendor ); + free(vendor); + + SmcCloseConnection(smc_conn, 0, NULL); + free(client_id); + + return ret; +} +#endif // wxUSE_DETECT_SM + +wxString wxGUIAppTraits::GetDesktopEnvironment() const +{ +#if wxUSE_DETECT_SM + const wxString SM = GetSM(); + + if (SM == wxT("GnomeSM")) + return wxT("GNOME"); + + if (SM == wxT("KDE")) + return wxT("KDE"); +#endif // wxUSE_DETECT_SM + + return wxEmptyString; +} + + +