]> sourceware.org Git - systemtap.git/commitdiff
grapher: start of a dialog for displaying active stap processes
authorTim Moore <timoore@redhat.com>
Tue, 8 Dec 2009 22:17:47 +0000 (23:17 +0100)
committerTim Moore <timoore@redhat.com>
Tue, 8 Dec 2009 22:34:00 +0000 (23:34 +0100)
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

grapher/Makefile.am
grapher/Makefile.in
grapher/StapParser.cxx
grapher/StapParser.hxx
grapher/grapher.cxx
grapher/processwindow.glade [new file with mode: 0644]
grapher/processwindow.gladep [new file with mode: 0644]

index 5bca286a1b036ff49e60aecd57bccf13d27a1e4e..1087f44dbd54a57941e9e3d1b8d4965df7d8ea6b 100644 (file)
@@ -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
index f06402bc8828913517efb56e742dafa7350de7c8..c608e5160d072adf98c8bd1bf88bf8f061d84a98 100644 (file)
@@ -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:
index 653c00debee1486e5c8198dd60af6d03858acb79..b82cc0247535526de7a99ae3ed507e8475a594e9 100644 (file)
@@ -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)
index eba8a7af87826b94a5151cbda63a769c2d920470..cfb807a8aa9a8afc9efaed1e7d4d8e42faf1a308 100644 (file)
@@ -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();
 }
index 4769877fa67f9da4e3e423a77f1f9c6bcac0a067..2a9a617b23e7760096b7cb0b000d702ef151f7a6 100644 (file)
@@ -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 (file)
index 0000000..ad1bdd1
--- /dev/null
@@ -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 (file)
index 0000000..183077b
--- /dev/null
@@ -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>
This page took 0.052195 seconds and 5 git commands to generate.