Rewrites layouts to be much smaller, and deal with much less annoying BS. Improves the overall architecture, unifies handling of pseudotiling, and various other improvements.
86 lines
No EOL
3.2 KiB
C++
86 lines
No EOL
3.2 KiB
C++
#pragma once
|
|
|
|
#include "../helpers/memory/Memory.hpp"
|
|
#include "../helpers/math/Math.hpp"
|
|
#include "../managers/input/InputManager.hpp"
|
|
|
|
#include "supplementary/DragController.hpp"
|
|
|
|
#include <optional>
|
|
#include <expected>
|
|
|
|
enum eFullscreenMode : int8_t;
|
|
|
|
namespace Layout {
|
|
class ITarget;
|
|
class CSpace;
|
|
|
|
enum eRectCorner : uint8_t {
|
|
CORNER_NONE = 0,
|
|
CORNER_TOPLEFT = (1 << 0),
|
|
CORNER_TOPRIGHT = (1 << 1),
|
|
CORNER_BOTTOMRIGHT = (1 << 2),
|
|
CORNER_BOTTOMLEFT = (1 << 3),
|
|
};
|
|
|
|
inline eRectCorner cornerFromBox(const CBox& box, const Vector2D& pos) {
|
|
const auto CENTER = box.middle();
|
|
|
|
if (pos.x < CENTER.x)
|
|
return pos.y < CENTER.y ? CORNER_TOPLEFT : CORNER_BOTTOMLEFT;
|
|
return pos.y < CENTER.y ? CORNER_TOPRIGHT : CORNER_BOTTOMRIGHT;
|
|
}
|
|
|
|
enum eSnapEdge : uint8_t {
|
|
SNAP_INVALID = 0,
|
|
SNAP_UP = (1 << 0),
|
|
SNAP_DOWN = (1 << 1),
|
|
SNAP_LEFT = (1 << 2),
|
|
SNAP_RIGHT = (1 << 3),
|
|
};
|
|
|
|
class CLayoutManager {
|
|
public:
|
|
CLayoutManager();
|
|
~CLayoutManager() = default;
|
|
|
|
void newTarget(SP<ITarget> target, SP<CSpace> space);
|
|
void removeTarget(SP<ITarget> target);
|
|
|
|
void changeFloatingMode(SP<ITarget> target);
|
|
|
|
void beginDragTarget(SP<ITarget> target, eMouseBindMode mode);
|
|
void moveMouse(const Vector2D& mousePos);
|
|
void resizeTarget(const Vector2D& Δ, SP<ITarget> target, eRectCorner corner = CORNER_NONE);
|
|
void moveTarget(const Vector2D& Δ, SP<ITarget> target);
|
|
void endDragTarget();
|
|
|
|
std::expected<void, std::string> layoutMsg(const std::string_view& sv);
|
|
|
|
void fullscreenRequestForTarget(SP<ITarget> target, eFullscreenMode currentEffectiveMode, eFullscreenMode effectiveMode);
|
|
|
|
void switchTargets(SP<ITarget> a, SP<ITarget> b, bool preserveFocus = true);
|
|
|
|
void moveInDirection(SP<ITarget> target, const std::string& direction, bool silent = false);
|
|
|
|
SP<ITarget> getNextCandidate(SP<CSpace> space, SP<ITarget> from);
|
|
|
|
bool isReachable(SP<ITarget> target);
|
|
|
|
void bringTargetToTop(SP<ITarget> target);
|
|
|
|
std::optional<Vector2D> predictSizeForNewTiledTarget();
|
|
|
|
void performSnap(Vector2D& sourcePos, Vector2D& sourceSize, SP<ITarget> target, eMouseBindMode mode, int corner, const Vector2D& beginSize);
|
|
|
|
void invalidateMonitorGeometries(PHLMONITOR);
|
|
void recalculateMonitor(PHLMONITOR);
|
|
|
|
const UP<Supplementary::CDragStateController>& dragController();
|
|
|
|
private:
|
|
UP<Supplementary::CDragStateController> m_dragStateController = makeUnique<Supplementary::CDragStateController>();
|
|
};
|
|
}
|
|
|
|
inline UP<Layout::CLayoutManager> g_layoutManager; |