summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBossCode45 <boss@tehbox.org>2025-05-11 18:17:27 +1200
committerBossCode45 <boss@tehbox.org>2025-06-08 23:29:33 +1200
commit6698e92f6d7574a31a6d0e17acf63edf9f689102 (patch)
tree96dec36f65651889a5f6ee80bb917b5bfc0f2bc3 /src
parent7dd44834f0af18cca87786a2050ae69928b7a397 (diff)
downloadYATwm-main.tar.gz
YATwm-main.zip
feat: A few minor bug fixesv0.0.2main
Fixed keybinding errors Hopefully fixed multiple monitor status bar workspaces Refactored EWMH module
Diffstat (limited to 'src')
-rw-r--r--src/IPC.cpp17
-rw-r--r--src/IPC.h8
-rw-r--r--src/commands.cpp19
-rw-r--r--src/debug.h10
-rw-r--r--src/ewmh.cpp115
-rw-r--r--src/ewmh.h27
-rw-r--r--src/keybinds.cpp43
-rw-r--r--src/main.cpp109
-rw-r--r--src/structs.h3
9 files changed, 228 insertions, 123 deletions
diff --git a/src/IPC.cpp b/src/IPC.cpp
index 3ed1bb6..4f9754e 100644
--- a/src/IPC.cpp
+++ b/src/IPC.cpp
@@ -12,13 +12,16 @@ using std::cout, std::endl;
static const char* path = "/tmp/YATwm.sock";
-IPCServerModule::IPCServerModule(CommandsModule& commandsModule, Config& cfg, Globals& globals)
- :commandsModule(commandsModule),
- cfg(cfg),
- globals(globals)
+IPCServerModule::IPCServerModule(Globals& globals, Config& cfg, CommandsModule& commandsModule, EWMHModule& ewmh)
+ :globals(globals)
+ ,cfg(cfg)
+ ,commandsModule(commandsModule)
+ ,ewmh(ewmh)
{
}
+
+
void IPCServerModule::init()
{
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
@@ -32,7 +35,7 @@ void IPCServerModule::init()
cout << "ERROR " << errno << endl;
}
cout << "SOCKETED" << endl;
- setIPCPath((unsigned char*)path, strlen(path));
+ ewmh.setIPCPath((unsigned char*)path, strlen(path));
ready = true;
}
@@ -85,10 +88,10 @@ void IPCServerModule::quitIPC()
int IPCServerModule::getFD()
{
if(!ready)
- return -1;
+ return 0;
if(sockfd > 0)
return sockfd;
- return -1;
+ return 0;
}
IPCClientModule::IPCClientModule()
diff --git a/src/IPC.h b/src/IPC.h
index e0bbcee..09d176a 100644
--- a/src/IPC.h
+++ b/src/IPC.h
@@ -5,20 +5,22 @@
#include "commands.h"
#include "config.h"
+#include "ewmh.h"
#include "util.h"
class IPCServerModule
{
public:
- IPCServerModule(CommandsModule& commandsModule, Config& cfg, Globals& globals);
+ IPCServerModule(Globals& globals, Config& cfg, CommandsModule& commandsModule, EWMHModule& ewmh);
void init();
void doListen();
void quitIPC();
int getFD();
private:
- CommandsModule& commandsModule;
- Config& cfg;
Globals& globals;
+ Config& cfg;
+ CommandsModule& commandsModule;
+ EWMHModule& ewmh;
int sockfd;
int len;
bool first = true;
diff --git a/src/commands.cpp b/src/commands.cpp
index caa82eb..460c45b 100644
--- a/src/commands.cpp
+++ b/src/commands.cpp
@@ -12,6 +12,8 @@
#include <cstring>
#include <fstream>
+#include "debug.h"
+
using std::cout, std::endl, std::string, std::vector;
const void CommandsModule::echo(const CommandArg* argv)
@@ -181,7 +183,12 @@ CommandArg* CommandsModule::getCommandArgs(vector<string>& split, const CommandA
{
switch(argTypes[i-1])
{
- case STR: args[i-1].str = (char*)split[i].c_str(); break;
+ case STR:
+ {
+ args[i-1].str = new char[split[i].length() + 1];
+ strncpy(args[i-1].str, split[i].c_str(), split[i].length() + 1);
+ break;
+ }
case NUM:
{
try
@@ -194,6 +201,7 @@ CommandArg* CommandsModule::getCommandArgs(vector<string>& split, const CommandA
delete[] args;
throw Err(CMD_ERR_WRONG_ARGS, split[i] + " is not a number!");
}
+ break;
}
case MOVDIR:
{
@@ -221,8 +229,8 @@ CommandArg* CommandsModule::getCommandArgs(vector<string>& split, const CommandA
if(j != split.size() - 1)
rest += " ";
}
- args[i-1].str = new char[rest.size()];
- strncpy(args[i-1].str, rest.c_str(), rest.size());
+ args[i-1].str = new char[rest.size() + 1];
+ strncpy(args[i-1].str, rest.c_str(), rest.size() + 1);
return args;
}
case NUM_ARR_REST:
@@ -252,6 +260,7 @@ CommandArg* CommandsModule::getCommandArgs(vector<string>& split, const CommandA
void CommandsModule::runCommand(string command)
{
+ debug(cout << command << endl);
vector<string> split = splitCommand(command);
vector<string>::const_iterator start = split.begin();
int count = 0;
@@ -303,7 +312,7 @@ void CommandsModule::runCommand(vector<string> split)
{
for(int i = 0; i < cmd->argc; i++)
{
- if(cmd->argTypes[i] == STR_REST)
+ if(cmd->argTypes[i] == STR_REST || cmd->argTypes[i] == STR)
delete[] args[i].str;
}
delete[] args;
@@ -311,7 +320,7 @@ void CommandsModule::runCommand(vector<string> split)
}
for(int i = 0; i < cmd->argc; i++)
{
- if(cmd->argTypes[i] == STR_REST)
+ if(cmd->argTypes[i] == STR_REST || cmd->argTypes[i] == STR)
delete[] args[i].str;
}
delete[] args;
diff --git a/src/debug.h b/src/debug.h
new file mode 100644
index 0000000..907498b
--- /dev/null
+++ b/src/debug.h
@@ -0,0 +1,10 @@
+#pragma once
+
+// Toggles global debug
+// #define ENABLE_DEBUG
+
+#ifdef ENABLE_DEBUG
+#define debug(x) (x)
+#else
+#define debug(x)
+#endif
diff --git a/src/ewmh.cpp b/src/ewmh.cpp
index a3cc505..553fbbb 100644
--- a/src/ewmh.cpp
+++ b/src/ewmh.cpp
@@ -1,99 +1,126 @@
#include "ewmh.h"
+#include "util.h"
#include <X11/X.h>
#include <X11/Xatom.h>
#include <X11/Xlib.h>
-#include <iostream>
-#include <ostream>
+#include <cstdint>
+#include <cstring>
#include <string>
-Display** dpy_;
-Window* root_;
+#include <iostream>
-void initEWMH(Display** dpy, Window* root, int numWS, std::vector<Workspace> workspaces)
+EWMHModule::EWMHModule(Globals& globals, Config& cfg)
+ :globals(globals)
+ ,cfg(cfg)
{
- dpy_ = dpy;
- root_ = root;
+}
- Atom supported[] = {XInternAtom(*dpy_, "_NET_NUMBER_OF_DESKTOPS", false), XInternAtom(*dpy_, "_NET_DESKTOP_NAMES", false), XInternAtom(*dpy_, "_NET_CLIENT_LIST", false), XInternAtom(*dpy_, "_NET_CURRENT_DESKTOP", false)};
- int wsNamesLen = numWS; //For null bytes
- for(int i = 0; i < numWS; i++)
+void EWMHModule::init()
+{
+ Atom supported[] = {XInternAtom(globals.dpy, "_NET_NUMBER_OF_DESKTOPS", false), XInternAtom(globals.dpy, "_NET_DESKTOP_NAMES", false), XInternAtom(globals.dpy, "_NET_CLIENT_LIST", false), XInternAtom(globals.dpy, "_NET_CURRENT_DESKTOP", false), XInternAtom(globals.dpy, "_NET_DESKTOP_VIEWPORT", false)};
+ int wsNamesLen = cfg.numWS; //For null bytes
+ for(int i = 0; i < cfg.numWS; i++)
{
- wsNamesLen += workspaces[i].name.length();
+ wsNamesLen += cfg.workspaces[i].name.length();
}
- char wsNames[wsNamesLen];
+ char *wsNames = new char[wsNamesLen];
int pos = 0;
- for(int i = 0; i < numWS; i++)
+ for(int i = 0; i < cfg.numWS; i++)
{
- for(char toAdd : workspaces[i].name)
+ for(char toAdd : cfg.workspaces[i].name)
{
wsNames[pos++] = toAdd;
}
wsNames[pos++] = '\0';
}
- unsigned long numDesktops = numWS;
- Atom netSupportedAtom = XInternAtom(*dpy_, "_NET_SUPPORTED", false);
- Atom netNumDesktopsAtom = XInternAtom(*dpy_, "_NET_NUMBER_OF_DESKTOPS", false);
- Atom netDesktopNamesAtom = XInternAtom(*dpy_, "_NET_DESKTOP_NAMES", false);
- Atom XA_UTF8STRING = XInternAtom(*dpy_, "UTF8_STRING", false);
- XChangeProperty(*dpy_, *root_, netSupportedAtom, XA_ATOM, 32, PropModeReplace, (unsigned char*)supported, 3);
- XChangeProperty(*dpy_, *root_, netDesktopNamesAtom, XA_UTF8STRING, 8, PropModeReplace, (unsigned char*)&wsNames, wsNamesLen);
- XChangeProperty(*dpy_, *root_, netNumDesktopsAtom, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)&numDesktops, 1);
-
+ unsigned long numDesktops = cfg.numWS;
+ Atom netSupportedAtom = XInternAtom(globals.dpy, "_NET_SUPPORTED", false);
+ Atom netNumDesktopsAtom = XInternAtom(globals.dpy, "_NET_NUMBER_OF_DESKTOPS", false);
+ Atom netDesktopNamesAtom = XInternAtom(globals.dpy, "_NET_DESKTOP_NAMES", false);
+ Atom XA_UTF8STRING = XInternAtom(globals.dpy, "UTF8_STRING", false);
+ XChangeProperty(globals.dpy, globals.root, netSupportedAtom, XA_ATOM, 32, PropModeReplace, (unsigned char*)supported, 5);
+ XChangeProperty(globals.dpy, globals.root, netDesktopNamesAtom, XA_UTF8STRING, 8, PropModeReplace, (unsigned char*)wsNames, wsNamesLen);
+ XChangeProperty(globals.dpy, globals.root, netNumDesktopsAtom, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)&numDesktops, 1);
+ delete[] wsNames;
}
-void updateClientList(std::map<int, Client> clients)
+void EWMHModule::updateClientList(std::map<int, Client> clients)
{
- Atom netClientList = XInternAtom(*dpy_, "_NET_CLIENT_LIST", false);
- XDeleteProperty(*dpy_, *root_, netClientList);
+ Atom netClientList = XInternAtom(globals.dpy, "_NET_CLIENT_LIST", false);
+ XDeleteProperty(globals.dpy, globals.root, netClientList);
std::map<int, Client>::iterator cItr;
for(cItr = clients.begin(); cItr != clients.end(); cItr++)
{
- XChangeProperty(*dpy_, *root_, netClientList, XA_WINDOW, 32, PropModeAppend, (unsigned char*)&cItr->second.w, 1);
+ XChangeProperty(globals.dpy, globals.root, netClientList, XA_WINDOW, 32, PropModeAppend, (unsigned char*)&cItr->second.w, 1);
}
}
-void setWindowDesktop(Window w, int desktop)
+void EWMHModule::updateScreens(ScreenInfo* screens, int nscreens)
+{
+ unsigned long *desktopViewports = new unsigned long[cfg.numWS*2];
+ memset(desktopViewports, 0, sizeof(int)*cfg.numWS*2);
+
+ for(int i = 0; i < cfg.numWS; i++)
+ {
+ for(int j = 0; j < cfg.workspaces[i].screenPreferencesc; j++)
+ {
+ if(cfg.workspaces[i].screenPreferences[j] < nscreens)
+ {
+ desktopViewports[i*2] = screens[cfg.workspaces[i].screenPreferences[j]].x;
+ desktopViewports[i*2 + 1] = screens[cfg.workspaces[i].screenPreferences[j]].y;
+ break;
+ }
+ }
+ }
+
+ Atom netDesktopViewport = XInternAtom(globals.dpy, "_NET_DESKTOP_VIEWPORT", false);
+ int status = XChangeProperty(globals.dpy, globals.root, netDesktopViewport, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)desktopViewports, cfg.numWS*2);
+
+ delete[] desktopViewports;
+}
+
+void EWMHModule::setWindowDesktop(Window w, int desktop)
{
unsigned long currDesktop = desktop - 1;
- Atom netWMDesktop = XInternAtom(*dpy_, "_NET_WM_DESKTOP", false);
- XChangeProperty(*dpy_, w, netWMDesktop, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)&currDesktop, 1);
+ Atom netWMDesktop = XInternAtom(globals.dpy, "_NET_WM_DESKTOP", false);
+ XChangeProperty(globals.dpy, w, netWMDesktop, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)&currDesktop, 1);
}
-void setCurrentDesktop(int desktop)
+void EWMHModule::setCurrentDesktop(int desktop)
{
unsigned long currDesktop = desktop - 1;
- Atom netCurrentDesktop = XInternAtom(*dpy_, "_NET_CURRENT_DESKTOP", false);
- XChangeProperty(*dpy_, *root_, netCurrentDesktop, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)&currDesktop, 1);
+ Atom netCurrentDesktop = XInternAtom(globals.dpy, "_NET_CURRENT_DESKTOP", false);
+ XChangeProperty(globals.dpy, globals.root, netCurrentDesktop, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)&currDesktop, 1);
}
-void setFullscreen(Window w, bool fullscreen)
+void EWMHModule::setFullscreen(Window w, bool fullscreen)
{
- Atom netWMState = XInternAtom(*dpy_, "_NET_WM_STATE", false);
+ Atom netWMState = XInternAtom(globals.dpy, "_NET_WM_STATE", false);
Atom netWMStateVal;
if(fullscreen)
- netWMStateVal = XInternAtom(*dpy_, "_NET_WM_STATE_FULLSCREEN", false);
+ netWMStateVal = XInternAtom(globals.dpy, "_NET_WM_STATE_FULLSCREEN", false);
else
- netWMStateVal = XInternAtom(*dpy_, "", false);
- XChangeProperty(*dpy_, w, netWMState, XA_ATOM, 32, PropModeReplace, (unsigned char*)&netWMStateVal, 1);
+ netWMStateVal = XInternAtom(globals.dpy, "", false);
+ XChangeProperty(globals.dpy, w, netWMState, XA_ATOM, 32, PropModeReplace, (unsigned char*)&netWMStateVal, 1);
}
-void setIPCPath(unsigned char* path, int len)
+void EWMHModule::setIPCPath(unsigned char* path, int len)
{
- Atom socketPathAtom = XInternAtom(*dpy_, "YATWM_SOCKET_PATH", false);
- XChangeProperty(*dpy_, *root_, socketPathAtom, XA_STRING, 8, PropModeReplace, path, len);
+ Atom socketPathAtom = XInternAtom(globals.dpy, "YATWM_SOCKET_PATH", false);
+ XChangeProperty(globals.dpy, globals.root, socketPathAtom, XA_STRING, 8, PropModeReplace, path, len);
}
-int getProp(Window w, char* propName, Atom* type, unsigned char** data)
+int EWMHModule::getProp(Window w, char* propName, Atom* type, unsigned char** data)
{
- Atom prop_type = XInternAtom(*dpy_, propName, false);
+ Atom prop_type = XInternAtom(globals.dpy, propName, false);
int format;
unsigned long length;
unsigned long after;
- int status = XGetWindowProperty(*dpy_, w, prop_type,
+ int status = XGetWindowProperty(globals.dpy, w, prop_type,
0L, 1L, False,
AnyPropertyType, type, &format,
&length, &after, data);
diff --git a/src/ewmh.h b/src/ewmh.h
index 9473d5d..cb1284a 100644
--- a/src/ewmh.h
+++ b/src/ewmh.h
@@ -9,17 +9,30 @@
#include "structs.h"
#include "config.h"
+#include "util.h"
-void initEWMH(Display** dpy, Window* root, int numWS, std::vector<Workspace> workspaces);
+class EWMHModule
+{
+public:
+ EWMHModule(Globals& globals, Config& cfg);
+
+ void init();
-void updateClientList(std::map<int, Client> clients);
+ void updateClientList(std::map<int, Client> clients);
-void setWindowDesktop(Window w, int desktop);
+ void updateScreens(ScreenInfo* screens, int nscreens);
-void setCurrentDesktop(int desktop);
+ void setWindowDesktop(Window w, int desktop);
-void setFullscreen(Window w, bool fullscreen);
+ void setCurrentDesktop(int desktop);
-void setIPCPath(unsigned char* path, int len);
+ void setFullscreen(Window w, bool fullscreen);
-int getProp(Window w, char* propName, Atom* type, unsigned char** data);
+ void setIPCPath(unsigned char* path, int len);
+
+ int getProp(Window w, char* propName, Atom* type, unsigned char** data);
+
+private:
+ Globals& globals;
+ Config& cfg;
+};
diff --git a/src/keybinds.cpp b/src/keybinds.cpp
index 1f60a75..828b7f6 100644
--- a/src/keybinds.cpp
+++ b/src/keybinds.cpp
@@ -12,6 +12,10 @@
#include "keybinds.h"
#include "util.h"
+// #define ENABLE_DEBUG
+
+#include "debug.h"
+
using std::string, std::cout, std::endl;
bool Keybind::operator<(const Keybind &o) const {
@@ -69,9 +73,6 @@ void KeybindsModule::changeMap(int newMapID)
const void KeybindsModule::handleKeypress(XKeyEvent e)
{
if(e.same_screen!=1) return;
- // cout << "Key Pressed" << endl;
- // cout << "\tState: " << e.state << endl;
- // cout << "\tCode: " << XKeysymToString(XKeycodeToKeysym(globals.dpy, e.keycode, 0)) << endl;
updateMousePos();
const unsigned int masks = ShiftMask | ControlMask | Mod1Mask | Mod4Mask;
@@ -82,9 +83,14 @@ const void KeybindsModule::handleKeypress(XKeyEvent e)
}
else if(getKeymap(currentMapID).count(k) > 0)
{
+ debug(cout << "Key Pressed" << endl);
+ debug(cout << "\tState: " << e.state << endl);
+ debug(cout << "\tCode: " << XKeysymToString(XKeycodeToKeysym(globals.dpy, e.keycode, 0)) << endl);
+
KeyFunction& c = getKeymap(currentMapID).find(k)->second;
- if(getKeymap(c.mapID).size() == 0)
+ if(c.mapID == -1)
{
+ debug(cout << '\t' << c.command << endl);
commandsModule.runCommand(c.command);
changeMap(0);
}
@@ -168,7 +174,7 @@ const Keybind KeybindsModule::emacsBindMode(string bindString)
Keybind bind;
bind.modifiers = 0;
- //cout << "Adding keybind: '" << bindString << "'" << endl;
+ debug(cout << "Adding keybind: '" << bindString << "'" << endl);
const std::regex keyRegex("^((?:[CMSs]-)*)([^\\s]|(?:SPC|ESC|RET))$");
std::smatch keyMatch;
@@ -179,34 +185,34 @@ const Keybind KeybindsModule::emacsBindMode(string bindString)
{
if(modifier == "s")
{
- //cout << "\tModifier: s" << endl;
+ debug(cout << "\tModifier: s" << endl);
bind.modifiers |= cfg.swapSuperAlt?Mod1Mask:Mod4Mask;
}
else if(modifier == "M")
{
- //cout << "\tModifier: M" << endl;
+ debug(cout << "\tModifier: M" << endl);
bind.modifiers |= cfg.swapSuperAlt?Mod4Mask:Mod1Mask;
}
else if(modifier == "C")
{
- //cout << "\tModifier: C" << endl;
+ debug(cout << "\tModifier: C" << endl);
bind.modifiers |= ControlMask;
}
else if(modifier == "S")
{
- //cout << "\tModifier: S" << endl;
+ debug(cout << "\tModifier: S" << endl);
bind.modifiers |= ShiftMask;
}
}
}
KeySym keySym = XStringToKeysym(keyMatch[2].str().c_str());
- //cout << "\tKey: " << keyMatch[2].str() << endl;
+ debug(cout << "\tKey: " << keyMatch[2].str() << endl);
- if(isUpper(keyMatch[2].str().c_str()) && keySym != NoSymbol)
+ if(keySym != NoSymbol && isUpper(keyMatch[2].str().c_str()))
{
bind.modifiers |= ShiftMask;
}
- if(keySym == NoSymbol)
+ else if(keySym == NoSymbol)
{
if(keyMatch[2].str() == "RET")
keySym = XK_Return;
@@ -218,10 +224,16 @@ const Keybind KeybindsModule::emacsBindMode(string bindString)
keySym = XK_minus;
else if(keyMatch[2].str() == "+")
keySym = XK_plus;
+ else if(keyMatch[2].str() == "[")
+ keySym = XK_bracketleft;
+ else if(keyMatch[2].str() == "]")
+ keySym = XK_bracketright;
else
throw Err(CFG_ERR_KEYBIND, "Keybind '" + bindString + "' is invalid");
}
bind.key = XKeysymToKeycode(globals.dpy, keySym);
+
+ debug(cout << "\tState: " << bind.modifiers << endl);
return bind;
}
@@ -258,9 +270,10 @@ const void KeybindsModule::bind(const CommandArg* argv)
Keybind bind = getKeybind(keys[keys.size() - 1]);
if(getKeymap(currentBindingMap).count(bind) <= 0)
{
- KeyFunction function = {argv[1].str, nextKeymapID};
- keyMaps.insert({nextKeymapID, std::map<Keybind, KeyFunction>()});
- nextKeymapID++;
+ KeyFunction function = {argv[1].str, -1};
+ debug(cout << "\tCommand: " << argv[1].str << endl);
+ // keyMaps.insert({nextKeymapID, std::map<Keybind, KeyFunction>()});
+ // nextKeymapID++;
getKeymap(currentBindingMap).insert({bind, function});
if(currentBindingMap == currentMapID)
{
diff --git a/src/main.cpp b/src/main.cpp
index 45e4eba..dc7b86b 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -4,11 +4,12 @@
#include <X11/cursorfont.h>
#include <X11/Xutil.h>
#include <X11/extensions/Xrandr.h>
+#include <X11/extensions/Xinerama.h>
+#include <cstdint>
#include <libnotify/notification.h>
#include <libnotify/notify.h>
-#include <chrono>
#include <cstdio>
#include <cstdlib>
#include <ctime>
@@ -17,7 +18,6 @@
#include <iostream>
#include <map>
#include <ostream>
-#include <regex>
#include <string>
#include <sys/poll.h>
#include <sys/select.h>
@@ -54,6 +54,9 @@ char nowString[80];
updateTime(); \
yatlog << nowString << x << std::endl
+
+const char* version = "YATwm for X - v0.0.2";
+
Display* dpy;
Window root;
@@ -64,7 +67,8 @@ void updateMousePos();
CommandsModule commandsModule;
Config cfg(commandsModule);
KeybindsModule keybindsModule(commandsModule, cfg, globals, &updateMousePos);
-IPCServerModule ipc(commandsModule, cfg, globals);
+EWMHModule ewmh(globals, cfg);
+IPCServerModule ipc(globals, cfg, commandsModule, ewmh);
int sW, sH;
int bH;
@@ -113,7 +117,7 @@ static int OnXError(Display* display, XErrorEvent* e);
// Tiling
// Call this one to tile everything (it does all the fancy stuff trust me just call this one)
void tileRoots();
-// Call this one to until everything (it handles multiple monitors)
+// Call this one to untile everything (it handles multiple monitors)
void untileRoots();
// This is to be called by tileRoots, it takes in the x, y, w, and h of where it's allowed to tile windows to, and returns the ID of a fullscreen client if one is found, or noID (-1) if none are found
int tile(int frameID, int x, int y, int w, int h);
@@ -132,6 +136,9 @@ void detectScreens()
delete[] screens;
delete[] focusedWorkspaces;
log("Detecting screens: ");
+
+
+
XRRMonitorInfo* monitors = XRRGetMonitors(dpy, root, true, &nscreens);
log("\t" << nscreens << " monitors");
screens = new ScreenInfo[nscreens];
@@ -146,14 +153,26 @@ void detectScreens()
log("\t\tw: " << screens[i].w << ", h: " << screens[i].h);
XFree(name);
}
- for(int i = 0; i < cfg.workspaces.size(); i++)
+
+ /*
+ XineramaScreenInfo* monitors = XineramaQueryScreens(dpy, &nscreens);
+ log("\t" << nscreens << " monitors");
+ if(XineramaIsActive(dpy))
+ log("\tXinerama active");
+ screens = new ScreenInfo[nscreens];
+ for(int i = 0; i < nscreens; i++)
{
- if(cfg.workspaces[i].screenPreferences[0] < nscreens && focusedWorkspaces[cfg.workspaces[i].screenPreferences[0]] == 0)
- {
- //focusedWorkspaces[screenPreferences[i][0]] = i+1;
- }
- }
+ screens[i] = {"", (uint16_t)monitors[i].x_org, (uint16_t)monitors[i].y_org, (uint16_t)monitors[i].width, (uint16_t)monitors[i].height};
+ log("\tMonitor " << i + 1);
+ log("\t\tx: " << screens[i].x << ", y: " << screens[i].y);
+ log("\t\tw: " << screens[i].w << ", h: " << screens[i].h);
+ };
+ */
+
+
XFree(monitors);
+
+ ewmh.updateScreens(screens, nscreens);
}
void updateMousePos()
{
@@ -271,7 +290,7 @@ void cWS(int newWS)
focusWindow(getFrame(currWS).rootData->focus);
//EWMH
- setCurrentDesktop(currWS);
+ ewmh.setCurrentDesktop(currWS);
}
void focusWindow(Window w)
{
@@ -393,7 +412,7 @@ const void wToWS(const CommandArg* argv)
frames.find(argv[0].num)->second.subFrameIDs.push_back(fID);
//EWMH
- setWindowDesktop(focusedWindow, argv[0].num);
+ ewmh.setWindowDesktop(focusedWindow, argv[0].num);
XUnmapWindow(dpy, focusedWindow);
//tile(currWS, outerGaps, outerGaps, sW - outerGaps*2, sH - outerGaps*2 - bH);
@@ -611,7 +630,7 @@ const void fullscreen(const CommandArg* arg)
int cID = getFrame(fID).cID;
getClient(cID).fullscreen ^= true;
tileRoots();
- setFullscreen(focusedWindow, getClient(cID).fullscreen);
+ ewmh.setFullscreen(focusedWindow, getClient(cID).fullscreen);
}
void configureRequest(XConfigureRequestEvent e)
@@ -697,7 +716,7 @@ void mapRequest(XMapRequestEvent e)
unsigned char* data;
Atom type;
- int status = getProp(e.window, "_NET_WM_WINDOW_TYPE", &type, &data);
+ int status = ewmh.getProp(e.window, "_NET_WM_WINDOW_TYPE", &type, &data);
if (status == Success && type != None && ((Atom*)data)[0] == XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DOCK", false))
{
log("\tWindow was bar");
@@ -730,15 +749,15 @@ void mapRequest(XMapRequestEvent e)
//Add ID to frameIDS map
frameIDS.insert(pair<Window, int>(e.window, f.ID));
- status = getProp(e.window, "_NET_WM_STATE", &type, &data);
+ status = ewmh.getProp(e.window, "_NET_WM_STATE", &type, &data);
if(status == Success && type!=None && (((Atom*)data)[0] == XInternAtom(dpy, "_NET_WM_STATE_MODAL", false) || ((Atom*)data)[0] == XInternAtom(dpy, "_NET_WM_STATE_ABOVE", false)))
{
cout << "Floating" << endl;
clients.find(c.ID)->second.floating = true;
frames.find(pID)->second.rootData->floatingFrameIDs.push_back(f.ID);
frames.insert(pair<int, Frame>(f.ID, f));
- setWindowDesktop(e.window, currWS);
- updateClientList(clients);
+ ewmh.setWindowDesktop(e.window, currWS);
+ ewmh.updateClientList(clients);
XFree(data);
//tile(currWS, outerGaps, outerGaps, sW - outerGaps*2, sH - outerGaps*2 - bH);
tileRoots();
@@ -785,8 +804,8 @@ void mapRequest(XMapRequestEvent e)
//Add to frames map
frames.insert(pair<int, Frame>(f.ID, f));
- setWindowDesktop(e.window, currWS);
- updateClientList(clients);
+ ewmh.setWindowDesktop(e.window, currWS);
+ ewmh.updateClientList(clients);
//tile(currWS, outerGaps, outerGaps, sW - outerGaps*2, sH - outerGaps*2 - bH);
focusWindow(e.window);
@@ -839,7 +858,7 @@ void destroyNotify(XDestroyWindowEvent e)
//tile(currWS, outerGaps, outerGaps, sW - outerGaps*2, sH - outerGaps*2 - bH);
tileRoots();
- updateClientList(clients);
+ ewmh.updateClientList(clients);
}
void enterNotify(XEnterWindowEvent e)
{
@@ -902,7 +921,7 @@ void clientMessage(XClientMessageEvent e)
int fID = getFrameID(e.window);
int cID = getFrame(fID).cID;
getClient(cID).fullscreen = (Atom) e.data.l[0] > 0;
- setFullscreen(e.window, (Atom) e.data.l[0] > 0);
+ ewmh.setFullscreen(e.window, (Atom) e.data.l[0] > 0);
tileRoots();
}
XFree(prop1);
@@ -976,7 +995,7 @@ int tile(int frameID, int x, int y, int w, int h)
return fullscreenClientID;
continue;
}
- Client c = clients.find(f.cID)->second;
+ Client c = getClient(f.cID);
if(c.fullscreen)
return c.ID;
wX += cfg.gaps;
@@ -1019,25 +1038,24 @@ void untile(int frameID)
void printVersion()
{
- const char* version =
- "YATwm for X\n"
- "version 0.0.1";
cout << version << endl;
}
int main(int argc, char** argv)
{
int versionFlag = 0;
+ int noSocketFlag = 0;
bool immediateExit = false;
string configLocation = "";
while(1)
{
static option long_options[] = {{"version", no_argument, &versionFlag, 1},
{"config", required_argument, NULL, 'c'},
+ {"nosocket", no_argument, &noSocketFlag, 1},
{0, 0, 0, 0}};
int optionIndex;
- char c = getopt_long(argc, argv, "c:v", long_options, &optionIndex);
+ char c = getopt_long(argc, argv, "c:nv", long_options, &optionIndex);
if(c == -1)
break;
@@ -1055,6 +1073,8 @@ int main(int argc, char** argv)
case 'v':
versionFlag = 1;
break;
+ case 'n':
+ noSocketFlag = 1;
case '?':
//Error??
break;
@@ -1130,21 +1150,25 @@ int main(int argc, char** argv)
cout << "Registered commands" << endl;
- if(configLocation != "")
- cfgErr = cfg.loadFromFile(configLocation);
- else
+ // if(configLocation != "")
+ // cfgErr = cfg.loadFromFile(configLocation);
+ if(configLocation == "")
{
char* confDir = getenv("XDG_CONFIG_HOME");
if(confDir != NULL)
- cfgErr = cfg.loadFromFile(string(confDir) + "/YATwm/config");
+ configLocation = string(confDir) + "/YATwm/config";
+ // cfgErr = cfg.loadFromFile(string(confDir) + "/YATwm/config");
else
{
string home = getenv("HOME");
- cfgErr = cfg.loadFromFile(home + "/.config/YATwm/config");
+ configLocation = home + "/.config/YATwm/config";
+ // cfgErr = cfg.loadFromFile(home + "/.config/YATwm/config");
}
}
- cout << "Done config" << endl;
+ cfgErr = cfg.loadFromFile(configLocation);
+
+ cout << "Loaded config" << endl;
//Log
yatlog.open(cfg.logFile, std::ios_base::app);
@@ -1152,6 +1176,9 @@ int main(int argc, char** argv)
//Print starting message
log("-------- YATWM STARTING --------");
+ log(version);
+ log("Running from command: " << argv[0]);
+ log("Reading config from file: " << configLocation);
//Notifications
notify_init("YATwm");
@@ -1172,10 +1199,11 @@ int main(int argc, char** argv)
XDefineCursor(dpy, root, XCreateFontCursor(dpy, XC_top_left_arrow));
//EWMH
- initEWMH(&dpy, &root, cfg.workspaces.size(), cfg.workspaces);
- setCurrentDesktop(1);
+ ewmh.init();
+ ewmh.setCurrentDesktop(1);
- ipc.init();
+ if(!noSocketFlag)
+ ipc.init();
for(int i = 1; i < cfg.numWS + 1; i++)
{
@@ -1192,18 +1220,15 @@ int main(int argc, char** argv)
fd_set fdset;
int x11fd = ConnectionNumber(dpy);
- FD_ZERO(&fdset);
- FD_SET(x11fd, &fdset);
- FD_SET(ipc.getFD(), &fdset);
-
log("Begin mainloop");
while(keepGoing)
{
FD_ZERO(&fdset);
FD_SET(x11fd, &fdset);
- FD_SET(ipc.getFD(), &fdset);
+ if(!noSocketFlag)
+ FD_SET(ipc.getFD(), &fdset);
int ready = select(std::max(x11fd, ipc.getFD()) + 1, &fdset, NULL, NULL, NULL);
- if(FD_ISSET(ipc.getFD(), &fdset))
+ if(!noSocketFlag && FD_ISSET(ipc.getFD(), &fdset))
{
ipc.doListen();
}
@@ -1248,5 +1273,7 @@ int main(int argc, char** argv)
//Kill children
ipc.quitIPC();
+ delete[] screens;
+ delete[] focusedWorkspaces;
XCloseDisplay(dpy);
}
diff --git a/src/structs.h b/src/structs.h
index 5273f52..ddeff5d 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -2,8 +2,9 @@
#include <X11/Xlib.h>
-#include <X11/extensions/Xrandr.h>
+#include <cstdint>
#include <string>
+#include <sys/types.h>
#include <vector>
#define noID -1