From c48336aac343317dc0e31d148c71c3a83b11b619 Mon Sep 17 00:00:00 2001 From: Felix Dick Date: Mon, 26 Sep 2022 06:35:00 +0200 Subject: [PATCH 1/4] Scale the cairo matrix to fit the monitor dimensions. --- src/render/OpenGL.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 2ae8d747..dee2ba36 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -1171,6 +1171,8 @@ void CHyprOpenGLImpl::createBGTextureForMonitor(CMonitor* pMonitor) { const auto CAIRO = cairo_create(CAIROSURFACE); + cairo_scale(CAIRO, textureSize.x / pMonitor->vecTransformedSize.x, textureSize.y / pMonitor->vecTransformedSize.y); + if (!*PNOSPLASH) renderSplash(CAIRO, CAIROSURFACE); From 10c4f4ba359f5c391683f44153a6e1ceb074811f Mon Sep 17 00:00:00 2001 From: Felix Dick Date: Thu, 29 Sep 2022 04:01:26 +0200 Subject: [PATCH 2/4] Shift splash up if monitor has wider ratio than bgTexture. --- src/render/OpenGL.cpp | 55 ++++++++++++++++++++++--------------------- src/render/OpenGL.hpp | 5 ++-- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index dee2ba36..84eba6c9 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -1113,18 +1113,19 @@ void CHyprOpenGLImpl::renderMirrored() { renderTexture(PFB->m_cTex, &monbox, 255.f, 0, false, false); } -void CHyprOpenGLImpl::renderSplash(cairo_t *const CAIRO, cairo_surface_t *const CAIROSURFACE) { +void CHyprOpenGLImpl::renderSplash(cairo_t *const CAIRO, cairo_surface_t *const CAIROSURFACE, double offsetY) { cairo_select_font_face(CAIRO, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); const auto FONTSIZE = (int)(m_RenderData.pMonitor->vecPixelSize.y / 76); cairo_set_font_size(CAIRO, FONTSIZE); - cairo_set_source_rgba(CAIRO, 1.f, 1.f, 1.f, 0.32f); + cairo_set_source_rgba(CAIRO, 1.0, 1.0, 1.0, 0.32); cairo_text_extents_t textExtents; cairo_text_extents(CAIRO, g_pCompositor->m_szCurrentSplash.c_str(), &textExtents); - cairo_move_to(CAIRO, m_RenderData.pMonitor->vecPixelSize.x / 2.f - textExtents.width / 2.f, m_RenderData.pMonitor->vecPixelSize.y - textExtents.height - 1); + cairo_move_to(CAIRO, (m_RenderData.pMonitor->vecPixelSize.x - textExtents.width) / 2.0, m_RenderData.pMonitor->vecPixelSize.y - textExtents.height + offsetY); + cairo_show_text(CAIRO, g_pCompositor->m_szCurrentSplash.c_str()); cairo_surface_flush(CAIROSURFACE); @@ -1166,15 +1167,37 @@ void CHyprOpenGLImpl::createBGTextureForMonitor(CMonitor* pMonitor) { PTEX->m_vSize = textureSize; + // calc the target box + const double MONRATIO = m_RenderData.pMonitor->vecTransformedSize.x / m_RenderData.pMonitor->vecTransformedSize.y; + const double WPRATIO = 1.77; + + Vector2D origin; + double scale; + + if (MONRATIO > WPRATIO) { + scale = m_RenderData.pMonitor->vecTransformedSize.x / PTEX->m_vSize.x; + + origin.y = (m_RenderData.pMonitor->vecTransformedSize.y - PTEX->m_vSize.y * scale) / 2.0; + } else { + scale = m_RenderData.pMonitor->vecTransformedSize.y / PTEX->m_vSize.y; + + origin.x = (m_RenderData.pMonitor->vecTransformedSize.x - PTEX->m_vSize.x * scale) / 2.0; + } + + wlr_box box = {origin.x, origin.y, PTEX->m_vSize.x * scale, PTEX->m_vSize.y * scale}; + + m_mMonitorRenderResources[pMonitor].backgroundTexBox = box; + // create a new one with cairo const auto CAIROSURFACE = cairo_image_surface_create_from_png(texPath.c_str()); - const auto CAIRO = cairo_create(CAIROSURFACE); + // scale it to fit the current monitor cairo_scale(CAIRO, textureSize.x / pMonitor->vecTransformedSize.x, textureSize.y / pMonitor->vecTransformedSize.y); + // render splash on wallpaper if (!*PNOSPLASH) - renderSplash(CAIRO, CAIROSURFACE); + renderSplash(CAIRO, CAIROSURFACE, origin.y * WPRATIO / MONRATIO); // copy the data to an OpenGL texture we have const auto DATA = cairo_image_surface_get_data(CAIROSURFACE); @@ -1190,28 +1213,6 @@ void CHyprOpenGLImpl::createBGTextureForMonitor(CMonitor* pMonitor) { cairo_surface_destroy(CAIROSURFACE); cairo_destroy(CAIRO); - // calc the target box - - const float MONRATIO = m_RenderData.pMonitor->vecTransformedSize.x / m_RenderData.pMonitor->vecTransformedSize.y; - const float WPRATIO = 1.77f; - - Vector2D origin; - float scale; - - if (MONRATIO > WPRATIO) { - scale = m_RenderData.pMonitor->vecTransformedSize.x / PTEX->m_vSize.x; - - origin.y = -(PTEX->m_vSize.y * scale - m_RenderData.pMonitor->vecTransformedSize.y) / 2.f / scale; - } else { - scale = m_RenderData.pMonitor->vecTransformedSize.y / PTEX->m_vSize.y; - - origin.x = -(PTEX->m_vSize.x * scale - m_RenderData.pMonitor->vecTransformedSize.x) / 2.f / scale; - } - - wlr_box box = {origin.x * scale, origin.y * scale, PTEX->m_vSize.x * scale, PTEX->m_vSize.y * scale}; - - m_mMonitorRenderResources[pMonitor].backgroundTexBox = box; - Debug::log(LOG, "Background created for monitor %s", pMonitor->szName.c_str()); } diff --git a/src/render/OpenGL.hpp b/src/render/OpenGL.hpp index e3350c15..5d205407 100644 --- a/src/render/OpenGL.hpp +++ b/src/render/OpenGL.hpp @@ -140,10 +140,9 @@ private: CFramebuffer* blurMainFramebufferWithDamage(float a, wlr_box* pBox, pixman_region32_t* damage); void renderTextureInternalWithDamage(const CTexture&, wlr_box* pBox, float a, pixman_region32_t* damage, int round = 0, bool discardOpaque = false, bool noAA = false, bool allowCustomUV = false, bool allowDim = false); - - void renderSplash(cairo_t *const, cairo_surface_t *const); + void renderSplash(cairo_t *const, cairo_surface_t *const, double); void preBlurForCurrentMonitor(); }; -inline std::unique_ptr g_pHyprOpenGL; \ No newline at end of file +inline std::unique_ptr g_pHyprOpenGL; From ead0e744714891f9b56469347f43b7e4e334f441 Mon Sep 17 00:00:00 2001 From: vaxerski Date: Thu, 29 Sep 2022 10:20:12 +0100 Subject: [PATCH 3/4] handle maximize toplevel request --- src/Compositor.cpp | 11 +++++++++-- src/events/Windows.cpp | 3 ++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index f670a643..e3392483 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -1616,6 +1616,15 @@ void CCompositor::setWindowFullscreen(CWindow* pWindow, bool on, eFullscreenMode return; } + const auto PMONITOR = getMonitorFromID(pWindow->m_iMonitorID); + + const auto PWORKSPACE = getWorkspaceByID(pWindow->m_iWorkspaceID); + + if (PWORKSPACE->m_bHasFullscreenWindow && on) { + Debug::log(LOG, "Rejecting fullscreen ON on a fullscreen workspace"); + return; + } + g_pLayoutManager->getCurrentLayout()->fullscreenRequestForWindow(pWindow, mode, on); g_pXWaylandManager->setWindowFullscreen(pWindow, pWindow->m_bIsFullscreen && mode == FULLSCREEN_FULL); @@ -1629,8 +1638,6 @@ void CCompositor::setWindowFullscreen(CWindow* pWindow, bool on, eFullscreenMode } } - const auto PMONITOR = getMonitorFromID(pWindow->m_iMonitorID); - for (auto& ls : PMONITOR->m_aLayerSurfaceLists[ZWLR_LAYER_SHELL_V1_LAYER_TOP]) { if (!ls->fadingOut) ls->alpha = pWindow->m_bIsFullscreen && mode == FULLSCREEN_FULL ? 0.f : 255.f; diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index b67a8619..8e6aed25 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -705,7 +705,8 @@ void Events::listener_NewXDGDeco(wl_listener* listener, void* data) { void Events::listener_requestMaximize(void* owner, void* data) { const auto PWINDOW = (CWindow*)owner; - // ignore + g_pCompositor->setWindowFullscreen(PWINDOW, !PWINDOW->m_bIsFullscreen, FULLSCREEN_MAXIMIZED); // this will be rejected if there already is a fullscreen window + wlr_xdg_surface_schedule_configure(PWINDOW->m_uSurface.xdg); } From 2636abca2dcf1eca2c0296bb817f644b8626a860 Mon Sep 17 00:00:00 2001 From: vaxerski Date: Thu, 29 Sep 2022 10:24:54 +0100 Subject: [PATCH 4/4] use the event data for determining maximize status in requests --- src/events/Windows.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index 8e6aed25..187d7745 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -705,7 +705,9 @@ void Events::listener_NewXDGDeco(wl_listener* listener, void* data) { void Events::listener_requestMaximize(void* owner, void* data) { const auto PWINDOW = (CWindow*)owner; - g_pCompositor->setWindowFullscreen(PWINDOW, !PWINDOW->m_bIsFullscreen, FULLSCREEN_MAXIMIZED); // this will be rejected if there already is a fullscreen window + const auto EV = (wlr_foreign_toplevel_handle_v1_maximized_event*)data; + + g_pCompositor->setWindowFullscreen(PWINDOW, EV->maximized, FULLSCREEN_MAXIMIZED); // this will be rejected if there already is a fullscreen window wlr_xdg_surface_schedule_configure(PWINDOW->m_uSurface.xdg); }