Skip to content

Commit

Permalink
Master layout: added SMasterWorkspaceData structure for keeping works…
Browse files Browse the repository at this point in the history
…pace-specific data (#1059)

Accommodates the new orientation data
Also introduced a master:orientation setting to set the default orientation
  • Loading branch information
proycon committed Dec 10, 2022
1 parent c2bce7b commit 73ba245
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 40 deletions.
1 change: 1 addition & 0 deletions src/config/ConfigManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ void CConfigManager::setDefaultVars() {
configValues["master:new_is_master"].intValue = 1;
configValues["master:new_on_top"].intValue = 0;
configValues["master:no_gaps_when_only"].intValue = 0;
configValues["master:orientation"].strValue = "left";

configValues["animations:enabled"].intValue = 1;
configValues["animations:speed"].floatValue = 7.f;
Expand Down
1 change: 0 additions & 1 deletion src/helpers/Workspace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ CWorkspace::CWorkspace(int monitorID, std::string name, bool special) {
m_iMonitorID = monitorID;
m_szName = name;
m_bIsSpecialWorkspace = special;
m_orientation = ORIENTATION_LEFT;

if (!special) {
m_pWlrHandle = wlr_ext_workspace_handle_v1_create(PMONITOR->pWLRWorkspaceGroupHandle);
Expand Down
10 changes: 0 additions & 10 deletions src/helpers/Workspace.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,6 @@ enum eFullscreenMode : uint8_t {
FULLSCREEN_MAXIMIZED
};

//orientation is used by the Master layout
//and determines which side of the screen the master area resides
enum eOrientation: uint8_t {
ORIENTATION_LEFT =0,
ORIENTATION_TOP,
ORIENTATION_RIGHT,
ORIENTATION_BOTTOM
};

class CWindow;

class CWorkspace {
Expand All @@ -34,7 +25,6 @@ class CWorkspace {
int m_iPrevWorkspaceID = -1;
bool m_bHasFullscreenWindow = false;
eFullscreenMode m_efFullscreenMode = FULLSCREEN_FULL;
eOrientation m_orientation = ORIENTATION_LEFT;

wlr_ext_workspace_handle_v1* m_pWlrHandle = nullptr;

Expand Down
72 changes: 45 additions & 27 deletions src/layout/MasterLayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,28 @@ int CHyprMasterLayout::getMastersOnWorkspace(const int& ws) {
return no;
}

SMasterWorkspaceData* CHyprMasterLayout::getMasterWorkspaceData(const int& ws) {
for (auto& n : m_lMasterWorkspacesData) {
if (n.workspaceID == ws)
return &n;
}

//create on the fly if it doesn't exist yet
const auto PWORKSPACEDATA = &m_lMasterWorkspacesData.emplace_back();
PWORKSPACEDATA->workspaceID = ws;
const auto orientation = g_pConfigManager->getString("master:orientation");
if (orientation == "top") {
PWORKSPACEDATA->orientation = ORIENTATION_TOP;
} else if (orientation == "right") {
PWORKSPACEDATA->orientation = ORIENTATION_RIGHT;
} else if (orientation == "bottom") {
PWORKSPACEDATA->orientation = ORIENTATION_BOTTOM;
} else {
PWORKSPACEDATA->orientation = ORIENTATION_LEFT;
}
return PWORKSPACEDATA;
}

std::string CHyprMasterLayout::getLayoutName() {
return "Master";
}
Expand Down Expand Up @@ -187,6 +209,8 @@ void CHyprMasterLayout::calculateWorkspace(const int& ws) {
if (!PWORKSPACE)
return;

const auto PWORKSPACEDATA = getMasterWorkspaceData(ws);

const auto PMONITOR = g_pCompositor->getMonitorFromID(PWORKSPACE->m_iMonitorID);

const auto PMASTERNODE = getMasterNodeOnWorkspace(PWORKSPACE->m_iID);
Expand All @@ -202,15 +226,15 @@ void CHyprMasterLayout::calculateWorkspace(const int& ws) {
PMASTERNODE->size = Vector2D(PMONITOR->vecSize.x - PMONITOR->vecReservedTopLeft.x - PMONITOR->vecReservedBottomRight.x, PMONITOR->vecSize.y - PMONITOR->vecReservedBottomRight.y - PMONITOR->vecReservedTopLeft.y);
applyNodeDataToWindow(PMASTERNODE);
return;
} else if (PWORKSPACE->m_orientation == ORIENTATION_LEFT || PWORKSPACE->m_orientation == ORIENTATION_RIGHT) {
} else if (PWORKSPACEDATA->orientation == ORIENTATION_LEFT || PWORKSPACEDATA->orientation == ORIENTATION_RIGHT) {
float heightLeft = PMONITOR->vecSize.y - PMONITOR->vecReservedBottomRight.y - PMONITOR->vecReservedTopLeft.y;
int nodesLeft = MASTERS;
float nextY = 0;
const float WIDTH = (PMONITOR->vecSize.x - PMONITOR->vecReservedTopLeft.x - PMONITOR->vecReservedBottomRight.x) * PMASTERNODE->percMaster;

for (auto& n : m_lMasterNodesData) {
if (n.workspaceID == PWORKSPACE->m_iID && n.isMaster) {
if (PWORKSPACE->m_orientation == ORIENTATION_RIGHT) {
if (PWORKSPACEDATA->orientation == ORIENTATION_RIGHT) {
n.position = PMONITOR->vecReservedTopLeft + PMONITOR->vecPosition + Vector2D(PMONITOR->vecSize.x - WIDTH, nextY);
} else {
n.position = PMONITOR->vecReservedTopLeft + PMONITOR->vecPosition + Vector2D(0, nextY);
Expand All @@ -227,15 +251,15 @@ void CHyprMasterLayout::calculateWorkspace(const int& ws) {
applyNodeDataToWindow(&n);
}
}
} else if (PWORKSPACE->m_orientation == ORIENTATION_TOP || PWORKSPACE->m_orientation == ORIENTATION_BOTTOM) {
} else if (PWORKSPACEDATA->orientation == ORIENTATION_TOP || PWORKSPACEDATA->orientation == ORIENTATION_BOTTOM) {
float widthLeft = PMONITOR->vecSize.x - PMONITOR->vecReservedBottomRight.x - PMONITOR->vecReservedTopLeft.x;
int nodesLeft = MASTERS;
float nextX = 0;
const float HEIGHT = (PMONITOR->vecSize.y - PMONITOR->vecReservedBottomRight.y - PMONITOR->vecReservedTopLeft.y) * PMASTERNODE->percMaster;

for (auto& n : m_lMasterNodesData) {
if (n.workspaceID == PWORKSPACE->m_iID && n.isMaster) {
if (PWORKSPACE->m_orientation == ORIENTATION_BOTTOM) {
if (PWORKSPACEDATA->orientation == ORIENTATION_BOTTOM) {
n.position = PMONITOR->vecReservedTopLeft + PMONITOR->vecPosition + Vector2D(nextX,PMONITOR->vecSize.y - HEIGHT - PMONITOR->vecReservedBottomRight.y);
} else {
n.position = PMONITOR->vecReservedTopLeft + PMONITOR->vecPosition + Vector2D(nextX, 0);
Expand All @@ -257,7 +281,7 @@ void CHyprMasterLayout::calculateWorkspace(const int& ws) {

//compute placement of slave window(s)
int slavesLeft = getNodesOnWorkspace(PWORKSPACE->m_iID) - MASTERS;
if (PWORKSPACE->m_orientation == ORIENTATION_LEFT || PWORKSPACE->m_orientation == ORIENTATION_RIGHT) {
if (PWORKSPACEDATA->orientation == ORIENTATION_LEFT || PWORKSPACEDATA->orientation == ORIENTATION_RIGHT) {
float heightLeft = PMONITOR->vecSize.y - PMONITOR->vecReservedBottomRight.y - PMONITOR->vecReservedTopLeft.y;
float nextY = 0;
const float WIDTH = PMONITOR->vecSize.x - PMONITOR->vecReservedBottomRight.x - PMONITOR->vecReservedTopLeft.x - PMASTERNODE->size.x;
Expand All @@ -266,7 +290,7 @@ void CHyprMasterLayout::calculateWorkspace(const int& ws) {
if (nd.workspaceID != PWORKSPACE->m_iID || nd.isMaster)
continue;

if (PWORKSPACE->m_orientation == ORIENTATION_LEFT) {
if (PWORKSPACEDATA->orientation == ORIENTATION_LEFT) {
nd.position = PMONITOR->vecReservedTopLeft + PMONITOR->vecPosition + Vector2D(PMASTERNODE->percMaster * (PMONITOR->vecSize.x - PMONITOR->vecReservedTopLeft.x - PMONITOR->vecReservedBottomRight.x), nextY);
} else {
nd.position = PMONITOR->vecReservedTopLeft + PMONITOR->vecPosition + Vector2D(0, nextY);
Expand All @@ -282,15 +306,15 @@ void CHyprMasterLayout::calculateWorkspace(const int& ws) {

applyNodeDataToWindow(&nd);
}
} else if (PWORKSPACE->m_orientation == ORIENTATION_TOP || PWORKSPACE->m_orientation == ORIENTATION_BOTTOM) {
} else if (PWORKSPACEDATA->orientation == ORIENTATION_TOP || PWORKSPACEDATA->orientation == ORIENTATION_BOTTOM) {
float widthLeft = PMONITOR->vecSize.x - PMONITOR->vecReservedBottomRight.x - PMONITOR->vecReservedTopLeft.x;
float nextX = 0;
const float HEIGHT = PMONITOR->vecSize.y - PMONITOR->vecReservedBottomRight.y - PMONITOR->vecReservedTopLeft.y - PMASTERNODE->size.y;

for (auto& nd : m_lMasterNodesData) {
if (nd.workspaceID != PWORKSPACE->m_iID || nd.isMaster)
continue;
if (PWORKSPACE->m_orientation == ORIENTATION_TOP) {
if (PWORKSPACEDATA->orientation == ORIENTATION_TOP) {
nd.position = PMONITOR->vecReservedTopLeft + PMONITOR->vecPosition + Vector2D(nextX, PMASTERNODE->percMaster * (PMONITOR->vecSize.y - PMONITOR->vecReservedBottomRight.y - PMONITOR->vecReservedTopLeft.y));
} else {
nd.position = PMONITOR->vecReservedTopLeft + PMONITOR->vecPosition + Vector2D(nextX, 0);
Expand Down Expand Up @@ -825,18 +849,16 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri
if (!PWINDOW)
return 0;

const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(PWINDOW->m_iWorkspaceID);
if (!PWORKSPACE)
return 0;
const auto PWORKSPACEDATA = getMasterWorkspaceData(PWINDOW->m_iWorkspaceID);

if (message == "orientationleft")
PWORKSPACE->m_orientation = ORIENTATION_LEFT;
PWORKSPACEDATA->orientation = ORIENTATION_LEFT;
else if (message == "orientationright")
PWORKSPACE->m_orientation = ORIENTATION_RIGHT;
PWORKSPACEDATA->orientation = ORIENTATION_RIGHT;
else if (message == "orientationtop")
PWORKSPACE->m_orientation = ORIENTATION_TOP;
PWORKSPACEDATA->orientation = ORIENTATION_TOP;
else if (message == "orientationbottom")
PWORKSPACE->m_orientation = ORIENTATION_BOTTOM;
PWORKSPACEDATA->orientation = ORIENTATION_BOTTOM;

recalculateMonitor(header.pWindow->m_iMonitorID);

Expand All @@ -846,14 +868,12 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri
if (!PWINDOW)
return 0;

const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(PWINDOW->m_iWorkspaceID);
if (!PWORKSPACE)
return 0;
const auto PWORKSPACEDATA = getMasterWorkspaceData(PWINDOW->m_iWorkspaceID);

if (PWORKSPACE->m_orientation == ORIENTATION_BOTTOM) {
PWORKSPACE->m_orientation = ORIENTATION_LEFT;
if (PWORKSPACEDATA->orientation == ORIENTATION_BOTTOM) {
PWORKSPACEDATA->orientation = ORIENTATION_LEFT;
} else {
PWORKSPACE->m_orientation = (eOrientation) (PWORKSPACE->m_orientation + 1);
PWORKSPACEDATA->orientation = (eOrientation) (PWORKSPACEDATA->orientation + 1);
}

recalculateMonitor(header.pWindow->m_iMonitorID);
Expand All @@ -863,14 +883,12 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri
if (!PWINDOW)
return 0;

const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(PWINDOW->m_iWorkspaceID);
if (!PWORKSPACE)
return 0;
const auto PWORKSPACEDATA = getMasterWorkspaceData(PWINDOW->m_iWorkspaceID);

if (PWORKSPACE->m_orientation == ORIENTATION_LEFT) {
PWORKSPACE->m_orientation = ORIENTATION_BOTTOM;
if (PWORKSPACEDATA->orientation == ORIENTATION_LEFT) {
PWORKSPACEDATA->orientation = ORIENTATION_BOTTOM;
} else {
PWORKSPACE->m_orientation = (eOrientation) (PWORKSPACE->m_orientation - 1);
PWORKSPACEDATA->orientation = (eOrientation) (PWORKSPACEDATA->orientation - 1);
}

recalculateMonitor(header.pWindow->m_iMonitorID);
Expand Down
24 changes: 22 additions & 2 deletions src/layout/MasterLayout.hpp
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
#pragma once

#include "IHyprLayout.hpp"
#include <vector>
#include <list>
#include <deque>

enum eFullscreenMode : uint8_t;
enum eOrientation : uint8_t;

//orientation determines which side of the screen the master area resides
enum eOrientation : uint8_t {
ORIENTATION_LEFT =0,
ORIENTATION_TOP,
ORIENTATION_RIGHT,
ORIENTATION_BOTTOM
};

struct SMasterNodeData {
bool isMaster = false;
Expand All @@ -25,6 +33,15 @@ struct SMasterNodeData {
}
};

struct SMasterWorkspaceData {
int workspaceID = -1;
eOrientation orientation = ORIENTATION_LEFT;

bool operator==(const SMasterWorkspaceData& rhs) {
return workspaceID == rhs.workspaceID;
}
};

class CHyprMasterLayout : public IHyprLayout {
public:
virtual void onWindowCreatedTiling(CWindow*);
Expand All @@ -45,17 +62,20 @@ class CHyprMasterLayout : public IHyprLayout {

private:

std::list<SMasterNodeData> m_lMasterNodesData;
std::list<SMasterNodeData> m_lMasterNodesData;
std::vector<SMasterWorkspaceData> m_lMasterWorkspacesData;

bool m_bForceWarps = false;

int getNodesOnWorkspace(const int&);
void applyNodeDataToWindow(SMasterNodeData*);
SMasterNodeData* getNodeFromWindow(CWindow*);
SMasterNodeData* getMasterNodeOnWorkspace(const int&);
SMasterWorkspaceData* getMasterWorkspaceData(const int&);
void calculateWorkspace(const int&);
CWindow* getNextWindow(CWindow*, bool);
int getMastersOnWorkspace(const int&);

friend struct SMasterNodeData;
friend struct SMasterWorkspaceData;
};

0 comments on commit 73ba245

Please sign in to comment.