summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ClientWindow.cc59
-rw-r--r--src/ClientWindow.hh32
-rw-r--r--src/MainWindow.cc290
-rw-r--r--src/MainWindow.hh117
-rw-r--r--src/Makefile9
-rw-r--r--src/ModuleWindow.cc58
-rw-r--r--src/ModuleWindow.hh29
-rw-r--r--src/ServerInfo.cc398
-rw-r--r--src/ServerInfo.hh130
-rw-r--r--src/SinkWindow.cc111
-rw-r--r--src/SinkWindow.hh45
-rw-r--r--src/SourceWindow.cc82
-rw-r--r--src/SourceWindow.hh32
-rw-r--r--src/paman.cc117
-rw-r--r--src/paman.glade2600
-rw-r--r--src/paman.gladep12
-rw-r--r--src/paman.hh15
17 files changed, 4136 insertions, 0 deletions
diff --git a/src/ClientWindow.cc b/src/ClientWindow.cc
new file mode 100644
index 0000000..88e2ad3
--- /dev/null
+++ b/src/ClientWindow.cc
@@ -0,0 +1,59 @@
+#include <iostream>
+
+#include "paman.hh"
+#include "ClientWindow.hh"
+
+#define GLADE_NAME "clientWindow"
+
+ClientWindow::ClientWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& refGlade) :
+ Gtk::Window(cobject),
+ nameLabel(NULL),
+ protocolLabel(NULL),
+ indexLabel(NULL),
+ ownerModuleLabel(NULL),
+ closeButton(NULL),
+ toOwnerModuleButton(NULL) {
+
+ refGlade->get_widget("nameLabel", nameLabel);
+ refGlade->get_widget("protocolLabel", protocolLabel);
+ refGlade->get_widget("indexLabel", indexLabel);
+ refGlade->get_widget("ownerModuleLabel", ownerModuleLabel);
+ refGlade->get_widget("closeButton", closeButton);
+ refGlade->get_widget("toOwnerModuleButton", toOwnerModuleButton);
+
+ closeButton->signal_clicked().connect(sigc::mem_fun(*this, &ClientWindow::onCloseButton));
+ toOwnerModuleButton->signal_clicked().connect(sigc::mem_fun(*this, &ClientWindow::onToOwnerModuleButton));
+}
+
+ClientWindow* ClientWindow::create() {
+ ClientWindow *w = NULL;
+ Glib::RefPtr<Gnome::Glade::Xml> refXml = Gnome::Glade::Xml::create(GLADE_FILE, GLADE_NAME);
+ refXml->get_widget_derived(GLADE_NAME, w);
+ return w;
+}
+
+void ClientWindow::updateInfo(const ClientInfo &i) {
+ char t[20], ss[PA_SAMPLE_SNPRINT_MAX_LENGTH];
+
+ nameLabel->set_text(i.name);
+ protocolLabel->set_text(i.protocol_name);
+ snprintf(t, sizeof(t), "#%u", i.index);
+ indexLabel->set_text(t);
+
+ snprintf(t, sizeof(t), "#%u", i.owner_module);
+ ownerModuleLabel->set_text(t);
+
+ set_title("Client: "+i.name);
+
+ owner_module = i.owner_module;
+ toOwnerModuleButton->set_sensitive(owner_module != (uint32_t) -1);
+}
+
+void ClientWindow::onCloseButton() {
+ hide();
+}
+
+void ClientWindow::onToOwnerModuleButton() {
+ if (owner_module != (uint32_t) -1)
+ serverInfoManager->showModuleWindow(owner_module);
+}
diff --git a/src/ClientWindow.hh b/src/ClientWindow.hh
new file mode 100644
index 0000000..61a1973
--- /dev/null
+++ b/src/ClientWindow.hh
@@ -0,0 +1,32 @@
+#ifndef fooclientwindowhhfoo
+#define fooclientwindowhhfoo
+
+#include <gtkmm.h>
+#include <libglademm.h>
+
+class ClientWindow;
+
+#include "ServerInfo.hh"
+
+class ClientWindow : public Gtk::Window {
+public:
+ ClientWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& refGlade);
+ static ClientWindow* create();
+
+ Gtk::Label *nameLabel,
+ *protocolLabel,
+ *indexLabel,
+ *ownerModuleLabel;
+
+ Gtk::Button *closeButton,
+ *toOwnerModuleButton;
+
+ uint32_t owner_module;
+
+ void updateInfo(const ClientInfo &i);
+
+ virtual void onCloseButton();
+ virtual void onToOwnerModuleButton();
+};
+
+#endif
diff --git a/src/MainWindow.cc b/src/MainWindow.cc
new file mode 100644
index 0000000..fdb817a
--- /dev/null
+++ b/src/MainWindow.cc
@@ -0,0 +1,290 @@
+#include <iostream>
+#include <string>
+#include <sstream>
+
+#include "paman.hh"
+#include "MainWindow.hh"
+
+#define GLADE_NAME "mainWindow"
+
+enum {
+ ROW_TYPE_SINK_CATEGORY,
+ ROW_TYPE_SOURCE_CATEGORY,
+ ROW_TYPE_SINK,
+ ROW_TYPE_SOURCE,
+};
+
+MainWindow::MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& refGlade) :
+ Gtk::Window(cobject),
+ statusLabel(NULL),
+ serverNameLabel(NULL),
+ serverVersionLabel(NULL),
+ defaultSampleTypeLabel(NULL),
+ userNameLabel(NULL),
+ hostNameLabel(NULL),
+ deviceOpenButton(NULL),
+ clientOpenButton(NULL),
+ moduleOpenButton(NULL),
+ connectButton(NULL),
+ deviceTreeView(NULL),
+ clientTreeView(NULL),
+ moduleTreeView(NULL) {
+
+ refGlade->get_widget("statusLabel", statusLabel);
+ refGlade->get_widget("serverNameLabel", serverNameLabel);
+ refGlade->get_widget("serverVersionLabel", serverVersionLabel);
+ refGlade->get_widget("defaultSampleTypeLabel", defaultSampleTypeLabel);
+ refGlade->get_widget("hostNameLabel", hostNameLabel);
+ refGlade->get_widget("userNameLabel", userNameLabel);
+ refGlade->get_widget("deviceTreeView", deviceTreeView);
+ refGlade->get_widget("clientTreeView", clientTreeView);
+ refGlade->get_widget("moduleTreeView", moduleTreeView);
+ refGlade->get_widget("deviceOpenButton", deviceOpenButton);
+ refGlade->get_widget("clientOpenButton", clientOpenButton);
+ refGlade->get_widget("moduleOpenButton", moduleOpenButton);
+ refGlade->get_widget("connectButton", connectButton);
+
+ deviceTreeStore = Gtk::TreeStore::create(deviceTreeModelColumns);
+ deviceTreeView->set_model(deviceTreeStore);
+ deviceTreeView->append_column("Name", deviceTreeModelColumns.name);
+ deviceTreeView->append_column("Description", deviceTreeModelColumns.description);
+ deviceTreeView->signal_row_activated().connect(sigc::mem_fun(*this, &MainWindow::onDeviceTreeViewRowActivated));
+ deviceTreeView->signal_cursor_changed().connect(sigc::mem_fun(*this, &MainWindow::onDeviceTreeViewCursorChanged));
+
+ clientTreeStore = Gtk::TreeStore::create(clientTreeModelColumns);
+ clientTreeView->set_model(clientTreeStore);
+ clientTreeView->append_column("Name", clientTreeModelColumns.name);
+ clientTreeView->signal_row_activated().connect(sigc::mem_fun(*this, &MainWindow::onClientTreeViewRowActivated));
+
+ moduleTreeStore = Gtk::TreeStore::create(moduleTreeModelColumns);
+ moduleTreeView->set_model(moduleTreeStore);
+ moduleTreeView->append_column("Name", moduleTreeModelColumns.name);
+ moduleTreeView->append_column("Argument", moduleTreeModelColumns.argument);
+ moduleTreeView->signal_row_activated().connect(sigc::mem_fun(*this, &MainWindow::onModuleTreeViewRowActivated));
+
+ connectButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::onConnectButton));
+ deviceOpenButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::onDeviceOpenButton));
+ clientOpenButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::onClientOpenButton));
+ moduleOpenButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::onModuleOpenButton));
+
+ statusLabel->set_text("Connecting ...");
+
+ clearAllData();
+}
+
+MainWindow::~MainWindow() {
+}
+
+MainWindow* MainWindow::create() {
+ MainWindow *w;
+ Glib::RefPtr<Gnome::Glade::Xml> refXml = Gnome::Glade::Xml::create(GLADE_FILE, GLADE_NAME);
+ refXml->get_widget_derived(GLADE_NAME, w);
+ return w;
+}
+
+void MainWindow::updateInfo(SinkInfo &i) {
+ if (!i.treeRef) {
+ Gtk::TreeIter iter = deviceTreeStore->get_iter(sinkRef.get_path());
+ i.treeRef = Gtk::TreeRowReference(deviceTreeStore, Gtk::TreePath(deviceTreeStore->append(iter->children())));
+ }
+
+ Gtk::TreeRow row = *(deviceTreeStore->get_iter(i.treeRef.get_path()));
+ row[deviceTreeModelColumns.name] = i.name;
+ row[deviceTreeModelColumns.description] = i.description;
+ row[deviceTreeModelColumns.index] = i.index;
+ row[deviceTreeModelColumns.type] = ROW_TYPE_SINK;
+
+ deviceTreeView->expand_row(sinkRef.get_path(), false);
+ onDeviceTreeViewCursorChanged();
+}
+
+void MainWindow::updateInfo(SourceInfo &i) {
+ if (!i.treeRef) {
+ Gtk::TreeIter iter = deviceTreeStore->get_iter(sourceRef.get_path());
+ i.treeRef = Gtk::TreeRowReference(deviceTreeStore, Gtk::TreePath(deviceTreeStore->append(iter->children())));
+ }
+
+ Gtk::TreeRow row = *(deviceTreeStore->get_iter(i.treeRef.get_path()));
+ row[deviceTreeModelColumns.name] = i.name;
+ row[deviceTreeModelColumns.description] = i.description;
+ row[deviceTreeModelColumns.index] = i.index;
+ row[deviceTreeModelColumns.type] = ROW_TYPE_SOURCE;
+
+ deviceTreeView->expand_row(sourceRef.get_path(), false);
+ onDeviceTreeViewCursorChanged();
+}
+
+void MainWindow::updateInfo(ClientInfo &i) {
+
+ if (!i.treeRef)
+ i.treeRef = Gtk::TreeRowReference(clientTreeStore, Gtk::TreePath(clientTreeStore->append()));
+
+ Gtk::TreeRow row = *(clientTreeStore->get_iter(i.treeRef.get_path()));
+ row[clientTreeModelColumns.name] = i.name;
+ row[clientTreeModelColumns.index] = i.index;
+ clientOpenButton->set_sensitive(true);
+}
+
+void MainWindow::updateInfo(ModuleInfo &i) {
+ if (!i.treeRef)
+ i.treeRef = Gtk::TreeRowReference(moduleTreeStore, Gtk::TreePath(moduleTreeStore->append()));
+
+ Gtk::TreeRow row = *(moduleTreeStore->get_iter(i.treeRef.get_path()));
+ row[moduleTreeModelColumns.name] = i.name;
+ row[moduleTreeModelColumns.argument] = i.argument;
+ row[moduleTreeModelColumns.index] = i.index;
+ moduleOpenButton->set_sensitive(true);
+}
+
+void MainWindow::removeInfo(SinkInfo &i) {
+ if (i.treeRef)
+ deviceTreeStore->erase(deviceTreeStore->get_iter(i.treeRef.get_path()));
+
+ onDeviceTreeViewCursorChanged();
+}
+
+void MainWindow::removeInfo(SourceInfo &i) {
+ if (!i.treeRef)
+ deviceTreeStore->erase(deviceTreeStore->get_iter(i.treeRef.get_path()));
+
+ onDeviceTreeViewCursorChanged();
+}
+
+void MainWindow::removeInfo(ClientInfo &i) {
+ if (i.treeRef)
+ clientTreeStore->erase(clientTreeStore->get_iter(i.treeRef.get_path()));
+
+ clientOpenButton->set_sensitive(!moduleTreeStore->children().empty());
+}
+
+void MainWindow::removeInfo(ModuleInfo &i) {
+ if (i.treeRef)
+ moduleTreeStore->erase(moduleTreeStore->get_iter(i.treeRef.get_path()));
+
+ moduleOpenButton->set_sensitive(!moduleTreeStore->children().empty());
+}
+
+void MainWindow::onDeviceTreeViewCursorChanged() {
+ Gtk::TreeModel::Path p;
+ Gtk::TreeViewColumn *c;
+ deviceTreeView->get_cursor(p, c);
+
+ if (!p.gobj())
+ return;
+
+ deviceOpenButton->set_sensitive((sourceRef.get_path() != p) && (sinkRef.get_path() != p));
+}
+
+void MainWindow::onDeviceTreeViewRowActivated(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* /* column */) {
+ showDeviceWindow(path);
+}
+
+void MainWindow::onClientTreeViewRowActivated(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* /* column */) {
+ showClientWindow(path);
+}
+
+void MainWindow::onModuleTreeViewRowActivated(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* /* column */) {
+ showModuleWindow(path);
+}
+
+void MainWindow::updateInfo(const struct pa_server_info &i) {
+ char t[PA_SAMPLE_SNPRINT_MAX_LENGTH];
+ serverNameLabel->set_text(i.server_name);
+ serverVersionLabel->set_text(i.server_version);
+ pa_sample_snprint(t, sizeof(t), &i.sample_spec);
+ defaultSampleTypeLabel->set_text(t);
+ hostNameLabel->set_text(i.host_name);
+ userNameLabel->set_text(i.user_name);
+}
+
+void MainWindow::showSuccess(const char *t) {
+ statusLabel->set_text(t);
+}
+
+void MainWindow::showFailure(const char *t) {
+ char s[256];
+ snprintf(s, sizeof(s), "<b>Failure:</b> %s", t);
+ statusLabel->set_markup(s);
+}
+
+void MainWindow::clearAllData() {
+ deviceTreeStore->clear();
+
+ Gtk::TreeIter i = deviceTreeStore->append();
+ sinkRef = Gtk::TreeRowReference(deviceTreeStore, Gtk::TreePath(i));
+ (*i)[deviceTreeModelColumns.name] = "Sinks";
+ (*i)[deviceTreeModelColumns.index] = (uint32_t) -1;
+ (*i)[deviceTreeModelColumns.type] = ROW_TYPE_SINK_CATEGORY;
+
+ i = deviceTreeStore->append();
+ sourceRef = Gtk::TreeRowReference(deviceTreeStore, Gtk::TreePath(i));
+ (*i)[deviceTreeModelColumns.name] = "Sources";
+ (*i)[deviceTreeModelColumns.index] = (uint32_t) -1;
+ (*i)[deviceTreeModelColumns.type] = ROW_TYPE_SOURCE_CATEGORY;
+
+ clientTreeStore->clear();
+ moduleTreeStore->clear();
+
+ deviceOpenButton->set_sensitive(false);
+ clientOpenButton->set_sensitive(false);
+ moduleOpenButton->set_sensitive(false);
+
+ serverNameLabel->set_markup("<i>n/a</i>");
+ serverVersionLabel->set_markup("<i>n/a</i>");
+ defaultSampleTypeLabel->set_markup("<i>n/a</i>");
+ hostNameLabel->set_markup("<i>n/a</i>");
+ userNameLabel->set_markup("<i>n/a</i>");
+}
+
+void MainWindow::onDeviceOpenButton() {
+ Gtk::TreeModel::Path p;
+ Gtk::TreeViewColumn *c;
+ deviceTreeView->get_cursor(p, c);
+ showDeviceWindow(p);
+}
+
+void MainWindow::onClientOpenButton() {
+ Gtk::TreeModel::Path p;
+ Gtk::TreeViewColumn *c;
+ clientTreeView->get_cursor(p, c);
+ showClientWindow(p);
+}
+
+void MainWindow::onModuleOpenButton() {
+ Gtk::TreeModel::Path p;
+ Gtk::TreeViewColumn *c;
+ moduleTreeView->get_cursor(p, c);
+ showModuleWindow(p);
+}
+
+void MainWindow::onConnectButton() {
+ create_connection();
+}
+
+void MainWindow::showDeviceWindow(const Gtk::TreePath &p) {
+ if (!serverInfoManager)
+ return;
+
+ Gtk::TreeModel::Row row = *(deviceTreeStore->get_iter(p));
+
+ if (row[deviceTreeModelColumns.type] == ROW_TYPE_SINK)
+ serverInfoManager->showSinkWindow(row[deviceTreeModelColumns.index]);
+ else if (row[deviceTreeModelColumns.type] == ROW_TYPE_SOURCE)
+ serverInfoManager->showSourceWindow(row[deviceTreeModelColumns.index]);
+}
+
+void MainWindow::showClientWindow(const Gtk::TreePath &p) {
+ if (!serverInfoManager)
+ return;
+
+ Gtk::TreeModel::Row row = *(clientTreeStore->get_iter(p));
+ serverInfoManager->showClientWindow(row[clientTreeModelColumns.index]);
+}
+
+void MainWindow::showModuleWindow(const Gtk::TreePath &p) {
+ if (!serverInfoManager)
+ return;
+
+ Gtk::TreeModel::Row row = *(moduleTreeStore->get_iter(p));
+ serverInfoManager->showModuleWindow(row[moduleTreeModelColumns.index]);
+}
diff --git a/src/MainWindow.hh b/src/MainWindow.hh
new file mode 100644
index 0000000..2d5f173
--- /dev/null
+++ b/src/MainWindow.hh
@@ -0,0 +1,117 @@
+#ifndef foomainwindowhhfoo
+#define foomainwindowhhfoo
+
+#include <gtkmm.h>
+#include <libglademm.h>
+#include <polyp/polyplib.h>
+
+class MainWinow;
+
+#include "ServerInfo.hh"
+
+class MainWindow : public Gtk::Window {
+public:
+ MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& refGlade);
+ virtual ~MainWindow();
+ static MainWindow* create();
+
+ Gtk::Label *statusLabel,
+ *serverNameLabel,
+ *serverVersionLabel,
+ *defaultSampleTypeLabel,
+ *userNameLabel,
+ *hostNameLabel;
+
+ Gtk::Button *deviceOpenButton,
+ *clientOpenButton,
+ *moduleOpenButton,
+ *connectButton;
+
+ Gtk::TreeView *deviceTreeView,
+ *clientTreeView,
+ *moduleTreeView;
+
+protected:
+
+ class DeviceTreeModelColumns : public Gtk::TreeModel::ColumnRecord {
+ public:
+
+ DeviceTreeModelColumns() {
+ add(name);
+ add(description);
+ add(index);
+ add(type);
+ }
+
+ Gtk::TreeModelColumn<Glib::ustring> name;
+ Gtk::TreeModelColumn<Glib::ustring> description;
+ Gtk::TreeModelColumn<uint32_t> index;
+ Gtk::TreeModelColumn<int> type;
+ };
+
+ DeviceTreeModelColumns deviceTreeModelColumns;
+ Glib::RefPtr<Gtk::TreeStore> deviceTreeStore;
+ Gtk::TreeRowReference sinkRef, sourceRef;
+
+ class ClientTreeModelColumns : public Gtk::TreeModel::ColumnRecord {
+ public:
+ ClientTreeModelColumns() {
+ add(name);
+ add(index);
+ }
+
+ Gtk::TreeModelColumn<Glib::ustring> name;
+ Gtk::TreeModelColumn<uint32_t> index;
+ };
+
+ ClientTreeModelColumns clientTreeModelColumns;
+ Glib::RefPtr<Gtk::TreeStore> clientTreeStore;
+
+ class ModuleTreeModelColumns : public Gtk::TreeModel::ColumnRecord {
+ public:
+ ModuleTreeModelColumns() {
+ add(name);
+ add(argument);
+ add(index);
+ }
+
+ Gtk::TreeModelColumn<Glib::ustring> name;
+ Gtk::TreeModelColumn<Glib::ustring> argument;
+ Gtk::TreeModelColumn<uint32_t> index;
+ };
+
+ ModuleTreeModelColumns moduleTreeModelColumns;
+ Glib::RefPtr<Gtk::TreeStore> moduleTreeStore;
+
+public:
+ virtual void updateInfo(const struct pa_server_info &i);
+ virtual void updateInfo(SinkInfo &i);
+ virtual void updateInfo(SourceInfo &i);
+ virtual void updateInfo(ClientInfo &i);
+ virtual void updateInfo(ModuleInfo &i);
+
+ virtual void removeInfo(SinkInfo &i);
+ virtual void removeInfo(SourceInfo &i);
+ virtual void removeInfo(ClientInfo &i);
+ virtual void removeInfo(ModuleInfo &i);
+
+ virtual void onDeviceTreeViewCursorChanged();
+ virtual void onDeviceTreeViewRowActivated(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* /* column */);
+ virtual void onClientTreeViewRowActivated(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* /* column */);
+ virtual void onModuleTreeViewRowActivated(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* /* column */);
+
+ virtual void showSuccess(const char *t);
+ virtual void showFailure(const char *t);
+ virtual void clearAllData();
+
+ virtual void onDeviceOpenButton();
+ virtual void onClientOpenButton();
+ virtual void onModuleOpenButton();
+ virtual void onConnectButton();
+
+ virtual void showDeviceWindow(const Gtk::TreePath &p);
+ virtual void showClientWindow(const Gtk::TreePath &p);
+ virtual void showModuleWindow(const Gtk::TreePath &p);
+};
+
+#endif
diff --git a/src/Makefile b/src/Makefile
new file mode 100644
index 0000000..8a9cb3a
--- /dev/null
+++ b/src/Makefile
@@ -0,0 +1,9 @@
+
+CXXFLAGS=`pkg-config gtkmm-2.4 libglademm-2.4 --cflags` -Wall -W -pipe -O0 -g -Wno-unused -I../polypaudio
+LIBS=`pkg-config gtkmm-2.4 libglademm-2.4 --libs` -L../polypaudio/polyp/.libs -lpolyp -lpolyp-mainloop-glib -lpolyp-error
+
+paman: paman.o MainWindow.o SinkWindow.o SourceWindow.o ServerInfo.o ClientWindow.o ModuleWindow.o
+ $(CXX) $^ -o $@ $(LIBS)
+
+clean:
+ rm -rf *.o paman
diff --git a/src/ModuleWindow.cc b/src/ModuleWindow.cc
new file mode 100644
index 0000000..04d8fb5
--- /dev/null
+++ b/src/ModuleWindow.cc
@@ -0,0 +1,58 @@
+#include <iostream>
+
+#include "paman.hh"
+#include "ModuleWindow.hh"
+
+#define GLADE_NAME "moduleWindow"
+
+ModuleWindow::ModuleWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& refGlade) :
+ Gtk::Window(cobject),
+ nameLabel(NULL),
+ argumentLabel(NULL),
+ indexLabel(NULL),
+ autoloadedLabel(NULL),
+ usageLabel(NULL),
+ closeButton(NULL) {
+
+ refGlade->get_widget("nameLabel", nameLabel);
+ refGlade->get_widget("argumentLabel", argumentLabel);
+ refGlade->get_widget("indexLabel", indexLabel);
+ refGlade->get_widget("autoloadedLabel", autoloadedLabel);
+ refGlade->get_widget("usageLabel", usageLabel);
+ refGlade->get_widget("closeButton", closeButton);
+
+ closeButton->signal_clicked().connect(sigc::mem_fun(*this, &ModuleWindow::onCloseButton));
+}
+
+ModuleWindow* ModuleWindow::create() {
+ ModuleWindow *w = NULL;
+ Glib::RefPtr<Gnome::Glade::Xml> refXml = Gnome::Glade::Xml::create(GLADE_FILE, GLADE_NAME);
+ refXml->get_widget_derived(GLADE_NAME, w);
+ return w;
+}
+
+void ModuleWindow::updateInfo(const ModuleInfo &i) {
+ char t[20], ss[PA_SAMPLE_SNPRINT_MAX_LENGTH];
+
+ nameLabel->set_text(i.name);
+ if (!i.argument.empty())
+ argumentLabel->set_text(i.argument);
+ else
+ argumentLabel->set_markup("<i>None specified</i>");
+
+ snprintf(t, sizeof(t), "#%u", i.index);
+ indexLabel->set_text(t);
+ autoloadedLabel->set_text(i.autoloaded ? "Yes" : "No");
+
+ if (i.used != (uint32_t) -1) {
+ snprintf(t, sizeof(t), "%u", i.used);
+ usageLabel->set_text(t);
+ } else
+ usageLabel->set_markup("<i>n/a</i>");
+
+ set_title("Module: "+i.name);
+}
+
+void ModuleWindow::onCloseButton() {
+ hide();
+}
diff --git a/src/ModuleWindow.hh b/src/ModuleWindow.hh
new file mode 100644
index 0000000..c28af52
--- /dev/null
+++ b/src/ModuleWindow.hh
@@ -0,0 +1,29 @@
+#ifndef foomodulewindowhhfoo
+#define foomodulewindowhhfoo
+
+#include <gtkmm.h>
+#include <libglademm.h>
+
+class ModuleWindow;
+
+#include "ServerInfo.hh"
+
+class ModuleWindow : public Gtk::Window {
+public:
+ ModuleWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& refGlade);
+ static ModuleWindow* create();
+
+ Gtk::Label *nameLabel,
+ *argumentLabel,
+ *indexLabel,
+ *autoloadedLabel,
+ *usageLabel;
+
+ Gtk::Button *closeButton;
+
+ void updateInfo(const ModuleInfo &i);
+
+ virtual void onCloseButton();
+};
+
+#endif
diff --git a/src/ServerInfo.cc b/src/ServerInfo.cc
new file mode 100644
index 0000000..fc7fe4e
--- /dev/null
+++ b/src/ServerInfo.cc
@@ -0,0 +1,398 @@
+#include <iostream>
+#include <polyp/polyplib-error.h>
+
+#include "ServerInfo.hh"
+#include "paman.hh"
+
+SinkInfo::SinkInfo(const struct pa_sink_info &i) :
+ name(i.name),
+ description(i.description),
+ index(i.index),
+ sample_spec(i.sample_spec),
+ monitor_source(i.monitor_source),
+ owner_module(i.owner_module),
+ volume(i.volume),
+ latency(i.latency),
+ window(NULL) {
+}
+
+SinkInfo::~SinkInfo() {
+ if (window)
+ delete window;
+}
+
+void SinkInfo::update(const struct pa_sink_info &i) {
+ name = Glib::ustring(i.name);
+ description = i.description;
+ index = i.index;
+ sample_spec = i.sample_spec;
+ monitor_source = i.monitor_source;
+ owner_module = i.owner_module;
+ volume = i.volume;
+ latency = i.latency;
+
+ if (window)
+ window->updateInfo(*this);
+ g_assert(mainWindow);
+ mainWindow->updateInfo(*this);
+}
+
+void SinkInfo::showWindow() {
+ if (window)
+ window->present();
+ else {
+ window = SinkWindow::create();
+ window->updateInfo(*this);
+ window->show();
+ }
+}
+
+SourceInfo::SourceInfo(const struct pa_source_info &i) :
+ name(i.name),
+ description(i.description),
+ index(i.index),
+ sample_spec(i.sample_spec),
+ owner_module(i.owner_module),
+ monitor_of_sink(i.monitor_of_sink),
+ window(NULL) {
+}
+
+SourceInfo::~SourceInfo() {
+ if (window)
+ delete window;
+}
+
+void SourceInfo::update(const struct pa_source_info &i) {
+ name = i.name;
+ description = i.description;
+ index = i.index;
+ sample_spec = i.sample_spec;
+ owner_module = i.owner_module;
+ monitor_of_sink = i.monitor_of_sink;
+
+ if (window)
+ window->updateInfo(*this);
+ g_assert(mainWindow);
+ mainWindow->updateInfo(*this);
+}
+
+void SourceInfo::showWindow() {
+ if (window)
+ window->present();
+ else {
+ window = SourceWindow::create();
+ window->updateInfo(*this);
+ window->show();
+ }
+}
+
+ClientInfo::ClientInfo(const struct pa_client_info &i) :
+ index(i.index),
+ name(i.name),
+ protocol_name(i.protocol_name),
+ owner_module(i.owner_module),
+ window(NULL) {
+}
+
+ClientInfo::~ClientInfo() {
+ if (window)
+ delete window;
+}
+
+void ClientInfo::update(const struct pa_client_info &i) {
+ name = i.name;
+ protocol_name = i.protocol_name;
+ index = i.index;
+ owner_module = i.owner_module;
+
+ if (window)
+ window->updateInfo(*this);
+
+ g_assert(mainWindow);
+ mainWindow->updateInfo(*this);
+}
+
+void ClientInfo::showWindow() {
+ if (window)
+ window->present();
+ else {
+ window = ClientWindow::create();
+ window->updateInfo(*this);
+ window->show();
+ }
+}
+
+ModuleInfo::ModuleInfo(const struct pa_module_info &i) :
+ index(i.index),
+ name(i.name),
+ argument(i.argument),
+ autoloaded(i.auto_unload),
+ used(i.n_used),
+ window(NULL) {
+}
+
+ModuleInfo::~ModuleInfo() {
+ if (window)
+ delete window;
+}
+
+void ModuleInfo::update(const struct pa_module_info &i) {
+ name = i.name;
+ argument = i.argument;
+ index = i.index;
+ autoloaded = i.auto_unload;
+ used = i.n_used;
+
+ if (window)
+ window->updateInfo(*this);
+ g_assert(mainWindow);
+ mainWindow->updateInfo(*this);
+}
+
+void ModuleInfo::showWindow() {
+ if (window)
+ window->present();
+ else {
+ window = ModuleWindow::create();
+ window->updateInfo(*this);
+ window->show();
+ }
+}
+
+static void server_info_callback(struct pa_context *c, const struct pa_server_info *i, void *userdata) {
+ ServerInfoManager *si = (ServerInfoManager*) userdata;
+
+ if (!i) {
+ mainWindow->showFailure(pa_strerror(pa_context_errno(c)));
+ return;
+ }
+
+ mainWindow->updateInfo(*i);
+}
+
+static void sink_info_callback(struct pa_context *c, const struct pa_sink_info *i, int is_last, void *userdata) {
+ ServerInfoManager *si = (ServerInfoManager*) userdata;
+ if (i) si->updateInfo(*i);
+}
+
+static void source_info_callback(struct pa_context *c, const struct pa_source_info *i, int is_last, void *userdata) {
+ ServerInfoManager *si = (ServerInfoManager*) userdata;
+ if (i) si->updateInfo(*i);
+}
+
+static void client_info_callback(struct pa_context *c, const struct pa_client_info *i, int is_last, void *userdata) {
+ ServerInfoManager *si = (ServerInfoManager*) userdata;
+ if (i) si->updateInfo(*i);
+}
+
+static void module_info_callback(struct pa_context *c, const struct pa_module_info *i, int is_last, void *userdata) {
+ ServerInfoManager *si = (ServerInfoManager*) userdata;
+ if (i) si->updateInfo(*i);
+}
+
+static void subscribe_callback(struct pa_context *c, enum pa_subscription_event_type t, uint32_t index, void *userdata) {
+ ServerInfoManager *si = (ServerInfoManager*) userdata;
+
+ //fprintf(stderr, "EV: %u %u\n", t, index);
+
+ switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) {
+ case PA_SUBSCRIPTION_EVENT_SINK:
+ if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE)
+ si->removeSinkInfo(index);
+ else
+ pa_operation_unref(pa_context_get_sink_info_by_index(c, index, sink_info_callback, si));
+ break;
+ case PA_SUBSCRIPTION_EVENT_SOURCE:
+ if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE)
+ si->removeSourceInfo(index);
+ else
+ pa_operation_unref(pa_context_get_source_info_by_index(c, index, source_info_callback, si));
+ break;
+ case PA_SUBSCRIPTION_EVENT_MODULE:
+ if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE)
+ si->removeModuleInfo(index);
+ else
+ pa_operation_unref(pa_context_get_module_info(c, index, module_info_callback, si));
+ break;
+ case PA_SUBSCRIPTION_EVENT_CLIENT:
+ if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE)
+ si->removeClientInfo(index);
+ else
+ pa_operation_unref(pa_context_get_client_info(c, index, client_info_callback, si));
+ break;
+ case PA_SUBSCRIPTION_EVENT_SINK_INPUT:
+// fprintf(stderr, "SINK INPUT EVENT\n");
+ break;
+ case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT:
+// fprintf(stderr, "SOURCE OUTPUT EVENT\n");
+ break;
+ default:
+// fprintf(stderr, "OTHER EVENT\n");
+ break;
+ }
+}
+
+ServerInfoManager::ServerInfoManager(struct pa_context &c) :
+ context(c) {
+ pa_operation_unref(pa_context_get_server_info(&c, server_info_callback, this));
+ pa_operation_unref(pa_context_get_sink_info_list(&c, sink_info_callback, this));
+ pa_operation_unref(pa_context_get_source_info_list(&c, source_info_callback, this));
+ pa_operation_unref(pa_context_get_module_info_list(&c, module_info_callback, this));
+ pa_operation_unref(pa_context_get_client_info_list(&c, client_info_callback, this));
+
+ pa_context_set_subscribe_callback(&c, subscribe_callback, this);
+
+ pa_operation_unref(pa_context_subscribe(&c, (enum pa_subscription_mask)
+ (PA_SUBSCRIPTION_MASK_SINK|
+ PA_SUBSCRIPTION_MASK_SOURCE|
+ PA_SUBSCRIPTION_MASK_MODULE|
+ PA_SUBSCRIPTION_MASK_SINK_INPUT|
+ PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT|
+ PA_SUBSCRIPTION_MASK_CLIENT), NULL, NULL));
+}
+
+
+ServerInfoManager::~ServerInfoManager() {
+ for (std::map<int, SinkInfo*>::iterator i = sinks.begin(); i != sinks.end(); i++)
+ delete i->second;
+
+ for (std::map<int, SourceInfo*>::iterator i = sources.begin(); i != sources.end(); i++)
+ delete i->second;
+
+ for (std::map<int, ClientInfo*>::iterator i = clients.begin(); i != clients.end(); i++)
+ delete i->second;
+
+ for (std::map<int, ModuleInfo*>::iterator i = modules.begin(); i != modules.end(); i++)
+ delete i->second;
+}
+
+void ServerInfoManager::updateInfo(const struct pa_sink_info &i) {
+ SinkInfo *si;
+ if ((si = sinks[i.index]))
+ si->update(i);
+ else {
+ SinkInfo *n = new SinkInfo(i);
+ sinks[i.index] = n;
+ mainWindow->updateInfo(*n);
+ }
+}
+
+void ServerInfoManager::updateInfo(const struct pa_source_info &i) {
+ SourceInfo *si;
+ if ((si = sources[i.index]))
+ si->update(i);
+ else {
+ SourceInfo *n = new SourceInfo(i);
+ sources[i.index] = n;
+ mainWindow->updateInfo(*n);
+ }
+}
+
+void ServerInfoManager::updateInfo(const struct pa_client_info &i) {
+ ClientInfo *ci;
+
+ if ((ci = clients[i.index]))
+ ci->update(i);
+ else {
+ ClientInfo *n = new ClientInfo(i);
+ clients[i.index] = n;
+ mainWindow->updateInfo(*n);
+ }
+}
+void ServerInfoManager::updateInfo(const struct pa_module_info &i) {
+ ModuleInfo *si;
+ if ((si = modules[i.index]))
+ si->update(i);
+ else {
+ ModuleInfo *n = new ModuleInfo(i);
+ modules[i.index] = n;
+ mainWindow->updateInfo(*n);
+ }
+}
+
+void ServerInfoManager::showSinkWindow(uint32_t index) {
+ SinkInfo *i;
+
+ if ((i = sinks[index]))
+ i->showWindow();
+}
+
+void ServerInfoManager::showSourceWindow(uint32_t index) {
+ SourceInfo *i;
+
+ if ((i = sources[index]))
+ i->showWindow();
+}
+
+void ServerInfoManager::showClientWindow(uint32_t index) {
+ ClientInfo *i;
+
+ if ((i = clients[index]))
+ i->showWindow();
+}
+
+void ServerInfoManager::showModuleWindow(uint32_t index) {
+ ModuleInfo *i;
+
+ if ((i = modules[index]))
+ i->showWindow();
+}
+
+
+SourceInfo* ServerInfoManager::getSourceInfo(uint32_t index) {
+ return sources[index];
+}
+
+SinkInfo* ServerInfoManager::getSinkInfo(uint32_t index) {
+ return sinks[index];
+}
+
+ClientInfo* ServerInfoManager::getClientInfo(uint32_t index) {
+ return clients[index];
+}
+
+ModuleInfo* ServerInfoManager::getModuleInfo(uint32_t index) {
+ return modules[index];
+}
+
+void ServerInfoManager::removeSinkInfo(uint32_t index) {
+ SinkInfo *i;
+
+ if ((i = sinks[index])) {
+ sinks.erase(index);
+ mainWindow->removeInfo(*i);
+ delete i;
+ }
+}
+
+void ServerInfoManager::removeSourceInfo(uint32_t index) {
+ SourceInfo *i;
+ if ((i = sources[index])) {
+ sources.erase(index);
+ mainWindow->removeInfo(*i);
+ delete i;
+ }
+}
+
+void ServerInfoManager::removeClientInfo(uint32_t index) {
+ ClientInfo *i;
+
+ if ((i = clients[index])) {
+ clients.erase(index);
+ mainWindow->removeInfo(*i);
+ delete i;
+ }
+}
+
+void ServerInfoManager::removeModuleInfo(uint32_t index) {
+ ModuleInfo *i;
+ if ((i = modules[index])) {
+ modules.erase(index);
+ mainWindow->removeInfo(*i);
+ delete i;
+ }
+}
+
+void ServerInfoManager::setSinkVolume(uint32_t index, uint32_t volume) {
+ pa_operation_unref(pa_context_set_sink_volume_by_index(&context, index, volume, NULL, NULL));
+}
diff --git a/src/ServerInfo.hh b/src/ServerInfo.hh
new file mode 100644
index 0000000..5c22f64
--- /dev/null
+++ b/src/ServerInfo.hh
@@ -0,0 +1,130 @@
+#ifndef fooserverinfohhfoo
+#define fooserverinfohhfoo
+
+#include <gtkmm.h>
+#include <map>
+
+#include <polyp/polyplib.h>
+
+class SinkInfo;
+class SourceInfo;
+class ServerInfo;
+class ClientInfo;
+class ModuleInfo;
+
+#include "SinkWindow.hh"
+#include "SourceWindow.hh"
+#include "ClientWindow.hh"
+#include "ModuleWindow.hh"
+#include "MainWindow.hh"
+
+class SinkInfo {
+public:
+
+ SinkInfo(const struct pa_sink_info &i);
+ ~SinkInfo();
+
+ void update(const struct pa_sink_info &i);
+ void showWindow();
+
+ Glib::ustring name, description;
+ uint32_t index;
+ struct pa_sample_spec sample_spec;
+ uint32_t monitor_source;
+ uint32_t owner_module;
+ uint32_t volume;
+ uint32_t latency;
+
+ Gtk::TreeRowReference treeRef;
+
+ SinkWindow *window;
+};
+
+class SourceInfo {
+public:
+ SourceInfo(const struct pa_source_info &i);
+ ~SourceInfo();
+
+ void update(const struct pa_source_info &i);
+ void showWindow();
+
+ Glib::ustring name, description;
+ uint32_t index;
+ struct pa_sample_spec sample_spec;
+ uint32_t owner_module;
+ uint32_t monitor_of_sink;
+
+ Gtk::TreeRowReference treeRef;
+ SourceWindow *window;
+};
+
+class ModuleInfo {
+public:
+ ModuleInfo(const struct pa_module_info &i);
+ ~ModuleInfo();
+
+ void update(const struct pa_module_info &i);
+ void showWindow();
+
+ uint32_t index;
+ Glib::ustring name, argument;
+ bool autoloaded;
+ uint32_t used;
+
+ Gtk::TreeRowReference treeRef;
+ ModuleWindow *window;
+};
+
+class ClientInfo {
+public:
+ ClientInfo(const struct pa_client_info &i);
+ ~ClientInfo();
+
+ void update(const struct pa_client_info &i);
+ void showWindow();
+
+ uint32_t index;
+ Glib::ustring name, protocol_name;
+ uint32_t owner_module;
+
+ Gtk::TreeRowReference treeRef;
+ ClientWindow *window;
+};
+
+class ServerInfoManager {
+public:
+ ServerInfoManager(struct pa_context &c);
+ ~ServerInfoManager();
+
+ void updateInfo(const struct pa_sink_info &i);
+ void updateInfo(const struct pa_source_info &i);
+ void updateInfo(const struct pa_client_info &i);
+ void updateInfo(const struct pa_module_info &i);
+
+ void showSinkWindow(uint32_t index);
+ void showSourceWindow(uint32_t index);
+ void showClientWindow(uint32_t index);
+ void showModuleWindow(uint32_t index);
+
+ SourceInfo* getSourceInfo(uint32_t index);
+ SinkInfo* getSinkInfo(uint32_t index);
+ ClientInfo* getClientInfo(uint32_t index);
+ ModuleInfo* getModuleInfo(uint32_t index);
+
+ void removeSinkInfo(uint32_t index);
+ void removeSourceInfo(uint32_t index);
+ void removeClientInfo(uint32_t index);
+ void removeModuleInfo(uint32_t index);
+
+ void setSinkVolume(uint32_t index, uint32_t volume);
+
+protected:
+ std::map<int, SinkInfo*> sinks;
+ std::map<int, SourceInfo*> sources;
+ std::map<int, ClientInfo*> clients;
+ std::map<int, ModuleInfo*> modules;
+
+ struct pa_context &context;
+};
+
+#endif
diff --git a/src/SinkWindow.cc b/src/SinkWindow.cc
new file mode 100644
index 0000000..68d3ec4
--- /dev/null
+++ b/src/SinkWindow.cc
@@ -0,0 +1,111 @@
+#include <iostream>
+
+#include "paman.hh"
+#include "SinkWindow.hh"
+
+#define GLADE_NAME "sinkWindow"
+
+SinkWindow::SinkWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& refGlade) :
+ Gtk::Window(cobject),
+ nameLabel(NULL),
+ descriptionLabel(NULL),
+ indexLabel(NULL),
+ sampleTypeLabel(NULL),
+ latencyLabel(NULL),
+ ownerModuleLabel(NULL),
+ monitorSourceLabel(NULL),
+ volumeLabel(NULL),
+ closeButton(NULL),
+ toMonitorSourceButton(NULL),
+ toOwnerModuleButton(NULL),
+ volumeResetButton(NULL),
+ volumeMuteButton(NULL),
+ volumeScale(NULL) {
+
+ refGlade->get_widget("nameLabel", nameLabel);
+ refGlade->get_widget("descriptionLabel", descriptionLabel);
+ refGlade->get_widget("indexLabel", indexLabel);
+ refGlade->get_widget("sampleTypeLabel", sampleTypeLabel);
+ refGlade->get_widget("latencyLabel", latencyLabel);
+ refGlade->get_widget("ownerModuleLabel", ownerModuleLabel);
+ refGlade->get_widget("monitorSourceLabel", monitorSourceLabel);
+ refGlade->get_widget("closeButton", closeButton);
+ refGlade->get_widget("toMonitorSourceButton", toMonitorSourceButton);
+ refGlade->get_widget("toOwnerModuleButton", toOwnerModuleButton);
+ refGlade->get_widget("volumeLabel", volumeLabel);
+ refGlade->get_widget("volumeScale", volumeScale);
+ refGlade->get_widget("volumeResetButton", volumeResetButton);
+ refGlade->get_widget("volumeMuteButton", volumeMuteButton);
+
+ closeButton->signal_clicked().connect(sigc::mem_fun(*this, &SinkWindow::onCloseButton));
+ toMonitorSourceButton->signal_clicked().connect(sigc::mem_fun(*this, &SinkWindow::onToMonitorSourceButton));
+ toOwnerModuleButton->signal_clicked().connect(sigc::mem_fun(*this, &SinkWindow::onToOwnerModuleButton));
+ volumeScale->signal_value_changed().connect(sigc::mem_fun(*this, &SinkWindow::onVolumeScaleValueChanged));
+ volumeResetButton->signal_clicked().connect(sigc::mem_fun(*this, &SinkWindow::onVolumeResetButton));
+ volumeMuteButton->signal_clicked().connect(sigc::mem_fun(*this, &SinkWindow::onVolumeMuteButton));
+}
+
+SinkWindow* SinkWindow::create() {
+ SinkWindow *w = NULL;
+ Glib::RefPtr<Gnome::Glade::Xml> refXml = Gnome::Glade::Xml::create(GLADE_FILE, GLADE_NAME);
+ refXml->get_widget_derived(GLADE_NAME, w);
+ return w;
+}
+
+void SinkWindow::updateInfo(const SinkInfo &i) {
+ char t[20], ss[PA_SAMPLE_SNPRINT_MAX_LENGTH];
+
+ nameLabel->set_text(i.name);
+ descriptionLabel->set_text(i.description);
+ snprintf(t, sizeof(t), "#%u", i.index);
+ indexLabel->set_text(t);
+ pa_sample_snprint(ss, sizeof(ss), &i.sample_spec);
+ sampleTypeLabel->set_text(ss);
+ snprintf(t, sizeof(t), "#%u", i.owner_module);
+ ownerModuleLabel->set_text(t);
+
+ snprintf(t, sizeof(t), "%u usec", i.latency);
+ latencyLabel->set_text(t);
+
+ SourceInfo *source = serverInfoManager->getSourceInfo(i.monitor_source);
+ monitorSourceLabel->set_text(source->name);
+
+ volumeScale->set_value(((double) i.volume / 0x100) * 100);
+ snprintf(t, sizeof(t), "%u%%", (i.volume*100)/0x100);
+ volumeLabel->set_text(t);
+
+ set_title("Sink: "+i.name);
+
+ monitor_source = i.monitor_source;
+ owner_module = i.owner_module;
+ index = i.index;
+
+ toOwnerModuleButton->set_sensitive(owner_module != (uint32_t) -1);
+}
+
+void SinkWindow::onCloseButton() {
+ hide();
+}
+
+void SinkWindow::onToMonitorSourceButton() {
+ serverInfoManager->showSourceWindow(monitor_source);
+}
+
+void SinkWindow::onToOwnerModuleButton() {
+ if (owner_module != (uint32_t) -1)
+ serverInfoManager->showModuleWindow(owner_module);
+}
+
+void SinkWindow::onVolumeScaleValueChanged() {
+ serverInfoManager->setSinkVolume(index, (uint32_t) ((volumeScale->get_value()*0x100)/100));
+}
+
+void SinkWindow::onVolumeResetButton() {
+ serverInfoManager->setSinkVolume(index, PA_VOLUME_NORM);
+}
+
+void SinkWindow::onVolumeMuteButton() {
+ serverInfoManager->setSinkVolume(index, PA_VOLUME_MUTE);
+}
+
+
diff --git a/src/SinkWindow.hh b/src/SinkWindow.hh
new file mode 100644
index 0000000..32557c4
--- /dev/null
+++ b/src/SinkWindow.hh
@@ -0,0 +1,45 @@
+#ifndef foosinkwindowhhfoo
+#define foosinkwindowhhfoo
+
+#include <gtkmm.h>
+#include <libglademm.h>
+
+class SinkWindow;
+
+#include "ServerInfo.hh"
+
+class SinkWindow : public Gtk::Window {
+public:
+ SinkWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& refGlade);
+ static SinkWindow* create();
+
+ Gtk::Label *nameLabel,
+ *descriptionLabel,
+ *indexLabel,
+ *sampleTypeLabel,
+ *latencyLabel,
+ *ownerModuleLabel,
+ *monitorSourceLabel,
+ *volumeLabel;
+
+ Gtk::Button *closeButton,
+ *toMonitorSourceButton,
+ *toOwnerModuleButton,
+ *volumeResetButton,
+ *volumeMuteButton;
+
+ Gtk::HScale *volumeScale;
+
+ uint32_t index, owner_module, monitor_source;
+
+ void updateInfo(const SinkInfo &i);
+
+ virtual void onCloseButton();
+ virtual void onToMonitorSourceButton();
+ virtual void onToOwnerModuleButton();
+ virtual void onVolumeScaleValueChanged();
+ virtual void onVolumeResetButton();
+ virtual void onVolumeMuteButton();
+};
+
+#endif
diff --git a/src/SourceWindow.cc b/src/SourceWindow.cc
new file mode 100644
index 0000000..b5119d9
--- /dev/null
+++ b/src/SourceWindow.cc
@@ -0,0 +1,82 @@
+#include "paman.hh"
+#include "SourceWindow.hh"
+
+#define GLADE_NAME "sourceWindow"
+
+SourceWindow::SourceWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& refGlade) :
+ Gtk::Window(cobject),
+ nameLabel(NULL),
+ descriptionLabel(NULL),
+ indexLabel(NULL),
+ sampleTypeLabel(NULL),
+ ownerModuleLabel(NULL),
+ monitorOfSinkLabel(NULL),
+ closeButton(NULL),
+ toParentSinkButton(NULL),
+ toOwnerModuleButton(NULL) {
+
+ refGlade->get_widget("nameLabel", nameLabel);
+ refGlade->get_widget("descriptionLabel", descriptionLabel);
+ refGlade->get_widget("indexLabel", indexLabel);
+ refGlade->get_widget("sampleTypeLabel", sampleTypeLabel);
+ refGlade->get_widget("ownerModuleLabel", ownerModuleLabel);
+ refGlade->get_widget("monitorOfSinkLabel", monitorOfSinkLabel);
+ refGlade->get_widget("closeButton", closeButton);
+ refGlade->get_widget("toParentSinkButton", toParentSinkButton);
+ refGlade->get_widget("toOwnerModuleButton", toOwnerModuleButton);
+
+ closeButton->signal_clicked().connect(sigc::mem_fun(*this, &SourceWindow::onCloseButton));
+ toParentSinkButton->signal_clicked().connect(sigc::mem_fun(*this, &SourceWindow::onParentSinkButton));
+ toOwnerModuleButton->signal_clicked().connect(sigc::mem_fun(*this, &SourceWindow::onToOwnerModuleButton));
+}
+
+SourceWindow* SourceWindow::create() {
+ SourceWindow *w = NULL;
+ Glib::RefPtr<Gnome::Glade::Xml> refXml = Gnome::Glade::Xml::create(GLADE_FILE, GLADE_NAME);
+ refXml->get_widget_derived(GLADE_NAME, w);
+ return w;
+}
+
+void SourceWindow::updateInfo(const SourceInfo &i) {
+ char t[20], ss[PA_SAMPLE_SNPRINT_MAX_LENGTH];
+
+ nameLabel->set_text(i.name);
+ descriptionLabel->set_text(i.description);
+ snprintf(t, sizeof(t), "#%u", i.index);
+ indexLabel->set_text(t);
+ pa_sample_snprint(ss, sizeof(ss), &i.sample_spec);
+ sampleTypeLabel->set_text(ss);
+ snprintf(t, sizeof(t), "#%u", i.owner_module);
+ ownerModuleLabel->set_text(t);
+
+ monitorOfSinkLabel->set_markup("<i>n/a</i>");
+ toParentSinkButton->set_sensitive(false);
+ if (i.monitor_of_sink != (uint32_t) -1) {
+ SinkInfo *sink = serverInfoManager->getSinkInfo(i.monitor_of_sink);
+ if (sink) {
+ monitorOfSinkLabel->set_text(sink->name);
+ toParentSinkButton->set_sensitive(true);
+ }
+ }
+
+ monitor_of_sink = i.monitor_of_sink;
+
+ set_title("Source: "+i.name);
+
+ owner_module = i.owner_module;
+ toOwnerModuleButton->set_sensitive(owner_module != (uint32_t) -1);
+}
+
+void SourceWindow::onCloseButton() {
+ hide();
+}
+
+void SourceWindow::onParentSinkButton() {
+ if (monitor_of_sink != (uint32_t) -1)
+ serverInfoManager->showSinkWindow(monitor_of_sink);
+}
+
+void SourceWindow::onToOwnerModuleButton() {
+ if (owner_module != (uint32_t) -1)
+ serverInfoManager->showModuleWindow(owner_module);
+}
diff --git a/src/SourceWindow.hh b/src/SourceWindow.hh
new file mode 100644
index 0000000..964d64f
--- /dev/null
+++ b/src/SourceWindow.hh
@@ -0,0 +1,32 @@
+#ifndef foosourcewindowhhfoo
+#define foosourcewindowhhfoo
+
+#include <gtkmm.h>
+#include <libglademm.h>
+
+class SourceWindow : public Gtk::Window {
+public:
+ SourceWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& refGlade);
+ static SourceWindow* create();
+
+ Gtk::Label *nameLabel,
+ *descriptionLabel,
+ *indexLabel,
+ *sampleTypeLabel,
+ *ownerModuleLabel,
+ *monitorOfSinkLabel;
+
+ Gtk::Button *closeButton,
+ *toParentSinkButton,
+ *toOwnerModuleButton;
+
+ uint32_t monitor_of_sink, owner_module;
+
+ void updateInfo(const SourceInfo &i);
+
+ virtual void onCloseButton();
+ virtual void onParentSinkButton();
+ virtual void onToOwnerModuleButton();
+};
+
+#endif
diff --git a/src/paman.cc b/src/paman.cc
new file mode 100644
index 0000000..0c1741d
--- /dev/null
+++ b/src/paman.cc
@@ -0,0 +1,117 @@
+#include <signal.h>
+
+#include <gtkmm.h>
+#include <libglademm.h>
+
+#include <polyp/polyplib.h>
+#include <polyp/glib-mainloop.h>
+#include <polyp/polyplib-error.h>
+
+#include "paman.hh"
+#include "SinkWindow.hh"
+#include "MainWindow.hh"
+
+MainWindow *mainWindow = NULL;
+ServerInfoManager *serverInfoManager = NULL;
+struct pa_context *context = NULL;
+struct pa_mainloop_api *mainloop_api = NULL;
+
+static void context_state_callback(struct pa_context *c, void *userdata) {
+ g_assert(c && mainWindow);
+
+ switch (pa_context_get_state(c)) {
+ case PA_CONTEXT_CONNECTING:
+ mainWindow->showSuccess("Connecting ...");
+ mainWindow->connectButton->set_sensitive(false);
+ return;
+
+ case PA_CONTEXT_AUTHORIZING:
+ mainWindow->showSuccess("Authorizing ...");
+ return;
+
+ case PA_CONTEXT_SETTING_NAME:
+ mainWindow->showSuccess("Setting name ...");
+ return;
+
+ case PA_CONTEXT_READY:
+ mainWindow->showSuccess("Ready");
+ g_assert(!serverInfoManager);
+ serverInfoManager = new ServerInfoManager(*c);
+ return;
+
+ case PA_CONTEXT_TERMINATED:
+ mainWindow->showSuccess("Disconnected");
+ break;
+
+ case PA_CONTEXT_FAILED:
+ default:
+ mainWindow->showFailure(pa_strerror(pa_context_errno(c)));
+ break;
+
+ }
+
+ if (context) {
+ pa_context_unref(context);
+ context = NULL;
+ }
+
+ if (serverInfoManager) {
+ delete serverInfoManager;
+ serverInfoManager = NULL;
+ }
+
+ mainWindow->connectButton->set_sensitive(true);
+ mainWindow->clearAllData();
+}
+
+void create_connection() {
+ if (serverInfoManager) {
+ delete serverInfoManager;
+ serverInfoManager = NULL;
+ }
+
+ if (context) {
+ pa_context_unref(context);
+ context = NULL;
+ }
+
+ context = pa_context_new(mainloop_api, "Polypaudio Manager");
+ g_assert(context);
+ pa_context_set_state_callback(context, context_state_callback, NULL);
+ pa_context_connect(context, NULL);
+}
+
+int main(int argc, char *argv[]) {
+ struct pa_glib_mainloop *m;
+
+ signal(SIGPIPE, SIG_IGN);
+
+ Gtk::Main kit(argc, argv);
+
+ mainWindow = MainWindow::create();
+ g_assert(mainWindow);
+
+ m = pa_glib_mainloop_new(g_main_context_default());
+ g_assert(m);
+ mainloop_api = pa_glib_mainloop_get_api(m);
+ g_assert(mainloop_api);
+
+ create_connection();
+
+ Gtk::Main::run(*mainWindow);
+
+quit:
+ if (serverInfoManager)
+ delete serverInfoManager;
+
+ if (context)
+ pa_context_unref(context);
+
+ mainloop_api = NULL;
+ if (mainWindow)
+ delete mainWindow;
+
+ pa_glib_mainloop_free(m);
+
+ return 0;
+}
diff --git a/src/paman.glade b/src/paman.glade
new file mode 100644
index 0000000..e8915e9
--- /dev/null
+++ b/src/paman.glade
@@ -0,0 +1,2600 @@
+<?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="mainWindow">
+ <property name="border_width">5</property>
+ <property name="visible">True</property>
+ <property name="title" translatable="yes">Polypaudio Manager</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_NONE</property>
+ <property name="modal">False</property>
+ <property name="default_width">500</property>
+ <property name="default_height">400</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_NORMAL</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+
+ <child>
+ <widget class="GtkVBox" id="vbox3">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+
+ <child>
+ <widget class="GtkNotebook" id="notebook1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_tabs">True</property>
+ <property name="show_border">True</property>
+ <property name="tab_pos">GTK_POS_TOP</property>
+ <property name="scrollable">False</property>
+ <property name="enable_popup">False</property>
+
+ <child>
+ <widget class="GtkVBox" id="vbox8">
+ <property name="border_width">5</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+
+ <child>
+ <widget class="GtkAlignment" id="alignment5">
+ <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="GtkTable" id="table3">
+ <property name="border_width">10</property>
+ <property name="visible">True</property>
+ <property name="n_rows">5</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">True</property>
+ <property name="row_spacing">5</property>
+ <property name="column_spacing">10</property>
+
+ <child>
+ <widget class="GtkLabel" id="label43">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Host Name:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label44">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;User Name:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label38">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Server Version:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label37">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Server Name:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">1</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label4711">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Default Sample Type:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="serverNameLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes"></property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">1</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="defaultSampleTypeLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes"></property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="hostNameLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"></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>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="userNameLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"></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>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="serverVersionLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes"></property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </widget>
+ </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="hbuttonbox7">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkButton" id="connectButton">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">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="alignment8">
+ <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="hbox7">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">2</property>
+
+ <child>
+ <widget class="GtkImage" id="image7">
+ <property name="visible">True</property>
+ <property name="stock">gtk-network</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="label4716">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Connect</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>
+ </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="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label34">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Server Information</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>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkVBox" id="vbox4">
+ <property name="border_width">5</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+
+ <child>
+ <widget class="GtkScrolledWindow" id="scrolledwindow2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="shadow_type">GTK_SHADOW_IN</property>
+ <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+ <child>
+ <widget class="GtkTreeView" id="deviceTreeView">
+ <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>
+ </widget>
+ </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="hbuttonbox3">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+ <property name="spacing">5</property>
+
+ <child>
+ <widget class="GtkButton" id="deviceOpenButton">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">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="alignment6">
+ <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="hbox5">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">2</property>
+
+ <child>
+ <widget class="GtkImage" id="image5">
+ <property name="visible">True</property>
+ <property name="stock">gtk-jump-to</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="label4712">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Open</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>
+ </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="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label35">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Devices</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>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkVBox" id="vbox9">
+ <property name="border_width">5</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+
+ <child>
+ <widget class="GtkScrolledWindow" id="scrolledwindow4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="shadow_type">GTK_SHADOW_IN</property>
+ <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+ <child>
+ <widget class="GtkTreeView" id="clientTreeView">
+ <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>
+ </widget>
+ </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="hbuttonbox8">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkButton" id="clientOpenButton">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_default">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="alignment9">
+ <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="hbox8">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">2</property>
+
+ <child>
+ <widget class="GtkImage" id="image8">
+ <property name="visible">True</property>
+ <property name="stock">gtk-jump-to</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="label4718">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Open</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>
+ </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="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label4717">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Clients</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>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkVBox" id="vbox5">
+ <property name="border_width">5</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+
+ <child>
+ <widget class="GtkScrolledWindow" id="scrolledwindow3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="shadow_type">GTK_SHADOW_IN</property>
+ <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+ <child>
+ <widget class="GtkTreeView" id="moduleTreeView">
+ <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>
+ </widget>
+ </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="hbuttonbox4">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+ <property name="spacing">5</property>
+
+ <child>
+ <widget class="GtkButton" id="moduleOpenButton">
+ <property name="visible">True</property>
+ <property name="can_default">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="alignment7">
+ <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="hbox6">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">2</property>
+
+ <child>
+ <widget class="GtkImage" id="image6">
+ <property name="visible">True</property>
+ <property name="stock">gtk-jump-to</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="label4713">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Open</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>
+ </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="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label36">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Modules</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>
+ </widget>
+ <packing>
+ <property name="type">tab</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="GtkLabel" id="statusLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label36</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>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+</widget>
+
+<widget class="GtkWindow" id="sinkWindow">
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Sink</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">False</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>
+
+ <child>
+ <widget class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+
+ <child>
+ <widget class="GtkNotebook" id="notebook2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_tabs">True</property>
+ <property name="show_border">True</property>
+ <property name="tab_pos">GTK_POS_TOP</property>
+ <property name="scrollable">False</property>
+ <property name="enable_popup">False</property>
+
+ <child>
+ <widget class="GtkVBox" id="vbox6">
+ <property name="border_width">5</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+
+ <child>
+ <widget class="GtkTable" id="table1">
+ <property name="border_width">5</property>
+ <property name="visible">True</property>
+ <property name="n_rows">8</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">5</property>
+ <property name="column_spacing">10</property>
+
+ <child>
+ <widget class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Name:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Description:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Monitor Source:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Owner Module:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Latency:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Sample Type:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Index:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="latencyLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes"></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">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="sampleTypeLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes"></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">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="indexLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes"></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">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="descriptionLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes"></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">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="nameLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes"></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">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label4730">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Volume:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">7</property>
+ <property name="bottom_attach">8</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHBox" id="hbox9">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+
+ <child>
+ <widget class="GtkLabel" id="volumeLabel">
+ <property name="width_request">40</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">100%</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">True</property>
+ <property name="xalign">0</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="GtkHScale" id="volumeScale">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="draw_value">False</property>
+ <property name="value_pos">GTK_POS_LEFT</property>
+ <property name="digits">0</property>
+ <property name="update_policy">GTK_UPDATE_DISCONTINUOUS</property>
+ <property name="inverted">False</property>
+ <property name="adjustment">147.692 0 500 10 100 20</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="volumeResetButton">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Reset to 100%, i.e. normal volume</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Reset</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NONE</property>
+ <property name="focus_on_click">True</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="volumeMuteButton">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Mute to 0%, i.e. turn this sink off</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Mute</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NONE</property>
+ <property name="focus_on_click">True</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">7</property>
+ <property name="bottom_attach">8</property>
+ <property name="y_options">fill</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="monitorSourceLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"></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>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="ownerModuleLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes"></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">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ <property name="y_options"></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="hbuttonbox5">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_START</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkButton" id="toOwnerModuleButton">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">To Owner Module</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="toMonitorSourceButton">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">To Monitor Source</property>
+ <property name="use_underline">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>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label4714">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Basic</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.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="type">tab</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="closeButton">
+ <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">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+</widget>
+
+<widget class="GtkWindow" id="sourceWindow">
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Source</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">False</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>
+
+ <child>
+ <widget class="GtkVBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+
+ <child>
+ <widget class="GtkNotebook" id="notebook3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_tabs">True</property>
+ <property name="show_border">True</property>
+ <property name="tab_pos">GTK_POS_TOP</property>
+ <property name="scrollable">False</property>
+ <property name="enable_popup">False</property>
+
+ <child>
+ <widget class="GtkVBox" id="vbox7">
+ <property name="border_width">5</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+
+ <child>
+ <widget class="GtkTable" id="table2">
+ <property name="border_width">5</property>
+ <property name="visible">True</property>
+ <property name="n_rows">6</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">5</property>
+ <property name="column_spacing">10</property>
+
+ <child>
+ <widget class="GtkLabel" id="label18">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Name:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label19">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Description:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label23">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Sample Type:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label24">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Index:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="ownerModuleLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes"></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">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="sampleTypeLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes"></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">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="indexLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes"></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">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="descriptionLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes"></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">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="nameLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes"></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">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label21">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Owner Module:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label20">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Monitor of Sink:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="monitorOfSinkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes"></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">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></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="hbuttonbox6">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_START</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkButton" id="toOwnerModuleButton">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">To Owner Module</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="toParentSinkButton">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">To Parent Sink</property>
+ <property name="use_underline">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>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label4715">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Basic</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.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="type">tab</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="hbuttonbox2">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkButton" id="closeButton">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="has_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">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+</widget>
+
+<widget class="GtkWindow" id="moduleWindow">
+ <property name="title" translatable="yes">Module</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">False</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>
+
+ <child>
+ <widget class="GtkVBox" id="vbox10">
+ <property name="border_width">5</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+
+ <child>
+ <widget class="GtkNotebook" id="notebook4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_tabs">True</property>
+ <property name="show_border">True</property>
+ <property name="tab_pos">GTK_POS_TOP</property>
+ <property name="scrollable">False</property>
+ <property name="enable_popup">False</property>
+
+ <child>
+ <widget class="GtkTable" id="table4">
+ <property name="border_width">5</property>
+ <property name="visible">True</property>
+ <property name="n_rows">5</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">5</property>
+ <property name="column_spacing">10</property>
+
+ <child>
+ <widget class="GtkLabel" id="label4720">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Name:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label4723">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Autoloaded:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="usageLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label4724</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>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="autoloadedLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label4725</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>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label4726">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Usage Counter:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="indexLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label4727</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>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="argumentLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">foo</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>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="nameLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label4729</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>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label4722">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Argument:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label0815">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Index:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label4719">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Basic</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.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="type">tab</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="hbuttonbox9">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkButton" id="closeButton">
+ <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">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+</widget>
+
+<widget class="GtkWindow" id="clientWindow">
+ <property name="title" translatable="yes">Client</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">False</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>
+
+ <child>
+ <widget class="GtkVBox" id="vbox11">
+ <property name="border_width">5</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+
+ <child>
+ <widget class="GtkNotebook" id="notebook5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_tabs">True</property>
+ <property name="show_border">True</property>
+ <property name="tab_pos">GTK_POS_TOP</property>
+ <property name="scrollable">False</property>
+ <property name="enable_popup">False</property>
+
+ <child>
+ <widget class="GtkVBox" id="vbox12">
+ <property name="border_width">5</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+
+ <child>
+ <widget class="GtkTable" id="table5">
+ <property name="visible">True</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">5</property>
+ <property name="column_spacing">10</property>
+
+ <child>
+ <widget class="GtkLabel" id="label4732">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Name:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label4733">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Owner Module:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="ownerModuleLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label4725</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>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="indexLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label4727</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>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="protocolLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">foo</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>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="nameLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label4729</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>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label4740">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Protocol:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label4741">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Index:&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></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="hbuttonbox11">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_START</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkButton" id="toOwnerModuleButton">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">To Owner Module</property>
+ <property name="use_underline">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">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label4742">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Basic</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.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="type">tab</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="hbuttonbox10">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkButton" id="closeButton">
+ <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">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+</widget>
+
+</glade-interface>
diff --git a/src/paman.gladep b/src/paman.gladep
new file mode 100644
index 0000000..f50f504
--- /dev/null
+++ b/src/paman.gladep
@@ -0,0 +1,12 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd">
+
+<glade-project>
+ <name>Paman</name>
+ <program_name>paman</program_name>
+ <gnome_support>FALSE</gnome_support>
+ <gettext_support>FALSE</gettext_support>
+ <output_main_file>FALSE</output_main_file>
+ <output_support_files>FALSE</output_support_files>
+ <output_build_files>FALSE</output_build_files>
+</glade-project>
diff --git a/src/paman.hh b/src/paman.hh
new file mode 100644
index 0000000..7f2127f
--- /dev/null
+++ b/src/paman.hh
@@ -0,0 +1,15 @@
+#ifndef foopamanhhfoo
+#define foopamanhhfoo
+
+#include "ServerInfo.hh"
+
+#define GLADE_FILE "paman.glade"
+
+extern ServerInfoManager *serverInfoManager;
+extern MainWindow *mainWindow;
+extern struct pa_context *context;
+
+void create_connection();
+
+
+#endif