From f236706d6a32aab3ddaa6ccd509727be3433ccd6 Mon Sep 17 00:00:00 2001 From: bbedward Date: Wed, 3 Dec 2025 12:02:04 -0500 Subject: [PATCH] hyprland: fix workspace overview truncation, update scaling fixes #871 --- .../WorkspaceOverlays/HyprlandOverview.qml | 3 -- .../WorkspaceOverlays/OverviewWidget.qml | 28 +++++++++++-------- .../WorkspaceOverlays/OverviewWindow.qml | 14 ++++++---- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/quickshell/Modules/WorkspaceOverlays/HyprlandOverview.qml b/quickshell/Modules/WorkspaceOverlays/HyprlandOverview.qml index 977f0fca..dc3a5730 100644 --- a/quickshell/Modules/WorkspaceOverlays/HyprlandOverview.qml +++ b/quickshell/Modules/WorkspaceOverlays/HyprlandOverview.qml @@ -1,12 +1,9 @@ import QtQuick import QtQuick.Controls -import QtQuick.Layouts import Quickshell -import Quickshell.Io import Quickshell.Wayland import Quickshell.Hyprland import qs.Common -import qs.Services Scope { id: overviewScope diff --git a/quickshell/Modules/WorkspaceOverlays/OverviewWidget.qml b/quickshell/Modules/WorkspaceOverlays/OverviewWidget.qml index 92ab36e2..6c9e8fa2 100644 --- a/quickshell/Modules/WorkspaceOverlays/OverviewWidget.qml +++ b/quickshell/Modules/WorkspaceOverlays/OverviewWidget.qml @@ -2,7 +2,6 @@ import QtQuick import QtQuick.Effects import QtQuick.Layouts import Quickshell -import Quickshell.Wayland import Quickshell.Hyprland import qs.Common import qs.Services @@ -13,6 +12,7 @@ Item { required property var panelWindow required property bool overviewOpen readonly property HyprlandMonitor monitor: Hyprland.monitorFor(panelWindow.screen) + readonly property real dpr: CompositorService.getScreenScale(panelWindow.screen) readonly property int workspacesShown: SettingsData.overviewRows * SettingsData.overviewColumns readonly property var allWorkspaces: Hyprland.workspaces?.values || [] @@ -77,6 +77,9 @@ Item { readonly property int maxWorkspaceId: displayedWorkspaceIds.length > 0 ? displayedWorkspaceIds[displayedWorkspaceIds.length - 1] : workspacesShown readonly property int displayWorkspaceCount: displayedWorkspaceIds.length + readonly property int effectiveColumns: SettingsData.overviewColumns + readonly property int effectiveRows: Math.max(SettingsData.overviewRows, Math.ceil(displayWorkspaceCount / effectiveColumns)) + function getWorkspaceMonitorName(workspaceId) { if (!allWorkspaces || !workspaceId) return "" try { @@ -103,8 +106,10 @@ Item { property real scale: SettingsData.overviewScale property color activeBorderColor: Theme.primary - property real workspaceImplicitWidth: ((monitor.width / monitor.scale) * root.scale) - property real workspaceImplicitHeight: ((monitor.height / monitor.scale) * root.scale) + readonly property real monitorPhysicalWidth: panelWindow.screen ? (panelWindow.screen.width / root.dpr) : (monitor?.width ?? 1920) + readonly property real monitorPhysicalHeight: panelWindow.screen ? (panelWindow.screen.height / root.dpr) : (monitor?.height ?? 1080) + property real workspaceImplicitWidth: monitorPhysicalWidth * root.scale + property real workspaceImplicitHeight: monitorPhysicalHeight * root.scale property int workspaceZ: 0 property int windowZ: 1 @@ -162,18 +167,18 @@ Item { spacing: workspaceSpacing Repeater { - model: SettingsData.overviewRows + model: root.effectiveRows delegate: RowLayout { id: row property int rowIndex: index spacing: workspaceSpacing Repeater { - model: SettingsData.overviewColumns + model: root.effectiveColumns Rectangle { id: workspace property int colIndex: index - property int workspaceIndex: rowIndex * SettingsData.overviewColumns + colIndex + property int workspaceIndex: rowIndex * root.effectiveColumns + colIndex property int workspaceValue: (root.displayedWorkspaceIds && workspaceIndex < root.displayedWorkspaceIds.length) ? root.displayedWorkspaceIds[workspaceIndex] : -1 property bool workspaceExists: (root.allWorkspaceIds && workspaceValue > 0) ? root.allWorkspaceIds.includes(workspaceValue) : false property var workspaceObj: (workspaceExists && Hyprland.workspaces?.values) ? Hyprland.workspaces.values.find(ws => ws?.id === workspaceValue) : null @@ -292,11 +297,12 @@ Item { } readonly property int workspaceIndex: getWorkspaceIndex() - readonly property int workspaceColIndex: workspaceIndex % SettingsData.overviewColumns - readonly property int workspaceRowIndex: Math.floor(workspaceIndex / SettingsData.overviewColumns) + readonly property int workspaceColIndex: workspaceIndex % root.effectiveColumns + readonly property int workspaceRowIndex: Math.floor(workspaceIndex / root.effectiveColumns) toplevel: modelData scale: root.scale + monitorDpr: root.dpr availableWorkspaceWidth: root.workspaceImplicitWidth availableWorkspaceHeight: root.workspaceImplicitHeight widgetMonitorId: root.monitor.id @@ -376,7 +382,7 @@ Item { z: root.monitorLabelZ Repeater { - model: SettingsData.overviewRows + model: root.effectiveRows delegate: Item { id: labelRow property int rowIndex: index @@ -385,11 +391,11 @@ Item { height: root.workspaceImplicitHeight Repeater { - model: SettingsData.overviewColumns + model: root.effectiveColumns delegate: Item { id: labelItem property int colIndex: index - property int workspaceIndex: labelRow.rowIndex * SettingsData.overviewColumns + colIndex + property int workspaceIndex: labelRow.rowIndex * root.effectiveColumns + colIndex property int workspaceValue: (root.displayedWorkspaceIds && workspaceIndex < root.displayedWorkspaceIds.length) ? root.displayedWorkspaceIds[workspaceIndex] : -1 property bool workspaceExists: (root.allWorkspaceIds && workspaceValue > 0) ? root.allWorkspaceIds.includes(workspaceValue) : false property string workspaceMonitorName: (workspaceValue > 0) ? root.getWorkspaceMonitorName(workspaceValue) : "" diff --git a/quickshell/Modules/WorkspaceOverlays/OverviewWindow.qml b/quickshell/Modules/WorkspaceOverlays/OverviewWindow.qml index b3de9861..643207c9 100644 --- a/quickshell/Modules/WorkspaceOverlays/OverviewWindow.qml +++ b/quickshell/Modules/WorkspaceOverlays/OverviewWindow.qml @@ -13,19 +13,21 @@ Item { property var availableWorkspaceWidth property var availableWorkspaceHeight property bool restrictToWorkspace: true + property real monitorDpr: 1 readonly property var windowData: toplevel?.lastIpcObject || null readonly property var monitorObj: toplevel?.monitor readonly property var monitorData: monitorObj?.lastIpcObject || null + readonly property real effectiveScale: root.scale / root.monitorDpr - property real initX: Math.max(((windowData?.at?.[0] ?? 0) - (monitorData?.x ?? 0) - (monitorData?.reserved?.[0] ?? 0)) * root.scale, 0) + xOffset - property real initY: Math.max(((windowData?.at?.[1] ?? 0) - (monitorData?.y ?? 0) - (monitorData?.reserved?.[1] ?? 0)) * root.scale, 0) + yOffset + property real initX: Math.max(((windowData?.at?.[0] ?? 0) - (monitorData?.x ?? 0) - (monitorData?.reserved?.[0] ?? 0)) * effectiveScale, 0) + xOffset + property real initY: Math.max(((windowData?.at?.[1] ?? 0) - (monitorData?.y ?? 0) - (monitorData?.reserved?.[1] ?? 0)) * effectiveScale, 0) + yOffset property real xOffset: 0 property real yOffset: 0 property int widgetMonitorId: 0 - property var targetWindowWidth: (windowData?.size?.[0] ?? 100) * scale - property var targetWindowHeight: (windowData?.size?.[1] ?? 100) * scale + property var targetWindowWidth: (windowData?.size?.[0] ?? 100) * effectiveScale + property var targetWindowHeight: (windowData?.size?.[1] ?? 100) * effectiveScale property bool hovered: false property bool pressed: false @@ -37,8 +39,8 @@ Item { x: initX y: initY - width: Math.min((windowData?.size?.[0] ?? 100) * root.scale, availableWorkspaceWidth) - height: Math.min((windowData?.size?.[1] ?? 100) * root.scale, availableWorkspaceHeight) + width: Math.min((windowData?.size?.[0] ?? 100) * effectiveScale, availableWorkspaceWidth) + height: Math.min((windowData?.size?.[1] ?? 100) * effectiveScale, availableWorkspaceHeight) opacity: (monitorObj?.id ?? -1) == widgetMonitorId ? 1 : 0.4 Rectangle {