Re: Redirecting cout to a TextBuffer
- From: Charles McLachlan <cim20 metropolis-data co uk>
- To: Søren Hauberg <hauberg gmail com>
- Cc: gtkmm-list <gtkmm-list gnome org>
- Subject: Re: Redirecting cout to a TextBuffer
- Date: Mon, 12 May 2008 11:59:41 +0100 (BST)
On Sat, 10 May 2008, Søren Hauberg wrote:
Hi all,
I'm using gtksourceviewmm as terminal-like widget, and I want to
redirect std::cout to this widget. Currently I'm doing something like
this in my constructor:
std::ostringstream outs;
std::cout.rdbuf (outs.rdbuf ());
Caveat: I don't know much about gtksourcemm but I do know something about
STL streambufs.
If the above code works (its an interesting idea that I have not seen
before), then my advice would be subclass your own streambuf. You'll need
to overload the the sync and overflow members. These have slightly weird
actions and (on first viewing) appear non trivial.
The advantage of this appreoach is that the source view will only be
updated when 1) the buffer runs out, 2) the stream explicitly asks for it,
usually via stream.sync() being called. This (correctly) puts the control
of the updates in the hands of the user of the stream, rather than having
to wait for timeouts.
Here is an (untested) example based on a streambuf I wrote for encoding
streams into base64,
class ogsbuf : public std::streambuf
{
public:
const static int kZBufferSize = 2048;
typedef unsigned char char_type;
typedef int int_type;
typedef std::streampos pos_type;
typedef std::streamoff off_type;
private:
gtksourceviewmm *destination;
unsigned char buffer[kZBufferSize];
public:
explicit ogsbuf(gtksourceviewmm *_destination) : destination(_destinination) {
setp((char *)buffer, (char *)buffer + kZBufferSize);
}
~ogsbuf() { sync(); }
protected:
inline int sync()
{
// pbase() is an unsigned char * pointing to the data to be written to the destination
// pptr() is an end pointer for the data.
// pptr() - pbase() is the length of the data in the buffer
destination->append(pbase(), pbase() - pptr());
setp((char *)buffer, (char *)buffer + kZBufferSize);
return 0;
};
inline int overflow(int ch = traits_type::eof())
{
int ret = sync();
*pptr() = ch;
pbump(1);
return ret;
};
};
Then do
ogsbuf gsb(ptrToSourceView);
std::cout.rdbuf (gsb);
Charlie - Metropolis Data Consultants - 07976 028167 - 01223 763758
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]