summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBossCode45 <human.cyborg42@gmail.com>2025-01-04 15:14:05 +1300
committerBossCode45 <human.cyborg42@gmail.com>2025-01-04 15:14:05 +1300
commitaa1500fea32db04c9e4fe72786ebd7e3479b6a8a (patch)
treedf2bcb0182704dac9e1813f269fb46bb67e65c61 /src
parentd1d4a63d4473cd4910b678cf5b385f622186fbd3 (diff)
downloadYATwm-aa1500fea32db04c9e4fe72786ebd7e3479b6a8a.tar.gz
YATwm-aa1500fea32db04c9e4fe72786ebd7e3479b6a8a.zip
feat: Commands restructure + home manager module now makes config
Commands module is now a separate libraray that the flake includes. The home manager module will now auto generate the config and has options for different things such as keybinds, gaps, workspaces, etc.
Diffstat (limited to 'src')
-rw-r--r--src/IPC.h2
-rw-r--r--src/commands.cpp335
-rw-r--r--src/commands.h89
-rw-r--r--src/config.cpp5
-rw-r--r--src/config.h2
-rw-r--r--src/keybinds.cpp5
-rw-r--r--src/keybinds.h2
-rw-r--r--src/main.cpp3
8 files changed, 11 insertions, 432 deletions
diff --git a/src/IPC.h b/src/IPC.h
index e0bbcee..0705c2b 100644
--- a/src/IPC.h
+++ b/src/IPC.h
@@ -3,7 +3,7 @@
#include <sys/socket.h>
#include <sys/un.h>
-#include "commands.h"
+#include <commands.h>
#include "config.h"
#include "util.h"
diff --git a/src/commands.cpp b/src/commands.cpp
deleted file mode 100644
index 5688da4..0000000
--- a/src/commands.cpp
+++ /dev/null
@@ -1,335 +0,0 @@
-#include "commands.h"
-#include "error.h"
-#include "util.h"
-
-#include <cctype>
-#include <iostream>
-#include <algorithm>
-#include <iterator>
-#include <stdexcept>
-#include <string>
-#include <utility>
-#include <vector>
-#include <regex>
-#include <cstring>
-
-using std::cout, std::endl, std::string, std::vector;
-
-const void CommandsModule::echo(const CommandArg* argv)
-{
- cout << argv[0].str << endl;
-}
-
-CommandsModule::CommandsModule()
-{
- addCommand("echo", &CommandsModule::echo, 1, {STR_REST}, this);
-}
-CommandsModule::~CommandsModule()
-{
- for(Command c : commandList)
- {
- if(c.argc > 0)
- delete[] c.argTypes;
- }
-}
-
-void CommandsModule::addCommand(Command c)
-{
- if(lookupCommand(c.name) != nullptr)
- {
- cout << "Duplicate command: " << c.name << endl;
- }
- commandList.push_back(c);
-}
-void CommandsModule::addCommand(std::string name, const void (*func)(const CommandArg *), const int argc, CommandArgType *argTypes)
-{
- Command c = {name, nullptr, func, argc, argTypes, nullptr};
- addCommand(c);
-}
-void CommandsModule::addCommand(std::string name, const void(*func)(const CommandArg*), const int argc, std::vector<CommandArgType> argTypes)
-{
- CommandArgType* argTypesArr = new CommandArgType[argc];
- for(int i = 0; i < argc; i++)
- {
- argTypesArr[i] = argTypes[i];
- }
- addCommand(name, func, argc, argTypesArr);
-}
-
-struct NameMatches
-{
- NameMatches(string s): s_{s} {}
- bool operator()(Command c) { return (c.name == s_); }
- string s_;
-};
-
-Command* CommandsModule::lookupCommand(string name)
-{
- auto elem = std::find_if(commandList.begin(), commandList.end(), NameMatches(name));
- if (elem != commandList.end())
- {
- int i = elem - commandList.begin();
- return &(commandList[i]);
- }
- else
- {
- return nullptr;
- }
-}
-
-vector<string> CommandsModule::splitCommand(string command)
-{
- vector<string> v;
- string arg = "";
- bool inQuotes = false;
- bool escapeNext = true;
- char quoteType;
- for(int i = 0; i < command.size(); i++)
- {
- if(escapeNext)
- {
- arg += command[i];
- escapeNext = false;
- }
- else if(command[i] == '\\')
- {
- escapeNext = true;
- }
- else if(inQuotes)
- {
- if(command[i] == quoteType)
- {
- if(arg != "")
- {
- v.push_back(arg);
- arg = "";
- }
- inQuotes = false;
- }
- else
- {
- arg += command[i];
- }
- }
- else
- {
- if(command[i] == ' ')
- {
- if(arg != "")
- {
- v.push_back(arg);
- arg = "";
- }
- }
- else if(command[i] == '"' || command[i] == '\'')
- {
- inQuotes = true;
- quoteType = command[i];
- }
- else
- {
- arg += command[i];
- }
- }
- }
- if(arg != "")
- v.push_back(arg);
- return v;
-}
-
-CommandArg* CommandsModule::getCommandArgs(vector<string>& split, const CommandArgType* argTypes, const int argc)
-{
- CommandArg* args = new CommandArg[argc];
- for(int i = 1; i < argc + 1; i++)
- {
- switch(argTypes[i-1])
- {
- case STR: args[i-1].str = (char*)split[i].c_str(); break;
- case NUM:
- {
- try
- {
- args[i-1].num = std::stoi(split[i]);
- break;
- }
- catch(std::invalid_argument e)
- {
- delete[] args;
- throw Err(CMD_ERR_WRONG_ARGS, split[i] + " is not a number!");
- }
- }
- case MOVDIR:
- {
- if(lowercase(split[i]) == "up")
- args[i-1].dir = UP;
- else if(lowercase(split[i]) == "down")
- args[i-1].dir = DOWN;
- else if(lowercase(split[i]) == "left")
- args[i-1].dir = LEFT;
- else if(lowercase(split[i]) == "right")
- args[i-1].dir = RIGHT;
- else
- {
- delete[] args;
- throw Err(CMD_ERR_WRONG_ARGS, split[i] + " is not a direction!");
- }
- break;
- }
- case STR_REST:
- {
- string rest = "";
- for(int j = i; j < split.size(); j++)
- {
- rest += split[j];
- if(j != split.size() - 1)
- rest += " ";
- }
- args[i-1].str = new char[rest.size()];
- strncpy(args[i-1].str, rest.c_str(), rest.size());
- return args;
- }
- case NUM_ARR_REST:
- {
- int* rest = new int[split.size() - i];
- for(int j = 0; j < split.size() - i; j++)
- {
- try
- {
- rest[j] = std::stoi(split[j + i]);
- }
- catch(std::invalid_argument e)
- {
- delete[] rest;
- delete[] args;
- throw Err(CMD_ERR_WRONG_ARGS, split[i] + " is not a number!");
- }
- }
- args[i-1].numArr = {rest, (int) split.size() - i};
- return args;
- }
- default: cout << "UH OH SOMETHING IS VERY WRONG" << endl;
- }
- }
- return args;
-}
-
-void CommandsModule::runCommand(string command)
-{
- vector<string> split = splitCommand(command);
- vector<string>::const_iterator start = split.begin();
- int count = 0;
- for(string s : split)
- {
- if(s == ";")
- {
- vector<string>::const_iterator end = start + count;
- vector<string> partialCmd(start, end);
- runCommand(partialCmd);
- count = 0;
- start = end + 1;
- }
- else
- {
- count++;
- }
- }
- if(start != split.end())
- {
- vector<string> partialCmd(start, (vector<string>::const_iterator)split.end());
- runCommand(partialCmd);
- }
-}
-void CommandsModule::runCommand(vector<string> split)
-{
- Command* cmd = lookupCommand(split[0]);
- if(cmd == nullptr)
- throw Err(CMD_ERR_NOT_FOUND, split[0] + " is not a valid command name");
- if(cmd->argc > split.size() - 1)
- throw Err(CMD_ERR_WRONG_ARGS, "wrong number of arguments");
- CommandArg* args;
- try
- {
- args = getCommandArgs(split, cmd->argTypes, cmd->argc);
- }
- catch(Err e)
- {
- throw e;
- }
- try
- {
- if(cmd->module == nullptr)
- cmd->staticFunc(args);
- else
- cmd->func(*cmd->module, args);
- }
- catch (Err e)
- {
- for(int i = 0; i < cmd->argc; i++)
- {
- if(cmd->argTypes[i] == STR_REST)
- delete[] args[i].str;
- }
- delete[] args;
- throw e;
- }
- for(int i = 0; i < cmd->argc; i++)
- {
- if(cmd->argTypes[i] == STR_REST)
- delete[] args[i].str;
- }
- delete[] args;
-}
-
-vector<Err> CommandsModule::checkCommand(string command)
-{
- vector<Err> errs;
- vector<string> split = splitCommand(command);
- vector<string>::const_iterator start = split.begin();
- int count = 0;
- for(string s : split)
- {
- if(s == ";")
- {
- vector<string>::const_iterator end = start + count;
- vector<string> partialCmd(start, end);
- errs.push_back(checkCommand(partialCmd));
- count = 0;
- start = end + 1;
- }
- else
- {
- count++;
- }
- }
- if(start != split.end())
- {
- vector<string> partialCmd(start, (vector<string>::const_iterator)split.end());
- errs.push_back(checkCommand(partialCmd));
- }
- return errs;
-}
-
-Err CommandsModule::checkCommand(vector<string> split)
-{
- Command* cmd = lookupCommand(split[0]);
- if(cmd == nullptr)
- return Err(CMD_ERR_NOT_FOUND, split[0] + " is not a valid command name");
- if(cmd->argc > split.size())
- return Err(CMD_ERR_WRONG_ARGS, "wrong number of arguments");
- CommandArg* args;
- try
- {
- args = getCommandArgs(split, cmd->argTypes, cmd->argc);
- }
- catch(Err e)
- {
- return e;
- }
- for(int i = 0; i < cmd->argc; i++)
- {
- if(cmd->argTypes[i] == STR_REST || cmd->argTypes[i] == NUM_ARR_REST)
- delete[] args[i].str;
- }
- delete[] args;
- return Err(NOERR, "");
-}
diff --git a/src/commands.h b/src/commands.h
deleted file mode 100644
index af4a4a0..0000000
--- a/src/commands.h
+++ /dev/null
@@ -1,89 +0,0 @@
-#pragma once
-
-#include "error.h"
-
-#include <vector>
-#include <string>
-#include <any>
-#include <functional>
-
-enum MoveDir
- {
- UP,
- RIGHT,
- DOWN,
- LEFT
- };
-enum CommandArgType
- {
- STR,
- NUM,
- MOVDIR,
- STR_REST,
- NUM_ARR_REST
- };
-
-struct NumArr
-{
- int* arr;
- int size;
-};
-typedef union
-{
- char* str;
- int num;
- NumArr numArr;
- MoveDir dir;
-} CommandArg;
-
-struct Command
-{
- const std::string name;
- const std::function<void(std::any&, const CommandArg* argv)> func;
- const std::function<void(const CommandArg* argv)> staticFunc;
- const int argc;
- CommandArgType* argTypes;
- std::any* module;
-};
-class CommandsModule
-{
-private:
- std::vector<Command> commandList;
- std::vector<std::string> splitCommand(std::string command);
- CommandArg* getCommandArgs(std::vector<std::string>& args, const CommandArgType* argTypes, const int argc);
- const void echo(const CommandArg* argv);
-public:
- CommandsModule();
- ~CommandsModule();
- template <class T>
- void addCommand(std::string name, const void(T::*func)(const CommandArg*), const int argc, CommandArgType* argTypes, T* module);
- void addCommand(std::string name, const void(*func)(const CommandArg*), const int argc, CommandArgType* argTypes);
- template <class T>
- void addCommand(std::string name, const void(T::*func)(const CommandArg*), const int argc, std::vector<CommandArgType> argTypes, T* module);
- void addCommand(std::string name, const void(*func)(const CommandArg*), const int argc, std::vector<CommandArgType> argTypes);
- void addCommand(Command c);
- Command* lookupCommand(std::string name);
- void runCommand(std::string command);
- void runCommand(std::vector<std::string> split);
- std::vector<Err> checkCommand(std::string command);
- Err checkCommand(std::vector<std::string> split);
-};
-
-// YES I KNOW THIS IS BAD
-// but it needs to be done this way
-template <class T>
-void CommandsModule::addCommand(std::string name, const void(T::*func)(const CommandArg*), const int argc, CommandArgType* argTypes, T* module)
-{
- Command c = {name, (const void*(std::any::*)(const CommandArg* argv)) func, nullptr, argc, argTypes, (std::any*)module};
- addCommand(c);
-}
-template <class T>
-void CommandsModule::addCommand(std::string name, const void(T::*func)(const CommandArg*), const int argc, std::vector<CommandArgType> argTypes, T* module)
-{
- CommandArgType* argTypesArr = new CommandArgType[argc];
- for(int i = 0; i < argc; i++)
- {
- argTypesArr[i] = argTypes[i];
- }
- addCommand(name, func, argc, argTypesArr, module);
-}
diff --git a/src/config.cpp b/src/config.cpp
index 925e6ea..df195aa 100644
--- a/src/config.cpp
+++ b/src/config.cpp
@@ -1,6 +1,7 @@
#include "config.h"
-#include "commands.h"
-#include "error.h"
+#include <commands.h>
+//TODO: FIX THIS
+#include <error.h>
#include <X11/Xlib.h>
diff --git a/src/config.h b/src/config.h
index 452db9c..b04753f 100644
--- a/src/config.h
+++ b/src/config.h
@@ -1,8 +1,8 @@
#pragma once
-#include "commands.h"
#include <X11/X.h>
#include <X11/keysym.h>
+#include <commands.h>
#include <string>
#include <vector>
diff --git a/src/keybinds.cpp b/src/keybinds.cpp
index 235f8c1..127a534 100644
--- a/src/keybinds.cpp
+++ b/src/keybinds.cpp
@@ -7,8 +7,9 @@
#include <vector>
#include <regex>
-#include "commands.h"
-#include "error.h"
+#include <commands.h>
+//TODO: FIX THIS
+#include <error.h>
#include "keybinds.h"
#include "util.h"
diff --git a/src/keybinds.h b/src/keybinds.h
index a742240..5fd4fba 100644
--- a/src/keybinds.h
+++ b/src/keybinds.h
@@ -8,7 +8,7 @@
#include <X11/keysym.h>
#include <vector>
-#include "commands.h"
+#include <commands.h>
#include "config.h"
#include "util.h"
diff --git a/src/main.cpp b/src/main.cpp
index da1ae9b..3e01b4d 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -36,7 +36,8 @@
#include "config.h"
#include "util.h"
#include "ewmh.h"
-#include "error.h"
+//TODO: FIX THIS
+#include <error.h>
using std::cout;
using std::string;