layout: rethonk layouts from the ground up (#12890)
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.
This commit is contained in:
parent
51f8849e54
commit
723870337f
82 changed files with 8431 additions and 5527 deletions
86
src/layout/LayoutManager.hpp
Normal file
86
src/layout/LayoutManager.hpp
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
#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;
|
||||
Loading…
Add table
Add a link
Reference in a new issue