summaryrefslogtreecommitdiffstats
path: root/grapher/CairoWidget.cxx
diff options
context:
space:
mode:
authorTim Moore <timoore@redhat.com>2009-12-04 13:08:01 +0100
committerTim Moore <timoore@redhat.com>2009-12-04 13:08:01 +0100
commit5ddc5963ce06ecea574e90ca503a3ee598522d8f (patch)
treecd6dd73b8104da1c2527180b24b38b48828b307e /grapher/CairoWidget.cxx
parent388924acea820c7a1328eb2ac8a4128437853c3a (diff)
downloadsystemtap-steved-5ddc5963ce06ecea574e90ca503a3ee598522d8f.tar.gz
systemtap-steved-5ddc5963ce06ecea574e90ca503a3ee598522d8f.tar.xz
systemtap-steved-5ddc5963ce06ecea574e90ca503a3ee598522d8f.zip
support multiline data output from scripts run under the grapher
This is accompanied by support for multiline output in hover text. * grapher/StapParser.cxx (ioCallback): Read data 'til the end of line character, not just '\n'. Be careful to use I/O functions that don't treat '\n' specially. * grapher/StapParser.hxx: ditto * grapher/CairoWidget.cxx (CairoTextBox::draw): Perform line breaks for hover text. * testsuite/systemtap.examples/general/grapher.stp: Do multiline output of keyboard events. Also, fix longstanding breaking in the pty probe.
Diffstat (limited to 'grapher/CairoWidget.cxx')
-rw-r--r--grapher/CairoWidget.cxx36
1 files changed, 31 insertions, 5 deletions
diff --git a/grapher/CairoWidget.cxx b/grapher/CairoWidget.cxx
index f627dfaa..db0e464e 100644
--- a/grapher/CairoWidget.cxx
+++ b/grapher/CairoWidget.cxx
@@ -1,9 +1,15 @@
#include "CairoWidget.hxx"
#include <math.h>
+#include <vector>
+
+#include <boost/algorithm/string.hpp>
namespace systemtap
{
+ using namespace std;
+ using namespace boost;
+
void CairoPlayButton::draw(Cairo::RefPtr<Cairo::Context> cr)
{
if (!_visible)
@@ -44,10 +50,22 @@ namespace systemtap
{
if (!_visible)
return;
+ vector<string> lines;
+ split(lines, contents, is_any_of("\n"));
+ vector<Cairo::TextExtents> extents;
+ double width = 0.0, height = 0.0;
+ for (vector<string>::iterator itr = lines.begin(), end = lines.end();
+ itr != end;
+ ++itr)
+ {
+ Cairo::TextExtents extent;
+ cr->get_text_extents(*itr, extent);
+ extents.push_back(extent);
+ width = max(width, extent.width);
+ height += extent.height;
+ }
+
cr->save();
- Cairo::TextExtents extents;
- cr->get_text_extents(contents, extents);
- double width = extents.width, height = extents.height;
cr->move_to(_x0 - 2, _y0 - 2);
cr->line_to(_x0 + width + 2, _y0 - 2);
cr->line_to(_x0 + width + 2, _y0 + height + 2);
@@ -56,8 +74,16 @@ namespace systemtap
cr->set_source_rgba(1.0, 1.0, 1.0, .8);
cr->fill();
cr->set_source_rgba(0.0, 0.0, 0.0, 1.0);
- cr->move_to(_x0, _y0 + height);
- cr->show_text(contents);
+ vector<Cairo::TextExtents>::iterator titr = extents.begin();
+ double texty = _y0;
+ for (vector<string>::iterator itr = lines.begin(), end = lines.end();
+ itr != end;
+ ++itr,++titr)
+ {
+ cr->move_to(_x0, texty + titr->height);
+ cr->show_text(*itr);
+ texty += titr->height;
+ }
cr->restore();
}
}