summaryrefslogtreecommitdiff
path: root/main.cpp
diff options
context:
space:
mode:
authorBossCode45 <human.cyborg42@gmail.com>2022-12-21 17:25:20 +1300
committerBossCode45 <human.cyborg42@gmail.com>2022-12-21 17:25:20 +1300
commitf7ca0146ba7fed288c34040db0c2eae1683cf461 (patch)
tree76c7bc201dd12d1ae44deaded822d6cb0f78b91c /main.cpp
parentb116028a645d7db75d93c359462112ac4ad8d5ad (diff)
downloadYATwm-f7ca0146ba7fed288c34040db0c2eae1683cf461.tar.gz
YATwm-f7ca0146ba7fed288c34040db0c2eae1683cf461.zip
Config file working - more tests and potentially features before merge with main though
Diffstat (limited to 'main.cpp')
-rw-r--r--main.cpp93
1 files changed, 59 insertions, 34 deletions
diff --git a/main.cpp b/main.cpp
index ebec3f2..ff49223 100644
--- a/main.cpp
+++ b/main.cpp
@@ -3,6 +3,8 @@
#include <X11/Xatom.h>
#include <X11/cursorfont.h>
+#include <toml++/toml.hpp>
+
#include <X11/Xutil.h>
#include <X11/extensions/Xrandr.h>
#include <chrono>
@@ -22,11 +24,10 @@
#include <fcntl.h>
#include "structs.h"
+#include "config.h"
#include "util.h"
#include "ewmh.h"
-#include "config.h"
-
using std::cout;
using std::map;
using std::pair;
@@ -36,6 +37,8 @@ std::ofstream yatlog;
#define log(x) yatlog << x << std::endl
+Config cfg;
+
Display* dpy;
Window root;
int sW, sH;
@@ -110,9 +113,9 @@ void detectScreens()
log("\t\tw: " << screens[i].w << ", h: " << screens[i].h);
XFree(name);
}
- for(int i = 0; i < numWS; i++)
+ for(int i = 0; i < cfg.numWS; i++)
{
- if(screenPreferences[i][0] < nscreens && focusedWorkspaces[screenPreferences[i][0]] == 0)
+ if(cfg.screenPreferences[i][0] < nscreens && focusedWorkspaces[cfg.screenPreferences[i][0]] == 0)
{
//focusedWorkspaces[screenPreferences[i][0]] = i+1;
}
@@ -162,7 +165,14 @@ void spawn(const KeyArg arg)
int null = open("/dev/null", O_WRONLY);
dup2(null, 1);
dup2(null, 2);
- execvp((char*)arg.str[0], (char**)arg.str);
+ const std::string argsStr = arg.str;
+ vector<std::string> args = split(argsStr, ' ');
+ char** execvpArgs = new char*[args.size()];
+ for(int i = 0; i < args.size(); i++)
+ {
+ execvpArgs[i] = strdup(args[i].c_str());
+ }
+ execvp(execvpArgs[0], execvpArgs);
exit(0);
}
}
@@ -212,19 +222,19 @@ void changeWS(const KeyArg arg)
//log("Changing WS with keybind");
- for(int i = 0; i < maxMonitors; i++)
+ for(int i = 0; i < cfg.maxMonitors; i++)
{
- if(nscreens > screenPreferences[arg.num - 1][i])
+ if(nscreens > cfg.screenPreferences[arg.num - 1][i])
{
- int screen = screenPreferences[arg.num - 1][i];
+ int screen = cfg.screenPreferences[arg.num - 1][i];
//log("Found screen (screen " << screenPreferences[arg.num - 1][i] << ")");
- prevWS = focusedWorkspaces[screenPreferences[arg.num - 1][i]];
+ prevWS = focusedWorkspaces[cfg.screenPreferences[arg.num - 1][i]];
//log("Changed prevWS");
- focusedWorkspaces[screenPreferences[arg.num - 1][i]] = arg.num;
+ focusedWorkspaces[cfg.screenPreferences[arg.num - 1][i]] = arg.num;
//log("Changed focusedWorkspaces");
- if(focusedScreen != screenPreferences[arg.num - 1][i])
+ if(focusedScreen != cfg.screenPreferences[arg.num - 1][i])
{
- focusedScreen = screenPreferences[arg.num - 1][i];
+ focusedScreen = cfg.screenPreferences[arg.num - 1][i];
XWarpPointer(dpy, root, root, 0, 0, 0, 0, screens[screen].x + screens[screen].w/2, screens[screen].y + screens[screen].h/2);
}
//log("Changed focusedScreen");
@@ -235,7 +245,7 @@ void changeWS(const KeyArg arg)
//log("Finished changes");
//log(prevWS);
- if(prevWS < 1 || prevWS > numWS)
+ if(prevWS < 1 || prevWS > cfg.numWS)
{
//untile(prevWS);
}
@@ -322,8 +332,8 @@ int dirFind(int fID, MoveDir dir)
{
case Up: i--; break;
case Down: i++; break;
- case Left: return (frames.find(fID)->second.pID > numWS)? dirFind(frames.find(fID)->second.pID, dir) : fID;
- case Right: return (frames.find(fID)->second.pID > numWS)? dirFind(frames.find(fID)->second.pID, dir) : fID;
+ case Left: return (frames.find(fID)->second.pID > cfg.numWS)? dirFind(frames.find(fID)->second.pID, dir) : fID;
+ case Right: return (frames.find(fID)->second.pID > cfg.numWS)? dirFind(frames.find(fID)->second.pID, dir) : fID;
}
}
else if(pDir == horizontal)
@@ -332,8 +342,8 @@ int dirFind(int fID, MoveDir dir)
{
case Left: i--; break;
case Right: i++; break;
- case Up: return (frames.find(fID)->second.pID > numWS)? dirFind(frames.find(fID)->second.pID, dir) : fID;
- case Down: return (frames.find(fID)->second.pID > numWS)? dirFind(frames.find(fID)->second.pID, dir) : fID;
+ case Up: return (frames.find(fID)->second.pID > cfg.numWS)? dirFind(frames.find(fID)->second.pID, dir) : fID;
+ case Down: return (frames.find(fID)->second.pID > cfg.numWS)? dirFind(frames.find(fID)->second.pID, dir) : fID;
}
}
if(i < 0)
@@ -449,7 +459,7 @@ void bashSpawn(const KeyArg arg)
int null = open("/dev/null", O_WRONLY);
dup2(null, 1);
dup2(null, 2);
- system(arg.str[0]);
+ system(arg.str);
exit(0);
}
@@ -488,12 +498,14 @@ void keyPress(XKeyEvent e)
{
if(e.same_screen!=1) return;
updateMousePos();
+ cout << "Keypress recieved\n";
KeySym keysym = XLookupKeysym(&e, 0);
- for(int i = 0; i < sizeof(keyBinds)/sizeof(keyBinds[0]); i++)
+ cout << "\t" << XKeysymToString(keysym) << " super: " << ((e.state & Mod4Mask) == Mod4Mask) << " alt: " << ((e.state & Mod1Mask) == Mod1Mask) << " shift: " << ((e.state & ShiftMask) == ShiftMask) << std::endl;
+ for(int i = 0; i < cfg.bindsc; i++)
{
- if(keyBinds[i].keysym == keysym && e.state == keyBinds[i].modifiers)
+ if(cfg.binds[i].keysym == keysym)// && e.state == cfg.binds[i].modifiers)
{
- keyBinds[i].function(keyBinds[i].arg);
+ cfg.binds[i].func(cfg.binds[i].args);
}
}
}
@@ -775,7 +787,7 @@ void tileRoots()
{
for(int i = 0; i < nscreens; i++)
{
- tile(focusedWorkspaces[i], screens[i].x + outerGaps, screens[i].y + outerGaps, screens[i].w - outerGaps*2, screens[i].h - outerGaps*2 - bH);
+ tile(focusedWorkspaces[i], screens[i].x + cfg.outerGaps, screens[i].y + cfg.outerGaps, screens[i].w - cfg.outerGaps*2, screens[i].h - cfg.outerGaps*2 - bH);
}
}
void untileRoots()
@@ -813,10 +825,10 @@ void tile(int frameID, int x, int y, int w, int h)
tile(fID, wX, wY, wW, wH);
continue;
}
- wX += gaps;
- wY += gaps;
- wW -= gaps * 2;
- wH -= gaps * 2;
+ wX += cfg.gaps;
+ wY += cfg.gaps;
+ wW -= cfg.gaps * 2;
+ wH -= cfg.gaps * 2;
Client c = clients.find(f.cID)->second;
XMapWindow(dpy, c.w);
XMoveWindow(dpy, c.w,
@@ -850,11 +862,24 @@ void untile(int frameID)
int main(int argc, char** argv)
{
+ std::string home = getenv("HOME");
+ std::string pathAfterHome = "/.config/YATwm/config.toml";
+ std::string file = home + pathAfterHome;
+ try
+ {
+ cfg.loadFromFile(file);
+ }
+ catch (const toml::parse_error& err)
+ {
+ std::cerr << "Parsing failed:\n" << err << "\n";
+ return 1;
+ }
+
mX = mY = 0;
dpy = XOpenDisplay(nullptr);
root = Window(DefaultRootWindow(dpy));
- yatlog.open(logFile, std::ios_base::app);
+ yatlog.open(cfg.logFile, std::ios_base::app);
auto timeUnformatted = std::chrono::system_clock::now();
std::time_t time = std::chrono::system_clock::to_time_t(timeUnformatted);
@@ -871,28 +896,28 @@ int main(int argc, char** argv)
XSetErrorHandler(OnXError);
XSelectInput(dpy, root, SubstructureRedirectMask | SubstructureNotifyMask | KeyPressMask | EnterWindowMask);
- for(int i = 0; i < sizeof(keyBinds)/sizeof(keyBinds[0]); i++)
+ for(int i = 0; i < cfg.bindsc; i++)
{
- XGrabKey(dpy, XKeysymToKeycode(dpy, keyBinds[i].keysym), keyBinds[i].modifiers, root, false, GrabModeAsync, GrabModeAsync);
- //log("Grabbing " << XKeysymToString(keyBinds[i].keysym));
+ XGrabKey(dpy, XKeysymToKeycode(dpy, cfg.binds[i].keysym), cfg.binds[i].modifiers, root, false, GrabModeAsync, GrabModeAsync);
+ //log("Grabbing " << XKeysymToString(cfg.binds[i].keysym));
}
XDefineCursor(dpy, root, XCreateFontCursor(dpy, XC_top_left_arrow));
//EWMH
- initEWMH(&dpy, &root, numWS, workspaceNames);
+ initEWMH(&dpy, &root, cfg.numWS,cfg. workspaceNames);
setCurrentDesktop(1);
- for(int i = 1; i < numWS + 1; i++)
+ for(int i = 1; i < cfg.numWS + 1; i++)
{
vector<int> v;
Frame rootFrame = {i, noID, false, noID, horizontal, v, true};
frames.insert(pair<int, Frame>(i, rootFrame));
currFrameID++;
}
- for(int i = 0; i < sizeof(startup)/sizeof(startup[0]); i++)
+ for(int i = 0; i < cfg.startupBashc; i++)
{
if(fork() == 0)
{
- system((startup[i] + " > /dev/null 2> /dev/null").c_str());
+ system((cfg.startupBash[i] + " > /dev/null 2> /dev/null").c_str());
exit(0);
}
}