all repos — openbox @ 5a90d2b671f01f29043ab82f909440de0abfa362

openbox fork - make it a bit more like ryudo

otk using ustring for shit that draws. expended its inferface yet some more.
Dana Jansens danakj@orodu.net
commit

5a90d2b671f01f29043ab82f909440de0abfa362

parent

4947902d269213edee40f3f31f97721fa0dd3877

6 files changed, 125 insertions(+), 30 deletions(-)

jump to
M otk/focuslabel.ccotk/focuslabel.cc

@@ -41,7 +41,7 @@ Color *text_color = (isFocused() ? style()->getTextFocus()

: style()->getTextUnfocus()); unsigned int sidemargin = style()->getBevelWidth() * 2; - std::string t = _text; // the actual text to draw + ustring t = _text; // the actual text to draw int x = sidemargin; // x coord for the text // find a string that will fit inside the area for text
M otk/focuslabel.hhotk/focuslabel.hh

@@ -14,8 +14,8 @@

FocusLabel(Widget *parent); ~FocusLabel(); - inline const std::string &getText(void) const { return _text; } - void setText(const std::string &text) { _text = text; _dirty = true; } + inline const ustring &getText(void) const { return _text; } + void setText(const ustring &text) { _text = text; _dirty = true; } void update(void);

@@ -25,7 +25,7 @@ private:

//! Object used by Xft to render to the drawable XftDraw *_xftdraw; //! Text displayed in the label - std::string _text; + ustring _text; }; }
M otk/label.ccotk/label.cc

@@ -35,7 +35,7 @@ if (_dirty) {

const Font *ft = style()->getFont(); unsigned int sidemargin = style()->getBevelWidth() * 2; - std::string t = _text; // the actual text to draw + ustring t = _text; // the actual text to draw int x = sidemargin; // x coord for the text // find a string that will fit inside the area for text
M otk/label.hhotk/label.hh

@@ -14,8 +14,8 @@

Label(Widget *parent); ~Label(); - inline const std::string &getText(void) const { return _text; } - void setText(const std::string &text) { _text = text; _dirty = true; } + inline const ustring &getText(void) const { return _text; } + void setText(const ustring &text) { _text = text; _dirty = true; } void update(void);

@@ -25,7 +25,7 @@ private:

//! Object used by Xft to render to the drawable XftDraw *_xftdraw; //! Text displayed in the label - std::string _text; + ustring _text; }; }
M otk/ustring.ccotk/ustring.cc

@@ -12,6 +12,63 @@ }

namespace otk { +// helper functions + +static ustring::size_type utf8_find_offset(const char *str, const char *pos) +{ + ustring::size_type offset = 0; + + while (str < pos) { + str += g_utf8_skip[*str]; + offset += g_utf8_skip[*str]; + } + + return offset; +} + +// First overload: stop on '\0' character. +ustring::size_type utf8_byte_offset(const char* str, ustring::size_type offset) +{ + if(offset == ustring::npos) + return ustring::npos; + + const char* p = str; + + for(; offset != 0; --offset) + { + if(*p == '\0') + return ustring::npos; + + p += g_utf8_skip[*p]; + } + + return (p - str); +} + +// Second overload: stop when reaching maxlen. +ustring::size_type utf8_byte_offset(const char* str, ustring::size_type offset, + ustring::size_type maxlen) +{ + if(offset == ustring::npos) + return ustring::npos; + + const char *const pend = str + maxlen; + const char* p = str; + + for(; offset != 0; --offset) + { + if(p >= pend) + return ustring::npos; + + p += g_utf8_skip[*p]; + } + + return (p - str); +} + + +// ustring methods + ustring::ustring() { }

@@ -61,23 +118,11 @@ _string += c;

return *this; } -static ustring::size_type find_utf8_offset(const char *str, const char *pos) -{ - ustring::size_type offset = 0; - - while (str < pos) { - str += g_utf8_skip[*str]; - offset += g_utf8_skip[*str]; - } - - return offset; -} - ustring::size_type ustring::size() const { if (_utf8) { const char *const pdata = _string.data(); - return find_utf8_offset(pdata, pdata + _string.size()); + return utf8_find_offset(pdata, pdata + _string.size()); } else return _string.size(); }

@@ -97,6 +142,39 @@ {

return _string.max_size(); } +void ustring::clear() +{ + _string.erase(); +} + +ustring& ustring::erase(ustring::size_type i, ustring::size_type n) +{ + if (_utf8) { + // find a proper offset + size_type utf_i = utf8_byte_offset(_string.c_str(), i); + if (utf_i != npos) { + // if the offset is not npos, find a proper length for 'n' + size_type utf_n = utf8_byte_offset(_string.data() + utf_i, n, + _string.size() - utf_i); + _string.erase(utf_i, utf_n); + } + } else + _string.erase(i, n); + + return *this; +} + +void ustring::resize(ustring::size_type n, char c) +{ + if (_utf8) { + const size_type size_now = size(); + if(n < size_now) + erase(n, npos); + else if(n > size_now) + _string.append(n - size_now, c); + } else + _string.resize(n, c); +} const char* ustring::data() const {
M otk/ustring.hhotk/ustring.hh

@@ -7,6 +7,7 @@ @brief Provides a simple UTF-8 encoded string

*/ extern "C" { +/* #ifdef HAVE_STDINT_H # include <stdint.h> #else

@@ -14,17 +15,20 @@ # ifdef HAVE_SYS_TYPES_H

# include <sys/types.h> # endif #endif +*/ } #include <string> namespace otk { +/* #ifdef HAVE_STDINT_H typedef uint32_t unichar; #else typedef u_int32_t unichar; #endif +*/ #ifndef DOXYGEN_IGNORE

@@ -40,6 +44,8 @@ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,

3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1 }; +#endif // DOXYGEN_IGNORE + //! The iterator type for ustring /*! Note this is not a random access iterator but a bidirectional one, since all

@@ -51,19 +57,21 @@ UTF-8 character and the new one to write could be different. Therefore, any

write operation would invalidate all other iterators pointing into the same string. */ +/* template <class T> class ustring_Iterator { public: typedef std::bidirectional_iterator_tag iterator_category; - typedef unichar value_type; + //typedef unichar value_type; typedef std::string::difference_type difference_type; - typedef value_type reference; + //typedef value_type reference; typedef void pointer; inline ustring_Iterator() {} inline ustring_Iterator(const ustring_Iterator<std::string::iterator>& other) : _pos(other.base()) {} + inline value_type operator*() const { // get a unicode character from the iterator's position

@@ -88,6 +96,7 @@

return result; } + inline ustring_Iterator<T> & operator++() { pos_ += g_utf8_skip[static_cast<unsigned char>(*pos_)]; return *this;

@@ -103,8 +112,7 @@

private: T _pos; }; - -#endif // DOXYGEN_IGNORE +*/ //! This class provides a simple wrapper to a std::string that can be encoded //! as UTF-8. The ustring::utf() member specifies if the given string is UTF-8

@@ -127,12 +135,12 @@ public:

typedef std::string::size_type size_type; typedef std::string::difference_type difference_type; - typedef unichar value_type; - typedef unichar & reference; - typedef const unichar & const_reference; + //typedef unichar value_type; + //typedef unichar & reference; + //typedef const unichar & const_reference; - typedef ustring_Iterator<std::string::iterator> iterator; - typedef ustring_Iterator<std::string::const_iterator> const_iterator; + //typedef ustring_Iterator<std::string::iterator> iterator; + //typedef ustring_Iterator<std::string::const_iterator> const_iterator; static const size_type npos = std::string::npos;

@@ -159,6 +167,15 @@ ustring::size_type bytes() const;

ustring::size_type capacity() const; ustring::size_type max_size() const; + // erase substrings + + void clear(); + ustring& erase(size_type i, size_type n=npos); + + // change the string's size + + void resize(size_type n, char c='\0'); + // internal data const char* data() const;