summaryrefslogtreecommitdiff
path: root/config.cpp
diff options
context:
space:
mode:
authorBossCode45 <human.cyborg42@gmail.com>2023-05-24 10:28:49 +1200
committerBossCode45 <human.cyborg42@gmail.com>2023-05-24 10:28:49 +1200
commitda3b5b2131d2b4ff5cb127e92090fca568376835 (patch)
tree3c3ca1dbb19683a22eefde705f2d8ac4d62ffdc3 /config.cpp
parent6655d5dfb24ca3fd36b02550c526bca1f5d924e9 (diff)
downloadYATwm-da3b5b2131d2b4ff5cb127e92090fca568376835.tar.gz
YATwm-da3b5b2131d2b4ff5cb127e92090fca568376835.zip
in-progress: Config refactor started, changed all existing keybind command args and added in the new files, still many errors
Diffstat (limited to 'config.cpp')
-rw-r--r--config.cpp423
1 files changed, 114 insertions, 309 deletions
diff --git a/config.cpp b/config.cpp
index 74ba0b0..101af24 100644
--- a/config.cpp
+++ b/config.cpp
@@ -1,349 +1,157 @@
#include "config.h"
+#include "commands.h"
-#include "error.h"
-#include "toml++/toml.hpp"
-#include "util.h"
-
-#include <X11/X.h>
#include <X11/Xlib.h>
+#include <cstdio>
+#include <cstring>
+#include <fstream>
+#include <ios>
#include <string>
-#include <map>
+#include <vector>
+#include <sstream>
+#include <unistd.h>
+#include <fcntl.h>
//Just for testing
#include <iostream>
-#include <vector>
-using std::map, std::string, std::to_string;
+using std::string;
// For testing
-using std::cout, std::endl, std::cerr;
-
-map<string, void(*) (const KeyArg arg)> funcNameMap = {
- {"exit", exit},
- {"spawn", spawn},
- {"toggle", toggle},
- {"kill", kill},
- {"changeWS", changeWS},
- {"wToWS", wToWS},
- {"focChange", focChange},
- {"wMove", wMove},
- {"bashSpawn", bashSpawn},
- {"reload", reload},
- {"wsDump", wsDump},
- {"nextMonitor", nextMonitor},
-};
-
+using std::cout, std::endl;
-Config::Config()
+const void Config::exit(const CommandArg* argv)
{
+ cout << "exit called" << endl;
+}
+const void Config::spawn_once(const CommandArg* argv)
+{
+ if(loaded)
+ return;
+ if(fork() == 0)
+ {
+ int null = open("/dev/null", O_WRONLY);
+ dup2(null, 0);
+ dup2(null, 1);
+ dup2(null, 2);
+ system(argv[0].str);
+ exit(0);
+ }
}
-string to_string(string s)
+const void Config::spawn(const CommandArg* argv)
{
- return s;
+ if(fork() == 0)
+ {
+ int null = open("/dev/null", O_WRONLY);
+ dup2(null, 0);
+ dup2(null, 1);
+ dup2(null, 2);
+ system(argv[0].str);
+ exit(0);
+ }
+}
+const void Config::changeWS(const CommandArg* argv)
+{
+ cout << "changeWS called" << endl;
+}
+const void Config::wToWS(const CommandArg* argv)
+{
+ cout << "wToWS called" << endl;
+}
+const void Config::focChange(const CommandArg* argv)
+{
+ cout << "focChange called" << endl;
}
-string to_string(bool b)
+const void Config::reload(const CommandArg* argv)
{
- if(b)
- return "true";
- else
- return "false";
+ cout << "Reloading config" << endl;
+ reloadFile();
}
-template <typename T>
-T Config::getValue(string path, Err* err)
+const void Config::gapsCmd(const CommandArg* argv)
{
- std::optional<T> tblVal = tbl.at_path(path).value<T>();
- if(tblVal)
- return *tblVal;
- else
- {
- err->code = ERR_CFG_NON_FATAL;
- T val = *defaults.at_path(path).value<T>();
- err->errorMessage += "\n\tValue for " + path + " is invalid, using default (" + to_string(val) + ")";
- return val;
- }
+ gaps = argv[0].num;
}
-void Config::loadWorkspaceArrays(toml::table tbl, toml::table defaults, Err* err)
+const void Config::outerGapsCmd(const CommandArg* argv)
{
- if(!tbl["Workspaces"]["workspaceNames"].as_array())
- {
- err->code = ERR_CFG_NON_FATAL;
- err->errorMessage += "\n\tworkspaceNames invalid array, using defaults";
- return loadWorkspaceArrays(defaults, defaults, err);
- }
- workspaceNamesc = tbl["Workspaces"]["workspaceNames"].as_array()->size();
- workspaceNames = new string[workspaceNamesc];
- for(int i = 0; i < workspaceNamesc; i++)
- {
- auto element = tbl["Workspaces"]["workspaceNames"][i].value<string>();
- if(element)
- workspaceNames[i] = *element;
- else
- {
- err->code = ERR_CFG_NON_FATAL;
- err->errorMessage += "\nelement " + to_string(i) + " in workspaceNames invalid, using defaults";
- delete[] workspaceNames;
- return loadWorkspaceArrays(defaults, defaults, err);
- }
- }
- if(!tbl["Workspaces"]["screenPreferences"].as_array())
- {
- err->code = ERR_CFG_NON_FATAL;
- err->errorMessage += "\nscreenPreferences invalid array, using default";
- delete[] workspaceNames;
- return loadWorkspaceArrays(defaults, defaults, err);
- }
- screenPreferencesc = tbl["Workspaces"]["screenPreferences"].as_array()->size();
- if(screenPreferencesc != workspaceNamesc)
- {
- err->code = ERR_CFG_NON_FATAL;
- err->errorMessage += "\nworkspaceNames and screenPreferences aren't the same length, using defaults";
- delete[] workspaceNames;
- return loadWorkspaceArrays(defaults, defaults, err);
- }
- screenPreferences = new int*[screenPreferencesc];
- for(int i = 0; i < screenPreferencesc; i++)
- {
- if(!tbl["Workspaces"]["screenPreferences"][i].as_array())
- {
- err->code = ERR_CFG_NON_FATAL;
- err->errorMessage += "\telement " + to_string(i) + " in screenPreferences in invalid, using defaults";
- delete[] workspaceNames;
- for(int k = 0; k < i; k++)
- {
- delete[] screenPreferences[k];
- }
- delete[] screenPreferences;
- return loadWorkspaceArrays(defaults, defaults, err);
- }
- int* wsScreens = new int[maxMonitors];
- for(int j = 0; j < maxMonitors; j++)
- {
- if(tbl["Workspaces"]["screenPreferences"][i].as_array()->size() <= j)
- {
- wsScreens[j] = 0;
- continue;
- }
- auto element = tbl["Workspaces"]["screenPreferences"][i][j].value<int>();
- if(element)
- wsScreens[j] = *element;
- else
- {
- err->code = ERR_CFG_NON_FATAL;
- err->errorMessage += "\telement " + to_string(i) + " " + to_string(j) + " in screenPreferences in invalid, using defaults";
- delete[] workspaceNames;
- for(int k = 0; k <= i; k++)
- {
- delete[] screenPreferences[k];
- }
- delete[] screenPreferences;
- return loadWorkspaceArrays(defaults, defaults, err);
- }
- }
- screenPreferences[i] = wsScreens;
- }
+ outerGaps = argv[0].num;
}
-void Config::loadStartupBash(toml::table tbl, toml::table defaults, Err* err)
+const void Config::logFileCmd(const CommandArg* argv)
{
- if(!tbl["Startup"]["startupBash"].as_array())
- {
- err->code = ERR_CFG_NON_FATAL;
- err->errorMessage += "\n\tstartupBash array invalid, using default";
- return loadStartupBash(defaults, defaults, err);
- }
- startupBashc = tbl["Startup"]["startupBash"].as_array()->size();
- std::vector<string> startupBash;
- for(int i = 0; i < startupBashc; i++)
- {
- auto element = tbl["Startup"]["startupBash"][i].value<string>();
- if(element)
- startupBash.push_back(*element);
- else
- {
- err->code = ERR_CFG_NON_FATAL;
- err->errorMessage += "\n\tstartupBash element " + to_string(i) + " invalid, skipping";
- }
- }
- startupBashc = startupBash.size();
- this->startupBash = new string[startupBashc];
- for(int i = 0; i < startupBash.size(); i++)
- {
- this->startupBash[i] = startupBash[i];
- }
+ logFile = argv[0].str;
}
-Err Config::reload()
+const void Config::addWorkspaceCmd(const CommandArg* argv)
{
- if(!loaded)
- return {ERR_CFG_FATAL, "Path not set yet, call loadFromFile before reload"};
- return loadFromFile(path);
+ int* prefs = new int[argv[1].numArr.size];
+ memcpy(prefs, argv[1].numArr.arr, argv[1].numArr.size * sizeof(int));
+ workspaces.push_back({argv[0].str, prefs, argv[1].numArr.size});
}
-Err Config::loadFromFile(string path)
+Config::Config(CommandsModule& commandsModule)
+ : commandsModule(commandsModule)
{
- if(loaded)
- {
- free();
- }
- loaded = true;
- this->path = path;
- Err err;
- err.code = NOERR;
- err.errorMessage = "";
- defaults = toml::parse_file("/etc/YATwm/config.toml");
- try
- {
- tbl = toml::parse_file(path);
- }
- catch (const toml::parse_error& parseErr)
- {
- err.code = ERR_CFG_FATAL;
- string description = (string) parseErr.description();
- string startCol = std::to_string(parseErr.source().begin.column);
- string startLine = std::to_string(parseErr.source().begin.line);
- string endCol = std::to_string(parseErr.source().end.column);
- string endLine = std::to_string(parseErr.source().end.line);
- string pos = "Line " + startLine;
- string what = parseErr.what();
- err.errorMessage += "\n\t" + description + "\t(" + pos + ")" + "\n\tUsing /etc/YATwm/config.toml instead";
- tbl = defaults;
- }
+ //Register commands for keybinds
+ CommandArgType* spawnArgs = new CommandArgType[1];
+ spawnArgs[0] = STR_REST;
+ commandsModule.addCommand("spawn", &Config::spawn, 1, spawnArgs, this);
+ commandsModule.addCommand("spawn_once", &Config::spawn_once, 1, spawnArgs, this);
+ commandsModule.addCommand("reload", &Config::reload, 0, {}, this);
+
+ //Register commands for config
+ CommandArgType* gapsArgs = new CommandArgType[1];
+ gapsArgs[0] = NUM;
+ commandsModule.addCommand("gaps", &Config::gapsCmd, 1, gapsArgs, this);
+ commandsModule.addCommand("outergaps", &Config::outerGapsCmd, 1, gapsArgs, this);
+ CommandArgType* logFileArgs = new CommandArgType[1];
+ logFileArgs[0] = STR_REST;
+ commandsModule.addCommand("logfile", &Config::logFileCmd, 1, logFileArgs, this);
+ CommandArgType* addWorkspaceArgs = new CommandArgType[2];
+ addWorkspaceArgs[0] = STR;
+ addWorkspaceArgs[1] = NUM_ARR_REST;
+ commandsModule.addCommand("addworkspace", &Config::addWorkspaceCmd, 2, addWorkspaceArgs, this);
+}
- //Startup
- loadStartupBash(tbl, defaults, &err);
+void Config::reloadFile()
+{
+ if(!loaded)
+ return;
+ loadFromFile(file);
+}
- //Main
- gaps = getValue<int>("Main.gaps", &err);
- outerGaps = getValue<int>("Main.outerGaps", &err);
- logFile = getValue<string>("Main.logFile", &err);
+void Config::loadFromFile(string path)
+{
+ file = path;
+ //Set defaults
+ gaps = 3;
+ outerGaps = 3;
+ logFile = "/tmp/yatlog.txt";
- //Workspaces
- numWS = getValue<int>("Workspaces.numWS", &err);
- maxMonitors = getValue<int>("Workspaces.maxMonitors", &err);
- loadWorkspaceArrays(tbl, defaults, &err);
-
- //Keybinds
- bool swapSuperAlt = getValue<bool>("Keybinds.swapSuperAlt", &err);
+ //Probably need something for workspaces and binds too...
- toml::node_view<toml::node> bindsArr = tbl["Keybinds"]["key"];
- if(!bindsArr.is_array())
+ string cmd;
+ int line = 0;
+ std::ifstream config(path);
+ while(getline(config, cmd))
{
- err.code = ERR_CFG_NON_FATAL;
- err.errorMessage += "\n\tBinds array not valid, using default";
- bindsArr = defaults["Keybinds"]["key"];
- }
- std::vector<KeyBind> keyBinds;
- bindsc = bindsArr.as_array()->size();
- for(int i = 0; i < bindsc; i++)
- {
- KeyBind bind;
- bind.modifiers = 0;
- const std::optional<string> potentialBindString = bindsArr[i]["bind"].value<string>();
- string bindString;
- if(potentialBindString)
- bindString = *potentialBindString;
- else
- {
- err.code = ERR_CFG_NON_FATAL;
- err.errorMessage += "\n\tSkipping element " + to_string(i) + " of binds as the bind string is invalid";
+ if(cmd.at(0) == '#')
continue;
- }
- std::vector<string> keys = split(bindString, '+');
- for(string key : keys)
- {
- if(key == "mod")
- {
- if(!swapSuperAlt)
- bind.modifiers |= Mod4Mask;
- else
- bind.modifiers |= Mod1Mask;
- }
- else if(key == "alt")
- {
- if(swapSuperAlt)
- bind.modifiers |= Mod4Mask;
- else
- bind.modifiers |= Mod1Mask;
- }
- else if(key == "shift")
- {
- bind.modifiers |= ShiftMask;
- }
- else if(key == "control")
- {
- bind.modifiers |= ControlMask;
- }
- else
- {
- bind.keysym = XStringToKeysym(key.c_str());
- if(bind.keysym == NoSymbol)
- {
- err.code = ERR_CFG_NON_FATAL;
- err.errorMessage += "\n\tSkipping element " + to_string(i) + " of binds as the bind string is invalid";
- continue;
- }
- }
- }
- std::optional<string> potentialFuncString = bindsArr[i]["func"].value<string>();
- string funcString;
- if(potentialFuncString)
- funcString = *potentialFuncString;
- else
+ try
{
- err.code = ERR_CFG_NON_FATAL;
- err.errorMessage += "\n\tSkipping element " + to_string(i) + " of binds as the func string is invalid";
- continue;
+ commandsModule.runCommand(cmd);
}
- if(funcNameMap.count(funcString) == 0)
+ catch (Err e)
{
- err.code = ERR_CFG_NON_FATAL;
- err.errorMessage += "\n\tSkipping element " + to_string(i) + " of binds as the func string is invalid";
- continue;
+ cout << "Error in config (line " << line << "): " << e.code << endl;
+ cout << "\tMessage: " << e.message << endl;
}
- void(* func) (const KeyArg arg) = funcNameMap.find(funcString)->second;
- bind.func = func;
-
- auto args = bindsArr[i]["args"];
- if(args.is<int64_t>())
- {
- int num = *args.value<int>();
- bind.args = {.num = num};
- }
- else if(args.is<string>())
- {
- string str = (string)*args.value<string>();
- if(str == "Up")
- bind.args = {.dir = Up};
- else if (str == "Down")
- bind.args = {.dir = Down};
- else if (str == "Left")
- bind.args = {.dir = Left};
- else if (str == "Right")
- bind.args = {.dir = Right};
- else
- {
- bind.args = {.str = strdup(str.c_str())};
- }
- }
- else
- {
- bind.args = {NULL};
- }
- keyBinds.push_back(bind);
+ line++;
}
- bindsc = keyBinds.size();
- binds = new KeyBind[bindsc];
- for(int i = 0; i < bindsc; i++)
- {
- binds[i] = keyBinds[i];
- }
- if(err.code != NOERR)
- err.errorMessage = err.errorMessage.substr(1);
- return err;
+ loaded = true;
}
Config::~Config()
@@ -352,13 +160,10 @@ Config::~Config()
}
void Config::free()
{
- delete[] startupBash;
- delete[] workspaceNames;
- for(int i = 0; i < screenPreferencesc; i++)
+ if(!loaded)
+ return;
+ for(Workspace w : workspaces)
{
- delete[] screenPreferences[i];
+ delete [] w.screenPreferences;
}
- delete[] screenPreferences;
- delete[] binds;
- loaded = false;
}