Add configuration file system
git-svn-id: file:///home/vcs/svn/jsweeper/trunk@2 6611ac79-6612-48ef-a1e9-b906f853523emaster
parent
8b10f1bc33
commit
28ae767a35
|
@ -10,8 +10,12 @@ pkg_check_modules(GTKMM gtkmm-2.4>=2.4)
|
||||||
pkg_check_modules(CAIROMM cairomm-1.0>=1.0)
|
pkg_check_modules(CAIROMM cairomm-1.0>=1.0)
|
||||||
|
|
||||||
SET(SOURCES
|
SET(SOURCES
|
||||||
|
src/config.cpp
|
||||||
|
src/config.h
|
||||||
src/gui.cpp
|
src/gui.cpp
|
||||||
src/gui.h
|
src/gui.h
|
||||||
|
src/inifile.cpp
|
||||||
|
src/inifile.h
|
||||||
src/jack.cpp
|
src/jack.cpp
|
||||||
src/jack.h
|
src/jack.h
|
||||||
src/jsweeper.cpp
|
src/jsweeper.cpp
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
#include <fstream>
|
||||||
|
#include <glibmm.h>
|
||||||
|
#include "glib.h"
|
||||||
|
#include "glib/gstdio.h"
|
||||||
|
#include "config.h"
|
||||||
|
#include "portmanager.h"
|
||||||
|
|
||||||
|
#define PACKAGE_NAME "jsweeper"
|
||||||
|
#define CONFIG_FILENAME "jsweeper.ini"
|
||||||
|
|
||||||
|
void Config::Read()
|
||||||
|
{
|
||||||
|
std::string path = Glib::build_filename(Glib::get_user_config_dir(), PACKAGE_NAME);
|
||||||
|
g_mkdir_with_parents(path.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);
|
||||||
|
m_filename = Glib::build_filename(path, CONFIG_FILENAME);
|
||||||
|
|
||||||
|
ini.LoadFromDisk(m_filename);
|
||||||
|
|
||||||
|
IniGroup *group = ini.GetGroup("gui");
|
||||||
|
CellPadding = group->GetValue("cellpadding", 3);
|
||||||
|
FontSize = group->GetValue("fontsize", 10);
|
||||||
|
FontFace = group->GetValue("fontface", std::string("Sans"));
|
||||||
|
|
||||||
|
ExpandClients = group->GetValue("expandclients", true);
|
||||||
|
ExpandGroups = group->GetValue("expandgroups", false);
|
||||||
|
|
||||||
|
pm.AliasClear();
|
||||||
|
|
||||||
|
group = ini.GetGroup("aliases");
|
||||||
|
IniItemList::iterator it;
|
||||||
|
for (it = group->items.begin(); it != group->items.end(); ++it) {
|
||||||
|
IniItem *item = *it;
|
||||||
|
pm.AliasAdd(item->name, item->value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Config::Write()
|
||||||
|
{
|
||||||
|
IniGroup *group = ini.GetGroup("gui");
|
||||||
|
group->SetValue("cellpadding", CellPadding);
|
||||||
|
group->SetValue("fontsize", FontSize);
|
||||||
|
group->SetValue("fontface", FontFace);
|
||||||
|
|
||||||
|
group->SetValue("expandclients", ExpandClients);
|
||||||
|
group->SetValue("expandgroups", ExpandGroups);
|
||||||
|
|
||||||
|
ini.RemoveGroup("aliases");
|
||||||
|
group = ini.GetGroup("aliases");
|
||||||
|
|
||||||
|
const AliasList &list = pm.AliasGetList();
|
||||||
|
AliasList::const_iterator it;
|
||||||
|
for (it = list.begin(); it != list.end(); ++it) {
|
||||||
|
const Alias &a = *it;
|
||||||
|
group->SetValue(a.name, a.alias);
|
||||||
|
}
|
||||||
|
|
||||||
|
ini.SaveToDisk(m_filename);
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
#include "inifile.h"
|
||||||
|
|
||||||
|
class Config
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
IniFile ini;
|
||||||
|
std::string m_filename;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void Read();
|
||||||
|
void Write();
|
||||||
|
|
||||||
|
int CellPadding;
|
||||||
|
int FontSize;
|
||||||
|
std::string FontFace;
|
||||||
|
|
||||||
|
bool ExpandClients;
|
||||||
|
bool ExpandGroups;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern Config cfg;
|
|
@ -4,12 +4,13 @@
|
||||||
#include "jack.h"
|
#include "jack.h"
|
||||||
#include "portmanager.h"
|
#include "portmanager.h"
|
||||||
#include "gui.h"
|
#include "gui.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
const Rect Rect::None = Rect(0, 0, -1, -1);
|
const Rect Rect::None = Rect(0, 0, -1, -1);
|
||||||
|
|
||||||
Matrix::Matrix() :
|
Matrix::Matrix() :
|
||||||
m_client_width(0), m_client_height(0), m_port_width(0), m_port_height(0), m_separation(0), m_padding(3),
|
m_client_width(0), m_client_height(0), m_port_width(0), m_port_height(0), m_separation(0), m_padding(cfg.CellPadding),
|
||||||
m_font_size(10), m_typeface("Liberation Sans Bold")
|
m_font_size(cfg.FontSize), m_typeface(cfg.FontFace)
|
||||||
{
|
{
|
||||||
set_size_request(0, 0);
|
set_size_request(0, 0);
|
||||||
show();
|
show();
|
||||||
|
|
|
@ -0,0 +1,181 @@
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <fstream>
|
||||||
|
#include "inifile.h"
|
||||||
|
|
||||||
|
// trim from start
|
||||||
|
static inline std::string <rim(std::string &s)
|
||||||
|
{
|
||||||
|
s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun<int, int>(std::isspace))));
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// trim from end
|
||||||
|
static inline std::string &rtrim(std::string &s)
|
||||||
|
{
|
||||||
|
s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun<int, int>(std::isspace))).base(), s.end());
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// trim from both ends
|
||||||
|
static inline std::string &trim(std::string &s)
|
||||||
|
{
|
||||||
|
return ltrim(rtrim(s));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
IniItem::IniItem(std::string _name)
|
||||||
|
{
|
||||||
|
name = _name;
|
||||||
|
value = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
IniItem::IniItem(std::string _name, std::string _value)
|
||||||
|
{
|
||||||
|
name = _name;
|
||||||
|
value = _value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IniItem::SetValue(std::string _value)
|
||||||
|
{
|
||||||
|
value = _value;
|
||||||
|
}
|
||||||
|
|
||||||
|
IniGroup::IniGroup(std::string _name)
|
||||||
|
{
|
||||||
|
name = _name;
|
||||||
|
}
|
||||||
|
|
||||||
|
IniGroup::~IniGroup()
|
||||||
|
{
|
||||||
|
IniItemList::iterator it;
|
||||||
|
for (it = items.begin(); it != items.end(); ++it) {
|
||||||
|
IniItem *item = *it;
|
||||||
|
delete item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IniItem *IniGroup::GetItem(std::string name)
|
||||||
|
{
|
||||||
|
IniItemList::iterator it;
|
||||||
|
for (it = items.begin(); it != items.end(); ++it) {
|
||||||
|
IniItem *item = *it;
|
||||||
|
if (item->name == name) return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
items.push_back(new IniItem(name));
|
||||||
|
return items.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
IniItem *IniGroup::GetItem(std::string name, std::string default_value)
|
||||||
|
{
|
||||||
|
IniItemList::iterator it;
|
||||||
|
for (it = items.begin(); it != items.end(); ++it) {
|
||||||
|
IniItem *item = *it;
|
||||||
|
if (item->name == name) return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
items.push_back(new IniItem(name, default_value));
|
||||||
|
return items.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
IniFile::~IniFile()
|
||||||
|
{
|
||||||
|
IniGroupList::iterator it;
|
||||||
|
for (it = groups.begin(); it != groups.end(); ++it) {
|
||||||
|
IniGroup *group = *it;
|
||||||
|
delete group;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IniGroup *IniFile::GetGroup(std::string name)
|
||||||
|
{
|
||||||
|
IniGroupList::iterator it;
|
||||||
|
for (it = groups.begin(); it != groups.end(); ++it) {
|
||||||
|
IniGroup *group = *it;
|
||||||
|
if (group->name == name) return group;
|
||||||
|
}
|
||||||
|
|
||||||
|
groups.push_back(new IniGroup(name));
|
||||||
|
return groups.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
void IniFile::RemoveGroup(std::string name)
|
||||||
|
{
|
||||||
|
IniGroupList::iterator it;
|
||||||
|
for (it = groups.begin(); it != groups.end();) {
|
||||||
|
IniGroup *group = *it;
|
||||||
|
if (group->name == name) {
|
||||||
|
delete group;
|
||||||
|
it = groups.erase(it);
|
||||||
|
} else {
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IniFile::LoadFromDisk(std::string filename)
|
||||||
|
{
|
||||||
|
// Clear all information first...
|
||||||
|
IniGroupList::iterator it;
|
||||||
|
for (it = groups.begin(); it != groups.end(); ++it) {
|
||||||
|
IniGroup *group = *it;
|
||||||
|
delete group;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ifstream file;
|
||||||
|
file.open(filename.c_str());
|
||||||
|
|
||||||
|
IniGroup *group = NULL;
|
||||||
|
while (file.good()) {
|
||||||
|
char tmp[1024];
|
||||||
|
file.getline(tmp, sizeof tmp);
|
||||||
|
std::string line = tmp;
|
||||||
|
|
||||||
|
// Blank line
|
||||||
|
if (line.length() == 0) continue;
|
||||||
|
// Comment
|
||||||
|
if (line[0] == '#' || line[0] == ';') continue;
|
||||||
|
// Group header
|
||||||
|
if (line[0] == '[' && line[line.length() - 1] == ']') {
|
||||||
|
group = GetGroup(line.substr(1, line.length() - 2));
|
||||||
|
} else {
|
||||||
|
if (group == NULL) continue;
|
||||||
|
|
||||||
|
size_t loc = line.find('=');
|
||||||
|
if (loc != std::string::npos) {
|
||||||
|
std::string name = line.substr(0, loc);
|
||||||
|
std::string value = line.substr(loc + 1);
|
||||||
|
group->SetValue(trim(name), trim(value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void IniFile::SaveToDisk(std::string filename)
|
||||||
|
{
|
||||||
|
std::ofstream file;
|
||||||
|
file.open(filename.c_str());
|
||||||
|
|
||||||
|
IniGroupList::iterator it;
|
||||||
|
for (it = groups.begin(); it != groups.end(); ++it) {
|
||||||
|
IniGroup *group = *it;
|
||||||
|
|
||||||
|
file << std::endl;
|
||||||
|
file << "[" << group->name << "]" << std::endl;
|
||||||
|
|
||||||
|
IniItemList::iterator it2;
|
||||||
|
for (it2 = group->items.begin(); it2 != group->items.end(); ++it2) {
|
||||||
|
IniItem *item = *it2;
|
||||||
|
|
||||||
|
file << item->name << " = " << item->value << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
file << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
}
|
|
@ -0,0 +1,92 @@
|
||||||
|
#ifndef INIFILE_H
|
||||||
|
#define INIFILE_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <sstream>
|
||||||
|
#include <list>
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
std::string ss_conv_from(T value)
|
||||||
|
{
|
||||||
|
std::ostringstream temp_ss;
|
||||||
|
temp_ss << value;
|
||||||
|
return temp_ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
T ss_conv_to(std::string value)
|
||||||
|
{
|
||||||
|
std::istringstream temp_ss(value);
|
||||||
|
T tmp;
|
||||||
|
temp_ss >> tmp;
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct IniItem
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
std::string value;
|
||||||
|
|
||||||
|
IniItem(std::string name);
|
||||||
|
IniItem(std::string name, std::string value);
|
||||||
|
|
||||||
|
void SetValue(std::string value);
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::list<IniItem *> IniItemList;
|
||||||
|
|
||||||
|
struct IniGroup
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
IniItemList items;
|
||||||
|
|
||||||
|
IniGroup(std::string name);
|
||||||
|
~IniGroup();
|
||||||
|
|
||||||
|
IniItem *GetItem(std::string name);
|
||||||
|
IniItem *GetItem(std::string name, std::string default_value);
|
||||||
|
|
||||||
|
std::string GetValue(std::string name, std::string default_value)
|
||||||
|
{
|
||||||
|
IniItem *item = GetItem(name, default_value);
|
||||||
|
return item->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetValue(std::string name, std::string value)
|
||||||
|
{
|
||||||
|
IniItem *item = GetItem(name);
|
||||||
|
item->value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
T GetValue(std::string name, T default_value)
|
||||||
|
{
|
||||||
|
std::string value = ss_conv_from(default_value);
|
||||||
|
IniItem *item = GetItem(name, value);
|
||||||
|
return ss_conv_to<T>(item->value);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void SetValue(std::string name, T value)
|
||||||
|
{
|
||||||
|
IniItem *item = GetItem(name);
|
||||||
|
item->value = ss_conv_from(value);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::list<IniGroup *> IniGroupList;
|
||||||
|
|
||||||
|
struct IniFile
|
||||||
|
{
|
||||||
|
IniGroupList groups;
|
||||||
|
|
||||||
|
~IniFile();
|
||||||
|
|
||||||
|
IniGroup *GetGroup(std::string name);
|
||||||
|
void RemoveGroup(std::string name);
|
||||||
|
|
||||||
|
void LoadFromDisk(std::string filename);
|
||||||
|
void SaveToDisk(std::string filename);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // INIFILE_H
|
|
@ -1,22 +1,28 @@
|
||||||
#include "jack.h"
|
#include "jack.h"
|
||||||
#include "portmanager.h"
|
#include "portmanager.h"
|
||||||
#include "gui.h"
|
#include "gui.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
PortManager pm;
|
PortManager pm;
|
||||||
JackDriver jack;
|
JackDriver jack;
|
||||||
|
Config cfg;
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
Gtk::Main kit(argc, argv);
|
Gtk::Main kit(argc, argv);
|
||||||
|
|
||||||
pm.AliasLoad("hurr.jsa");
|
cfg.Read();
|
||||||
|
|
||||||
|
// pm.AliasLoad("hurr.jsa");
|
||||||
|
|
||||||
jack.Connect();
|
jack.Connect();
|
||||||
|
|
||||||
Gui *g = new Gui();
|
Gui *g = new Gui();
|
||||||
kit.run(*g);
|
kit.run(*g);
|
||||||
|
|
||||||
delete g;
|
delete g;
|
||||||
|
|
||||||
|
jack.Disconnect();
|
||||||
|
|
||||||
|
cfg.Write();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include "jack.h"
|
#include "jack.h"
|
||||||
#include "portmanager.h"
|
#include "portmanager.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
void PortManager::Add(jack_port_t *port)
|
void PortManager::Add(jack_port_t *port)
|
||||||
{
|
{
|
||||||
|
@ -150,7 +151,7 @@ Client *PortManager::FindOrMakeClient(std::string name, bool is_input, bool is_m
|
||||||
c->m_name = name;
|
c->m_name = name;
|
||||||
c->m_is_input = is_input;
|
c->m_is_input = is_input;
|
||||||
c->m_is_midi = is_midi;
|
c->m_is_midi = is_midi;
|
||||||
c->m_expanded = true;
|
c->m_expanded = cfg.ExpandClients;
|
||||||
|
|
||||||
m_clients.push_back(c);
|
m_clients.push_back(c);
|
||||||
|
|
||||||
|
@ -168,7 +169,7 @@ PortGroup *PortManager::FindOrMakeGroup(Client *client, JackPortFlags flags, std
|
||||||
PortGroup *pg = new PortGroup();
|
PortGroup *pg = new PortGroup();
|
||||||
pg->m_name = name;
|
pg->m_name = name;
|
||||||
pg->m_flags = flags;
|
pg->m_flags = flags;
|
||||||
pg->m_expanded = false;
|
pg->m_expanded = cfg.ExpandGroups;
|
||||||
|
|
||||||
client->m_groups.push_back(pg);
|
client->m_groups.push_back(pg);
|
||||||
|
|
||||||
|
@ -306,6 +307,20 @@ void PortManager::AliasBay(jack_port_t *port, int num_aliases, char *aliases[2])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PortManager::AliasClear()
|
||||||
|
{
|
||||||
|
m_aliases.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PortManager::AliasAdd(std::string source, std::string target)
|
||||||
|
{
|
||||||
|
Alias a;
|
||||||
|
a.name = source;
|
||||||
|
a.alias = target;
|
||||||
|
m_aliases.push_back(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
void PortManager::AliasLoad(std::string filename)
|
void PortManager::AliasLoad(std::string filename)
|
||||||
{
|
{
|
||||||
std::ifstream file;
|
std::ifstream file;
|
||||||
|
@ -321,3 +336,4 @@ void PortManager::AliasLoad(std::string filename)
|
||||||
m_aliases.push_back(a);
|
m_aliases.push_back(a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
|
@ -38,7 +38,10 @@ public:
|
||||||
void ToggleConnect(PortGroup *a, PortGroup *b);
|
void ToggleConnect(PortGroup *a, PortGroup *b);
|
||||||
|
|
||||||
void AliasBay(jack_port_t *port, int num_aliases, char *aliases[2]);
|
void AliasBay(jack_port_t *port, int num_aliases, char *aliases[2]);
|
||||||
void AliasLoad(std::string filename);
|
void AliasClear();
|
||||||
|
void AliasAdd(std::string source, std::string target);
|
||||||
|
|
||||||
|
const AliasList &AliasGetList() const { return m_aliases; }
|
||||||
};
|
};
|
||||||
|
|
||||||
extern PortManager pm;
|
extern PortManager pm;
|
||||||
|
|
Loading…
Reference in New Issue