summaryrefslogtreecommitdiff
path: root/src/desktop/Window.hpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2024-04-27 12:43:12 +0100
committerGitHub <noreply@github.com>2024-04-27 12:43:12 +0100
commitbca7804bb6e1bf5ce5a99b9ae4806be25e36993c (patch)
treeebd3a578de1dfe11b54f9440cfc3a408ffa6a620 /src/desktop/Window.hpp
parent25aec3ac8ce65ed224f025f8f6dfef73780577a4 (diff)
internal: Window storage rework - part 1 (#5762)
* Window storage rework - part 1 * format * remove useless include * fix pch * format * fix crash in dwindle * fix vram leak * prefer .expired() for bool checks
Diffstat (limited to 'src/desktop/Window.hpp')
-rw-r--r--src/desktop/Window.hpp90
1 files changed, 58 insertions, 32 deletions
diff --git a/src/desktop/Window.hpp b/src/desktop/Window.hpp
index b101700a..dd7d2e1e 100644
--- a/src/desktop/Window.hpp
+++ b/src/desktop/Window.hpp
@@ -14,8 +14,6 @@
#include "DesktopTypes.hpp"
#include "../helpers/signal/Signal.hpp"
-class CWindow;
-
enum eIdleInhibitMode {
IDLEINHIBIT_NONE = 0,
IDLEINHIBIT_ALWAYS,
@@ -191,13 +189,18 @@ struct SWindowRule {
};
struct SInitialWorkspaceToken {
- CWindow* primaryOwner = nullptr;
- std::string workspace;
+ PHLWINDOWREF primaryOwner;
+ std::string workspace;
};
class CWindow {
public:
+ static PHLWINDOW create();
+
+ private:
CWindow();
+
+ public:
~CWindow();
DYNLISTENER(commitWindow);
@@ -279,13 +282,13 @@ class CWindow {
bool m_bCreatedOverFullscreen = false;
// XWayland stuff
- bool m_bIsX11 = false;
- CWindow* m_pX11Parent = nullptr;
- uint64_t m_iX11Type = 0;
- bool m_bIsModal = false;
- bool m_bX11DoesntWantBorders = false;
- bool m_bX11ShouldntFocus = false;
- float m_fX11SurfaceScaledBy = 1.f;
+ bool m_bIsX11 = false;
+ PHLWINDOWREF m_pX11Parent;
+ uint64_t m_iX11Type = 0;
+ bool m_bIsModal = false;
+ bool m_bX11DoesntWantBorders = false;
+ bool m_bX11ShouldntFocus = false;
+ float m_fX11SurfaceScaledBy = 1.f;
//
// For nofocus
@@ -326,7 +329,7 @@ class CWindow {
bool m_bFakeFullscreenState = false;
// for proper cycling. While cycling we can't just move the pointers, so we need to keep track of the last cycled window.
- CWindow* m_pLastCycledWindow = nullptr;
+ PHLWINDOWREF m_pLastCycledWindow;
// Window decorations
std::deque<std::unique_ptr<IHyprWindowDecoration>> m_dWindowDecorations;
@@ -349,7 +352,7 @@ class CWindow {
CAnimatedVariable<float> m_fDimPercent;
// swallowing
- CWindow* m_pSwallowed = nullptr;
+ PHLWINDOWREF m_pSwallowed;
// focus stuff
bool m_bStayFocused = false;
@@ -366,10 +369,10 @@ class CWindow {
// for groups
struct SGroupData {
- CWindow* pNextWindow = nullptr; // nullptr means no grouping. Self means single group.
- bool head = false;
- bool locked = false; // per group lock
- bool deny = false; // deny window from enter a group or made a group
+ PHLWINDOWREF pNextWindow; // nullptr means no grouping. Self means single group.
+ bool head = false;
+ bool locked = false; // per group lock
+ bool deny = false; // deny window from enter a group or made a group
} m_sGroupData;
uint16_t m_eGroupRules = GROUP_NONE;
@@ -398,7 +401,7 @@ class CWindow {
void updateToplevel();
void updateSurfaceScaleTransformDetails();
void moveToWorkspace(PHLWORKSPACE);
- CWindow* X11TransientFor();
+ PHLWINDOW X11TransientFor();
void onUnmap();
void onMap();
void setHidden(bool hidden);
@@ -429,23 +432,26 @@ class CWindow {
void applyGroupRules();
void createGroup();
void destroyGroup();
- CWindow* getGroupHead();
- CWindow* getGroupTail();
- CWindow* getGroupCurrent();
- CWindow* getGroupPrevious();
- CWindow* getGroupWindowByIndex(int);
+ PHLWINDOW getGroupHead();
+ PHLWINDOW getGroupTail();
+ PHLWINDOW getGroupCurrent();
+ PHLWINDOW getGroupPrevious();
+ PHLWINDOW getGroupWindowByIndex(int);
int getGroupSize();
- bool canBeGroupedInto(CWindow* pWindow);
- void setGroupCurrent(CWindow* pWindow);
- void insertWindowToGroup(CWindow* pWindow);
+ bool canBeGroupedInto(PHLWINDOW pWindow);
+ void setGroupCurrent(PHLWINDOW pWindow);
+ void insertWindowToGroup(PHLWINDOW pWindow);
void updateGroupOutputs();
- void switchWithWindowInGroup(CWindow* pWindow);
+ void switchWithWindowInGroup(PHLWINDOW pWindow);
void setAnimationsToMove();
void onWorkspaceAnimUpdate();
//
std::unordered_map<std::string, std::string> getEnv();
+ //
+ PHLWINDOWREF m_pSelf;
+
private:
// For hidden windows and stuff
bool m_bHidden = false;
@@ -453,6 +459,26 @@ class CWindow {
int m_iLastWorkspace = WORKSPACE_INVALID;
};
+inline bool valid(PHLWINDOW w) {
+ return w.get();
+}
+
+inline bool valid(PHLWINDOWREF w) {
+ return w.lock().get();
+}
+
+inline bool validMapped(PHLWINDOW w) {
+ if (!valid(w))
+ return false;
+ return w->m_bIsMapped;
+}
+
+inline bool validMapped(PHLWINDOWREF w) {
+ if (!valid(w))
+ return false;
+ return w.lock()->m_bIsMapped;
+}
+
/**
format specification
- 'x', only address, equivalent of (uintpr_t)CWindow*
@@ -462,7 +488,7 @@ class CWindow {
*/
template <typename CharT>
-struct std::formatter<CWindow*, CharT> : std::formatter<CharT> {
+struct std::formatter<PHLWINDOW, CharT> : std::formatter<CharT> {
bool formatAddressOnly = false;
bool formatWorkspace = false;
bool formatMonitor = false;
@@ -472,18 +498,18 @@ struct std::formatter<CWindow*, CharT> : std::formatter<CharT> {
FORMAT_FLAG('m', formatMonitor) //
FORMAT_FLAG('w', formatWorkspace) //
FORMAT_FLAG('c', formatClass),
- CWindow*)
+ PHLWINDOW)
template <typename FormatContext>
- auto format(CWindow* const& w, FormatContext& ctx) const {
+ auto format(PHLWINDOW const& w, FormatContext& ctx) const {
auto&& out = ctx.out();
if (formatAddressOnly)
- return std::format_to(out, "{:x}", (uintptr_t)w);
+ return std::format_to(out, "{:x}", (uintptr_t)w.get());
if (!w)
return std::format_to(out, "[Window nullptr]");
std::format_to(out, "[");
- std::format_to(out, "Window {:x}: title: \"{}\"", (uintptr_t)w, w->m_szTitle);
+ std::format_to(out, "Window {:x}: title: \"{}\"", (uintptr_t)w.get(), w->m_szTitle);
if (formatWorkspace)
std::format_to(out, ", workspace: {}", w->m_pWorkspace ? w->workspaceID() : WORKSPACE_INVALID);
if (formatMonitor)