summaryrefslogtreecommitdiff
path: root/src/events/Windows.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-03-24 18:22:01 +0100
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-03-24 18:22:01 +0100
commitccbc0e4a2e4b1bcd9966b59edfbb0aaf6c27a52d (patch)
treeb4e80c8112416a408576d47ad7a7da2cfc4f66c9 /src/events/Windows.cpp
parent8cec07c39d17472a93c383683ca5c49f0119be77 (diff)
Added window rules
Diffstat (limited to 'src/events/Windows.cpp')
-rw-r--r--src/events/Windows.cpp66
1 files changed, 63 insertions, 3 deletions
diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp
index c6f4e352..0ee5e158 100644
--- a/src/events/Windows.cpp
+++ b/src/events/Windows.cpp
@@ -36,13 +36,73 @@ void Events::listener_mapWindow(wl_listener* listener, void* data) {
wl_signal_add(&PWINDOWSURFACE->events.new_subsurface, &PWINDOW->listen_newSubsurfaceWindow);
- if (g_pXWaylandManager->shouldBeFloated(PWINDOW)) {
- g_pLayoutManager->getCurrentLayout()->onWindowCreatedFloating(PWINDOW);
+ if (g_pXWaylandManager->shouldBeFloated(PWINDOW))
PWINDOW->m_bIsFloating = true;
+
+ // window rules
+ const auto WINDOWRULES = g_pConfigManager->getMatchingRules(PWINDOW);
+
+ for (auto& r : WINDOWRULES) {
+ if (r.szRule.find("monitor") == 0) {
+ try {
+ const long int MONITOR = std::stoi(r.szRule.substr(r.szRule.find(" ")));
+
+ Debug::log(LOG, "Rule monitor, applying to window %x", PWINDOW);
+
+ if (MONITOR >= (long int)g_pCompositor->m_lMonitors.size() || MONITOR < (long int)0)
+ PWINDOW->m_iMonitorID = 0;
+ else
+ PWINDOW->m_iMonitorID = MONITOR;
+
+ PWINDOW->m_iWorkspaceID = g_pCompositor->getMonitorFromID(PWINDOW->m_iMonitorID)->activeWorkspace;
+ } catch (...) {
+ Debug::log(LOG, "Rule monitor failed, rule: %s -> %s", r.szRule.c_str(), r.szValue.c_str());
+ }
+ } else if (r.szRule.find("float") == 0) {
+ PWINDOW->m_bIsFloating = true;
+ } else if (r.szRule.find("tile") == 0) {
+ PWINDOW->m_bIsFloating = false;
+ }
+ }
+
+ if (PWINDOW->m_bIsFloating) {
+ g_pLayoutManager->getCurrentLayout()->onWindowCreatedFloating(PWINDOW);
+
+ // size and move rules
+ for (auto& r : WINDOWRULES) {
+ if (r.szRule.find("size") == 0) {
+ try {
+ const auto VALUE = r.szRule.substr(r.szRule.find(" ") + 1);
+ const auto SIZEX = stoi(VALUE.substr(0, VALUE.find(" ")));
+ const auto SIZEY = stoi(VALUE.substr(VALUE.find(" ") + 1));
+
+ Debug::log(LOG, "Rule size, applying to window %x", PWINDOW);
+
+ PWINDOW->m_vEffectiveSize = Vector2D(SIZEX, SIZEY);
+ g_pXWaylandManager->setWindowSize(PWINDOW, PWINDOW->m_vEffectiveSize);
+ } catch (...) {
+ Debug::log(LOG, "Rule size failed, rule: %s -> %s", r.szRule.c_str(), r.szValue.c_str());
+ }
+ } else if (r.szRule.find("move") == 0) {
+ try {
+ const auto VALUE = r.szRule.substr(r.szRule.find(" ") + 1);
+ const auto POSX = stoi(VALUE.substr(0, VALUE.find(" ")));
+ const auto POSY = stoi(VALUE.substr(VALUE.find(" ") + 1));
+
+ Debug::log(LOG, "Rule move, applying to window %x", PWINDOW);
+
+ PWINDOW->m_vEffectivePosition = Vector2D(POSX, POSY) + PMONITOR->vecPosition;
+ } catch (...) {
+ Debug::log(LOG, "Rule move failed, rule: %s -> %s", r.szRule.c_str(), r.szValue.c_str());
+ }
+ }
+ }
}
else
g_pLayoutManager->getCurrentLayout()->onWindowCreated(PWINDOW);
-
+
+ PWINDOW->m_szTitle = g_pXWaylandManager->getTitle(PWINDOW);
+
if (!PWINDOW->m_bIsModal)
g_pCompositor->focusWindow(PWINDOW);