From ebfbd4f7c302f80032476e65937575a2d6ff0882 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Thu, 14 Apr 2022 18:16:09 +0200 Subject: [PATCH 01/10] fix focus not applying sometimes to the active window --- src/Compositor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 2f1746c9..45e2444b 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -366,7 +366,7 @@ void CCompositor::focusWindow(CWindow* pWindow, wlr_surface* pSurface) { return; } - if (m_pLastWindow == pWindow) + if (m_pLastWindow == pWindow && m_sSeat.seat->keyboard_state.focused_surface == pSurface) return; if (windowValidMapped(m_pLastWindow) && m_pLastWindow->m_bIsX11) { From 8b8903391823ac2f53b486764c85f31c49bf8ce6 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Thu, 14 Apr 2022 18:18:37 +0200 Subject: [PATCH 02/10] Add a note regarding packages --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index f360fb65..f944981c 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,8 @@ Hyprland needs testers! Try it out and report bugs or suggestions! # Installation I do not maintain any packages, but some kind people have made them for me. If I missed any, please let me know. +**Warning:** since I am not the maintainer, I cannot guarantee that those packages will always work and be up to date. Use at your own disclosure. If they don't, try building manually. + _Arch (AUR, -git)_ ``` yay -S hyprland-git From d1e5f8760741b4b2ad4652f15519f56f52e7e646 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Thu, 14 Apr 2022 20:11:46 +0200 Subject: [PATCH 03/10] fix first workspace being 0 --- src/events/Monitors.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index 85b76abd..90617f51 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -135,7 +135,7 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { PNEWMONITOR->pWLRWorkspaceGroupHandle = wlr_ext_workspace_group_handle_v1_create(g_pCompositor->m_sWLREXTWorkspaceMgr); // Workspace - const auto WORKSPACEID = monitorRule.defaultWorkspaceID == -1 ? g_pCompositor->m_lWorkspaces.size() : monitorRule.defaultWorkspaceID; + const auto WORKSPACEID = monitorRule.defaultWorkspaceID == -1 ? g_pCompositor->m_lWorkspaces.size() + 1 /* Cuz workspaces doesnt have the new one yet and we start with 1 */ : monitorRule.defaultWorkspaceID; g_pCompositor->m_lWorkspaces.emplace_back(newMonitor.ID); const auto PNEWWORKSPACE = &g_pCompositor->m_lWorkspaces.back(); From e4d05c90ce755a609cbec229a54d0069f21e7d53 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Thu, 14 Apr 2022 21:30:18 +0200 Subject: [PATCH 04/10] fix pointer focus coords in focusWindow --- src/Compositor.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 45e2444b..753e61c2 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -380,8 +380,9 @@ void CCompositor::focusWindow(CWindow* pWindow, wlr_surface* pSurface) { g_pXWaylandManager->activateWindow(pWindow, true); - // do pointer focus too - wlr_seat_pointer_notify_enter(m_sSeat.seat, PWINDOWSURFACE, 0, 0); + // do pointer focus too + const auto POINTERLOCAL = g_pInputManager->getMouseCoordsInternal() - pWindow->m_vRealPosition; + wlr_seat_pointer_notify_enter(m_sSeat.seat, PWINDOWSURFACE, POINTERLOCAL.x, POINTERLOCAL.y); m_pLastWindow = pWindow; } From 05d7afe2ecd69169045248e04bf039bdae2508f6 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Thu, 14 Apr 2022 21:48:12 +0200 Subject: [PATCH 05/10] support linux_dmabuf_v1 --- src/Compositor.cpp | 1 + src/Compositor.hpp | 1 + src/includes.hpp | 1 + 3 files changed, 3 insertions(+) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 753e61c2..95e2ac48 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -54,6 +54,7 @@ CCompositor::CCompositor() { m_sWLRSubCompositor = wlr_subcompositor_create(m_sWLDisplay); m_sWLRDataDevMgr = wlr_data_device_manager_create(m_sWLDisplay); + m_sWLRDmabuf = wlr_linux_dmabuf_v1_create(m_sWLDisplay, m_sWLRRenderer); wlr_export_dmabuf_manager_v1_create(m_sWLDisplay); wlr_screencopy_manager_v1_create(m_sWLDisplay); wlr_data_control_manager_v1_create(m_sWLDisplay); diff --git a/src/Compositor.hpp b/src/Compositor.hpp index 9f1fdc87..2435b972 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -50,6 +50,7 @@ public: wlr_egl* m_sWLREGL; int m_iDRMFD; wlr_ext_workspace_manager_v1* m_sWLREXTWorkspaceMgr; + wlr_linux_dmabuf_v1* m_sWLRDmabuf; // ------------------------------------------------- // diff --git a/src/includes.hpp b/src/includes.hpp index 54893af7..db4bd60f 100644 --- a/src/includes.hpp +++ b/src/includes.hpp @@ -42,6 +42,7 @@ extern "C" { #include #include #include +#include #include #include #include From 7cd3e5f34affc85ed57345fe3473d64d83151677 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Thu, 14 Apr 2022 23:02:10 +0200 Subject: [PATCH 06/10] Added workspace dispatcher + and - --- src/managers/KeybindManager.cpp | 35 +++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index dbb5fa06..f4e0df94 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -56,6 +56,9 @@ bool CKeybindManager::handleKeybinds(const uint32_t& modmask, const xkb_keysym_t else if (k.handler == "movefocus") { moveFocusTo(k.arg); } else if (k.handler == "togglegroup") { toggleGroup(k.arg); } else if (k.handler == "changegroupactive") { changeGroupActive(k.arg); } + else { + Debug::log(ERR, "Inavlid handler in a keybind! (handler %s does not exist)", k.handler.c_str()); + } found = true; } @@ -130,10 +133,28 @@ void CKeybindManager::toggleActivePseudo(std::string args) { void CKeybindManager::changeworkspace(std::string args) { int workspaceToChangeTo = 0; - try { - workspaceToChangeTo = stoi(args); - } catch (...) { - Debug::log(ERR, "Invalid arg \"%s\" in changeWorkspace!", args.c_str()); + + if (args.find_first_of("+") == 0) { + try { + workspaceToChangeTo = g_pCompositor->m_pLastMonitor->activeWorkspace + std::stoi(args.substr(1)); + } catch (...) { + Debug::log(ERR, "Invalid arg \"%s\" in changeWorkspace!", args.c_str()); + return; + } + } else if (args.find_first_of("-") == 0) { + try { + workspaceToChangeTo = std::clamp(g_pCompositor->m_pLastMonitor->activeWorkspace - std::stoi(args.substr(1)), 1, INT_MAX); + } catch (...) { + Debug::log(ERR, "Invalid arg \"%s\" in changeWorkspace!", args.c_str()); + return; + } + } else { + try { + workspaceToChangeTo = stoi(args); + } catch (...) { + Debug::log(ERR, "Invalid arg \"%s\" in changeWorkspace!", args.c_str()); + return; + } } // if it exists, we warp to it @@ -171,6 +192,9 @@ void CKeybindManager::changeworkspace(std::string args) { Debug::log(LOG, "Changed to workspace %i", workspaceToChangeTo); + // focus + g_pInputManager->refocus(); + return; } @@ -198,6 +222,9 @@ void CKeybindManager::changeworkspace(std::string args) { g_pCompositor->deactivateAllWLRWorkspaces(); wlr_ext_workspace_handle_v1_set_active(PWORKSPACE->m_pWlrHandle, true); + // focus (clears the last) + g_pInputManager->refocus(); + Debug::log(LOG, "Changed to workspace %i", workspaceToChangeTo); } From 2118628d586456e1173cfbd69add792b20f6c11f Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Fri, 15 Apr 2022 18:59:58 +0200 Subject: [PATCH 07/10] include climits --- src/includes.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/includes.hpp b/src/includes.hpp index db4bd60f..45347672 100644 --- a/src/includes.hpp +++ b/src/includes.hpp @@ -20,6 +20,7 @@ #include #include #include +#include #if true From 4a966c945bc04982cde1f9ab8f84a67df928c3f1 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Sun, 17 Apr 2022 10:19:46 +0200 Subject: [PATCH 08/10] Add monitor disabled option --- src/config/ConfigManager.cpp | 8 ++++++++ src/config/ConfigManager.hpp | 1 + src/events/Monitors.cpp | 13 ++++++++++--- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 14f20470..b15d7bcf 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -142,6 +142,14 @@ void CConfigManager::handleMonitor(const std::string& command, const std::string nextItem(); + if (curitem == "disable") { + newrule.disabled = true; + + m_dMonitorRules.push_back(newrule); + + return; + } + newrule.resolution.x = stoi(curitem.substr(0, curitem.find_first_of('x'))); newrule.resolution.y = stoi(curitem.substr(curitem.find_first_of('x') + 1, curitem.find_first_of('@'))); diff --git a/src/config/ConfigManager.hpp b/src/config/ConfigManager.hpp index 45946b93..e1e21dd2 100644 --- a/src/config/ConfigManager.hpp +++ b/src/config/ConfigManager.hpp @@ -26,6 +26,7 @@ struct SMonitorRule { float scale = 1; float refreshRate = 60; int defaultWorkspaceID = -1; + bool disabled = false; }; struct SWindowRule { diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index 90617f51..5fa6b67b 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -45,6 +45,16 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { // new monitor added, let's accomodate for that. const auto OUTPUT = (wlr_output*)data; + // get monitor rule that matches + SMonitorRule monitorRule = g_pConfigManager->getMonitorRuleFor(OUTPUT->name); + + // if it's disabled, disable and ignore + if (monitorRule.disabled) { + wlr_output_enable(OUTPUT, 0); + wlr_output_commit(OUTPUT); + return; + } + SMonitor newMonitor; newMonitor.output = OUTPUT; newMonitor.ID = g_pCompositor->m_lMonitors.size(); @@ -52,9 +62,6 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { wlr_output_init_render(OUTPUT, g_pCompositor->m_sWLRAllocator, g_pCompositor->m_sWLRRenderer); - // get monitor rule that matches - SMonitorRule monitorRule = g_pConfigManager->getMonitorRuleFor(OUTPUT->name); - wlr_output_set_scale(OUTPUT, monitorRule.scale); wlr_xcursor_manager_load(g_pCompositor->m_sWLRXCursorMgr, monitorRule.scale); wlr_output_set_transform(OUTPUT, WL_OUTPUT_TRANSFORM_NORMAL); // TODO: support other transforms From 4f83adcdb9481bf9ddfd7a570dda0e50899c948d Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Sun, 17 Apr 2022 10:21:54 +0200 Subject: [PATCH 09/10] Allow monitor disabled too --- src/config/ConfigManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index b15d7bcf..72eb2051 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -142,11 +142,11 @@ void CConfigManager::handleMonitor(const std::string& command, const std::string nextItem(); - if (curitem == "disable") { + if (curitem == "disable" || curitem == "disabled") { newrule.disabled = true; m_dMonitorRules.push_back(newrule); - + return; } From 24df15105ee2fc7f2975ef2958c2e7b1258569d1 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Sun, 17 Apr 2022 10:46:04 +0200 Subject: [PATCH 10/10] don't rearrange layersurfaces when not needed --- src/events/Layers.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/events/Layers.cpp b/src/events/Layers.cpp index 4aac1a74..c6295e70 100644 --- a/src/events/Layers.cpp +++ b/src/events/Layers.cpp @@ -145,15 +145,17 @@ void Events::listener_commitLayerSurface(void* owner, void* data) { g_pHyprRenderer->arrangeLayersForMonitor(POLDMON->ID); } - g_pHyprRenderer->arrangeLayersForMonitor(PMONITOR->ID); + if (layersurface->layerSurface->current.committed != 0) { + g_pHyprRenderer->arrangeLayersForMonitor(PMONITOR->ID); - if (layersurface->layer != layersurface->layerSurface->current.layer) { - PMONITOR->m_aLayerSurfaceLists[layersurface->layer].remove(layersurface); - PMONITOR->m_aLayerSurfaceLists[layersurface->layerSurface->current.layer].push_back(layersurface); - layersurface->layer = layersurface->layerSurface->current.layer; + if (layersurface->layer != layersurface->layerSurface->current.layer) { + PMONITOR->m_aLayerSurfaceLists[layersurface->layer].remove(layersurface); + PMONITOR->m_aLayerSurfaceLists[layersurface->layerSurface->current.layer].push_back(layersurface); + layersurface->layer = layersurface->layerSurface->current.layer; + } + + g_pLayoutManager->getCurrentLayout()->recalculateMonitor(PMONITOR->ID); } - g_pLayoutManager->getCurrentLayout()->recalculateMonitor(PMONITOR->ID); - layersurface->position = Vector2D(layersurface->geometry.x, layersurface->geometry.y); } \ No newline at end of file