summaryrefslogtreecommitdiffstats
path: root/grapher
diff options
context:
space:
mode:
authorTim Moore <timoore@redhat.com>2009-12-08 23:17:47 +0100
committerTim Moore <timoore@redhat.com>2009-12-08 23:34:00 +0100
commit8cabc8bcdcd22e8726734f1a18f23ed7d9c19e9f (patch)
tree5cc6fc14a7b51859a0bf181c10d08b5d75fff03f /grapher
parentcfd482078cd4805076cc6fd7e4e8642b97a03b25 (diff)
downloadsystemtap-steved-8cabc8bcdcd22e8726734f1a18f23ed7d9c19e9f.tar.gz
systemtap-steved-8cabc8bcdcd22e8726734f1a18f23ed7d9c19e9f.tar.xz
systemtap-steved-8cabc8bcdcd22e8726734f1a18f23ed7d9c19e9f.zip
grapher: start of a dialog for displaying active stap processes
The names of active scripts are displayed in a list; mock buttons suggest being able to stop and restart them. * grapher/processwindow.glade: new file * grapher/Makefile.am: add processwindow.glade to installed files * grapher/StapParser.hxx (StapProcess): new class (StapParser): factor out members that are now in StapProcess (ioCallback): Use the new childDied signal instead of aborting the whole grapher when a child dies. * grapher/grapher.cxx (ProcModelColumns, ProcWindow): classes for displaying stap process window. (GrapherWindow::on_menu_proc_window): new function
Diffstat (limited to 'grapher')
-rw-r--r--grapher/Makefile.am2
-rw-r--r--grapher/Makefile.in5
-rw-r--r--grapher/StapParser.cxx12
-rw-r--r--grapher/StapParser.hxx77
-rw-r--r--grapher/grapher.cxx156
-rw-r--r--grapher/processwindow.glade372
-rw-r--r--grapher/processwindow.gladep8
7 files changed, 573 insertions, 59 deletions
diff --git a/grapher/Makefile.am b/grapher/Makefile.am
index 5bca286a..1087f44d 100644
--- a/grapher/Makefile.am
+++ b/grapher/Makefile.am
@@ -9,5 +9,5 @@ stapgraph_CPPFLAGS = -DPKGDATADIR='"${pkgdatadir}"'
stapgraph_CXXFLAGS = $(libglade_CFLAGS) -Wall -Werror
stapgraph_SOURCES = grapher.cxx StapParser.cxx Graph.cxx GraphWidget.cxx CairoWidget.cxx GraphStyle.cxx
stapgraph_LDADD = $(libglade_LIBS)
-dist_pkgdata_DATA = graph-dialog.glade stap-start.glade
+dist_pkgdata_DATA = graph-dialog.glade stap-start.glade processwindow.glade
endif
diff --git a/grapher/Makefile.in b/grapher/Makefile.in
index f06402bc..c608e516 100644
--- a/grapher/Makefile.in
+++ b/grapher/Makefile.in
@@ -112,7 +112,8 @@ am__base_list = \
man1dir = $(mandir)/man1
NROFF = nroff
MANS = $(man_MANS)
-am__dist_pkgdata_DATA_DIST = graph-dialog.glade stap-start.glade
+am__dist_pkgdata_DATA_DIST = graph-dialog.glade stap-start.glade \
+ processwindow.glade
DATA = $(dist_pkgdata_DATA)
ETAGS = etags
CTAGS = ctags
@@ -246,7 +247,7 @@ top_srcdir = @top_srcdir@
@BUILD_GRAPHER_TRUE@stapgraph_CXXFLAGS = $(libglade_CFLAGS) -Wall -Werror
@BUILD_GRAPHER_TRUE@stapgraph_SOURCES = grapher.cxx StapParser.cxx Graph.cxx GraphWidget.cxx CairoWidget.cxx GraphStyle.cxx
@BUILD_GRAPHER_TRUE@stapgraph_LDADD = $(libglade_LIBS)
-@BUILD_GRAPHER_TRUE@dist_pkgdata_DATA = graph-dialog.glade stap-start.glade
+@BUILD_GRAPHER_TRUE@dist_pkgdata_DATA = graph-dialog.glade stap-start.glade processwindow.glade
all: all-am
.SUFFIXES:
diff --git a/grapher/StapParser.cxx b/grapher/StapParser.cxx
index 653c00de..b82cc024 100644
--- a/grapher/StapParser.cxx
+++ b/grapher/StapParser.cxx
@@ -25,6 +25,12 @@ namespace systemtap
using namespace std;
using namespace std::tr1;
+ sigc::signal<void, pid_t>& childDiedSignal()
+ {
+ static sigc::signal<void, pid_t> deathSignal;
+ return deathSignal;
+ }
+
vector<string> commaSplit(const boost::sub_range<Glib::ustring>& range)
{
using namespace boost;
@@ -72,7 +78,7 @@ vector<string> commaSplit(const boost::sub_range<Glib::ustring>& range)
using namespace boost;
if (ioCondition & Glib::IO_HUP)
{
- _win->hide();
+ childDiedSignal().emit(getPid());
return true;
}
if ((ioCondition & Glib::IO_IN) == 0)
@@ -82,7 +88,7 @@ vector<string> commaSplit(const boost::sub_range<Glib::ustring>& range)
bytes_read = read(_inFd, buf, sizeof(buf) - 1);
if (bytes_read <= 0)
{
- _win->hide();
+ childDiedSignal().emit(getPid());
return true;
}
_buffer.append(buf, bytes_read);
@@ -242,7 +248,7 @@ vector<string> commaSplit(const boost::sub_range<Glib::ustring>& range)
bytes_read = read(_errFd, buf, sizeof(buf) - 1);
if (bytes_read <= 0)
{
- _win->hide();
+ cerr << "StapParser: error reading from stderr!\n";
return true;
}
if (write(STDOUT_FILENO, buf, bytes_read) < 0)
diff --git a/grapher/StapParser.hxx b/grapher/StapParser.hxx
index eba8a7af..cfb807a8 100644
--- a/grapher/StapParser.hxx
+++ b/grapher/StapParser.hxx
@@ -9,30 +9,61 @@
#include "GraphData.hxx"
#include <string>
+#include <tr1/memory>
+
+#include <unistd.h>
+
namespace systemtap
{
-class StapParser
-{
- std::string _buffer;
- typedef std::map<std::string, std::tr1::shared_ptr<GraphDataBase> > DataMap;
- DataMap _dataSets;
- CSVData _csv;
- Gtk::Window* _win;
- int _errFd;
- int _inFd;
- unsigned char _lineEndChar;
-public:
- StapParser(Gtk::Window* win)
- : _win(win), _errFd(-1), _inFd(-1), _lineEndChar('\n')
+ // arguments and script for a stap process
+ struct StapProcess
{
- }
- void parseData(std::tr1::shared_ptr<GraphDataBase> gdata,
- int64_t time, const std::string& dataString);
- bool ioCallback(Glib::IOCondition ioCondition);
- bool errIoCallback(Glib::IOCondition ioCondition);
- int getErrFd() { return _errFd; }
- void setErrFd(int fd) { _errFd = fd; }
- int getInFd() { return _inFd; }
- void setInFd(int fd) { _inFd = fd; }
-};
+ StapProcess(pid_t pid_ = -1) : pid(pid_) {}
+ std::string stapArgs;
+ std::string script;
+ std::string scriptArgs;
+ // arguments passed from a single array, like from the command line.
+ char **argv;
+ // -1 if the grapher is reading from stdin
+ pid_t pid;
+ };
+
+ class StapParser
+ {
+ std::string _buffer;
+ typedef std::map<std::string, std::tr1::shared_ptr<GraphDataBase> > DataMap;
+ DataMap _dataSets;
+ CSVData _csv;
+ int _errFd;
+ int _inFd;
+ unsigned char _lineEndChar;
+ std::tr1::shared_ptr<StapProcess> _process;
+ public:
+ StapParser()
+ : _errFd(-1), _inFd(-1), _lineEndChar('\n')
+ {
+ }
+ void parseData(std::tr1::shared_ptr<GraphDataBase> gdata,
+ int64_t time, const std::string& dataString);
+ bool ioCallback(Glib::IOCondition ioCondition);
+ bool errIoCallback(Glib::IOCondition ioCondition);
+ int getErrFd() const { return _errFd; }
+ void setErrFd(int fd) { _errFd = fd; }
+ int getInFd() const { return _inFd; }
+ void setInFd(int fd) { _inFd = fd; }
+ pid_t getPid() const
+ {
+ if (_process)
+ return _process->pid;
+ else
+ return -1;
+ }
+ std::tr1::shared_ptr<StapProcess> getProcess() { return _process; }
+ void setProcess(std::tr1::shared_ptr<StapProcess> process)
+ {
+ _process = process;
+ }
+ };
+
+ sigc::signal<void, pid_t>& childDiedSignal();
}
diff --git a/grapher/grapher.cxx b/grapher/grapher.cxx
index 4769877f..2a9a617b 100644
--- a/grapher/grapher.cxx
+++ b/grapher/grapher.cxx
@@ -39,6 +39,7 @@
#include <getopt.h>
using namespace std;
+using namespace tr1;
using namespace systemtap;
@@ -159,22 +160,33 @@ public:
}
int launch();
void cleanUp();
- tr1::shared_ptr<StapParser> makeStapParser()
+ shared_ptr<StapParser> makeStapParser()
{
- tr1::shared_ptr<StapParser> result(new StapParser(_win));
- _parsers.push_back(ParserInstance(-1, result));
+ shared_ptr<StapParser> result(new StapParser);
+ _parsers.push_back(result);
return result;
}
+private:
+ struct pidPred
+ {
+ pidPred(pid_t pid_) : pid(pid_) {}
+ bool operator()(const shared_ptr<StapParser>& parser) const
+ {
+ return parser->getPid() == pid;
+ }
+ pid_t pid;
+ };
+public:
pid_t reap()
{
+ using namespace boost;
pid_t pid = ChildDeathReader::reap();
if (pid < 0)
return pid;
ParserList::iterator itr
- = find_if(_parsers.begin(), _parsers.end(),
- boost::bind(&ParserInstance::childPid, _1) == pid);
+ = find_if(_parsers.begin(), _parsers.end(), pidPred(pid));
if (itr != _parsers.end())
- itr->childPid = -1;
+ (*itr)->setProcess(tr1::shared_ptr<StapProcess>());
return pid;
}
void killAll()
@@ -183,10 +195,12 @@ public:
itr != end;
++itr)
{
- if (itr->childPid >= 0)
- kill(itr->childPid, SIGTERM);
+ if ((*itr)->getPid() >= 0)
+ kill((*itr)->getPid(), SIGTERM);
}
}
+ typedef vector<shared_ptr<StapParser> > ParserList;
+ ParserList _parsers;
protected:
char** _argv;
string _stapArgs;
@@ -196,18 +210,6 @@ protected:
ChildDeathReader::Callback* _deathCallback;
Gtk::Window* _win;
GraphWidget* _widget;
- struct ParserInstance
- {
- ParserInstance() : childPid(-1) {}
- ParserInstance(int childPid_, tr1::shared_ptr<StapParser> stapParser_)
- : childPid(childPid_), stapParser(stapParser_)
- {
- }
- pid_t childPid;
- tr1::shared_ptr<StapParser> stapParser;
- };
- typedef vector<ParserInstance> ParserList;
- ParserList _parsers;
};
int StapLauncher::launch()
@@ -274,8 +276,18 @@ int StapLauncher::launch()
}
_exit(1);
}
- tr1::shared_ptr<StapParser> sp(new StapParser(_win));
- _parsers.push_back(ParserInstance(childPid, sp));
+ tr1::shared_ptr<StapParser> sp(new StapParser);
+ shared_ptr<StapProcess> proc(new StapProcess(childPid));
+ if (_argv)
+ proc->argv = _argv;
+ else
+ {
+ proc->stapArgs = _stapArgs;
+ proc->script = _script;
+ proc->scriptArgs = _scriptArgs;
+ }
+ sp->setProcess(proc);
+ _parsers.push_back(sp);
sp->setErrFd(pipefd[2]);
sp->setInFd(pipefd[0]);
Glib::signal_io().connect(sigc::mem_fun(sp.get(),
@@ -305,21 +317,22 @@ void StapLauncher::cleanUp()
itr != end;
++itr)
{
- if (itr->childPid > 0)
- kill(itr->childPid, SIGTERM);
+ pid_t childPid = (*itr)->getPid();
+ if (childPid > 0)
+ kill(childPid, SIGTERM);
int status;
pid_t killedPid = -1;
if ((killedPid = wait(&status)) == -1)
{
std::perror("wait");
}
- else if (killedPid != itr->childPid)
+ else if (killedPid != childPid)
{
std::cerr << "wait: killed Pid " << killedPid << " != child Pid "
- << itr->childPid << "\n";
+ << childPid << "\n";
}
else if (_deathCallback)
- _deathCallback->childDied(itr->childPid);
+ _deathCallback->childDied(childPid);
}
}
@@ -338,6 +351,58 @@ private:
Gtk::Entry* _scriptArgEntry;
};
+class ProcModelColumns : public Gtk::TreeModelColumnRecord
+{
+public:
+ ProcModelColumns()
+ {
+ add(_scriptName);
+ add(_proc);
+ }
+ Gtk::TreeModelColumn<Glib::ustring> _scriptName;
+ Gtk::TreeModelColumn<shared_ptr<StapProcess> > _proc;
+};
+
+class ProcWindow
+{
+public:
+ ProcWindow();
+ ProcModelColumns _modelColumns;
+ Glib::RefPtr<Gnome::Glade::Xml> _xml;
+ Gtk::Window* _window;
+ Gtk::TreeView* _dataTreeView;
+ Glib::RefPtr<Gtk::ListStore> _listStore;
+ void onClose();
+};
+
+ProcWindow::ProcWindow()
+{
+ try
+ {
+ _xml = Gnome::Glade::Xml::create(PKGDATADIR "/processwindow.glade");
+ _xml->get_widget("window1", _window);
+ _xml->get_widget("treeview1", _dataTreeView);
+
+ }
+ catch (const Gnome::Glade::XmlError& ex )
+ {
+ std::cerr << ex.what() << std::endl;
+ throw;
+ }
+ _listStore = Gtk::ListStore::create(_modelColumns);
+ _dataTreeView->set_model(_listStore);
+ _dataTreeView->append_column("Script", _modelColumns._scriptName);
+ Gtk::Button* button = 0;
+ _xml->get_widget("button5", button);
+ button->signal_clicked().connect(sigc::mem_fun(*this, &ProcWindow::onClose),
+ false);
+}
+
+void ProcWindow::onClose()
+{
+ _window->hide();
+}
+
class GrapherWindow : public Gtk::Window, public ChildDeathReader::Callback
{
public:
@@ -355,25 +420,28 @@ public:
protected:
virtual void on_menu_file_quit();
virtual void on_menu_script_start();
+ virtual void on_menu_proc_window();
void addGraph();
// menu support
Glib::RefPtr<Gtk::UIManager> m_refUIManager;
Glib::RefPtr<Gtk::ActionGroup> m_refActionGroup;
GraphicalStapLauncher* _graphicalLauncher;
-
+ shared_ptr<ProcWindow> _procWindow;
};
+
GrapherWindow::GrapherWindow()
+ : _procWindow(new ProcWindow)
{
set_title("systemtap grapher");
add(m_Box);
-
+
//Create actions for menus and toolbars:
m_refActionGroup = Gtk::ActionGroup::create();
//File menu:
m_refActionGroup->add(Gtk::Action::create("FileMenu", "File"));
- m_refActionGroup->add(Gtk::Action::create("StartScript", "Start script"),
+ m_refActionGroup->add(Gtk::Action::create("StartScript", "Start script..."),
sigc::mem_fun(*this,
&GrapherWindow::on_menu_script_start));
m_refActionGroup->add(Gtk::Action::create("AddGraph", "Add graph"),
@@ -381,6 +449,12 @@ GrapherWindow::GrapherWindow()
m_refActionGroup->add(Gtk::Action::create("FileQuit", Gtk::Stock::QUIT),
sigc::mem_fun(*this,
&GrapherWindow::on_menu_file_quit));
+ // Window menu
+ m_refActionGroup->add(Gtk::Action::create("WindowMenu", "Window"));
+ m_refActionGroup->add(Gtk::Action::create("ProcessWindow",
+ "Stap processes..."),
+ sigc::mem_fun(*this,
+ &GrapherWindow::on_menu_proc_window));
m_refUIManager = Gtk::UIManager::create();
m_refUIManager->insert_action_group(m_refActionGroup);
@@ -394,6 +468,9 @@ GrapherWindow::GrapherWindow()
" <menuitem action='AddGraph'/>"
" <menuitem action='FileQuit'/>"
" </menu>"
+ " <menu action='WindowMenu'>"
+ " <menuitem action='ProcessWindow'/>"
+ " </menu>"
" </menubar>"
"</ui>";
try
@@ -425,6 +502,25 @@ void GrapherWindow::on_menu_script_start()
_graphicalLauncher->runDialog();
}
+
+void GrapherWindow::on_menu_proc_window()
+{
+ _procWindow->_listStore->clear();
+ for (StapLauncher::ParserList::iterator spitr
+ = _graphicalLauncher->_parsers.begin(),
+ end = _graphicalLauncher->_parsers.end();
+ spitr != end;
+ ++spitr)
+ {
+ shared_ptr<StapProcess> sp = (*spitr)->getProcess();
+ Gtk::TreeModel::iterator litr = _procWindow->_listStore->append();
+ Gtk::TreeModel::Row row = *litr;
+ if (sp)
+ row[_procWindow->_modelColumns._scriptName] = sp->script;
+ }
+ _procWindow->_window->show();
+}
+
void GrapherWindow::childDied(int pid)
{
hide();
diff --git a/grapher/processwindow.glade b/grapher/processwindow.glade
new file mode 100644
index 00000000..ad1bdd14
--- /dev/null
+++ b/grapher/processwindow.glade
@@ -0,0 +1,372 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+
+<widget class="GtkWindow" id="window1">
+ <property name="title" translatable="yes">stap processes</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_NONE</property>
+ <property name="modal">False</property>
+ <property name="resizable">True</property>
+ <property name="destroy_with_parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip_taskbar_hint">False</property>
+ <property name="skip_pager_hint">False</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus_on_map">True</property>
+ <property name="urgency_hint">False</property>
+
+ <child>
+ <widget class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkToolbar" id="toolbar1">
+ <property name="visible">True</property>
+ <property name="orientation">GTK_ORIENTATION_HORIZONTAL</property>
+ <property name="toolbar_style">GTK_TOOLBAR_BOTH</property>
+ <property name="tooltips">True</property>
+ <property name="show_arrow">True</property>
+
+ <child>
+ <widget class="GtkToolItem" id="toolitem1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">True</property>
+ <property name="visible_vertical">True</property>
+ <property name="is_important">False</property>
+
+ <child>
+ <widget class="GtkButton" id="button1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+
+ <child>
+ <widget class="GtkAlignment" id="alignment3">
+ <property name="visible">True</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xscale">0</property>
+ <property name="yscale">0</property>
+ <property name="top_padding">0</property>
+ <property name="bottom_padding">0</property>
+ <property name="left_padding">0</property>
+ <property name="right_padding">0</property>
+
+ <child>
+ <widget class="GtkHBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">2</property>
+
+ <child>
+ <widget class="GtkImage" id="image3">
+ <property name="visible">True</property>
+ <property name="stock">gtk-cancel</property>
+ <property name="icon_size">4</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Kill</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkToolItem" id="toolitem2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">True</property>
+ <property name="visible_vertical">True</property>
+ <property name="is_important">False</property>
+
+ <child>
+ <widget class="GtkButton" id="button2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+
+ <child>
+ <widget class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xscale">0</property>
+ <property name="yscale">0</property>
+ <property name="top_padding">0</property>
+ <property name="bottom_padding">0</property>
+ <property name="left_padding">0</property>
+ <property name="right_padding">0</property>
+
+ <child>
+ <widget class="GtkHBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">2</property>
+
+ <child>
+ <widget class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="stock">gtk-refresh</property>
+ <property name="icon_size">4</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Restart</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property>
+ <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
+ <property name="shadow_type">GTK_SHADOW_IN</property>
+ <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+ <child>
+ <widget class="GtkTreeView" id="treeview1">
+ <property name="width_request">300</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">True</property>
+ <property name="rules_hint">False</property>
+ <property name="reorderable">False</property>
+ <property name="enable_search">True</property>
+ <property name="fixed_height_mode">False</property>
+ <property name="hover_selection">False</property>
+ <property name="hover_expand">False</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHandleBox" id="handlebox1">
+ <property name="width_request">26</property>
+ <property name="visible">True</property>
+ <property name="shadow_type">GTK_SHADOW_OUT</property>
+ <property name="handle_position">GTK_POS_LEFT</property>
+ <property name="snap_edge">GTK_POS_TOP</property>
+
+ <child>
+ <widget class="GtkVBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkLabel" id="label1">
+ <property name="height_request">17</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label1</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkScrolledWindow" id="scrolledwindow2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property>
+ <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
+ <property name="shadow_type">GTK_SHADOW_IN</property>
+ <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+ <child>
+ <widget class="GtkTextView" id="textview1">
+ <property name="width_request">20</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="overwrite">False</property>
+ <property name="accepts_tab">True</property>
+ <property name="justification">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap_mode">GTK_WRAP_NONE</property>
+ <property name="cursor_visible">True</property>
+ <property name="pixels_above_lines">0</property>
+ <property name="pixels_below_lines">0</property>
+ <property name="pixels_inside_wrap">0</property>
+ <property name="left_margin">0</property>
+ <property name="right_margin">0</property>
+ <property name="indent">0</property>
+ <property name="text" translatable="yes"></property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkButton" id="button5">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-close</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+</widget>
+
+</glade-interface>
diff --git a/grapher/processwindow.gladep b/grapher/processwindow.gladep
new file mode 100644
index 00000000..183077ba
--- /dev/null
+++ b/grapher/processwindow.gladep
@@ -0,0 +1,8 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd">
+
+<glade-project>
+ <name></name>
+ <program_name></program_name>
+ <gnome_support>FALSE</gnome_support>
+</glade-project>