diff options
author | Tim Moore <timoore@redhat.com> | 2009-12-04 13:08:01 +0100 |
---|---|---|
committer | Tim Moore <timoore@redhat.com> | 2009-12-04 13:08:01 +0100 |
commit | 5ddc5963ce06ecea574e90ca503a3ee598522d8f (patch) | |
tree | cd6dd73b8104da1c2527180b24b38b48828b307e /grapher/CairoWidget.cxx | |
parent | 388924acea820c7a1328eb2ac8a4128437853c3a (diff) | |
download | systemtap-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.cxx | 36 |
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(); } } |