From f7c4865bac1cde066db5d6e5d51f3e60c5606f6f Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Sun, 3 Jul 2022 21:38:39 +0200 Subject: warp size and pos before rule fullscreen --- src/events/Windows.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/events') diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index 3c1d83f5..eff01adf 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -268,6 +268,9 @@ void Events::listener_mapWindow(void* owner, void* data) { g_pXWaylandManager->setWindowFullscreen(PFULLWINDOW, PFULLWINDOW->m_bIsFullscreen); } + PWINDOW->m_vRealPosition.warp(); + PWINDOW->m_vRealSize.warp(); + g_pCompositor->setWindowFullscreen(PWINDOW, true, FULLSCREEN_FULL); } -- cgit v1.2.3 From 853a33888b85d296d00ab015d4f68431862bae82 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Mon, 4 Jul 2022 12:03:09 +0200 Subject: fix issue with special workspace rules --- src/events/Windows.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src/events') diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index eff01adf..6a6368e7 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -170,6 +170,10 @@ void Events::listener_mapWindow(void* owner, void* data) { } requestedWorkspace = requestedWorkspace.substr(0, requestedWorkspace.find_first_of(' ')); + + if (requestedWorkspace == "special") { + workspaceSilent = true; + } } if (!workspaceSilent) { @@ -254,7 +258,10 @@ void Events::listener_mapWindow(void* owner, void* data) { if (workspaceSilent) { // move the window if (g_pCompositor->m_pLastWindow == PWINDOW) { - g_pKeybindManager->m_mDispatchers["movetoworkspacesilent"](requestedWorkspace); + if (requestedWorkspace != "special") + g_pKeybindManager->m_mDispatchers["movetoworkspacesilent"](requestedWorkspace); + else + g_pKeybindManager->m_mDispatchers["movetoworkspace"]("special"); } else { Debug::log(ERR, "Tried to set workspace silent rule to a nofocus window!"); } -- cgit v1.2.3 From c71b76a9e04df40f57b3d44fbcab2ed65eacb1ee Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Mon, 4 Jul 2022 15:58:12 +0200 Subject: fix chromium part 1 --- src/events/Windows.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/events') diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index 6a6368e7..0b0ce909 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -368,6 +368,8 @@ void Events::listener_commitWindow(void* owner, void* data) { if (!g_pCompositor->windowValidMapped(PWINDOW)) return; + g_pHyprRenderer->damageSurface(g_pXWaylandManager->getWindowSurface(PWINDOW), PWINDOW->m_vRealPosition.goalv().x, PWINDOW->m_vRealPosition.goalv().y); + // Debug::log(LOG, "Window %x committed", PWINDOW); // SPAM! } -- cgit v1.2.3 From e0bfec6ef2507de3f13e1d4690adfe195cf1643c Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Mon, 4 Jul 2022 17:47:31 +0200 Subject: added experimental:vfr --- src/events/Monitors.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'src/events') diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index 11527cee..562c4533 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -173,6 +173,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { static auto *const PDEBUGOVERLAY = &g_pConfigManager->getConfigValuePtr("debug:overlay")->intValue; static auto *const PDAMAGETRACKINGMODE = &g_pConfigManager->getConfigValuePtr("general:damage_tracking_internal")->intValue; static auto *const PDAMAGEBLINK = &g_pConfigManager->getConfigValuePtr("debug:damage_blink")->intValue; + static auto *const VFRENABLED = &g_pConfigManager->getConfigValuePtr("experimental:vfr")->intValue; static int damageBlinkCleanup = 0; // because double-buffered @@ -231,7 +232,10 @@ void Events::listener_monitorFrame(void* owner, void* data) { if (!hasChanged && *PDAMAGETRACKINGMODE != DAMAGE_TRACKING_NONE && PMONITOR->forceFullFrames == 0 && damageBlinkCleanup == 0) { pixman_region32_fini(&damage); wlr_output_rollback(PMONITOR->output); - wlr_output_schedule_frame(PMONITOR->output); // we update shit at the monitor's Hz so we need to schedule frames because rollback wont + + if (!*VFRENABLED) + wlr_output_schedule_frame(PMONITOR->output); + return; } @@ -319,7 +323,8 @@ void Events::listener_monitorFrame(void* owner, void* data) { wlr_output_commit(PMONITOR->output); - wlr_output_schedule_frame(PMONITOR->output); + if (!*VFRENABLED) + wlr_output_schedule_frame(PMONITOR->output); if (*PDEBUGOVERLAY == 1) { const float µs = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - startRender).count() / 1000.f; -- cgit v1.2.3 From cc8b8f595fa5c20b394394fe777451d4873608b3 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Mon, 4 Jul 2022 19:58:51 +0200 Subject: disallow workspace special windowrule --- src/events/Windows.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'src/events') diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index 0b0ce909..66ba532a 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -122,6 +122,13 @@ void Events::listener_mapWindow(void* owner, void* data) { requestedWorkspace = WORKSPACERQ; } + if (requestedWorkspace == "special") { + requestedWorkspace = ""; + workspaceSilent = false; + Debug::log(LOG, "windowrule=workspace special is not allowed!"); + continue; + } + Debug::log(LOG, "Rule workspace matched by window %x, %s applied.", PWINDOW, r.szValue.c_str()); } else if (r.szRule.find("float") == 0) { PWINDOW->m_bIsFloating = true; @@ -170,10 +177,6 @@ void Events::listener_mapWindow(void* owner, void* data) { } requestedWorkspace = requestedWorkspace.substr(0, requestedWorkspace.find_first_of(' ')); - - if (requestedWorkspace == "special") { - workspaceSilent = true; - } } if (!workspaceSilent) { -- cgit v1.2.3 From ae096219e83b1a90990f2277b5a9302a3e943d84 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Tue, 5 Jul 2022 21:45:32 +0200 Subject: do updates on every mon update if VFR is enabled --- src/events/Monitors.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/events') diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index 562c4533..d46b02ff 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -184,7 +184,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { // Hack: only check when monitor with top hz refreshes, saves a bit of resources. // This is for stuff that should be run every frame - if (PMONITOR->ID == pMostHzMonitor->ID) { + if (PMONITOR->ID == pMostHzMonitor->ID || *VFRENABLED) { // unfortunately with VFR we don't have the guarantee mostHz is going to be updated all the time, so we have to ignore that g_pCompositor->sanityCheckWorkspaces(); g_pAnimationManager->tick(); g_pCompositor->cleanupFadingOut(); -- cgit v1.2.3 From 9655d0c13822bdaa5d86fd1153c27c184fd55253 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Wed, 6 Jul 2022 15:42:37 +0200 Subject: added support for wlr_idle_inhibitor_v1 --- src/events/Events.hpp | 2 ++ src/events/Windows.cpp | 6 ++++++ 2 files changed, 8 insertions(+) (limited to 'src/events') diff --git a/src/events/Events.hpp b/src/events/Events.hpp index 9d1fdb53..ceade1cc 100644 --- a/src/events/Events.hpp +++ b/src/events/Events.hpp @@ -112,4 +112,6 @@ namespace Events { // Renderer destroy LISTENER(RendererDestroy); + + LISTENER(newIdleInhibitor); }; \ No newline at end of file diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index 66ba532a..add63140 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -284,6 +284,9 @@ void Events::listener_mapWindow(void* owner, void* data) { g_pCompositor->setWindowFullscreen(PWINDOW, true, FULLSCREEN_FULL); } + // recheck idle inhibitors + g_pInputManager->recheckIdleInhibitorStatus(); + PWINDOW->m_pSurfaceTree = SubsurfaceTree::createTreeRoot(g_pXWaylandManager->getWindowSurface(PWINDOW), addViewCoords, PWINDOW, PWINDOW); Debug::log(LOG, "Map request dispatched, monitor %s, xywh: %f %f %f %f", PMONITOR->szName.c_str(), PWINDOW->m_vRealPosition.goalv().x, PWINDOW->m_vRealPosition.goalv().y, PWINDOW->m_vRealSize.goalv().x, PWINDOW->m_vRealSize.goalv().y); @@ -363,6 +366,9 @@ void Events::listener_unmapWindow(void* owner, void* data) { // Destroy Foreign Toplevel wlr_foreign_toplevel_handle_v1_destroy(PWINDOW->m_phForeignToplevel); PWINDOW->m_phForeignToplevel = nullptr; + + // recheck idle inhibitors + g_pInputManager->recheckIdleInhibitorStatus(); } void Events::listener_commitWindow(void* owner, void* data) { -- cgit v1.2.3 From f9756d10d4d1c5ea7737cf3a237b1f966d6b7a01 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Wed, 6 Jul 2022 16:50:11 +0200 Subject: changed C++ std to C++23, use std::string::contains --- src/events/Windows.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'src/events') diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index add63140..d7c3e1ec 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -152,7 +152,7 @@ void Events::listener_mapWindow(void* owner, void* data) { try { std::string alphaPart = r.szRule.substr(r.szRule.find_first_of(' ') + 1); - if (alphaPart.find_first_of(' ') != std::string::npos) { + if (alphaPart.contains(' ')) { // we have a comma, 2 values PWINDOW->m_sSpecialRenderData.alpha = std::stof(alphaPart.substr(0, alphaPart.find_first_of(' '))); PWINDOW->m_sSpecialRenderData.alphaInactive = std::stof(alphaPart.substr(alphaPart.find_first_of(' ') + 1)); @@ -170,9 +170,9 @@ void Events::listener_mapWindow(void* owner, void* data) { if (requestedWorkspace != "") { // process requested workspace - if (requestedWorkspace.find_first_of(' ') != std::string::npos) { + if (requestedWorkspace.contains(' ')) { // check for silent - if (requestedWorkspace.find("silent") != std::string::npos) { + if (requestedWorkspace.contains("silent")) { workspaceSilent = true; } @@ -199,8 +199,8 @@ void Events::listener_mapWindow(void* owner, void* data) { const auto SIZEXSTR = VALUE.substr(0, VALUE.find(" ")); const auto SIZEYSTR = VALUE.substr(VALUE.find(" ") + 1); - const auto SIZEX = SIZEXSTR.find('%') == std::string::npos ? std::stoi(SIZEXSTR) : std::stoi(SIZEXSTR.substr(0, SIZEXSTR.length() - 1)) * 0.01f * PMONITOR->vecSize.x; - const auto SIZEY = SIZEYSTR.find('%') == std::string::npos ? std::stoi(SIZEYSTR) : std::stoi(SIZEYSTR.substr(0, SIZEYSTR.length() - 1)) * 0.01f * PMONITOR->vecSize.y; + const auto SIZEX = !SIZEXSTR.contains('%') ? std::stoi(SIZEXSTR) : std::stoi(SIZEXSTR.substr(0, SIZEXSTR.length() - 1)) * 0.01f * PMONITOR->vecSize.x; + const auto SIZEY = !SIZEYSTR.contains('%') ? std::stoi(SIZEYSTR) : std::stoi(SIZEYSTR.substr(0, SIZEYSTR.length() - 1)) * 0.01f * PMONITOR->vecSize.y; Debug::log(LOG, "Rule size, applying to window %x", PWINDOW); @@ -215,8 +215,8 @@ void Events::listener_mapWindow(void* owner, void* data) { const auto POSXSTR = VALUE.substr(0, VALUE.find(" ")); const auto POSYSTR = VALUE.substr(VALUE.find(" ") + 1); - const auto POSX = POSXSTR.find('%') == std::string::npos ? std::stoi(POSXSTR) : std::stoi(POSXSTR.substr(0, POSXSTR.length() - 1)) * 0.01f * PMONITOR->vecSize.x; - const auto POSY = POSYSTR.find('%') == std::string::npos ? std::stoi(POSYSTR) : std::stoi(POSYSTR.substr(0, POSYSTR.length() - 1)) * 0.01f * PMONITOR->vecSize.y; + const auto POSX = !POSXSTR.contains('%') ? std::stoi(POSXSTR) : std::stoi(POSXSTR.substr(0, POSXSTR.length() - 1)) * 0.01f * PMONITOR->vecSize.x; + const auto POSY = !POSYSTR.contains('%') ? std::stoi(POSYSTR) : std::stoi(POSYSTR.substr(0, POSYSTR.length() - 1)) * 0.01f * PMONITOR->vecSize.y; Debug::log(LOG, "Rule move, applying to window %x", PWINDOW); -- cgit v1.2.3 From 6a16f11d63cead0b8526f442c18727a6f3dc76ea Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Wed, 6 Jul 2022 21:57:35 +0200 Subject: add namespace to hyprctl layers --- src/events/Layers.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/events') diff --git a/src/events/Layers.cpp b/src/events/Layers.cpp index 773ba909..495dfc1b 100644 --- a/src/events/Layers.cpp +++ b/src/events/Layers.cpp @@ -32,8 +32,9 @@ void Events::listener_newLayerSurface(wl_listener* listener, void* data) { } const auto PMONITOR = (SMonitor*)g_pCompositor->getMonitorFromOutput(WLRLAYERSURFACE->output); - PMONITOR->m_aLayerSurfaceLists[WLRLAYERSURFACE->pending.layer].push_back(new SLayerSurface()); - SLayerSurface* layerSurface = PMONITOR->m_aLayerSurfaceLists[WLRLAYERSURFACE->pending.layer].back(); + SLayerSurface* layerSurface = PMONITOR->m_aLayerSurfaceLists[WLRLAYERSURFACE->pending.layer].emplace_back(new SLayerSurface()); + + layerSurface->szNamespace = WLRLAYERSURFACE->_namespace; if (!WLRLAYERSURFACE->output) { WLRLAYERSURFACE->output = g_pCompositor->m_vMonitors.front()->output; // TODO: current mon -- cgit v1.2.3 From 1cf2f378d4a0e5e3da757d90404c2816a6765626 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Wed, 6 Jul 2022 22:12:03 +0200 Subject: added ls blurring --- src/events/Layers.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/events') diff --git a/src/events/Layers.cpp b/src/events/Layers.cpp index 495dfc1b..d924935b 100644 --- a/src/events/Layers.cpp +++ b/src/events/Layers.cpp @@ -51,6 +51,8 @@ void Events::listener_newLayerSurface(wl_listener* listener, void* data) { WLRLAYERSURFACE->data = layerSurface; layerSurface->monitorID = PMONITOR->ID; + layerSurface->forceBlur = g_pConfigManager->shouldBlurLS(layerSurface->szNamespace); + Debug::log(LOG, "LayerSurface %x (namespace %s layer %d) created on monitor %s", layerSurface->layerSurface, layerSurface->layerSurface->_namespace, layerSurface->layer, PMONITOR->szName.c_str()); } -- cgit v1.2.3 From 4b796d30c190e14aa39a9540395523cee27bd348 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Thu, 7 Jul 2022 11:52:12 +0200 Subject: Added swipe workspace gestures --- src/events/Devices.cpp | 20 +++++++++++++++++++- src/events/Events.hpp | 4 ++++ 2 files changed, 23 insertions(+), 1 deletion(-) (limited to 'src/events') diff --git a/src/events/Devices.cpp b/src/events/Devices.cpp index adbe268e..eae04bc3 100644 --- a/src/events/Devices.cpp +++ b/src/events/Devices.cpp @@ -158,4 +158,22 @@ void Events::listener_destroyMouse(void* owner, void* data) { const auto PMOUSE = (SMouse*)owner; g_pInputManager->destroyMouse(PMOUSE->mouse); -} \ No newline at end of file +} + +void Events::listener_swipeBegin(wl_listener* listener, void* data) { + const auto EVENT = (wlr_pointer_swipe_begin_event*)data; + + g_pInputManager->onSwipeBegin(EVENT); +} + +void Events::listener_swipeUpdate(wl_listener* listener, void* data) { + const auto EVENT = (wlr_pointer_swipe_update_event*)data; + + g_pInputManager->onSwipeUpdate(EVENT); +} + +void Events::listener_swipeEnd(wl_listener* listener, void* data) { + const auto EVENT = (wlr_pointer_swipe_end_event*)data; + + g_pInputManager->onSwipeEnd(EVENT); +} diff --git a/src/events/Events.hpp b/src/events/Events.hpp index ceade1cc..de7f1d04 100644 --- a/src/events/Events.hpp +++ b/src/events/Events.hpp @@ -114,4 +114,8 @@ namespace Events { LISTENER(RendererDestroy); LISTENER(newIdleInhibitor); + + LISTENER(swipeBegin); + LISTENER(swipeEnd); + LISTENER(swipeUpdate); }; \ No newline at end of file -- cgit v1.2.3 From a7b595d9684814285bd71089f500f60b351a00f2 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Thu, 7 Jul 2022 19:01:42 +0200 Subject: allow windowrule special again --- src/events/Windows.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'src/events') diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index d7c3e1ec..b2e93216 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -122,13 +122,6 @@ void Events::listener_mapWindow(void* owner, void* data) { requestedWorkspace = WORKSPACERQ; } - if (requestedWorkspace == "special") { - requestedWorkspace = ""; - workspaceSilent = false; - Debug::log(LOG, "windowrule=workspace special is not allowed!"); - continue; - } - Debug::log(LOG, "Rule workspace matched by window %x, %s applied.", PWINDOW, r.szValue.c_str()); } else if (r.szRule.find("float") == 0) { PWINDOW->m_bIsFloating = true; @@ -177,6 +170,10 @@ void Events::listener_mapWindow(void* owner, void* data) { } requestedWorkspace = requestedWorkspace.substr(0, requestedWorkspace.find_first_of(' ')); + + if (requestedWorkspace == "special") { + workspaceSilent = true; + } } if (!workspaceSilent) { -- cgit v1.2.3 From 75a580fedab7f12934d6c2885b48efb3fb00f3f1 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Fri, 8 Jul 2022 10:36:21 +0200 Subject: Disallow focus to modal and override_redirect X11 windows --- src/events/Windows.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/events') diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index b2e93216..de15799e 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -235,7 +235,7 @@ void Events::listener_mapWindow(void* owner, void* data) { PWINDOW->m_vPseudoSize = PWINDOW->m_vRealSize.goalv() - Vector2D(10,10); } - if (!PWINDOW->m_bNoFocus && !PWINDOW->m_bNoInitialFocus) + if (!PWINDOW->m_bNoFocus && !PWINDOW->m_bNoInitialFocus && !PWINDOW->m_bIsModal && PWINDOW->m_iX11Type != 2) g_pCompositor->focusWindow(PWINDOW); Debug::log(LOG, "Window got assigned a surfaceTreeNode %x", PWINDOW->m_pSurfaceTree); -- cgit v1.2.3 From 491b99c61ea19f2e9048f215eace07e126af890b Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Fri, 8 Jul 2022 11:24:07 +0200 Subject: handle unmanaged X11 setGeometry --- src/events/Events.hpp | 1 + src/events/Popups.cpp | 3 +++ src/events/Windows.cpp | 23 ++++++++++++++++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) (limited to 'src/events') diff --git a/src/events/Events.hpp b/src/events/Events.hpp index de7f1d04..eefc55c7 100644 --- a/src/events/Events.hpp +++ b/src/events/Events.hpp @@ -49,6 +49,7 @@ namespace Events { DYNLISTENFUNC(fullscreenWindow); DYNLISTENFUNC(activateX11); DYNLISTENFUNC(configureX11); + DYNLISTENFUNC(unmanagedSetGeometry); // Window subsurfaces // LISTENER(newSubsurfaceWindow); diff --git a/src/events/Popups.cpp b/src/events/Popups.cpp index cfb92f9b..04064696 100644 --- a/src/events/Popups.cpp +++ b/src/events/Popups.cpp @@ -92,6 +92,9 @@ void Events::listener_newPopupXDG(void* owner, void* data) { ASSERT(PWINDOW); + if (!PWINDOW->m_bIsMapped) + return; + Debug::log(LOG, "New layer popup created from XDG window %x -> %s", PWINDOW, PWINDOW->m_szTitle.c_str()); const auto WLRPOPUP = (wlr_xdg_popup*)data; diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index de15799e..c245c626 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -250,6 +250,9 @@ void Events::listener_mapWindow(void* owner, void* data) { PWINDOW->hyprListener_activateX11.initCallback(&PWINDOW->m_uSurface.xwayland->events.request_activate, &Events::listener_activateX11, PWINDOW, "XWayland Window Late"); PWINDOW->hyprListener_configureX11.initCallback(&PWINDOW->m_uSurface.xwayland->events.request_configure, &Events::listener_configureX11, PWINDOW, "XWayland Window Late"); PWINDOW->hyprListener_setTitleWindow.initCallback(&PWINDOW->m_uSurface.xwayland->events.set_title, &Events::listener_setTitleWindow, PWINDOW, "XWayland Window Late"); + + if (PWINDOW->m_iX11Type == 2) + PWINDOW->hyprListener_setGeometryX11U.initCallback(&PWINDOW->m_uSurface.xwayland->events.set_geometry, &Events::listener_unmanagedSetGeometry, PWINDOW, "XWayland Window Late"); } // do the animation thing @@ -306,6 +309,7 @@ void Events::listener_unmapWindow(void* owner, void* data) { PWINDOW->hyprListener_activateX11.removeCallback(); PWINDOW->hyprListener_configureX11.removeCallback(); PWINDOW->hyprListener_setTitleWindow.removeCallback(); + PWINDOW->hyprListener_setGeometryX11U.removeCallback(); } if (PWINDOW->m_bIsFullscreen) { @@ -371,7 +375,7 @@ void Events::listener_unmapWindow(void* owner, void* data) { void Events::listener_commitWindow(void* owner, void* data) { CWindow* PWINDOW = (CWindow*)owner; - if (!g_pCompositor->windowValidMapped(PWINDOW)) + if (!PWINDOW->m_bMappedX11 || PWINDOW->m_bHidden || (PWINDOW->m_bIsX11 && !PWINDOW->m_bMappedX11)) return; g_pHyprRenderer->damageSurface(g_pXWaylandManager->getWindowSurface(PWINDOW), PWINDOW->m_vRealPosition.goalv().x, PWINDOW->m_vRealPosition.goalv().y); @@ -490,6 +494,23 @@ void Events::listener_configureX11(void* owner, void* data) { g_pHyprRenderer->damageWindow(PWINDOW); } +void Events::listener_unmanagedSetGeometry(void* owner, void* data) { + CWindow* PWINDOW = (CWindow*)owner; + + if (!PWINDOW->m_bMappedX11 || PWINDOW->m_bHidden) + return; + + const auto POS = PWINDOW->m_vRealPosition.goalv(); + + if (floor(POS.x) != PWINDOW->m_uSurface.xwayland->x || floor(POS.x) != PWINDOW->m_uSurface.xwayland->y) { + g_pHyprRenderer->damageWindow(PWINDOW); + PWINDOW->m_vRealPosition.setValueAndWarp(Vector2D(PWINDOW->m_uSurface.xwayland->x, PWINDOW->m_uSurface.xwayland->y)); + g_pXWaylandManager->setWindowSize(PWINDOW, PWINDOW->m_vRealSize.vec()); + g_pCompositor->moveWindowToTop(PWINDOW); + g_pHyprRenderer->damageWindow(PWINDOW); + } +} + void Events::listener_surfaceXWayland(wl_listener* listener, void* data) { const auto XWSURFACE = (wlr_xwayland_surface*)data; -- cgit v1.2.3 From 84820631579178854db2ed5bce064bcfe8490ed9 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Fri, 8 Jul 2022 13:19:57 +0200 Subject: fixed layersurface focus quirks --- src/events/Layers.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'src/events') diff --git a/src/events/Layers.cpp b/src/events/Layers.cpp index d924935b..8bbb2bf6 100644 --- a/src/events/Layers.cpp +++ b/src/events/Layers.cpp @@ -121,6 +121,11 @@ void Events::listener_mapLayerSurface(void* owner, void* data) { if (layersurface->layerSurface->current.keyboard_interactive) g_pCompositor->focusSurface(layersurface->layerSurface->surface); + // mouse enter always, keeb only when needed + const auto LOCAL = g_pInputManager->getMouseCoordsInternal() - Vector2D(layersurface->geometry.x + PMONITOR->vecPosition.x, layersurface->geometry.y + PMONITOR->vecPosition.y); + wlr_seat_pointer_notify_enter(g_pCompositor->m_sSeat.seat, layersurface->layerSurface->surface, LOCAL.x, LOCAL.y); + wlr_seat_pointer_notify_motion(g_pCompositor->m_sSeat.seat, 0, LOCAL.x, LOCAL.y); + layersurface->position = Vector2D(layersurface->geometry.x, layersurface->geometry.y); wlr_box geomFixed = {layersurface->geometry.x + PMONITOR->vecPosition.x, layersurface->geometry.y + PMONITOR->vecPosition.y, layersurface->geometry.width, layersurface->geometry.height}; @@ -153,14 +158,17 @@ void Events::listener_unmapLayerSurface(void* owner, void* data) { if (layersurface->layerSurface->mapped) layersurface->layerSurface->mapped = false; - if (layersurface->layerSurface->surface == g_pCompositor->m_pLastFocus) - g_pCompositor->m_pLastFocus = nullptr; - const auto PMONITOR = g_pCompositor->getMonitorFromOutput(layersurface->layerSurface->output); if (!PMONITOR) return; + // refocus if needed + if (layersurface->layerSurface->surface == g_pCompositor->m_pLastFocus) { + g_pCompositor->m_pLastFocus = nullptr; + g_pInputManager->refocus(); + } + wlr_box geomFixed = {layersurface->geometry.x + PMONITOR->vecPosition.x, layersurface->geometry.y + PMONITOR->vecPosition.y, layersurface->geometry.width, layersurface->geometry.height}; g_pHyprRenderer->damageBox(&geomFixed); -- cgit v1.2.3 From ddc4cbbd7e572d5f81b73375395c9ba59a97556b Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Fri, 8 Jul 2022 23:37:55 +0200 Subject: allow focus to modal --- src/events/Windows.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/events') diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index c245c626..b7b631b2 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -235,7 +235,7 @@ void Events::listener_mapWindow(void* owner, void* data) { PWINDOW->m_vPseudoSize = PWINDOW->m_vRealSize.goalv() - Vector2D(10,10); } - if (!PWINDOW->m_bNoFocus && !PWINDOW->m_bNoInitialFocus && !PWINDOW->m_bIsModal && PWINDOW->m_iX11Type != 2) + if (!PWINDOW->m_bNoFocus && !PWINDOW->m_bNoInitialFocus && PWINDOW->m_iX11Type != 2) g_pCompositor->focusWindow(PWINDOW); Debug::log(LOG, "Window got assigned a surfaceTreeNode %x", PWINDOW->m_pSurfaceTree); -- cgit v1.2.3 From 06c0be5ea6e3ed6b7fe7a45a550d42bc646ad6db Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Sun, 10 Jul 2022 11:45:50 +0200 Subject: clear with 17 --- src/events/Monitors.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/events') diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index d46b02ff..7a0fb358 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -270,7 +270,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { // potentially can save on resources. g_pHyprOpenGL->begin(PMONITOR, &damage); - g_pHyprOpenGL->clear(CColor(100, 11, 11, 255)); + g_pHyprOpenGL->clear(CColor(17, 17, 17, 255)); g_pHyprOpenGL->clearWithTex(); // will apply the hypr "wallpaper" g_pHyprRenderer->renderAllClientsForMonitor(PMONITOR->ID, &now); -- cgit v1.2.3 From 11c88e2503e10f17997bde8db072beac3b965410 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Sun, 10 Jul 2022 20:36:32 +0200 Subject: apply surface width to ls geo on commit --- src/events/Layers.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/events') diff --git a/src/events/Layers.cpp b/src/events/Layers.cpp index 8bbb2bf6..9c4daeac 100644 --- a/src/events/Layers.cpp +++ b/src/events/Layers.cpp @@ -217,5 +217,8 @@ void Events::listener_commitLayerSurface(void* owner, void* data) { layersurface->position = Vector2D(layersurface->geometry.x, layersurface->geometry.y); + // update geom if it changed + layersurface->geometry = {layersurface->geometry.x, layersurface->geometry.y, layersurface->layerSurface->surface->current.width, layersurface->layerSurface->surface->current.height}; + g_pHyprRenderer->damageSurface(layersurface->layerSurface->surface, layersurface->position.x, layersurface->position.y); } \ No newline at end of file -- cgit v1.2.3 From c923b0e538b7381ecbb4d50b45917ac353d06824 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Mon, 11 Jul 2022 15:31:31 +0200 Subject: respect size in setgeo unmanaged x11 --- src/events/Windows.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/events') diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index b7b631b2..2ed0de88 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -501,10 +501,12 @@ void Events::listener_unmanagedSetGeometry(void* owner, void* data) { return; const auto POS = PWINDOW->m_vRealPosition.goalv(); + const auto SIZ = PWINDOW->m_vRealSize.goalv(); - if (floor(POS.x) != PWINDOW->m_uSurface.xwayland->x || floor(POS.x) != PWINDOW->m_uSurface.xwayland->y) { + if (floor(POS.x) != PWINDOW->m_uSurface.xwayland->x || floor(POS.x) != PWINDOW->m_uSurface.xwayland->y || floor(SIZ.x) != PWINDOW->m_uSurface.xwayland->width || floor(SIZ.y) != PWINDOW->m_uSurface.xwayland->height) { g_pHyprRenderer->damageWindow(PWINDOW); PWINDOW->m_vRealPosition.setValueAndWarp(Vector2D(PWINDOW->m_uSurface.xwayland->x, PWINDOW->m_uSurface.xwayland->y)); + PWINDOW->m_vRealSize.setValueAndWarp(Vector2D(PWINDOW->m_uSurface.xwayland->width, PWINDOW->m_uSurface.xwayland->height)); g_pXWaylandManager->setWindowSize(PWINDOW, PWINDOW->m_vRealSize.vec()); g_pCompositor->moveWindowToTop(PWINDOW); g_pHyprRenderer->damageWindow(PWINDOW); -- cgit v1.2.3 From ab44aabbd717a23f60f29fbafdaab0226326b814 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Mon, 11 Jul 2022 19:07:59 +0200 Subject: update decos on setgeometry x11 --- src/events/Windows.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/events') diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index 2ed0de88..bbd7421a 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -509,6 +509,7 @@ void Events::listener_unmanagedSetGeometry(void* owner, void* data) { PWINDOW->m_vRealSize.setValueAndWarp(Vector2D(PWINDOW->m_uSurface.xwayland->width, PWINDOW->m_uSurface.xwayland->height)); g_pXWaylandManager->setWindowSize(PWINDOW, PWINDOW->m_vRealSize.vec()); g_pCompositor->moveWindowToTop(PWINDOW); + PWINDOW->updateWindowDecos(); g_pHyprRenderer->damageWindow(PWINDOW); } } -- cgit v1.2.3 From ad66c158ba793c424519eaee0a64fb81860f5e3c Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Mon, 11 Jul 2022 20:23:16 +0200 Subject: don't refocus on virt ptrs --- src/events/Devices.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/events') diff --git a/src/events/Devices.cpp b/src/events/Devices.cpp index eae04bc3..5660772c 100644 --- a/src/events/Devices.cpp +++ b/src/events/Devices.cpp @@ -151,7 +151,7 @@ void Events::listener_newVirtPtr(wl_listener* listener, void* data) { const auto POINTER = EV->new_pointer; const auto DEVICE = &POINTER->pointer.base; - g_pInputManager->newMouse(DEVICE); + g_pInputManager->newMouse(DEVICE, true); } void Events::listener_destroyMouse(void* owner, void* data) { -- cgit v1.2.3 From 676e4c36c53c991f6950a0c51fbe7b41ee9a4db2 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Mon, 11 Jul 2022 22:51:20 +0200 Subject: fix focus on layers when constrained --- src/events/Layers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/events') diff --git a/src/events/Layers.cpp b/src/events/Layers.cpp index 9c4daeac..45f20870 100644 --- a/src/events/Layers.cpp +++ b/src/events/Layers.cpp @@ -118,7 +118,7 @@ void Events::listener_mapLayerSurface(void* owner, void* data) { g_pHyprRenderer->arrangeLayersForMonitor(PMONITOR->ID); - if (layersurface->layerSurface->current.keyboard_interactive) + if (layersurface->layerSurface->current.keyboard_interactive && (!g_pCompositor->m_sSeat.mouse || !g_pCompositor->m_sSeat.mouse->currentConstraint)) // don't focus if constrained g_pCompositor->focusSurface(layersurface->layerSurface->surface); // mouse enter always, keeb only when needed -- cgit v1.2.3 From c0c75db62188667a4f42aef1ae6bfd8034093af7 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Mon, 11 Jul 2022 23:56:24 +0200 Subject: roll VFR for everyone --- src/events/Monitors.cpp | 47 ++++++++++++----------------------------------- 1 file changed, 12 insertions(+), 35 deletions(-) (limited to 'src/events') diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index 7a0fb358..1b90fbd0 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -15,8 +15,6 @@ // // // --------------------------------------------------------- // -SMonitor* pMostHzMonitor = nullptr; - void Events::listener_change(wl_listener* listener, void* data) { // layout got changed, let's update monitors. const auto CONFIG = wlr_output_configuration_v1_create(); @@ -149,9 +147,6 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { g_pCompositor->deactivateAllWLRWorkspaces(PNEWWORKSPACE->m_pWlrHandle); PNEWWORKSPACE->setActive(true); - - if (!pMostHzMonitor || monitorRule.refreshRate > pMostHzMonitor->refreshRate) - pMostHzMonitor = PNEWMONITOR; // if (!g_pCompositor->m_pLastMonitor) // set the last monitor if it isnt set yet @@ -173,7 +168,6 @@ void Events::listener_monitorFrame(void* owner, void* data) { static auto *const PDEBUGOVERLAY = &g_pConfigManager->getConfigValuePtr("debug:overlay")->intValue; static auto *const PDAMAGETRACKINGMODE = &g_pConfigManager->getConfigValuePtr("general:damage_tracking_internal")->intValue; static auto *const PDAMAGEBLINK = &g_pConfigManager->getConfigValuePtr("debug:damage_blink")->intValue; - static auto *const VFRENABLED = &g_pConfigManager->getConfigValuePtr("experimental:vfr")->intValue; static int damageBlinkCleanup = 0; // because double-buffered @@ -182,22 +176,20 @@ void Events::listener_monitorFrame(void* owner, void* data) { g_pDebugOverlay->frameData(PMONITOR); } - // Hack: only check when monitor with top hz refreshes, saves a bit of resources. - // This is for stuff that should be run every frame - if (PMONITOR->ID == pMostHzMonitor->ID || *VFRENABLED) { // unfortunately with VFR we don't have the guarantee mostHz is going to be updated all the time, so we have to ignore that - g_pCompositor->sanityCheckWorkspaces(); - g_pAnimationManager->tick(); - g_pCompositor->cleanupFadingOut(); + // checks // + g_pCompositor->sanityCheckWorkspaces(); + g_pAnimationManager->tick(); + g_pCompositor->cleanupFadingOut(); - HyprCtl::tickHyprCtl(); // so that we dont get that race condition multithread bullshit + HyprCtl::tickHyprCtl(); // so that we dont get that race condition multithread bullshit - g_pConfigManager->dispatchExecOnce(); // We exec-once when at least one monitor starts refreshing, meaning stuff has init'd + g_pConfigManager->dispatchExecOnce(); // We exec-once when at least one monitor starts refreshing, meaning stuff has init'd - if (g_pConfigManager->m_bWantsMonitorReload) - g_pConfigManager->performMonitorReload(); + if (g_pConfigManager->m_bWantsMonitorReload) + g_pConfigManager->performMonitorReload(); - g_pHyprRenderer->ensureCursorRenderingMode(); // so that the cursor gets hidden/shown if the user requested timeouts - } + g_pHyprRenderer->ensureCursorRenderingMode(); // so that the cursor gets hidden/shown if the user requested timeouts + // // if (PMONITOR->framesToSkip > 0) { PMONITOR->framesToSkip -= 1; @@ -233,7 +225,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { pixman_region32_fini(&damage); wlr_output_rollback(PMONITOR->output); - if (!*VFRENABLED) + if (*PDAMAGEBLINK) wlr_output_schedule_frame(PMONITOR->output); return; @@ -323,7 +315,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { wlr_output_commit(PMONITOR->output); - if (!*VFRENABLED) + if (*PDAMAGEBLINK) wlr_output_schedule_frame(PMONITOR->output); if (*PDEBUGOVERLAY == 1) { @@ -390,19 +382,4 @@ void Events::listener_monitorDestroy(void* owner, void* data) { g_pEventManager->postEvent(SHyprIPCEvent("monitorremoved", pMonitor->szName)); g_pCompositor->m_vMonitors.erase(std::remove_if(g_pCompositor->m_vMonitors.begin(), g_pCompositor->m_vMonitors.end(), [&](std::unique_ptr& el) { return el.get() == pMonitor; })); - - // update the pMostHzMonitor - if (pMostHzMonitor == pMonitor) { - int mostHz = 0; - SMonitor* pMonitorMostHz = nullptr; - - for (auto& m : g_pCompositor->m_vMonitors) { - if (m->refreshRate > mostHz) { - pMonitorMostHz = m.get(); - mostHz = m->refreshRate; - } - } - - pMostHzMonitor = pMonitorMostHz; - } } -- cgit v1.2.3 From 29e2bb27f6073695aa4f9767f87cd653db5ce811 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Tue, 12 Jul 2022 10:02:12 +0200 Subject: added misc:no_vfr --- src/events/Monitors.cpp | 42 ++++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) (limited to 'src/events') diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index 1b90fbd0..d523aeb3 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -15,6 +15,8 @@ // // // --------------------------------------------------------- // +SMonitor* pMostHzMonitor = nullptr; + void Events::listener_change(wl_listener* listener, void* data) { // layout got changed, let's update monitors. const auto CONFIG = wlr_output_configuration_v1_create(); @@ -149,6 +151,9 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { PNEWWORKSPACE->setActive(true); // + if (!pMostHzMonitor || monitorRule.refreshRate > pMostHzMonitor->refreshRate) + pMostHzMonitor = PNEWMONITOR; + if (!g_pCompositor->m_pLastMonitor) // set the last monitor if it isnt set yet g_pCompositor->m_pLastMonitor = PNEWMONITOR; @@ -168,6 +173,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { static auto *const PDEBUGOVERLAY = &g_pConfigManager->getConfigValuePtr("debug:overlay")->intValue; static auto *const PDAMAGETRACKINGMODE = &g_pConfigManager->getConfigValuePtr("general:damage_tracking_internal")->intValue; static auto *const PDAMAGEBLINK = &g_pConfigManager->getConfigValuePtr("debug:damage_blink")->intValue; + static auto *const PNOVFR = &g_pConfigManager->getConfigValuePtr("misc:no_vfr")->intValue; static int damageBlinkCleanup = 0; // because double-buffered @@ -177,18 +183,20 @@ void Events::listener_monitorFrame(void* owner, void* data) { } // checks // - g_pCompositor->sanityCheckWorkspaces(); - g_pAnimationManager->tick(); - g_pCompositor->cleanupFadingOut(); + if (PMONITOR->ID == pMostHzMonitor->ID || !*PNOVFR) { // unfortunately with VFR we don't have the guarantee mostHz is going to be updated all the time, so we have to ignore that + g_pCompositor->sanityCheckWorkspaces(); + g_pAnimationManager->tick(); + g_pCompositor->cleanupFadingOut(); - HyprCtl::tickHyprCtl(); // so that we dont get that race condition multithread bullshit + HyprCtl::tickHyprCtl(); // so that we dont get that race condition multithread bullshit - g_pConfigManager->dispatchExecOnce(); // We exec-once when at least one monitor starts refreshing, meaning stuff has init'd + g_pConfigManager->dispatchExecOnce(); // We exec-once when at least one monitor starts refreshing, meaning stuff has init'd - if (g_pConfigManager->m_bWantsMonitorReload) - g_pConfigManager->performMonitorReload(); + if (g_pConfigManager->m_bWantsMonitorReload) + g_pConfigManager->performMonitorReload(); - g_pHyprRenderer->ensureCursorRenderingMode(); // so that the cursor gets hidden/shown if the user requested timeouts + g_pHyprRenderer->ensureCursorRenderingMode(); // so that the cursor gets hidden/shown if the user requested timeouts + } // // if (PMONITOR->framesToSkip > 0) { @@ -225,7 +233,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { pixman_region32_fini(&damage); wlr_output_rollback(PMONITOR->output); - if (*PDAMAGEBLINK) + if (*PDAMAGEBLINK || *PNOVFR) wlr_output_schedule_frame(PMONITOR->output); return; @@ -315,7 +323,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { wlr_output_commit(PMONITOR->output); - if (*PDAMAGEBLINK) + if (*PDAMAGEBLINK || *PNOVFR) wlr_output_schedule_frame(PMONITOR->output); if (*PDEBUGOVERLAY == 1) { @@ -382,4 +390,18 @@ void Events::listener_monitorDestroy(void* owner, void* data) { g_pEventManager->postEvent(SHyprIPCEvent("monitorremoved", pMonitor->szName)); g_pCompositor->m_vMonitors.erase(std::remove_if(g_pCompositor->m_vMonitors.begin(), g_pCompositor->m_vMonitors.end(), [&](std::unique_ptr& el) { return el.get() == pMonitor; })); + + if (pMostHzMonitor == pMonitor) { + int mostHz = 0; + SMonitor* pMonitorMostHz = nullptr; + + for (auto& m : g_pCompositor->m_vMonitors) { + if (m->refreshRate > mostHz) { + pMonitorMostHz = m.get(); + mostHz = m->refreshRate; + } + } + + pMostHzMonitor = pMonitorMostHz; + } } -- cgit v1.2.3 From a4f82491b7e825255253a1fbea509e823b73115b Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Tue, 12 Jul 2022 13:40:55 +0200 Subject: active opacity is now animated --- src/events/Windows.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'src/events') diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index bbd7421a..71f1775f 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -32,6 +32,9 @@ void addViewCoords(void* pWindow, int* x, int* y) { void Events::listener_mapWindow(void* owner, void* data) { CWindow* PWINDOW = (CWindow*)owner; + static auto *const PINACTIVEALPHA = &g_pConfigManager->getConfigValuePtr("decoration:inactive_opacity")->floatValue; + static auto *const PACTIVEALPHA = &g_pConfigManager->getConfigValuePtr("decoration:active_opacity")->floatValue; + const auto PMONITOR = g_pCompositor->getMonitorFromCursor(); const auto PWORKSPACE = PMONITOR->specialWorkspaceOpen ? g_pCompositor->getWorkspaceByID(SPECIAL_WORKSPACE_ID) : g_pCompositor->getWorkspaceByID(PMONITOR->activeWorkspace); PWINDOW->m_iMonitorID = PMONITOR->ID; @@ -235,8 +238,11 @@ void Events::listener_mapWindow(void* owner, void* data) { PWINDOW->m_vPseudoSize = PWINDOW->m_vRealSize.goalv() - Vector2D(10,10); } - if (!PWINDOW->m_bNoFocus && !PWINDOW->m_bNoInitialFocus && PWINDOW->m_iX11Type != 2) + if (!PWINDOW->m_bNoFocus && !PWINDOW->m_bNoInitialFocus && PWINDOW->m_iX11Type != 2) { g_pCompositor->focusWindow(PWINDOW); + PWINDOW->m_fActiveInactiveAlpha.setValueAndWarp(*PACTIVEALPHA); + } else + PWINDOW->m_fActiveInactiveAlpha.setValueAndWarp(*PINACTIVEALPHA); Debug::log(LOG, "Window got assigned a surfaceTreeNode %x", PWINDOW->m_pSurfaceTree); -- cgit v1.2.3 From b1e3430405850c24035c8c1f70ebea99a707135a Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Tue, 12 Jul 2022 14:14:12 +0200 Subject: only set xwayland size/pos on reasonable deltas --- src/events/Windows.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src/events') diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index 71f1775f..3d46931e 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -509,10 +509,13 @@ void Events::listener_unmanagedSetGeometry(void* owner, void* data) { const auto POS = PWINDOW->m_vRealPosition.goalv(); const auto SIZ = PWINDOW->m_vRealSize.goalv(); - if (floor(POS.x) != PWINDOW->m_uSurface.xwayland->x || floor(POS.x) != PWINDOW->m_uSurface.xwayland->y || floor(SIZ.x) != PWINDOW->m_uSurface.xwayland->width || floor(SIZ.y) != PWINDOW->m_uSurface.xwayland->height) { + if (abs(floor(POS.x) - PWINDOW->m_uSurface.xwayland->x) > 2 || abs(floor(POS.y) - PWINDOW->m_uSurface.xwayland->y) > 2 || abs(floor(SIZ.x) - PWINDOW->m_uSurface.xwayland->width) > 2 || abs(floor(SIZ.y) - PWINDOW->m_uSurface.xwayland->height) > 2) { g_pHyprRenderer->damageWindow(PWINDOW); PWINDOW->m_vRealPosition.setValueAndWarp(Vector2D(PWINDOW->m_uSurface.xwayland->x, PWINDOW->m_uSurface.xwayland->y)); - PWINDOW->m_vRealSize.setValueAndWarp(Vector2D(PWINDOW->m_uSurface.xwayland->width, PWINDOW->m_uSurface.xwayland->height)); + + if (abs(floor(SIZ.x) - PWINDOW->m_uSurface.xwayland->width) > 2 || abs(floor(SIZ.y) - PWINDOW->m_uSurface.xwayland->height) > 2) + PWINDOW->m_vRealSize.setValueAndWarp(Vector2D(PWINDOW->m_uSurface.xwayland->width, PWINDOW->m_uSurface.xwayland->height)); + g_pXWaylandManager->setWindowSize(PWINDOW, PWINDOW->m_vRealSize.vec()); g_pCompositor->moveWindowToTop(PWINDOW); PWINDOW->updateWindowDecos(); -- cgit v1.2.3 From bf762f566f1c8c5e9c636f0d1ad4e485ad322da9 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Tue, 12 Jul 2022 23:11:34 +0200 Subject: Fix VRAM memory leak when releasing snapshots --- src/events/Monitors.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/events') diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index d523aeb3..cf7e4b49 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -186,7 +186,6 @@ void Events::listener_monitorFrame(void* owner, void* data) { if (PMONITOR->ID == pMostHzMonitor->ID || !*PNOVFR) { // unfortunately with VFR we don't have the guarantee mostHz is going to be updated all the time, so we have to ignore that g_pCompositor->sanityCheckWorkspaces(); g_pAnimationManager->tick(); - g_pCompositor->cleanupFadingOut(); HyprCtl::tickHyprCtl(); // so that we dont get that race condition multithread bullshit @@ -229,6 +228,9 @@ void Events::listener_monitorFrame(void* owner, void* data) { return; } + // we need to cleanup fading out when rendering the appropriate context + g_pCompositor->cleanupFadingOut(PMONITOR->ID); + if (!hasChanged && *PDAMAGETRACKINGMODE != DAMAGE_TRACKING_NONE && PMONITOR->forceFullFrames == 0 && damageBlinkCleanup == 0) { pixman_region32_fini(&damage); wlr_output_rollback(PMONITOR->output); -- cgit v1.2.3 From 6708f3b1334e8b6a966f424fe04713a4e74d5fdb Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Wed, 13 Jul 2022 18:18:23 +0200 Subject: Fixed TTY switching (#364) --- src/events/Events.hpp | 3 +++ src/events/Misc.cpp | 6 ++++++ src/events/Monitors.cpp | 36 ++++++++++++++++++++---------------- 3 files changed, 29 insertions(+), 16 deletions(-) (limited to 'src/events') diff --git a/src/events/Events.hpp b/src/events/Events.hpp index eefc55c7..63e65fdc 100644 --- a/src/events/Events.hpp +++ b/src/events/Events.hpp @@ -119,4 +119,7 @@ namespace Events { LISTENER(swipeBegin); LISTENER(swipeEnd); LISTENER(swipeUpdate); + + // session + LISTENER(sessionActive); }; \ No newline at end of file diff --git a/src/events/Misc.cpp b/src/events/Misc.cpp index c25b1c6a..503d2111 100644 --- a/src/events/Misc.cpp +++ b/src/events/Misc.cpp @@ -157,4 +157,10 @@ void Events::listener_InhibitDeactivate(wl_listener* listener, void* data) { void Events::listener_RendererDestroy(wl_listener* listener, void* data) { Debug::log(LOG, "!!Renderer destroyed!!"); +} + +void Events::listener_sessionActive(wl_listener* listener, void* data) { + Debug::log(LOG, "Session got activated!"); + + g_pCompositor->m_bSessionActive = true; } \ No newline at end of file diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index cf7e4b49..949d4585 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -166,6 +166,11 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { void Events::listener_monitorFrame(void* owner, void* data) { SMonitor* const PMONITOR = (SMonitor*)owner; + if (!g_pCompositor->m_sWLRSession->active || !g_pCompositor->m_bSessionActive) { + Debug::log(WARN, "Attempted to render frame on inactive session!"); + return; // cannot draw on session inactive (different tty) + } + static std::chrono::high_resolution_clock::time_point startRender = std::chrono::high_resolution_clock::now(); static std::chrono::high_resolution_clock::time_point startRenderOverlay = std::chrono::high_resolution_clock::now(); static std::chrono::high_resolution_clock::time_point endRenderOverlay = std::chrono::high_resolution_clock::now(); @@ -182,6 +187,18 @@ void Events::listener_monitorFrame(void* owner, void* data) { g_pDebugOverlay->frameData(PMONITOR); } + if (PMONITOR->framesToSkip > 0) { + PMONITOR->framesToSkip -= 1; + + if (!PMONITOR->noFrameSchedule) + g_pCompositor->scheduleFrameForMonitor(PMONITOR); + else { + Debug::log(LOG, "NoFrameSchedule hit for %s.", PMONITOR->szName.c_str()); + } + g_pLayoutManager->getCurrentLayout()->recalculateMonitor(PMONITOR->ID); + return; + } + // checks // if (PMONITOR->ID == pMostHzMonitor->ID || !*PNOVFR) { // unfortunately with VFR we don't have the guarantee mostHz is going to be updated all the time, so we have to ignore that g_pCompositor->sanityCheckWorkspaces(); @@ -198,18 +215,6 @@ void Events::listener_monitorFrame(void* owner, void* data) { } // // - if (PMONITOR->framesToSkip > 0) { - PMONITOR->framesToSkip -= 1; - - if (!PMONITOR->noFrameSchedule) - wlr_output_schedule_frame(PMONITOR->output); - else { - Debug::log(LOG, "NoFrameSchedule hit for %s.", PMONITOR->szName.c_str()); - } - g_pLayoutManager->getCurrentLayout()->recalculateMonitor(PMONITOR->ID); - return; - } - timespec now; clock_gettime(CLOCK_MONOTONIC, &now); @@ -236,7 +241,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { wlr_output_rollback(PMONITOR->output); if (*PDAMAGEBLINK || *PNOVFR) - wlr_output_schedule_frame(PMONITOR->output); + g_pCompositor->scheduleFrameForMonitor(PMONITOR); return; } @@ -326,7 +331,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { wlr_output_commit(PMONITOR->output); if (*PDAMAGEBLINK || *PNOVFR) - wlr_output_schedule_frame(PMONITOR->output); + g_pCompositor->scheduleFrameForMonitor(PMONITOR); if (*PDEBUGOVERLAY == 1) { const float µs = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - startRender).count() / 1000.f; @@ -360,8 +365,7 @@ void Events::listener_monitorDestroy(void* owner, void* data) { if (!BACKUPMON) { Debug::log(CRIT, "No monitors! Unplugged last! Exiting."); - g_pCompositor->cleanupExit(); - exit(1); + g_pCompositor->cleanup(); return; } -- cgit v1.2.3 From 49dbb586e341b5aeb451897ddfe7b46dd538b8c9 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Wed, 13 Jul 2022 18:31:09 +0200 Subject: fixed session-less envs --- src/events/Monitors.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/events') diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index 949d4585..24a8faa7 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -166,7 +166,7 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { void Events::listener_monitorFrame(void* owner, void* data) { SMonitor* const PMONITOR = (SMonitor*)owner; - if (!g_pCompositor->m_sWLRSession->active || !g_pCompositor->m_bSessionActive) { + if ((g_pCompositor->m_sWLRSession && !g_pCompositor->m_sWLRSession->active) || !g_pCompositor->m_bSessionActive) { Debug::log(WARN, "Attempted to render frame on inactive session!"); return; // cannot draw on session inactive (different tty) } -- cgit v1.2.3 From 642af5395e19d696be0cbf217a92d2a1e723e17a Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Thu, 14 Jul 2022 21:33:36 +0200 Subject: dont focus anything on constrained --- src/events/Layers.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'src/events') diff --git a/src/events/Layers.cpp b/src/events/Layers.cpp index 45f20870..0e2f49d5 100644 --- a/src/events/Layers.cpp +++ b/src/events/Layers.cpp @@ -99,8 +99,6 @@ void Events::listener_mapLayerSurface(void* owner, void* data) { layersurface->layerSurface->mapped = true; - wlr_surface_send_enter(layersurface->layerSurface->surface, layersurface->layerSurface->output); - // fix if it changed its mon const auto PMONITOR = g_pCompositor->getMonitorFromOutput(layersurface->layerSurface->output); @@ -118,13 +116,14 @@ void Events::listener_mapLayerSurface(void* owner, void* data) { g_pHyprRenderer->arrangeLayersForMonitor(PMONITOR->ID); - if (layersurface->layerSurface->current.keyboard_interactive && (!g_pCompositor->m_sSeat.mouse || !g_pCompositor->m_sSeat.mouse->currentConstraint)) // don't focus if constrained + if (layersurface->layerSurface->current.keyboard_interactive && (!g_pCompositor->m_sSeat.mouse || !g_pCompositor->m_sSeat.mouse->currentConstraint)) { // don't focus if constrained + wlr_surface_send_enter(layersurface->layerSurface->surface, layersurface->layerSurface->output); g_pCompositor->focusSurface(layersurface->layerSurface->surface); - // mouse enter always, keeb only when needed - const auto LOCAL = g_pInputManager->getMouseCoordsInternal() - Vector2D(layersurface->geometry.x + PMONITOR->vecPosition.x, layersurface->geometry.y + PMONITOR->vecPosition.y); - wlr_seat_pointer_notify_enter(g_pCompositor->m_sSeat.seat, layersurface->layerSurface->surface, LOCAL.x, LOCAL.y); - wlr_seat_pointer_notify_motion(g_pCompositor->m_sSeat.seat, 0, LOCAL.x, LOCAL.y); + const auto LOCAL = g_pInputManager->getMouseCoordsInternal() - Vector2D(layersurface->geometry.x + PMONITOR->vecPosition.x, layersurface->geometry.y + PMONITOR->vecPosition.y); + wlr_seat_pointer_notify_enter(g_pCompositor->m_sSeat.seat, layersurface->layerSurface->surface, LOCAL.x, LOCAL.y); + wlr_seat_pointer_notify_motion(g_pCompositor->m_sSeat.seat, 0, LOCAL.x, LOCAL.y); + } layersurface->position = Vector2D(layersurface->geometry.x, layersurface->geometry.y); -- cgit v1.2.3