Fullscreen and Maximize

This commit is contained in:
outfoxxed 2023-04-17 00:53:02 -07:00
parent 0a0177d019
commit cdfccf632c
No known key found for this signature in database
GPG key ID: 4C88A185FB89301E
3 changed files with 115 additions and 6 deletions

View file

@ -1,3 +1,4 @@
#include "globals.hpp"
#include "Hy3Layout.hpp"
#include <src/Compositor.hpp>
@ -286,7 +287,7 @@ void Hy3Layout::applyNodeDataToWindow(Hy3Node* node, bool force) {
const auto* border_size = &g_pConfigManager->getConfigValuePtr("general:border_size")->intValue;
const auto* gaps_in = &g_pConfigManager->getConfigValuePtr("general:gaps_in")->intValue;
const auto* gaps_out = &g_pConfigManager->getConfigValuePtr("general:gaps_out")->intValue;
static auto* const single_window_no_gaps = &g_pConfigManager->getConfigValuePtr("plugin:hy3:no_gaps_when_only")->intValue;
static auto* const single_window_no_gaps = &HyprlandAPI::getConfigValue(PHANDLE, "plugin:hy3:no_gaps_when_only")->intValue;
if (!g_pCompositor->windowExists(window) || !window->m_bIsMapped) {
Debug::log(ERR, "Node %p holding invalid window %p!!", node, window);
@ -503,8 +504,52 @@ bool Hy3Layout::isWindowTiled(CWindow* window) {
return this->getNodeFromWindow(window) != nullptr;
}
void Hy3Layout::recalculateMonitor(const int& eIdleInhibitMode) {
; // empty
void Hy3Layout::recalculateMonitor(const int& monitor_id) {
const auto monitor = g_pCompositor->getMonitorFromID(monitor_id);
if (monitor == nullptr) return;
const auto workspace = g_pCompositor->getWorkspaceByID(monitor->activeWorkspace);
if (workspace == nullptr) return;
g_pHyprRenderer->damageMonitor(monitor);
if (monitor->specialWorkspaceID) {
const auto top_node = this->getWorkspaceRootGroup(monitor->specialWorkspaceID);
if (top_node != nullptr) {
top_node->position = monitor->vecPosition + monitor->vecReservedTopLeft;
top_node->size = monitor->vecSize - monitor->vecReservedTopLeft - monitor->vecReservedBottomRight;
top_node->recalcSizePosRecursive();
}
}
if (workspace->m_bHasFullscreenWindow) {
const auto window = g_pCompositor->getFullscreenWindowOnWorkspace(workspace->m_iID);
if (workspace->m_efFullscreenMode == FULLSCREEN_FULL) {
window->m_vRealPosition = monitor->vecPosition;
window->m_vRealSize = monitor->vecSize;
} else {
// Vaxry's hack from below, but again
Hy3Node fakeNode = {
.data = window,
.position = monitor->vecPosition + monitor->vecReservedTopLeft,
.size = monitor->vecSize - monitor->vecReservedTopLeft - monitor->vecReservedBottomRight,
.workspace_id = window->m_iWorkspaceID,
};
this->applyNodeDataToWindow(&fakeNode);
}
} else {
const auto top_node = this->getWorkspaceRootGroup(monitor->specialWorkspaceID);
if (top_node) {
top_node->position = monitor->vecPosition + monitor->vecReservedTopLeft;
top_node->size = monitor->vecSize - monitor->vecReservedTopLeft - monitor->vecReservedBottomRight;
top_node->recalcSizePosRecursive();
}
}
}
void Hy3Layout::recalculateWindow(CWindow* pWindow) {
@ -515,8 +560,66 @@ void Hy3Layout::resizeActiveWindow(const Vector2D& delta, CWindow* pWindow) {
; // empty
}
void Hy3Layout::fullscreenRequestForWindow(CWindow* pWindow, eFullscreenMode mode, bool on) {
; // empty
void Hy3Layout::fullscreenRequestForWindow(CWindow* window, eFullscreenMode fullscreen_mode, bool on) {
if (!g_pCompositor->windowValidMapped(window)) return;
if (on == window->m_bIsFullscreen || g_pCompositor->isWorkspaceSpecial(window->m_iWorkspaceID)) return;
const auto monitor = g_pCompositor->getMonitorFromID(window->m_iMonitorID);
const auto workspace = g_pCompositor->getWorkspaceByID(window->m_iWorkspaceID);
if (workspace->m_bHasFullscreenWindow && on) return;
window->m_bIsFullscreen = on;
workspace->m_bHasFullscreenWindow = !workspace->m_bHasFullscreenWindow;
if (!window->m_bIsFullscreen) {
auto* node = this->getNodeFromWindow(window);
if (node) {
// restore node positioning if tiled
this->applyNodeDataToWindow(node);
} else {
// restore floating position if not
window->m_vRealPosition = window->m_vLastFloatingPosition;
window->m_vRealSize = window->m_vLastFloatingSize;
window->m_sSpecialRenderData.rounding = true;
window->m_sSpecialRenderData.border = true;
window->m_sSpecialRenderData.decorate = true;
}
} else {
workspace->m_efFullscreenMode = fullscreen_mode;
// save position and size if floating
if (window->m_bIsFloating) {
window->m_vLastFloatingPosition = window->m_vRealPosition.goalv();
window->m_vPosition = window->m_vRealPosition.goalv();
window->m_vLastFloatingSize = window->m_vRealSize.goalv();
window->m_vSize = window->m_vRealSize.goalv();
}
if (fullscreen_mode == FULLSCREEN_FULL) {
Debug::log(LOG, "fullscreen");
window->m_vRealPosition = monitor->vecPosition;
window->m_vRealSize = monitor->vecSize;
} else {
Debug::log(LOG, "vaxry hack");
// Copy of vaxry's massive hack
Hy3Node fakeNode = {
.data = window,
.position = monitor->vecPosition + monitor->vecReservedTopLeft,
.size = monitor->vecSize - monitor->vecReservedTopLeft - monitor->vecReservedBottomRight,
.workspace_id = window->m_iWorkspaceID,
};
this->applyNodeDataToWindow(&fakeNode);
}
}
g_pCompositor->updateWindowAnimatedDecorationValues(window);
g_pXWaylandManager->setWindowSize(window, window->m_vRealSize.goalv());
g_pCompositor->moveWindowToTop(window);
this->recalculateMonitor(monitor->ID);
}
std::any Hy3Layout::layoutMessage(SLayoutMessageHeader header, std::string content) {

3
src/globals.hpp Normal file
View file

@ -0,0 +1,3 @@
#include <src/plugins/PluginAPI.hpp>
inline HANDLE PHANDLE = nullptr;

View file

@ -1,9 +1,10 @@
#include <src/plugins/PluginAPI.hpp>
#include "globals.hpp"
#include "Hy3Layout.hpp"
#include "src/Compositor.hpp"
#include "src/config/ConfigManager.hpp"
inline HANDLE PHANDLE = nullptr;
inline std::unique_ptr<Hy3Layout> g_Hy3Layout;
APICALL EXPORT std::string PLUGIN_API_VERSION() {
@ -68,6 +69,8 @@ void dispatch_movefocus(std::string arg) {
APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
PHANDLE = handle;
HyprlandAPI::addConfigValue(PHANDLE, "plugin:hy3:no_gaps_when_only", SConfigValue{.intValue = 0});
g_Hy3Layout = std::make_unique<Hy3Layout>();
HyprlandAPI::addLayout(PHANDLE, "hy3", g_Hy3Layout.get());