all repos — fluxbox @ 41249b77fb4db6041d53447ffdb49bfb4dd34ce8

custom fork of the fluxbox windowmanager

utf-8 fix, a fixed patch from Sergey Kuleshov
fluxgen fluxgen
commit

41249b77fb4db6041d53447ffdb49bfb4dd34ce8

parent

52cb3758861117dbd30c63fd2e24fad5e9900742

2 files changed, 48 insertions(+), 34 deletions(-)

jump to
M src/FbTk/XftFontImp.ccsrc/FbTk/XftFontImp.cc

@@ -19,7 +19,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -//$Id: XftFontImp.cc,v 1.2 2002/12/01 13:42:15 rathnor Exp $ +//$Id: XftFontImp.cc,v 1.3 2004/08/10 11:57:35 fluxgen Exp $ #include "XftFontImp.hh" #include "App.hh"

@@ -27,6 +27,7 @@

#ifdef HAVE_CONFIG_H #include "config.h" #endif //HAVE_CONFIG_H + namespace FbTk { XftFontImp::XftFontImp(const char *name, bool utf8):m_xftfont(0),

@@ -93,20 +94,33 @@

// draw string #ifdef HAVE_XFT_UTF8_STRING if (m_utf8mode) { - XftDrawStringUtf8(draw, - &xftcolor, - m_xftfont, - x, y, - (XftChar8 *)(text), len); - } else + // check the string size, + // if the size is zero we use the XftDrawString8 function instead. + XGlyphInfo ginfo; + XftTextExtentsUtf8(App::instance()->display(), + m_xftfont, + (XftChar8 *)text, len, + &ginfo); + if (ginfo.xOff != 0) { + XftDrawStringUtf8(draw, + &xftcolor, + m_xftfont, + x, y, + (XftChar8 *)(text), len); + XftColorFree(disp, DefaultVisual(disp, screen), + DefaultColormap(disp, screen), &xftcolor); + XftDrawDestroy(draw); + return; + } + } #endif // HAVE_XFT_UTF8_STRING - { - XftDrawString8(draw, - &xftcolor, - m_xftfont, - x, y, - (XftChar8 *)(text), len); - } + + XftDrawString8(draw, + &xftcolor, + m_xftfont, + x, y, + (XftChar8 *)(text), len); + XftColorFree(disp, DefaultVisual(disp, screen), DefaultColormap(disp, screen), &xftcolor);

@@ -116,21 +130,27 @@

unsigned int XftFontImp::textWidth(const char * const text, unsigned int len) const { if (m_xftfont == 0) return 0; + XGlyphInfo ginfo; + #ifdef HAVE_XFT_UTF8_STRING if (m_utf8mode) { XftTextExtentsUtf8(App::instance()->display(), m_xftfont, (XftChar8 *)text, len, &ginfo); - } else + if (ginfo.xOff != 0) + return ginfo.xOff; + + // the utf8 failed, try normal extents + } #endif //HAVE_XFT_UTF8_STRING - { - XftTextExtents8(App::instance()->display(), - m_xftfont, - (XftChar8 *)text, len, - &ginfo); - } + + XftTextExtents8(App::instance()->display(), + m_xftfont, + (XftChar8 *)text, len, + &ginfo); + return ginfo.xOff; }
M src/FbTk/XmbFontImp.ccsrc/FbTk/XmbFontImp.cc

@@ -19,7 +19,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: XmbFontImp.cc,v 1.7 2004/02/10 19:03:42 fluxgen Exp $ +// $Id: XmbFontImp.cc,v 1.8 2004/08/10 11:57:35 fluxgen Exp $ #include "XmbFontImp.hh"

@@ -186,13 +186,6 @@ };

namespace FbTk { XmbFontImp::XmbFontImp(const char *filename, bool utf8):m_fontset(0), m_utf8mode(utf8) { -#ifdef DEBUG -#ifdef X_HAVE_UTF8_STRING - cerr<<"Using utf8 = "<<utf8<<endl; -#else // X_HAVE_UTF8_STRING - cerr<<"Using uft8 = false"<<endl; -#endif //X_HAVE_UTF8_STRING -#endif // DEBUG if (filename != 0) load(filename); }

@@ -238,18 +231,19 @@

unsigned int XmbFontImp::textWidth(const char * const text, unsigned int len) const { if (m_fontset == 0) return 0; + XRectangle ink, logical; #ifdef X_HAVE_UTF8_STRING if (m_utf8mode) { Xutf8TextExtents(m_fontset, text, len, &ink, &logical); - } else + if (logical.width != 0) + return logical.width; + } #endif // X_HAVE_UTF8_STRING - { - XmbTextExtents(m_fontset, text, len, - &ink, &logical); - } + XmbTextExtents(m_fontset, text, len, + &ink, &logical); return logical.width; }