diff --git a/dots/.config/quickshell/ii/modules/overlay/Overlay.qml b/dots/.config/quickshell/ii/modules/overlay/Overlay.qml index 2fd33fcd7..efb37cd89 100644 --- a/dots/.config/quickshell/ii/modules/overlay/Overlay.qml +++ b/dots/.config/quickshell/ii/modules/overlay/Overlay.qml @@ -47,12 +47,23 @@ Scope { id: grab windows: [overlayWindow] active: GlobalStates.overlayOpen + onActiveChanged: { + if (active) { + // Quick workspace flick to unlock cursor from game's relative mode + cursorUnlockProcess.running = true; + } + } onCleared: () => { if (!active) GlobalStates.overlayOpen = false; } } + Process { + id: cursorUnlockProcess + command: ["bash", "-c", "ws=$(hyprctl activeworkspace -j | jq -r '.id'); hyprctl --batch \"keyword animations:enabled 0 ; dispatch workspace empty ; dispatch workspace $ws ; keyword animations:enabled 1\""] + } + OverlayContent { id: overlayContent anchors.fill: parent diff --git a/dots/.config/quickshell/ii/modules/overlay/OverlayContext.qml b/dots/.config/quickshell/ii/modules/overlay/OverlayContext.qml index cc54d379f..dcfeae099 100644 --- a/dots/.config/quickshell/ii/modules/overlay/OverlayContext.qml +++ b/dots/.config/quickshell/ii/modules/overlay/OverlayContext.qml @@ -7,7 +7,7 @@ Singleton { readonly property list availableWidgets: [ { identifier: "crosshair", materialSymbol: "point_scan" }, - { identifier: "fpsLimiter", materialSymbol: "speed" }, + { identifier: "fpsLimiter", materialSymbol: "animation" }, { identifier: "volumeMixer", materialSymbol: "volume_up" } ] diff --git a/dots/.config/quickshell/ii/modules/overlay/fpsLimiter/FpsLimiter.qml b/dots/.config/quickshell/ii/modules/overlay/fpsLimiter/FpsLimiter.qml index fe3ab9df4..24cac5387 100644 --- a/dots/.config/quickshell/ii/modules/overlay/fpsLimiter/FpsLimiter.qml +++ b/dots/.config/quickshell/ii/modules/overlay/fpsLimiter/FpsLimiter.qml @@ -5,6 +5,6 @@ import qs.modules.overlay StyledOverlayWidget { id: root - title: "FPS Limiter" + title: "MangoHud FPS" contentItem: FpsLimiterContent {} } diff --git a/dots/.config/quickshell/ii/modules/overlay/fpsLimiter/FpsLimiterContent.qml b/dots/.config/quickshell/ii/modules/overlay/fpsLimiter/FpsLimiterContent.qml index fae1aca78..c83e83de9 100644 --- a/dots/.config/quickshell/ii/modules/overlay/fpsLimiter/FpsLimiterContent.qml +++ b/dots/.config/quickshell/ii/modules/overlay/fpsLimiter/FpsLimiterContent.qml @@ -1,3 +1,4 @@ +import qs.services import QtQuick import QtQuick.Layouts import QtQuick.Controls @@ -10,12 +11,33 @@ Rectangle { id: root color: Appearance.m3colors.m3surfaceContainer property real padding: 20 + property bool showCheckIcon: false + property bool showError: false implicitWidth: contentColumn.implicitWidth + padding * 2 implicitHeight: contentColumn.implicitHeight + padding * 2 + Timer { + id: iconResetTimer + interval: 1000 + onTriggered: { + root.showCheckIcon = false; + } + } + + Timer { + id: errorResetTimer + interval: 1000 + onTriggered: { + root.showError = false; + } + } + function applyLimit() { var fpsValue = parseInt(fpsField.text); if (isNaN(fpsValue) || fpsValue < 0) { + root.showError = true; + errorResetTimer.restart(); + fpsField.text = ""; return; } @@ -34,6 +56,9 @@ Rectangle { fpsSetter.command = ["bash", "-c", cmd]; fpsSetter.startDetached(); + root.showCheckIcon = true; + iconResetTimer.restart(); + // Clear the field after applying fpsField.text = ""; } @@ -41,7 +66,7 @@ Rectangle { Keys.onPressed: event => { if (event.key === Qt.Key_Escape) { fpsField.text = ""; - event.accepted = true; + event.onAccepted(); } } @@ -58,13 +83,13 @@ Rectangle { id: fpsField Layout.fillWidth: true Layout.preferredWidth: 200 - placeholderText: qsTr("Set FPS limit (e.g. 80)") + placeholderText: root.showError ? Translation.tr("Insert a valid number!") : Translation.tr("Set FPS limit (e.g. 80)") inputMethodHints: Qt.ImhDigitsOnly focus: true Keys.onReturnPressed: { root.applyLimit(); - event.accepted = true; + event.onAccepted(); } } @@ -80,7 +105,22 @@ Rectangle { anchors.centerIn: parent horizontalAlignment: Text.AlignHCenter font.pixelSize: Appearance.font.pixelSize.title - text: "keyboard_return" + text: root.showError ? "close" : (root.showCheckIcon ? "check" : "save") + rotation: (root.showCheckIcon || root.showError) ? 360 : 0 + color: root.showError ? "#ef5350" : (root.showCheckIcon ? Appearance.m3colors.m3primary : Appearance.m3colors.m3onSurface) + + Behavior on rotation { + NumberAnimation { + duration: 200 + easing.type: Easing.OutCubic + } + } + + Behavior on color { + ColorAnimation { + duration: 200 + } + } } } }