Skip to content

Commit d88de59

Browse files
committed
Add Settings class
1 parent ec5f25c commit d88de59

File tree

6 files changed

+176
-30
lines changed

6 files changed

+176
-30
lines changed

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ set(PROJECT_SOURCES
4141
src/layoutmodel.h
4242
src/environment.cpp
4343
src/environment.h
44+
src/settings.cpp
45+
src/settings.h
4446
src/theme.c
4547
src/theme.h
4648
src/xml.c

src/main.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,16 @@
22

33
#include <QApplication>
44
#include <QLibraryInfo>
5+
#include <QMessageBox>
56
#include <QTranslator>
67
#include <QFileInfo>
78

9+
#include "settings.h"
10+
11+
extern "C" {
12+
#include "xml.h"
13+
}
14+
815
static void initLocale(QTranslator *qtTranslator, QTranslator *translator)
916
{
1017
QApplication *app = qApp;
@@ -37,6 +44,30 @@ static void initLocale(QTranslator *qtTranslator, QTranslator *translator)
3744
app->installTranslator(translator);
3845
}
3946

47+
void initConfig(std::string &config_file)
48+
{
49+
bool success = xml_init(config_file.data());
50+
51+
if (!success) {
52+
QMessageBox msgBox;
53+
msgBox.setText(QObject::tr("Error loading ") + QString(config_file.data()));
54+
msgBox.setInformativeText(
55+
QObject::tr("Run labwc-tweaks from a terminal to view error messages"));
56+
msgBox.exec();
57+
exit(EXIT_FAILURE);
58+
}
59+
60+
/* Ensure all relevant nodes exist before we start getting/setting */
61+
xpath_add_node("/labwc_config/theme/cornerRadius");
62+
xpath_add_node("/labwc_config/theme/name");
63+
xpath_add_node("/labwc_config/theme/dropShadows");
64+
xpath_add_node("/labwc_config/theme/icon");
65+
xpath_add_node("/labwc_config/placement/policy");
66+
xpath_add_node("/labwc_config/libinput/device/naturalScroll");
67+
68+
xml_save();
69+
}
70+
4071
int main(int argc, char *argv[])
4172
{
4273
QApplication app(argc, argv);
@@ -45,6 +76,16 @@ int main(int argc, char *argv[])
4576
QTranslator qtTranslator, translator;
4677
initLocale(&qtTranslator, &translator);
4778

79+
std::string config_dir =
80+
std::getenv("LABWC_CONFIG_DIR") ?: std::getenv("HOME") + std::string("/.config/labwc");
81+
std::string config_file = config_dir + "/rc.xml";
82+
initConfig(config_file);
83+
84+
// The 'settings' vector contains the master state of all settings that can
85+
// be changed by labwc-tweaks.
86+
std::vector<std::shared_ptr<Setting>> settings;
87+
initSettings(settings);
88+
4889
MainDialog w;
4990
w.show();
5091

src/maindialog.cpp

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#include <QDebug>
22
#include <QDir>
3-
#include <QMessageBox>
43
#include <QFile>
54
#include <QString>
65
#include <QStandardPaths>
@@ -27,11 +26,6 @@ MainDialog::MainDialog(QWidget *parent) : QDialog(parent), ui(new Ui::MainDialog
2726
m_model = new LayoutModel(this);
2827
ui->layoutView->setModel(m_model);
2928

30-
std::string config_dir =
31-
std::getenv("LABWC_CONFIG_DIR") ?: std::getenv("HOME") + std::string("/.config/labwc");
32-
std::string config_file = config_dir + "/rc.xml";
33-
initConfig(config_file);
34-
3529
QObject::connect(ui->buttonBox, &QDialogButtonBox::clicked, [&](QAbstractButton *button) {
3630
if (ui->buttonBox->standardButton(button) == QDialogButtonBox::Apply) {
3731
onApply();
@@ -153,29 +147,6 @@ void MainDialog::activate()
153147
}
154148
}
155149

156-
void MainDialog::initConfig(std::string &config_file)
157-
{
158-
bool success = xml_init(config_file.data());
159-
160-
if (!success) {
161-
QMessageBox msgBox;
162-
msgBox.setText(tr("Error loading ") + QString(config_file.data()));
163-
msgBox.setInformativeText(tr("Run labwc-tweaks from a terminal to view error messages"));
164-
msgBox.exec();
165-
exit(EXIT_FAILURE);
166-
}
167-
168-
/* Ensure all relevant nodes exist before we start getting/setting */
169-
xpath_add_node("/labwc_config/theme/cornerRadius");
170-
xpath_add_node("/labwc_config/theme/name");
171-
xpath_add_node("/labwc_config/theme/dropShadows");
172-
xpath_add_node("/labwc_config/theme/name");
173-
xpath_add_node("/labwc_config/placement/policy");
174-
xpath_add_node("/labwc_config/libinput/device/naturalScroll");
175-
176-
xml_save();
177-
}
178-
179150
void MainDialog::onApply()
180151
{
181152
/* ~/.config/labwc/rc.xml */

src/maindialog.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ private slots:
2626
private:
2727
LayoutModel *m_model;
2828

29-
void initConfig(std::string &config_file);
3029
void onApply();
3130

3231
Ui::MainDialog *ui;

src/settings.cpp

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#include <QDebug>
2+
#include <variant>
3+
#include "settings.h"
4+
5+
extern "C" {
6+
#include "xml.h"
7+
}
8+
9+
void initSettings(std::vector<std::shared_ptr<Setting>> &settings)
10+
{
11+
// Appearance
12+
settings.push_back(std::make_shared<Setting>("/labwc_config/theme/name", LAB_FILE_TYPE_RCXML,
13+
LAB_VALUE_TYPE_STRING, ""));
14+
settings.push_back(std::make_shared<Setting>("/labwc_config/theme/cornerRadius",
15+
LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_INT, 8));
16+
settings.push_back(std::make_shared<Setting>("/labwc_config/theme/dropShadows",
17+
LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_BOOL, 1));
18+
settings.push_back(std::make_shared<Setting>("/labwc_config/theme/icon", LAB_FILE_TYPE_RCXML,
19+
LAB_VALUE_TYPE_STRING, ""));
20+
21+
// Behaviour
22+
settings.push_back(std::make_shared<Setting>("/labwc_config/placement/policy",
23+
LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_STRING,
24+
"Cascade"));
25+
26+
// Mouse & Touchpad
27+
settings.push_back(std::make_shared<Setting>("XCURSOR_THEME", LAB_FILE_TYPE_ENVIRONMENT,
28+
LAB_VALUE_TYPE_STRING, "Adwaita"));
29+
settings.push_back(std::make_shared<Setting>("XCURSOR_SIZE", LAB_FILE_TYPE_ENVIRONMENT,
30+
LAB_VALUE_TYPE_INT, 24));
31+
settings.push_back(std::make_shared<Setting>("/labwc_config/libinput/device/naturalScroll",
32+
LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_BOOL, 0));
33+
34+
// Language
35+
settings.push_back(std::make_shared<Setting>("XKB_DEFAULT_LAYOUT", LAB_FILE_TYPE_ENVIRONMENT,
36+
LAB_VALUE_TYPE_STRING, "us"));
37+
}
38+
39+
Setting::Setting(QString name, enum settingFileType fileType, enum settingValueType valueType,
40+
std::variant<int, QString> defaultValue)
41+
: m_name(name), m_fileType(fileType), m_valueType(valueType), m_value(defaultValue)
42+
{
43+
m_valueOrigin = LAB_VALUE_ORIGIN_DEFAULT;
44+
45+
if (m_fileType == LAB_FILE_TYPE_RCXML) {
46+
switch (m_valueType) {
47+
case LAB_VALUE_TYPE_STRING: {
48+
QString value = QString(xml_get(m_name.toStdString().c_str()));
49+
if (value != std::get<QString>(m_value)) {
50+
m_valueOrigin = LAB_VALUE_ORIGIN_USER_OVERRIDE;
51+
m_value = value;
52+
qDebug() << "USER OVERRIDE: " << m_name << "=" << value;
53+
}
54+
break;
55+
}
56+
case LAB_VALUE_TYPE_INT: {
57+
int value = xml_get_int(m_name.toStdString().c_str());
58+
if (value != std::get<int>(m_value)) {
59+
m_valueOrigin = LAB_VALUE_ORIGIN_USER_OVERRIDE;
60+
m_value = value;
61+
qDebug() << "USER OVERRIDE: " << m_name << "=" << value;
62+
}
63+
break;
64+
}
65+
case LAB_VALUE_TYPE_BOOL: {
66+
int value = xml_get_bool_text(m_name.toStdString().c_str());
67+
if (value != std::get<int>(m_value)) {
68+
m_valueOrigin = LAB_VALUE_ORIGIN_USER_OVERRIDE;
69+
m_value = value;
70+
qDebug() << "USER OVERRIDE: " << m_name << "=" << value;
71+
}
72+
break;
73+
}
74+
default:
75+
break;
76+
}
77+
}
78+
};

src/settings.h

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#pragma once
2+
#include <memory>
3+
#include <vector>
4+
#include <QString>
5+
6+
enum settingFileType {
7+
LAB_FILE_TYPE_UNKNOWN = 0,
8+
LAB_FILE_TYPE_RCXML,
9+
LAB_FILE_TYPE_ENVIRONMENT,
10+
};
11+
12+
enum settingValueOrigin {
13+
LAB_VALUE_ORIGIN_UNKNOWN = 0,
14+
LAB_VALUE_ORIGIN_DEFAULT,
15+
LAB_VALUE_ORIGIN_USER_OVERRIDE,
16+
};
17+
18+
enum settingValueType {
19+
LAB_VALUE_TYPE_UNKNOWN = 0,
20+
LAB_VALUE_TYPE_INT,
21+
LAB_VALUE_TYPE_BOOL,
22+
LAB_VALUE_TYPE_STRING,
23+
};
24+
25+
static inline QString settingFileTypeName(enum settingFileType type)
26+
{
27+
if (type == LAB_FILE_TYPE_RCXML)
28+
return "rc.xml";
29+
else if (type == LAB_FILE_TYPE_ENVIRONMENT)
30+
return "environment";
31+
return "unknown";
32+
}
33+
34+
class Setting
35+
{
36+
public:
37+
Setting(QString name, enum settingFileType fileType, enum settingValueType valueType,
38+
std::variant<int, QString> defaultValue);
39+
40+
private:
41+
QString m_name;
42+
enum settingFileType m_fileType;
43+
enum settingValueOrigin m_valueOrigin;
44+
enum settingValueType m_valueType;
45+
std::variant<int, QString> m_value;
46+
47+
public:
48+
// Getters
49+
QString name() const { return m_name; }
50+
enum settingFileType fileType() const { return m_fileType; }
51+
enum settingValueOrigin valueOrigin() const { return m_valueOrigin; }
52+
enum settingValueType valueType() const { return m_valueType; }
53+
};
54+
55+
void initSettings(std::vector<std::shared_ptr<Setting>> &settings);

0 commit comments

Comments
 (0)