diff options
| author | BossCode45 <human.cyborg42@gmail.com> | 2025-01-04 15:14:05 +1300 |
|---|---|---|
| committer | BossCode45 <human.cyborg42@gmail.com> | 2025-01-04 15:14:05 +1300 |
| commit | aa1500fea32db04c9e4fe72786ebd7e3479b6a8a (patch) | |
| tree | df2bcb0182704dac9e1813f269fb46bb67e65c61 /src | |
| parent | d1d4a63d4473cd4910b678cf5b385f622186fbd3 (diff) | |
| download | YATwm-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.h | 2 | ||||
| -rw-r--r-- | src/commands.cpp | 335 | ||||
| -rw-r--r-- | src/commands.h | 89 | ||||
| -rw-r--r-- | src/config.cpp | 5 | ||||
| -rw-r--r-- | src/config.h | 2 | ||||
| -rw-r--r-- | src/keybinds.cpp | 5 | ||||
| -rw-r--r-- | src/keybinds.h | 2 | ||||
| -rw-r--r-- | src/main.cpp | 3 |
8 files changed, 11 insertions, 432 deletions
@@ -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; |
