use "userstring" for all user viewable strings

This commit is contained in:
Dana Jansens 2003-01-12 21:17:26 +00:00
parent c03068ee3a
commit 74061b4e2d
9 changed files with 156 additions and 72 deletions

View file

@ -41,7 +41,7 @@ void FocusLabel::update(void)
: style()->getTextUnfocus());
unsigned int sidemargin = style()->getBevelWidth() * 2;
std::string t = _text; // the actual text to draw
userstring 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

View file

@ -4,6 +4,7 @@
#include "focuswidget.hh"
#include "font.hh"
#include "userstring.hh"
namespace otk {
@ -14,8 +15,8 @@ public:
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 userstring &getText(void) const { return _text; }
void setText(const userstring &text) { _text = text; _dirty = true; }
void update(void);
@ -25,7 +26,7 @@ private:
//! Object used by Xft to render to the drawable
XftDraw *_xftdraw;
//! Text displayed in the label
std::string _text;
userstring _text;
};
}

View file

@ -10,15 +10,7 @@ extern "C" {
#endif // HAVE_STDLIB_H
}
#include <iostream>
#include <algorithm>
using std::string;
using std::cerr;
using std::endl;
#include "font.hh"
#include "util.hh"
#include "display.hh"
#include "color.hh"
#include "screeninfo.hh"
@ -34,10 +26,10 @@ extern "C" {
namespace otk {
string Font::_fallback_font = "fixed";
std::string Font::_fallback_font = "fixed";
bool Font::_xft_init = false;
Font::Font(int screen_num, const string &fontstring,
Font::Font(int screen_num, const std::string &fontstring,
bool shadow, unsigned char offset, unsigned char tint)
: _screen_num(screen_num),
_fontstring(fontstring),
@ -86,7 +78,7 @@ Font::~Font(void)
void Font::drawString(XftDraw *d, int x, int y, const Color &color,
const string &string, bool utf8) const
const userstring &string) const
{
assert(d);
@ -98,7 +90,7 @@ void Font::drawString(XftDraw *d, int x, int y, const Color &color,
c.color.alpha = _tint | _tint << 8; // transparent shadow
c.pixel = BlackPixel(Display::display, _screen_num);
if (utf8)
if (string.utf8())
XftDrawStringUtf8(d, &c, _xftfont, x + _offset,
_xftfont->ascent + y + _offset,
(FcChar8*)string.c_str(), string.size());
@ -115,7 +107,7 @@ void Font::drawString(XftDraw *d, int x, int y, const Color &color,
c.pixel = color.pixel();
c.color.alpha = 0xff | 0xff << 8; // no transparency in Color yet
if (utf8)
if (string.utf8())
XftDrawStringUtf8(d, &c, _xftfont, x, _xftfont->ascent + y,
(FcChar8*)string.c_str(), string.size());
else
@ -126,11 +118,11 @@ void Font::drawString(XftDraw *d, int x, int y, const Color &color,
}
unsigned int Font::measureString(const string &string, bool utf8) const
unsigned int Font::measureString(const userstring &string) const
{
XGlyphInfo info;
if (utf8)
if (string.utf8())
XftTextExtentsUtf8(Display::display, _xftfont,
(FcChar8*)string.c_str(), string.size(), &info);
else

View file

@ -2,6 +2,8 @@
#ifndef __font_hh
#define __font_hh
#include "userstring.hh"
extern "C" {
#include <X11/Xlib.h>
#define _XFT_NO_COMPAT_ // no Xft 1 API
@ -9,6 +11,7 @@ extern "C" {
}
#include <assert.h>
#include <string>
namespace otk {
@ -57,16 +60,24 @@ public:
unsigned int height() const;
unsigned int maxCharWidth() const;
unsigned int measureString(const std::string &string,
bool utf8 = false) const;
//! Measures the length of a string
/*!
@param string The string to measure, it should be UTF8 encoded.
*/
unsigned int measureString(const userstring &string) const;
//! Draws a string into an XftDraw object
/*!
Be Warned: If you use an XftDraw object and a color, or a font from
different screens, you WILL have unpredictable results! :)
@param d The drawable to render into.
@param x The X offset onto the drawable at which to start drawing.
@param x The Y offset onto the drawable at which to start drawing.
@param color The color to use for drawing the text.
@param string The string to draw, it should be UTF8 encoded.
*/
void drawString(XftDraw *d, int x, int y, const Color &color,
const std::string &string, bool utf8 = false) const;
const userstring &string) const;
};
}

View file

@ -35,7 +35,7 @@ void Label::update(void)
const Font *ft = style()->getFont();
unsigned int sidemargin = style()->getBevelWidth() * 2;
std::string t = _text; // the actual text to draw
userstring 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

View file

@ -4,6 +4,7 @@
#include "widget.hh"
#include "font.hh"
#include "userstring.hh"
namespace otk {
@ -14,8 +15,8 @@ public:
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 userstring &getText(void) const { return _text; }
void setText(const userstring &text) { _text = text; _dirty = true; }
void update(void);
@ -25,7 +26,7 @@ private:
//! Object used by Xft to render to the drawable
XftDraw *_xftdraw;
//! Text displayed in the label
std::string _text;
userstring _text;
};
}

View file

@ -163,7 +163,7 @@ Property::~Property()
*/
Atom Property::create(const char *name) const
{
Atom a = XInternAtom(Display::display, name, False);
Atom a = XInternAtom(Display::display, name, false);
assert(a);
return a;
}
@ -196,7 +196,7 @@ void Property::set(Window win, Atoms atom, Atoms type,
assert(atom >= 0 && atom < NUM_ATOMS);
assert(type >= 0 && type < NUM_ATOMS);
set(win, _atoms[atom], _atoms[type],
reinterpret_cast<unsigned char*>(&value), 32, 1, False);
reinterpret_cast<unsigned char*>(&value), 32, 1, false);
}
@ -209,7 +209,7 @@ void Property::set(Window win, Atoms atom, Atoms type,
assert(atom >= 0 && atom < NUM_ATOMS);
assert(type >= 0 && type < NUM_ATOMS);
set(win, _atoms[atom], _atoms[type],
reinterpret_cast<unsigned char*>(value), 32, elements, False);
reinterpret_cast<unsigned char*>(value), 32, elements, false);
}
@ -217,7 +217,7 @@ void Property::set(Window win, Atoms atom, Atoms type,
* Set an string property value on a window.
*/
void Property::set(Window win, Atoms atom, StringType type,
const std::string &value) const
const userstring &value) const
{
assert(atom >= 0 && atom < NUM_ATOMS);
assert(type >= 0 && type < NUM_STRING_TYPE);
@ -226,11 +226,11 @@ void Property::set(Window win, Atoms atom, StringType type,
switch (type) {
case ascii: t = _atoms[Atom_String]; break;
case utf8: t = _atoms[Atom_Utf8]; break;
default: assert(False); return; // unhandled StringType
default: assert(false); return; // unhandled StringType
}
set(win, _atoms[atom], t,
reinterpret_cast<unsigned char *>(const_cast<char *>(value.c_str())),
8, value.size() + 1, False); // add 1 to the size to include the null
8, value.size() + 1, false); // add 1 to the size to include the null
}
@ -238,7 +238,7 @@ void Property::set(Window win, Atoms atom, StringType type,
* Set an array of string property values on a window.
*/
void Property::set(Window win, Atoms atom, StringType type,
const StringVect &strings) const
const userstring::vector &strings) const
{
assert(atom >= 0 && atom < NUM_ATOMS);
assert(type >= 0 && type < NUM_STRING_TYPE);
@ -247,26 +247,26 @@ void Property::set(Window win, Atoms atom, StringType type,
switch (type) {
case ascii: t = _atoms[Atom_String]; break;
case utf8: t = _atoms[Atom_Utf8]; break;
default: assert(False); return; // unhandled StringType
default: assert(false); return; // unhandled StringType
}
std::string value;
StringVect::const_iterator it = strings.begin();
const StringVect::const_iterator end = strings.end();
userstring::vector::const_iterator it = strings.begin();
const userstring::vector::const_iterator end = strings.end();
for (; it != end; ++it)
value += *it + '\0';
set(win, _atoms[atom], t,
reinterpret_cast<unsigned char *>(const_cast<char *>(value.c_str())),
8, value.size(), False);
8, value.size(), false);
}
/*
* Internal get function used by all of the typed get functions.
* Gets an property's value from a window.
* Returns True if the property was successfully retrieved; False if the
* Returns true if the property was successfully retrieved; false if the
* property did not exist on the window, or has a different type/size format
* than the user tried to retrieve.
*/
@ -283,11 +283,11 @@ bool Property::get(Window win, Atom atom, Atom type,
unsigned long ret_bytes;
int result;
unsigned long maxread = *nelements;
bool ret = False;
bool ret = false;
// try get the first element
result = XGetWindowProperty(Display::display, win, atom, 0l, 1l,
False, AnyPropertyType, &ret_type, &ret_size,
false, AnyPropertyType, &ret_type, &ret_size,
nelements, &ret_bytes, &c_val);
ret = (result == Success && ret_type == type && ret_size == size &&
*nelements > 0);
@ -305,7 +305,7 @@ bool Property::get(Window win, Atom atom, Atom type,
if (remain > size/8 * (signed)maxread) // dont get more than the max
remain = size/8 * (signed)maxread;
result = XGetWindowProperty(Display::display, win, atom, 0l,
remain, False, type, &ret_type, &ret_size,
remain, false, type, &ret_type, &ret_size,
nelements, &ret_bytes, &c_val);
ret = (result == Success && ret_type == type && ret_size == size &&
ret_bytes == 0);
@ -352,10 +352,10 @@ bool Property::get(Window win, Atoms atom, Atoms type,
unsigned long num = 1;
if (! get(win, _atoms[atom], _atoms[type], &num,
reinterpret_cast<unsigned char **>(&temp), 32))
return False;
return false;
*value = temp[0];
delete [] temp;
return True;
return true;
}
@ -363,20 +363,25 @@ bool Property::get(Window win, Atoms atom, Atoms type,
* Gets an string property's value from a window.
*/
bool Property::get(Window win, Atoms atom, StringType type,
std::string *value) const
userstring *value) const
{
unsigned long n = 1;
StringVect s;
userstring::vector s;
if (get(win, atom, type, &n, &s)) {
*value = s[0];
return True;
switch (type) {
case ascii: value->setUtf8(false); break;
case utf8: value->setUtf8(true); break;
default: assert(false); return false; // unhandled StringType
}
return true;
}
return False;
return false;
}
bool Property::get(Window win, Atoms atom, StringType type,
unsigned long *nelements, StringVect *strings) const
unsigned long *nelements, userstring::vector *strings) const
{
assert(atom >= 0 && atom < NUM_ATOMS);
assert(type >= 0 && type < NUM_STRING_TYPE);
@ -384,26 +389,27 @@ bool Property::get(Window win, Atoms atom, StringType type,
assert(*nelements > 0);
Atom t;
bool isutf8;
switch (type) {
case ascii: t = _atoms[Atom_String]; break;
case utf8: t = _atoms[Atom_Utf8]; break;
default: assert(False); return False; // unhandled StringType
case ascii: t = _atoms[Atom_String]; isutf8 = false; break;
case utf8: t = _atoms[Atom_Utf8]; isutf8 = true; break;
default: assert(false); return false; // unhandled StringType
}
unsigned char *value;
unsigned long elements = (unsigned) -1;
if (!get(win, _atoms[atom], t, &elements, &value, 8) || elements < 1)
return False;
return false;
std::string s(reinterpret_cast<char *>(value), elements);
userstring s(reinterpret_cast<char *>(value), elements, isutf8);
delete [] value;
std::string::const_iterator it = s.begin(), end = s.end();
userstring::const_iterator it = s.begin(), end = s.end();
unsigned long num = 0;
while(num < *nelements) {
std::string::const_iterator tmp = it; // current string.begin()
userstring::const_iterator tmp = it; // current string.begin()
it = std::find(tmp, end, '\0'); // look for null between tmp and end
strings->push_back(std::string(tmp, it)); // s[tmp:it)
strings->push_back(userstring(tmp, it, isutf8)); // s[tmp:it)
++num;
if (it == end) break;
++it;
@ -412,7 +418,7 @@ bool Property::get(Window win, Atoms atom, StringType type,
*nelements = num;
return True;
return true;
}

View file

@ -14,8 +14,8 @@ extern "C" {
}
#include <vector>
#include <string>
#include "userstring.hh"
#include "screeninfo.hh"
namespace otk {
@ -175,9 +175,6 @@ private:
int size) const;
public:
//! A list of strings
typedef std::vector<std::string> StringVect;
//! Constructs a new Atom object
/*!
CAUTION: This constructor uses Display::display, so ensure that it is
@ -220,7 +217,7 @@ public:
@param value The string to set the property to
*/
void set(Window win, Atoms atom, StringType type,
const std::string &value) const;
const userstring &value) const;
//! Sets a string-array property on a window to a new value
/*!
@param win The window id of the window on which to set the property's value
@ -231,7 +228,7 @@ public:
@param strings A list of strings to set the property to
*/
void set(Window win, Atoms atom, StringType type,
const StringVect &strings) const;
const userstring::vector &strings) const;
//! Gets the value of a property on a window
/*!
@ -284,7 +281,7 @@ public:
@return true if retrieval of the specified property with the specified
type was successful; otherwise, false
*/
bool get(Window win, Atoms atom, StringType type, std::string *value) const;
bool get(Window win, Atoms atom, StringType type, userstring *value) const;
//! Gets strings from the value of a property on a window
/*!
@param win The window id of the window to get the property value from
@ -303,7 +300,7 @@ public:
type was successful; otherwise, false
*/
bool get(Window win, Atoms atom, StringType type,
unsigned long *nelements, StringVect *strings) const;
unsigned long *nelements, userstring::vector *strings) const;
//! Removes a property from a window
/*!

View file

@ -3,26 +3,102 @@
#define __userstring_hh
#include <string>
#include <vector>
extern "C" {
#include <assert.h>
}
//! userstring is a std::string with an extra flag specifying if the string is
//! UTF-8 encoded.
class userstring : public std::string
{
public:
//! A vector of userstrings
typedef std::vector<userstring> vector;
private:
bool _utf8;
public:
userstring(bool utf8) : std::string(), _utf8(utf8) {}
userstring(const userstring& s, bool utf8, size_type pos = 0,
size_type n = npos) : std::string(s, pos, n), _utf8(utf8) {}
userstring(const charT *s, bool utf8) : std::string(s), _utf8(utf8) {}
userstring(const charT* s, size_type n, bool utf8) : std::string(s, n),
_utf8(utf8) {}
userstring(size_type n, charT c, bool utf8) : std::string(n, c),
_utf8(utf8) {}
userstring(const userstring& s, size_type pos = 0,
size_type n = npos) : std::string(s, pos, n), _utf8(s._utf8) {}
userstring(const char *s, bool utf8) : std::string(s), _utf8(utf8) {}
userstring(const char *s, size_type n, bool utf8) : std::string(s, n),
_utf8(utf8) {}
userstring(size_type n, char c, bool utf8) : std::string(n, c),
_utf8(utf8) {}
userstring(const_iterator first, const_iterator last, bool utf8) :
std::string(first, last), _utf8(utf8) {}
//! Returns if the string is encoded in UTF-8 or not
inline bool utf8() const { return _utf8; }
inline void setUtf8(bool u) { _utf8 = u; }
inline userstring& insert(size_type pos, const userstring& s) {
assert(s._utf8 == _utf8);
std::string::insert(pos, s);
return *this;
}
inline userstring& insert(size_type pos,
const userstring& s,
size_type pos1, size_type n) {
assert(s._utf8 == _utf8);
std::string::insert(pos, s, pos1, n);
return *this;
}
inline userstring& append(const userstring& s) {
assert(s._utf8 == _utf8);
std::string::append(s);
return *this;
}
inline userstring& append(const userstring& s,
size_type pos, size_type n) {
assert(s._utf8 == _utf8);
std::string::append(s, pos, n);
return *this;
}
inline userstring& assign(const userstring& s) {
assert(s._utf8 == _utf8);
std::string::assign(s);
return *this;
}
inline userstring& assign(const userstring& s,
size_type pos, size_type n) {
assert(s._utf8 == _utf8);
std::string::assign(s, pos, n);
return *this;
}
inline userstring& replace(size_type pos, size_type n,
const userstring& s) {
assert(s._utf8 == _utf8);
std::string::replace(pos, n, s);
return *this;
}
inline userstring& replace(size_type pos, size_type n,
const userstring& s,
size_type pos1, size_type n1) {
assert(s._utf8 == _utf8);
std::string::replace(pos, n, s, pos1, n1);
return *this;
}
inline userstring& operator=(const userstring& s) {
return assign(s);
}
inline userstring& operator+=(const userstring& s) {
return append(s);
}
};
#endif // __userstring_hh