protocols: add ext-workspace implementation (#10818)

This commit is contained in:
outfoxxed 2025-06-26 09:32:44 -07:00 committed by GitHub
parent 1f337a7a5e
commit 3bbdf9dc5a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 510 additions and 22 deletions

View file

@ -70,6 +70,8 @@ CWorkspace::~CWorkspace() {
g_pEventManager->postEvent({.event = "destroyworkspacev2", .data = std::format("{},{}", m_id, m_name)});
EMIT_HOOK_EVENT("destroyWorkspace", this);
}
m_events.destroy.emit();
}
void CWorkspace::startAnim(bool in, bool left, bool instant) {
@ -185,14 +187,6 @@ void CWorkspace::startAnim(bool in, bool left, bool instant) {
}
}
void CWorkspace::setActive(bool on) {
; // empty until https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/40
}
void CWorkspace::moveToMonitor(const MONITORID& id) {
; // empty until https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/40
}
PHLWINDOW CWorkspace::getLastFocusedWindow() {
if (!validMapped(m_lastFocusedWindow) || m_lastFocusedWindow->workspaceID() != m_id)
return nullptr;
@ -650,6 +644,7 @@ void CWorkspace::rename(const std::string& name) {
g_pCompositor->ensurePersistentWorkspacesPresent(std::vector<SWorkspaceRule>{WORKSPACERULE}, m_self.lock());
g_pEventManager->postEvent({.event = "renameworkspace", .data = std::to_string(m_id) + "," + m_name});
m_events.rename.emit();
}
void CWorkspace::updateWindows() {

View file

@ -4,6 +4,7 @@
#include <string>
#include "DesktopTypes.hpp"
#include "../helpers/MiscFunctions.hpp"
#include "../helpers/signal/Signal.hpp"
enum eFullscreenMode : int8_t {
FSMODE_NONE = 0,
@ -21,6 +22,8 @@ class CWorkspace {
CWorkspace(WORKSPACEID id, PHLMONITOR monitor, std::string name, bool special = false, bool isEmpty = true);
~CWorkspace();
WP<CWorkspace> m_self;
// Workspaces ID-based have IDs > 0
// and workspaces name-based have IDs starting with -1337
WORKSPACEID m_id = WORKSPACE_INVALID;
@ -60,8 +63,6 @@ class CWorkspace {
// Inert: destroyed and invalid. If this is true, release the ptr you have.
bool inert();
void startAnim(bool in, bool left, bool instant = false);
void setActive(bool on);
void moveToMonitor(const MONITORID&);
MONITORID monitorID();
PHLWINDOW getLastFocusedWindow();
void rememberPrevWorkspace(const PHLWORKSPACE& prevWorkspace);
@ -83,6 +84,13 @@ class CWorkspace {
void forceReportSizesToWindows();
void updateWindows();
struct {
CSignal destroy;
CSignal rename;
CSignal monitorChange;
CSignal activeChange;
} m_events;
private:
void init(PHLWORKSPACE self);
// Previous workspace ID and name is stored during a workspace change, allowing travel
@ -91,7 +99,6 @@ class CWorkspace {
SP<HOOK_CALLBACK_FN> m_focusedWindowHook;
bool m_inert = true;
WP<CWorkspace> m_self;
};
inline bool valid(const PHLWORKSPACE& ref) {