From 23af50a30d533e3313ea576f43fe751750d112bb Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sat, 16 Aug 2025 08:38:58 +0700 Subject: [PATCH 01/23] vertical bar: hide battery when not available --- .config/quickshell/ii/modules/bar/BarContent.qml | 3 --- .../quickshell/ii/modules/verticalBar/VerticalBarContent.qml | 4 +--- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/.config/quickshell/ii/modules/bar/BarContent.qml b/.config/quickshell/ii/modules/bar/BarContent.qml index dcfb6616d..ead5d8c83 100644 --- a/.config/quickshell/ii/modules/bar/BarContent.qml +++ b/.config/quickshell/ii/modules/bar/BarContent.qml @@ -2,9 +2,6 @@ import "./weather" import QtQuick import QtQuick.Layouts import Quickshell -import Quickshell.Io -import Quickshell.Wayland -import Quickshell.Hyprland import Quickshell.Services.UPower import qs import qs.services diff --git a/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml b/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml index 42e71026e..976d3d448 100644 --- a/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml +++ b/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml @@ -1,9 +1,6 @@ import QtQuick import QtQuick.Layouts import Quickshell -import Quickshell.Io -import Quickshell.Wayland -import Quickshell.Hyprland import Quickshell.Services.UPower import qs import qs.services @@ -198,6 +195,7 @@ Item { // Bar content region } BatteryIndicator { + visible: UPower.displayDevice.isLaptopBattery Layout.fillWidth: true Layout.fillHeight: false } From 138684fcea31398d812681ccb1764e77f9305738 Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sat, 16 Aug 2025 08:51:07 +0700 Subject: [PATCH 02/23] vertical bar: add media progress --- .../verticalBar/VerticalBarContent.qml | 4 + .../ii/modules/verticalBar/VerticalMedia.qml | 100 ++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 .config/quickshell/ii/modules/verticalBar/VerticalMedia.qml diff --git a/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml b/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml index 976d3d448..6d80da84a 100644 --- a/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml +++ b/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml @@ -153,6 +153,10 @@ Item { // Bar content region Layout.fillWidth: true Layout.fillHeight: false } + VerticalMedia { + Layout.fillWidth: true + Layout.fillHeight: false + } } HorizontalBarSeparator { diff --git a/.config/quickshell/ii/modules/verticalBar/VerticalMedia.qml b/.config/quickshell/ii/modules/verticalBar/VerticalMedia.qml new file mode 100644 index 000000000..c20e4e9b0 --- /dev/null +++ b/.config/quickshell/ii/modules/verticalBar/VerticalMedia.qml @@ -0,0 +1,100 @@ +import qs.modules.common +import qs.modules.common.widgets +import qs.services +import qs +import qs.modules.common.functions + +import QtQuick +import QtQuick.Layouts +import Quickshell.Services.Mpris + +MouseArea { + id: root + property bool borderless: Config.options.bar.borderless + readonly property MprisPlayer activePlayer: MprisController.activePlayer + readonly property string cleanedTitle: StringUtils.cleanMusicTitle(activePlayer?.trackTitle) || Translation.tr("No media") + + Layout.fillHeight: true + implicitHeight: mediaCircProg.implicitHeight + implicitWidth: Appearance.sizes.verticalBarWidth + + Timer { + running: activePlayer?.playbackState == MprisPlaybackState.Playing + interval: 1000 + repeat: true + onTriggered: activePlayer.positionChanged() + } + + acceptedButtons: Qt.MiddleButton | Qt.BackButton | Qt.ForwardButton | Qt.RightButton | Qt.LeftButton + hoverEnabled: true + onPressed: (event) => { + if (event.button === Qt.MiddleButton) { + activePlayer.togglePlaying(); + } else if (event.button === Qt.BackButton) { + activePlayer.previous(); + } else if (event.button === Qt.ForwardButton || event.button === Qt.RightButton) { + activePlayer.next(); + } else if (event.button === Qt.LeftButton) { + GlobalStates.mediaControlsOpen = !GlobalStates.mediaControlsOpen + } + } + + ClippedFilledCircularProgress { + id: mediaCircProg + anchors.centerIn: parent + implicitSize: 20 + + lineWidth: Appearance.rounding.unsharpen + value: activePlayer?.position / activePlayer?.length + colPrimary: Appearance.colors.colOnSecondaryContainer + enableAnimation: false + + Item { + anchors.centerIn: parent + width: mediaCircProg.implicitSize + height: mediaCircProg.implicitSize + + MaterialSymbol { + anchors.centerIn: parent + fill: 1 + text: activePlayer?.isPlaying ? "pause" : "music_note" + iconSize: Appearance.font.pixelSize.normal + color: Appearance.m3colors.m3onSecondaryContainer + } + } + } + + StyledPopup { + hoverTarget: root + active: GlobalStates.mediaControlsOpen ? false : root.containsMouse + + ColumnLayout { + anchors.centerIn: parent + RowLayout { + spacing: 5 + + MaterialSymbol { + fill: 0 + font.weight: Font.Medium + text: "music_note" + iconSize: Appearance.font.pixelSize.large + color: Appearance.colors.colOnSurfaceVariant + } + + StyledText { + text: "Media" + font { + weight: Font.Medium + pixelSize: Appearance.font.pixelSize.normal + } + color: Appearance.colors.colOnSurfaceVariant + } + } + + StyledText { + text: `${cleanedTitle}${activePlayer?.trackArtist ? '\n' + activePlayer.trackArtist : ''}` + } + } + } + +} From e189f0317f054b1f09fa499e6ccb67914a71ba65 Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sat, 16 Aug 2025 11:54:50 +0700 Subject: [PATCH 03/23] move StyledPopup to Bar --- .../ii/modules/{common/widgets => bar}/StyledPopup.qml | 0 .config/quickshell/ii/modules/bar/weather/WeatherPopup.qml | 1 + .config/quickshell/ii/modules/verticalBar/VerticalMedia.qml | 4 +++- 3 files changed, 4 insertions(+), 1 deletion(-) rename .config/quickshell/ii/modules/{common/widgets => bar}/StyledPopup.qml (100%) diff --git a/.config/quickshell/ii/modules/common/widgets/StyledPopup.qml b/.config/quickshell/ii/modules/bar/StyledPopup.qml similarity index 100% rename from .config/quickshell/ii/modules/common/widgets/StyledPopup.qml rename to .config/quickshell/ii/modules/bar/StyledPopup.qml diff --git a/.config/quickshell/ii/modules/bar/weather/WeatherPopup.qml b/.config/quickshell/ii/modules/bar/weather/WeatherPopup.qml index aa61359d7..0c472493e 100644 --- a/.config/quickshell/ii/modules/bar/weather/WeatherPopup.qml +++ b/.config/quickshell/ii/modules/bar/weather/WeatherPopup.qml @@ -5,6 +5,7 @@ import qs.modules.common.widgets import QtQuick import QtQuick.Layouts +import "../" StyledPopup { id: root diff --git a/.config/quickshell/ii/modules/verticalBar/VerticalMedia.qml b/.config/quickshell/ii/modules/verticalBar/VerticalMedia.qml index c20e4e9b0..f64792f2e 100644 --- a/.config/quickshell/ii/modules/verticalBar/VerticalMedia.qml +++ b/.config/quickshell/ii/modules/verticalBar/VerticalMedia.qml @@ -8,6 +8,8 @@ import QtQuick import QtQuick.Layouts import Quickshell.Services.Mpris +import "../bar" as Bar + MouseArea { id: root property bool borderless: Config.options.bar.borderless @@ -64,7 +66,7 @@ MouseArea { } } - StyledPopup { + Bar.StyledPopup { hoverTarget: root active: GlobalStates.mediaControlsOpen ? false : root.containsMouse From 2a46b179587a4a67e933198c8fdf70e599ac4fbc Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sat, 16 Aug 2025 11:55:27 +0700 Subject: [PATCH 04/23] vertical bar: add date --- .../quickshell/ii/modules/common/Config.qml | 1 + .../verticalBar/VerticalBarContent.qml | 17 +++++ .../verticalBar/VerticalDateWidget.qml | 64 +++++++++++++++++++ .config/quickshell/ii/services/DateTime.qml | 1 + 4 files changed, 83 insertions(+) create mode 100644 .config/quickshell/ii/modules/verticalBar/VerticalDateWidget.qml diff --git a/.config/quickshell/ii/modules/common/Config.qml b/.config/quickshell/ii/modules/common/Config.qml index abcaaf80f..464fe9c4a 100644 --- a/.config/quickshell/ii/modules/common/Config.qml +++ b/.config/quickshell/ii/modules/common/Config.qml @@ -280,6 +280,7 @@ Singleton { property JsonObject time: JsonObject { // https://doc.qt.io/qt-6/qtime.html#toString property string format: "hh:mm" + property string shortDateFormat: "dd/MM" property string dateFormat: "ddd, dd/MM" property JsonObject pomodoro: JsonObject { property string alertSound: "" diff --git a/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml b/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml index 6d80da84a..7d72eed29 100644 --- a/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml +++ b/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml @@ -153,6 +153,9 @@ Item { // Bar content region Layout.fillWidth: true Layout.fillHeight: false } + + HorizontalBarSeparator {} + VerticalMedia { Layout.fillWidth: true Layout.fillHeight: false @@ -198,11 +201,25 @@ Item { // Bar content region Layout.fillHeight: false } + HorizontalBarSeparator {} + + VerticalDateWidget { + Layout.fillWidth: true + Layout.fillHeight: false + } + + HorizontalBarSeparator { + visible: UPower.displayDevice.isLaptopBattery + } + BatteryIndicator { visible: UPower.displayDevice.isLaptopBattery Layout.fillWidth: true Layout.fillHeight: false } + + + } } diff --git a/.config/quickshell/ii/modules/verticalBar/VerticalDateWidget.qml b/.config/quickshell/ii/modules/verticalBar/VerticalDateWidget.qml new file mode 100644 index 000000000..8ff9386c3 --- /dev/null +++ b/.config/quickshell/ii/modules/verticalBar/VerticalDateWidget.qml @@ -0,0 +1,64 @@ +import qs.modules.common +import qs.modules.common.widgets +import qs.services +import QtQuick +import QtQuick.Shapes +import QtQuick.Layouts +import "../bar" as Bar + +Item { // Full hitbox + id: root + + implicitHeight: content.implicitHeight + implicitWidth: Appearance.sizes.verticalBarWidth + property var dayOfMonth: DateTime.shortDate.split(/[-\/]/)[0] // What if 🍔murica🦅? good question + property var monthOfYear: DateTime.shortDate.split(/[-\/]/)[1] + + Item { // Boundaries for date numbers + id: content + anchors.centerIn: parent + implicitWidth: 24 + implicitHeight: 30 + + Shape { + id: diagonalLine + property real padding: 4 + anchors.fill: parent + preferredRendererType: Shape.CurveRenderer + + ShapePath { + strokeWidth: 1.2 + strokeColor: Appearance.colors.colSubtext + fillColor: "transparent" + startX: content.width - diagonalLine.padding + startY: diagonalLine.padding + PathLine { + x: diagonalLine.padding + y: content.height - diagonalLine.padding + } + } + } + + StyledText { + id: dayText + anchors { + top: parent.top + left: parent.left + } + font.pixelSize: 13 + color: Appearance.colors.colOnLayer1 + text: dayOfMonth + } + + StyledText { + id: monthText + anchors { + bottom: parent.bottom + right: parent.right + } + font.pixelSize: 13 + color: Appearance.colors.colOnLayer1 + text: monthOfYear + } + } +} diff --git a/.config/quickshell/ii/services/DateTime.qml b/.config/quickshell/ii/services/DateTime.qml index 16dc6c4e6..8a185e0bd 100644 --- a/.config/quickshell/ii/services/DateTime.qml +++ b/.config/quickshell/ii/services/DateTime.qml @@ -14,6 +14,7 @@ Singleton { precision: SystemClock.Minutes } property string time: Qt.locale().toString(clock.date, Config.options?.time.format ?? "hh:mm") + property string shortDate: Qt.locale().toString(clock.date, Config.options?.time.shortDateFormat ?? "dd/MM") property string date: Qt.locale().toString(clock.date, Config.options?.time.dateFormat ?? "dddd, dd/MM") property string collapsedCalendarFormat: Qt.locale().toString(clock.date, "dd MMMM yyyy") property string uptime: "0h, 0m" From 51310e632c7e89f5da68cea1b7dcecf1a6bf3c52 Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sat, 16 Aug 2025 14:47:01 +0700 Subject: [PATCH 05/23] fix media controls positioning for vertical bar --- .../modules/mediaControls/MediaControls.qml | 21 ++++++++++++------- .../modules/mediaControls/PlayerControl.qml | 3 --- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/.config/quickshell/ii/modules/mediaControls/MediaControls.qml b/.config/quickshell/ii/modules/mediaControls/MediaControls.qml index 2774e8099..41347d5ce 100644 --- a/.config/quickshell/ii/modules/mediaControls/MediaControls.qml +++ b/.config/quickshell/ii/modules/mediaControls/MediaControls.qml @@ -111,21 +111,24 @@ Scope { exclusionMode: ExclusionMode.Ignore exclusiveZone: 0 - margins { - top: Appearance.sizes.barHeight - bottom: Appearance.sizes.barHeight - left: (mediaControlsRoot.screen.width / 2) - (osdWidth / 2) - widgetWidth - } implicitWidth: root.widgetWidth implicitHeight: playerColumnLayout.implicitHeight color: "transparent" WlrLayershell.namespace: "quickshell:mediaControls" anchors { - top: !Config.options.bar.bottom - bottom: Config.options.bar.bottom - left: true + top: !Config.options.bar.bottom || Config.options.bar.vertical + bottom: Config.options.bar.bottom && !Config.options.bar.vertical + left: !(Config.options.bar.vertical && Config.options.bar.bottom) + right: Config.options.bar.vertical && Config.options.bar.bottom } + margins { + top: Config.options.bar.vertical ? ((mediaControlsRoot.screen.height / 2) - widgetHeight * 1.5) : Appearance.sizes.barHeight + bottom: Appearance.sizes.barHeight + left: Config.options.bar.vertical ? Appearance.sizes.barHeight : ((mediaControlsRoot.screen.width / 2) - (osdWidth / 2) - widgetWidth) + right: Appearance.sizes.barHeight + } + mask: Region { item: playerColumnLayout } @@ -143,6 +146,8 @@ Scope { required property MprisPlayer modelData player: modelData visualizerPoints: root.visualizerPoints + implicitWidth: widgetWidth + implicitHeight: widgetHeight } } } diff --git a/.config/quickshell/ii/modules/mediaControls/PlayerControl.qml b/.config/quickshell/ii/modules/mediaControls/PlayerControl.qml index 6f63c8369..673ad289f 100644 --- a/.config/quickshell/ii/modules/mediaControls/PlayerControl.qml +++ b/.config/quickshell/ii/modules/mediaControls/PlayerControl.qml @@ -23,9 +23,6 @@ Item { // Player instance property real maxVisualizerValue: 1000 // Max value in the data points property int visualizerSmoothing: 2 // Number of points to average for smoothing - implicitWidth: widgetWidth - implicitHeight: widgetHeight - component TrackChangeButton: RippleButton { implicitWidth: 24 implicitHeight: 24 From 98e2bf53ed162dfad4c787cd72bc0a3b105dfc1a Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sat, 16 Aug 2025 19:19:15 +0700 Subject: [PATCH 06/23] add slide rule for vertical bar --- .config/hypr/hyprland/rules.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/.config/hypr/hyprland/rules.conf b/.config/hypr/hyprland/rules.conf index e378d92d7..18125427b 100644 --- a/.config/hypr/hyprland/rules.conf +++ b/.config/hypr/hyprland/rules.conf @@ -131,6 +131,7 @@ layerrule = blurpopups, quickshell:.* layerrule = blur, quickshell:.* layerrule = ignorealpha 0.79, quickshell:.* layerrule = animation slide top, quickshell:bar +layerrule = animation slide left, quickshell:verticalBar layerrule = animation fade, quickshell:screenCorners layerrule = animation slide right, quickshell:sidebarRight layerrule = animation slide left, quickshell:sidebarLeft From fcab19c3924e4c406b203272cf9aaee9b58982f6 Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sat, 16 Aug 2025 19:20:17 +0700 Subject: [PATCH 07/23] make bottom/right bar slide anim not go across the screen --- .config/hypr/hyprland/rules.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.config/hypr/hyprland/rules.conf b/.config/hypr/hyprland/rules.conf index 18125427b..b31b30581 100644 --- a/.config/hypr/hyprland/rules.conf +++ b/.config/hypr/hyprland/rules.conf @@ -130,8 +130,8 @@ layerrule = ignorealpha 0.6, osk[0-9]* layerrule = blurpopups, quickshell:.* layerrule = blur, quickshell:.* layerrule = ignorealpha 0.79, quickshell:.* -layerrule = animation slide top, quickshell:bar -layerrule = animation slide left, quickshell:verticalBar +layerrule = animation slide, quickshell:bar +layerrule = animation slide, quickshell:verticalBar layerrule = animation fade, quickshell:screenCorners layerrule = animation slide right, quickshell:sidebarRight layerrule = animation slide left, quickshell:sidebarLeft From 7aacac554d51b05ae3adc7420d53258ec10f733d Mon Sep 17 00:00:00 2001 From: Nyx <189459385+nyx-4@users.noreply.github.com> Date: Sat, 16 Aug 2025 18:25:52 +0500 Subject: [PATCH 08/23] [Feature Request] Add `mantra' beneath clock Signed-off-by: Nyx <189459385+nyx-4@users.noreply.github.com> --- .../ii/modules/background/Background.qml | 14 ++++++++++++++ .config/quickshell/ii/modules/common/Config.qml | 1 + 2 files changed, 15 insertions(+) diff --git a/.config/quickshell/ii/modules/background/Background.qml b/.config/quickshell/ii/modules/background/Background.qml index 1e3ac5200..2850249e3 100644 --- a/.config/quickshell/ii/modules/background/Background.qml +++ b/.config/quickshell/ii/modules/background/Background.qml @@ -242,6 +242,20 @@ Variants { styleColor: Appearance.colors.colShadow text: DateTime.date } + StyledText { + Layout.fillWidth: true + Layout.topMargin: -5 + horizontalAlignment: bgRoot.textHorizontalAlignment + font { + family: Appearance.font.family.expressive + pixelSize: 20 + weight: Font.DemiBold + } + color: bgRoot.colText + style: Text.Raised + styleColor: Appearance.colors.colShadow + text: Config.options.background.mantra + } } RowLayout { diff --git a/.config/quickshell/ii/modules/common/Config.qml b/.config/quickshell/ii/modules/common/Config.qml index 464fe9c4a..7f874602c 100644 --- a/.config/quickshell/ii/modules/common/Config.qml +++ b/.config/quickshell/ii/modules/common/Config.qml @@ -126,6 +126,7 @@ Singleton { property real workspaceZoom: 1.07 // Relative to your screen, not wallpaper size property bool enableSidebar: true } + property string mantra: "" } property JsonObject bar: JsonObject { From c745615a2aab939dd233f251590e09a7bd0901a2 Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sat, 16 Aug 2025 21:00:56 +0700 Subject: [PATCH 09/23] prompt to kill kded6, mako, dunst (conflicting stuff) --- .config/quickshell/ii/killDialog.qml | 195 ++++++++++++++++++ .../quickshell/ii/modules/common/Config.qml | 5 + .../modules/common/widgets/RippleButton.qml | 2 +- .../quickshell/ii/services/ConflictKiller.qml | 49 +++++ .config/quickshell/ii/shell.qml | 7 +- 5 files changed, 254 insertions(+), 4 deletions(-) create mode 100644 .config/quickshell/ii/killDialog.qml create mode 100644 .config/quickshell/ii/services/ConflictKiller.qml diff --git a/.config/quickshell/ii/killDialog.qml b/.config/quickshell/ii/killDialog.qml new file mode 100644 index 000000000..fdccfe807 --- /dev/null +++ b/.config/quickshell/ii/killDialog.qml @@ -0,0 +1,195 @@ +//@ pragma UseQApplication +//@ pragma Env QS_NO_RELOAD_POPUP=1 +//@ pragma Env QT_QUICK_CONTROLS_STYLE=Basic +//@ pragma Env QT_QUICK_FLICKABLE_WHEEL_DECELERATION=10000 + +// Adjust this to make the app smaller or larger +//@ pragma Env QT_SCALE_FACTOR=1 + +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import QtQuick.Window +import Quickshell +import Quickshell.Io +import Quickshell.Hyprland +import qs +import qs.services +import qs.modules.common +import qs.modules.common.widgets +import qs.modules.common.functions + +ApplicationWindow { + id: root + property int conflictCount: 0 + onConflictCountChanged: { + if (conflictCount === 0) { + root.close(); + } + } + + property real contentPadding: 8 + visible: true + onClosing: { + Qt.quit() + } + title: Translation.tr("Shell conflicts killer") + + Component.onCompleted: { + Config.ready // Just read to force init + MaterialThemeLoader.reapplyTheme(); + } + + minimumWidth: 400 + minimumHeight: 300 + maximumWidth: 400 + maximumHeight: 300 + width: 400 + height: 300 + color: Appearance.m3colors.m3background + + component ConflictingProgramGroup: ColumnLayout { + id: conflictGroup + required property list programs + required property string description + visible: false + onVisibleChanged: { + conflictCount += visible ? 1 : -1 + } + + signal alwaysSelected() + + Process { + running: true + command: ["pidof", ...conflictGroup.programs] + onExited: (exitCode, exitStatus) => { + if (exitCode === 0) { + conflictGroup.visible = true + } + } + } + + StyledText { + text: conflictGroup.programs.join(", ") + font.pixelSize: Appearance.font.pixelSize.normal + } + StyledText { + font { + pixelSize: Appearance.font.pixelSize.smaller + italic: true + } + text: conflictGroup.description + color: Appearance.colors.colSubtext + } + RowLayout { + Layout.alignment: Qt.AlignRight + + RippleButton { + colBackground: Appearance.colors.colLayer2 + contentItem: StyledText { + text: Translation.tr("Always") + } + onClicked: { + Quickshell.execDetached(["killall", ...conflictGroup.programs]) + conflictGroup.visible = false + conflictGroup.alwaysSelected() + } + } + RippleButton { + colBackground: Appearance.colors.colLayer2 + contentItem: StyledText { + text: Translation.tr("Yes") + } + onClicked: { + Quickshell.execDetached(["killall", ...conflictGroup.programs]) + conflictGroup.visible = false + } + } + RippleButton { + colBackground: Appearance.colors.colLayer2 + contentItem: StyledText { + text: Translation.tr("No") + } + onClicked: conflictGroup.visible = false + } + } + } + + ColumnLayout { + anchors { + fill: parent + margins: contentPadding + } + + Item { + // Titlebar + visible: Config.options?.windows.showTitlebar + Layout.fillWidth: true + implicitHeight: Math.max(welcomeText.implicitHeight, windowControlsRow.implicitHeight) + StyledText { + id: welcomeText + anchors { + left: Config.options.windows.centerTitle ? undefined : parent.left + horizontalCenter: Config.options.windows.centerTitle ? parent.horizontalCenter : undefined + verticalCenter: parent.verticalCenter + leftMargin: 12 + } + color: Appearance.colors.colOnLayer0 + text: Translation.tr("Kill conflicting programs?") + font.pixelSize: Appearance.font.pixelSize.title + font.family: Appearance.font.family.title + } + RowLayout { // Window controls row + id: windowControlsRow + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + RippleButton { + buttonRadius: Appearance.rounding.full + implicitWidth: 35 + implicitHeight: 35 + onClicked: root.close() + contentItem: MaterialSymbol { + anchors.centerIn: parent + horizontalAlignment: Text.AlignHCenter + text: "close" + iconSize: 20 + } + } + } + } + Rectangle { + // Content container + color: Appearance.m3colors.m3surfaceContainerLow + radius: Appearance.rounding.windowRounding - root.contentPadding + implicitHeight: contentColumn.implicitHeight + implicitWidth: contentColumn.implicitWidth + Layout.fillWidth: true + Layout.fillHeight: true + + ColumnLayout { + id: contentColumn + anchors.fill: parent + spacing: 12 + + ConflictingProgramGroup { + id: kded6Group + Layout.alignment: Qt.AlignHCenter + Layout.fillHeight: false + programs: ["kded6"] + description: Translation.tr("Conflicts with the shell's system tray implementation") + onAlwaysSelected: Config.options.conflictKiller.autoKillTrays = true + } + + ConflictingProgramGroup { + id: notificationDaemons + Layout.alignment: Qt.AlignHCenter + Layout.fillHeight: false + programs: ["mako", "dunst"] + description: Translation.tr("Conflicts with the shell's notification implementation") + onAlwaysSelected: Config.options.conflictKiller.autoKillNotificationDaemons = true + } + + } + } + } +} diff --git a/.config/quickshell/ii/modules/common/Config.qml b/.config/quickshell/ii/modules/common/Config.qml index 464fe9c4a..afc75c278 100644 --- a/.config/quickshell/ii/modules/common/Config.qml +++ b/.config/quickshell/ii/modules/common/Config.qml @@ -183,6 +183,11 @@ Singleton { property int suspend: 3 } + property JsonObject conflictKiller: JsonObject { + property bool autoKillNotificationDaemons: false + property bool autoKillTrays: false + } + property JsonObject dock: JsonObject { property bool enable: false property bool monochromeIcons: true diff --git a/.config/quickshell/ii/modules/common/widgets/RippleButton.qml b/.config/quickshell/ii/modules/common/widgets/RippleButton.qml index 759bc043c..0308fa974 100644 --- a/.config/quickshell/ii/modules/common/widgets/RippleButton.qml +++ b/.config/quickshell/ii/modules/common/widgets/RippleButton.qml @@ -133,7 +133,7 @@ Button { background: Rectangle { id: buttonBackground radius: root.buttonEffectiveRadius - implicitHeight: 50 + implicitHeight: 30 color: root.buttonColor Behavior on color { diff --git a/.config/quickshell/ii/services/ConflictKiller.qml b/.config/quickshell/ii/services/ConflictKiller.qml new file mode 100644 index 000000000..fc94e3384 --- /dev/null +++ b/.config/quickshell/ii/services/ConflictKiller.qml @@ -0,0 +1,49 @@ +pragma Singleton + +import qs +import qs.modules.common +import qs.modules.common.functions +import QtQuick +import Quickshell +import Quickshell.Io + +Singleton { + id: root + + property string killDialogQmlPath: FileUtils.trimFileProtocol(Quickshell.shellPath("killDialog.qml")) + + function load() { + // dummy to force init + } + + Connections { + target: Config + function onReadyChanged() { + if (Config.ready) checkConflictsProc.running = true + } + } + + Process { + id: checkConflictsProc + command: ["bash", "-c", `echo "$(pidof kded6);$(pidof mako dunst)"`] + stdout: StdioCollector { + onStreamFinished: { + const output = this.text; + const conflictingTrays = output.split(";")[0].trim().length > 0; + const conflictingNotifications = output.split(";")[1].trim().length > 0; + var openDialog = false; + if (conflictingTrays) { + if (!Config.options.conflictKiller.autoKillTrays) openDialog = true; + else Quickshell.execDetached(["killall", "kded6"]) + } + if (conflictingNotifications) { + if (!Config.options.conflictKiller.autoKillNotificationDaemons) openDialog = true; + else Quickshell.execDetached(["killall", "mako", "dunst"]) + } + if (openDialog) { + Quickshell.execDetached(["qs", "-p", root.killDialogQmlPath]) + } + } + } + } +} diff --git a/.config/quickshell/ii/shell.qml b/.config/quickshell/ii/shell.qml index 8186d1a56..4877bd449 100644 --- a/.config/quickshell/ii/shell.qml +++ b/.config/quickshell/ii/shell.qml @@ -52,10 +52,11 @@ ShellRoot { // Force initialization of some singletons Component.onCompleted: { - Cliphist.refresh() - FirstRunExperience.load() - Hyprsunset.load() MaterialThemeLoader.reapplyTheme() + Hyprsunset.load() + FirstRunExperience.load() + ConflictKiller.load() + Cliphist.refresh() } LazyLoader { active: enableBar && Config.ready && !Config.options.bar.vertical; component: Bar {} } From 7cc00b99a15b789191230bc2b682254af53dbade Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sat, 16 Aug 2025 21:30:12 +0700 Subject: [PATCH 10/23] bar: make right clicking right side not skip current track (closes #1456) --- .config/quickshell/ii/modules/bar/BarContent.qml | 4 +--- .../quickshell/ii/modules/verticalBar/VerticalBarContent.qml | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.config/quickshell/ii/modules/bar/BarContent.qml b/.config/quickshell/ii/modules/bar/BarContent.qml index ead5d8c83..875091e40 100644 --- a/.config/quickshell/ii/modules/bar/BarContent.qml +++ b/.config/quickshell/ii/modules/bar/BarContent.qml @@ -269,8 +269,6 @@ Item { // Bar content region onPressed: event => { if (event.button === Qt.LeftButton) { GlobalStates.sidebarRightOpen = !GlobalStates.sidebarRightOpen; - } else if (event.button === Qt.RightButton) { - MprisController.activePlayer.next(); } } @@ -417,8 +415,8 @@ Item { // Bar content region Layout.leftMargin: 8 Layout.fillHeight: true active: Config.options.bar.weather.enable + sourceComponent: BarGroup { - implicitHeight: Appearance.sizes.baseBarHeight WeatherBar {} } } diff --git a/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml b/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml index 7d72eed29..b877dbb2a 100644 --- a/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml +++ b/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml @@ -253,8 +253,6 @@ Item { // Bar content region onPressed: event => { if (event.button === Qt.LeftButton) { GlobalStates.sidebarRightOpen = !GlobalStates.sidebarRightOpen; - } else if (event.button === Qt.RightButton) { - MprisController.activePlayer.next(); } } // Scroll to change volume From d1e66c444192644f95146ee3da3c0f9518c2dd8b Mon Sep 17 00:00:00 2001 From: Nyx <189459385+nyx-4@users.noreply.github.com> Date: Sat, 16 Aug 2025 20:16:38 +0500 Subject: [PATCH 11/23] It's 9/11, where yo planes at? Signed-off-by: Nyx <189459385+nyx-4@users.noreply.github.com> --- .config/quickshell/ii/modules/background/Background.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.config/quickshell/ii/modules/background/Background.qml b/.config/quickshell/ii/modules/background/Background.qml index 2850249e3..32fa00b1c 100644 --- a/.config/quickshell/ii/modules/background/Background.qml +++ b/.config/quickshell/ii/modules/background/Background.qml @@ -243,8 +243,6 @@ Variants { text: DateTime.date } StyledText { - Layout.fillWidth: true - Layout.topMargin: -5 horizontalAlignment: bgRoot.textHorizontalAlignment font { family: Appearance.font.family.expressive @@ -253,6 +251,9 @@ Variants { } color: bgRoot.colText style: Text.Raised + visible: { + return (Config.options.background.mantra !== "") + } styleColor: Appearance.colors.colShadow text: Config.options.background.mantra } From a50b673e073fc9179358326e2cc06da70a8d51bc Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sun, 17 Aug 2025 07:31:07 +0700 Subject: [PATCH 12/23] disable touchpad scroll tweak by default --- .config/quickshell/ii/modules/common/Config.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.config/quickshell/ii/modules/common/Config.qml b/.config/quickshell/ii/modules/common/Config.qml index afc75c278..ce1de603e 100644 --- a/.config/quickshell/ii/modules/common/Config.qml +++ b/.config/quickshell/ii/modules/common/Config.qml @@ -202,7 +202,7 @@ Singleton { property JsonObject interactions: JsonObject { property JsonObject scrolling: JsonObject { - property bool fasterTouchpadScroll: true // Enable faster scrolling with touchpad + property bool fasterTouchpadScroll: false // Enable faster scrolling with touchpad property int mouseScrollDeltaThreshold: 120 // delta >= this then it gets detected as mouse scroll rather than touchpad property int mouseScrollFactor: 120 property int touchpadScrollFactor: 450 From ad323f788515628b456c33f685dad03826cae963 Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sun, 17 Aug 2025 06:21:23 +0200 Subject: [PATCH 13/23] remove redundant return --- .config/quickshell/ii/modules/background/Background.qml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.config/quickshell/ii/modules/background/Background.qml b/.config/quickshell/ii/modules/background/Background.qml index 32fa00b1c..c92ca2765 100644 --- a/.config/quickshell/ii/modules/background/Background.qml +++ b/.config/quickshell/ii/modules/background/Background.qml @@ -251,9 +251,7 @@ Variants { } color: bgRoot.colText style: Text.Raised - visible: { - return (Config.options.background.mantra !== "") - } + visible: Config.options.background.mantra !== "" styleColor: Appearance.colors.colShadow text: Config.options.background.mantra } From 8b77aa151bfe3f152a3896f3be3bfbea1a04ed9d Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sun, 17 Aug 2025 15:39:58 +0700 Subject: [PATCH 14/23] bars: refractor corner areas' scrolling behavior --- .../quickshell/ii/modules/bar/BarContent.qml | 126 +++++------------- .../common/widgets/FocusedScrollMouseArea.qml | 63 +++++++++ .../verticalBar/VerticalBarContent.qml | 102 +++----------- 3 files changed, 116 insertions(+), 175 deletions(-) create mode 100644 .config/quickshell/ii/modules/common/widgets/FocusedScrollMouseArea.qml diff --git a/.config/quickshell/ii/modules/bar/BarContent.qml b/.config/quickshell/ii/modules/bar/BarContent.qml index 875091e40..8764731b4 100644 --- a/.config/quickshell/ii/modules/bar/BarContent.qml +++ b/.config/quickshell/ii/modules/bar/BarContent.qml @@ -47,58 +47,26 @@ Item { // Bar content region border.color: Appearance.colors.colLayer0Border } - MouseArea { // Left side | scroll to change brightness + FocusedScrollMouseArea { // Left side | scroll to change brightness id: barLeftSideMouseArea - anchors.left: parent.left - implicitHeight: Appearance.sizes.baseBarHeight + + anchors { + top: parent.top + bottom: parent.bottom + left: parent.left + right: middleSection.left + } implicitWidth: leftSectionRowLayout.implicitWidth - height: Appearance.sizes.barHeight - width: (root.width - middleSection.width) / 2 - property bool hovered: false - property real lastScrollX: 0 - property real lastScrollY: 0 - property bool trackingScroll: false - acceptedButtons: Qt.LeftButton - hoverEnabled: true - propagateComposedEvents: true - onEntered: event => { - barLeftSideMouseArea.hovered = true; - } - onExited: event => { - barLeftSideMouseArea.hovered = false; - barLeftSideMouseArea.trackingScroll = false; - } + implicitHeight: Appearance.sizes.baseBarHeight + + onScrollDown: root.brightnessMonitor.setBrightness(root.brightnessMonitor.brightness - 0.05) + onScrollUp: root.brightnessMonitor.setBrightness(root.brightnessMonitor.brightness + 0.05) + onMovedAway: GlobalStates.osdBrightnessOpen = false onPressed: event => { - if (event.button === Qt.LeftButton) { + if (event.button === Qt.LeftButton) GlobalStates.sidebarLeftOpen = !GlobalStates.sidebarLeftOpen; - } } - // Scroll to change brightness - WheelHandler { - onWheel: event => { - if (event.angleDelta.y < 0) - root.brightnessMonitor.setBrightness(root.brightnessMonitor.brightness - 0.05); - else if (event.angleDelta.y > 0) - root.brightnessMonitor.setBrightness(root.brightnessMonitor.brightness + 0.05); - // Store the mouse position and start tracking - barLeftSideMouseArea.lastScrollX = event.x; - barLeftSideMouseArea.lastScrollY = event.y; - barLeftSideMouseArea.trackingScroll = true; - } - acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad - } - onPositionChanged: mouse => { - if (barLeftSideMouseArea.trackingScroll) { - const dx = mouse.x - barLeftSideMouseArea.lastScrollX; - const dy = mouse.y - barLeftSideMouseArea.lastScrollY; - if (Math.sqrt(dx * dx + dy * dy) > osdHideMouseMoveThreshold) { - GlobalStates.osdBrightnessOpen = false; - barLeftSideMouseArea.trackingScroll = false; - } - } - } - // Visual content ScrollHint { reveal: barLeftSideMouseArea.hovered @@ -159,7 +127,11 @@ Item { // Bar content region RowLayout { // Middle section id: middleSection - anchors.centerIn: parent + anchors { + top: parent.top + bottom: parent.bottom + horizontalCenter: parent.horizontalCenter + } spacing: 4 BarGroup { @@ -242,63 +214,35 @@ Item { // Bar content region } } - MouseArea { // Right side | scroll to change volume + FocusedScrollMouseArea { // Right side | scroll to change volume id: barRightSideMouseArea - anchors.right: parent.right + anchors { + top: parent.top + bottom: parent.bottom + left: middleSection.right + right: parent.right + } implicitWidth: rightSectionRowLayout.implicitWidth implicitHeight: Appearance.sizes.baseBarHeight - height: Appearance.sizes.barHeight - width: (root.width - middleSection.width) / 2 - property bool hovered: false - property real lastScrollX: 0 - property real lastScrollY: 0 - property bool trackingScroll: false - - acceptedButtons: Qt.LeftButton - hoverEnabled: true - propagateComposedEvents: true - onEntered: event => { - barRightSideMouseArea.hovered = true; + onScrollDown: { + const currentVolume = Audio.value; + const step = currentVolume < 0.1 ? 0.01 : 0.02 || 0.2; + Audio.sink.audio.volume -= step; } - onExited: event => { - barRightSideMouseArea.hovered = false; - barRightSideMouseArea.trackingScroll = false; + onScrollUp: { + const currentVolume = Audio.value; + const step = currentVolume < 0.1 ? 0.01 : 0.02 || 0.2; + Audio.sink.audio.volume = Math.min(1, Audio.sink.audio.volume + step); } + onMovedAway: GlobalStates.osdVolumeOpen = false; onPressed: event => { if (event.button === Qt.LeftButton) { GlobalStates.sidebarRightOpen = !GlobalStates.sidebarRightOpen; } } - // Scroll to change volume - WheelHandler { - onWheel: event => { - const currentVolume = Audio.value; - const step = currentVolume < 0.1 ? 0.01 : 0.02 || 0.2; - if (event.angleDelta.y < 0) - Audio.sink.audio.volume -= step; - else if (event.angleDelta.y > 0) - Audio.sink.audio.volume = Math.min(1, Audio.sink.audio.volume + step); - // Store the mouse position and start tracking - barRightSideMouseArea.lastScrollX = event.x; - barRightSideMouseArea.lastScrollY = event.y; - barRightSideMouseArea.trackingScroll = true; - } - acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad - } - onPositionChanged: mouse => { - if (barRightSideMouseArea.trackingScroll) { - const dx = mouse.x - barRightSideMouseArea.lastScrollX; - const dy = mouse.y - barRightSideMouseArea.lastScrollY; - if (Math.sqrt(dx * dx + dy * dy) > osdHideMouseMoveThreshold) { - GlobalStates.osdVolumeOpen = false; - barRightSideMouseArea.trackingScroll = false; - } - } - } - // Visual content ScrollHint { reveal: barRightSideMouseArea.hovered diff --git a/.config/quickshell/ii/modules/common/widgets/FocusedScrollMouseArea.qml b/.config/quickshell/ii/modules/common/widgets/FocusedScrollMouseArea.qml new file mode 100644 index 000000000..b4bc3780c --- /dev/null +++ b/.config/quickshell/ii/modules/common/widgets/FocusedScrollMouseArea.qml @@ -0,0 +1,63 @@ +import QtQuick +import QtQuick.Layouts +import Quickshell +import Quickshell.Services.UPower +import qs +import qs.services +import qs.modules.common +import qs.modules.common.widgets +import qs.modules.common.functions + +MouseArea { // Right side | scroll to change volume + id: root + + signal scrollUp(delta: int) + signal scrollDown(delta: int) + signal movedAway() + + property bool hovered: false + property real lastScrollX: 0 + property real lastScrollY: 0 + property bool trackingScroll: false + + acceptedButtons: Qt.LeftButton + hoverEnabled: true + + onEntered: { + root.hovered = true; + } + + onExited: { + root.hovered = false; + root.trackingScroll = false; + } + + onWheel: event => { + if (event.angleDelta.y < 0) + root.scrollDown(event.angleDelta.y); + else if (event.angleDelta.y > 0) + root.scrollUp(event.angleDelta.y); + // Store the mouse position and start tracking + root.lastScrollX = event.x; + root.lastScrollY = event.y; + root.trackingScroll = true; + } + + onPositionChanged: mouse => { + if (root.trackingScroll) { + const dx = mouse.x - root.lastScrollX; + const dy = mouse.y - root.lastScrollY; + if (Math.sqrt(dx * dx + dy * dy) > osdHideMouseMoveThreshold) { + root.movedAway(); + root.trackingScroll = false; + } + } + } + + onContainsMouseChanged: { + if (!root.containsMouse && root.trackingScroll) { + root.movedAway(); + root.trackingScroll = false; + } + } +} diff --git a/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml b/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml index b877dbb2a..e5a1c162f 100644 --- a/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml +++ b/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml @@ -45,57 +45,22 @@ Item { // Bar content region border.color: Appearance.colors.colLayer0Border } - MouseArea { // Top section | scroll to change brightness + FocusedScrollMouseArea { // Top section | scroll to change brightness id: barTopSectionMouseArea anchors.top: parent.top implicitHeight: topSectionColumnLayout.implicitHeight implicitWidth: Appearance.sizes.baseVerticalBarWidth height: (root.height - middleSection.height) / 2 width: Appearance.sizes.verticalBarWidth - property bool hovered: false - property real lastScrollX: 0 - property real lastScrollY: 0 - property bool trackingScroll: false - acceptedButtons: Qt.LeftButton - hoverEnabled: true - propagateComposedEvents: true - onEntered: event => { - barTopSectionMouseArea.hovered = true; - } - onExited: event => { - barTopSectionMouseArea.hovered = false; - barTopSectionMouseArea.trackingScroll = false; - } + + onScrollDown: root.brightnessMonitor.setBrightness(root.brightnessMonitor.brightness - 0.05) + onScrollUp: root.brightnessMonitor.setBrightness(root.brightnessMonitor.brightness + 0.05) + onMovedAway: GlobalStates.osdBrightnessOpen = false onPressed: event => { - if (event.button === Qt.LeftButton) { + if (event.button === Qt.LeftButton) GlobalStates.sidebarLeftOpen = !GlobalStates.sidebarLeftOpen; - } } - // Scroll to change brightness - WheelHandler { - onWheel: event => { - if (event.angleDelta.y < 0) - root.brightnessMonitor.setBrightness(root.brightnessMonitor.brightness - 0.05); - else if (event.angleDelta.y > 0) - root.brightnessMonitor.setBrightness(root.brightnessMonitor.brightness + 0.05); - // Store the mouse position and start tracking - barTopSectionMouseArea.lastScrollX = event.x; - barTopSectionMouseArea.lastScrollY = event.y; - barTopSectionMouseArea.trackingScroll = true; - } - acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad - } - onPositionChanged: mouse => { - if (barTopSectionMouseArea.trackingScroll) { - const dx = mouse.x - barTopSectionMouseArea.lastScrollX; - const dy = mouse.y - barTopSectionMouseArea.lastScrollY; - if (Math.sqrt(dx * dx + dy * dy) > osdHideMouseMoveThreshold) { - GlobalStates.osdBrightnessOpen = false; - barTopSectionMouseArea.trackingScroll = false; - } - } - } - + ColumnLayout { // Content id: topSectionColumnLayout anchors.fill: parent @@ -223,7 +188,7 @@ Item { // Bar content region } } - MouseArea { // Bottom section | scroll to change volume + FocusedScrollMouseArea { // Bottom section | scroll to change volume id: barBottomSectionMouseArea anchors { @@ -233,54 +198,23 @@ Item { // Bar content region } implicitWidth: Appearance.sizes.baseVerticalBarWidth implicitHeight: bottomSectionColumnLayout.implicitHeight - width: Appearance.sizes.verticalBarWidth - - property bool hovered: false - property real lastScrollX: 0 - property real lastScrollY: 0 - property bool trackingScroll: false - - acceptedButtons: Qt.LeftButton - hoverEnabled: true - propagateComposedEvents: true - onEntered: event => { - barBottomSectionMouseArea.hovered = true; + + onScrollDown: { + const currentVolume = Audio.value; + const step = currentVolume < 0.1 ? 0.01 : 0.02 || 0.2; + Audio.sink.audio.volume -= step; } - onExited: event => { - barBottomSectionMouseArea.hovered = false; - barBottomSectionMouseArea.trackingScroll = false; + onScrollUp: { + const currentVolume = Audio.value; + const step = currentVolume < 0.1 ? 0.01 : 0.02 || 0.2; + Audio.sink.audio.volume = Math.min(1, Audio.sink.audio.volume + step); } + onMovedAway: GlobalStates.osdVolumeOpen = false; onPressed: event => { if (event.button === Qt.LeftButton) { GlobalStates.sidebarRightOpen = !GlobalStates.sidebarRightOpen; } } - // Scroll to change volume - WheelHandler { - onWheel: event => { - const currentVolume = Audio.value; - const step = currentVolume < 0.1 ? 0.01 : 0.02 || 0.2; - if (event.angleDelta.y < 0) - Audio.sink.audio.volume -= step; - else if (event.angleDelta.y > 0) - Audio.sink.audio.volume = Math.min(1, Audio.sink.audio.volume + step); - // Store the mouse position and start tracking - barBottomSectionMouseArea.lastScrollX = event.x; - barBottomSectionMouseArea.lastScrollY = event.y; - barBottomSectionMouseArea.trackingScroll = true; - } - acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad - } - onPositionChanged: mouse => { - if (barBottomSectionMouseArea.trackingScroll) { - const dx = mouse.x - barBottomSectionMouseArea.lastScrollX; - const dy = mouse.y - barBottomSectionMouseArea.lastScrollY; - if (Math.sqrt(dx * dx + dy * dy) > osdHideMouseMoveThreshold) { - GlobalStates.osdVolumeOpen = false; - barBottomSectionMouseArea.trackingScroll = false; - } - } - } ColumnLayout { id: bottomSectionColumnLayout From 8c47d859272b42250f06e7e388b31136941dbca9 Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sun, 17 Aug 2025 15:47:20 +0700 Subject: [PATCH 15/23] background: fix mantra positioning --- .config/quickshell/ii/modules/background/Background.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.config/quickshell/ii/modules/background/Background.qml b/.config/quickshell/ii/modules/background/Background.qml index c92ca2765..98760db2e 100644 --- a/.config/quickshell/ii/modules/background/Background.qml +++ b/.config/quickshell/ii/modules/background/Background.qml @@ -243,6 +243,8 @@ Variants { text: DateTime.date } StyledText { + Layout.fillWidth: true + Layout.topMargin: 8 horizontalAlignment: bgRoot.textHorizontalAlignment font { family: Appearance.font.family.expressive From ff7aa46cda31dede258b1195851ab582470ded8a Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sun, 17 Aug 2025 15:48:33 +0700 Subject: [PATCH 16/23] background: fix too close date placement for 12h clock --- .config/quickshell/ii/modules/background/Background.qml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.config/quickshell/ii/modules/background/Background.qml b/.config/quickshell/ii/modules/background/Background.qml index 98760db2e..01bdd96f2 100644 --- a/.config/quickshell/ii/modules/background/Background.qml +++ b/.config/quickshell/ii/modules/background/Background.qml @@ -213,7 +213,7 @@ Variants { ColumnLayout { id: clockColumn anchors.centerIn: parent - spacing: 0 + spacing: 6 StyledText { Layout.fillWidth: true @@ -244,7 +244,6 @@ Variants { } StyledText { Layout.fillWidth: true - Layout.topMargin: 8 horizontalAlignment: bgRoot.textHorizontalAlignment font { family: Appearance.font.family.expressive From 680378e68fe8ff7aa64b9313b0f73e5a2eb72d29 Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sun, 17 Aug 2025 18:15:01 +0700 Subject: [PATCH 17/23] clipboard history: make updates happen immediately after change Updates previously wouldn't trigger immediately because no focus = no clipboard grab https://quickshell.org/docs/v0.2.0/types/Quickshell/Quickshell/#clipboardText --- .config/hypr/hyprland/execs.conf | 4 ++-- .config/quickshell/ii/services/Cliphist.qml | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.config/hypr/hyprland/execs.conf b/.config/hypr/hyprland/execs.conf index 6d92de1c8..88b64f99d 100644 --- a/.config/hypr/hyprland/execs.conf +++ b/.config/hypr/hyprland/execs.conf @@ -18,8 +18,8 @@ exec-once = easyeffects --gapplication-service # Clipboard: history # exec-once = wl-paste --watch cliphist store & -exec-once = wl-paste --type text --watch cliphist store -exec-once = wl-paste --type image --watch cliphist store +exec-once = wl-paste --type text --watch bash -c 'cliphist store && qs -c ii ipc call cliphistService update' +exec-once = wl-paste --type image --watch bash -c 'cliphist store && qs -c ii ipc call cliphistService update' # Cursor exec-once = hyprctl setcursor Bibata-Modern-Classic 24 diff --git a/.config/quickshell/ii/services/Cliphist.qml b/.config/quickshell/ii/services/Cliphist.qml index 6e3f7a1f3..3bd9cbc00 100644 --- a/.config/quickshell/ii/services/Cliphist.qml +++ b/.config/quickshell/ii/services/Cliphist.qml @@ -98,4 +98,12 @@ Singleton { } } } + + IpcHandler { + target: "cliphistService" + + function update(): void { + root.refresh() + } + } } From dc167bd25e989e031cff1828165ecb44b17986ba Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sun, 17 Aug 2025 18:17:16 +0700 Subject: [PATCH 18/23] previous commit but use `$qsConfig` instead of `ii` in hyprland config --- .config/hypr/hyprland/execs.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.config/hypr/hyprland/execs.conf b/.config/hypr/hyprland/execs.conf index 88b64f99d..2ccf9b314 100644 --- a/.config/hypr/hyprland/execs.conf +++ b/.config/hypr/hyprland/execs.conf @@ -18,8 +18,8 @@ exec-once = easyeffects --gapplication-service # Clipboard: history # exec-once = wl-paste --watch cliphist store & -exec-once = wl-paste --type text --watch bash -c 'cliphist store && qs -c ii ipc call cliphistService update' -exec-once = wl-paste --type image --watch bash -c 'cliphist store && qs -c ii ipc call cliphistService update' +exec-once = wl-paste --type text --watch bash -c 'cliphist store && qs -c $qsConfig ipc call cliphistService update' +exec-once = wl-paste --type image --watch bash -c 'cliphist store && qs -c $qsConfig ipc call cliphistService update' # Cursor exec-once = hyprctl setcursor Bibata-Modern-Classic 24 From e66ab2b2c9fbf6c53e7b7d728c53013b664ced59 Mon Sep 17 00:00:00 2001 From: relyadev Date: Sun, 17 Aug 2025 12:16:52 +0000 Subject: [PATCH 19/23] Updated some incorrect words and added new ones to ru_RU.json --- .config/quickshell/translations/ru_RU.json | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.config/quickshell/translations/ru_RU.json b/.config/quickshell/translations/ru_RU.json index df1c0488f..fefdfa9df 100644 --- a/.config/quickshell/translations/ru_RU.json +++ b/.config/quickshell/translations/ru_RU.json @@ -22,7 +22,7 @@ "Load chat from %1": "Загрузить чат из %1", "OK": "ОК", "No further instruction provided": "Больше инструкций не предоставлено", - "Set temperature (randomness) of the model. Values range between 0 to 2 for Gemini, 0 to 1 for other models. Default is 0.5.": "Установить температуру (случайность) модели. Выберите значение от 0 до 2 для Gemini, от 0 до 1 для других моделей. По умолчанию: 0.5", + "Set temperature (randomness) of the model. Values range between 0 to 2 for Gemini, 0 to 1 for other models. Default is 0.5.": "Установить температуру (предсказуемость) модели. Выберите значение от 0 до 2 для Gemini, от 0 до 1 для других моделей. По умолчанию: 0.5", "Open file link": "Открыть ссылку на файл", "API key is set\nChange with /key YOUR_API_KEY": "API ключ установлен\nПоменять с помощью /key ВАШ_КЛЮЧ_API", "Advanced": "Продвинутые", @@ -147,7 +147,7 @@ "Borderless": "Безрамочный", "Loaded the following system prompt\n\n---\n\n%1": "Загружен следующий системный промпт\n\n---\n\n%1", "Thought": "Мысли", - "Your package manager is running": "Ваш менеджер пакетов работает", + "Your package manager is running": "Ваш пакетный менеджер работает", "12h AM/PM": "12 ч. AM/PM", "Scale (%)": "Размер (%)", "Waiting for response...": "Ожидание ответа...", @@ -159,7 +159,7 @@ "Silent": "Выкл. звук", "Rainbow": "Радуга", "Anime boorus": "Аниме боору", - "Nothing here!": "Ничего нету!", + "Nothing here!": "Тут ничего нет!", "Documentation": "Документация", "Clear": "Очистить", "Transparency": "Прозрачность", @@ -322,7 +322,12 @@ "Save to Downloads": "Сохранить в загрузки", "Light": "Светлый", "Keyboard toggle": "Экранная клавиатура", - "Night Light": "Night Light", + "Night Light": "Ночной Свет", + "Timer": "Таймер", + "Stopwatch": "Секундомер", + "Pomodoro": "Pomodoro", + "Start": "Начать", + "Reset": "Сбросить", "We": "Ср/*keep*/", "Mo": "Пн/*keep*/", "Su": "Вс/*keep*/", @@ -337,7 +342,7 @@ "Set the tool to use for the model.": "Установите инструмент для этой модели.", "Invalid tool. Supported tools:\n- %1": "Неправильный инструмент. Доступны:\n- %1", "Usage: %1tool TOOL_NAME": "Использование: %1tool ИНСТРУМЕНТ", - "Performance Profile toggle": "Профили производительности", + "Performance Profile toggle": "Переключатель Профиля питания", "Usage: %1save CHAT_NAME": "Использование: %1save ИМЯ_ЧАТА", "Online | Google's model\nA Gemini 2.5 Flash model optimized for cost-efficiency and high throughput.": "Онлайн | Модель Google\nМодель Gemini 2.5 Flash оптимизирована под меньшие затраты и высокую производительнность", "Online | Google's model\nNewer model that's slower than its predecessor but should deliver higher quality answers": "Онлайн | Модель Google\nНовая модель, которая медленее, чем ее предшественник, но выдает лучшее качество", From 9a9a35d75efdc4a2264e861b01ed2a6ab0fa4a9d Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sun, 17 Aug 2025 21:34:22 +0700 Subject: [PATCH 20/23] =?UTF-8?q?bar:=20corrected=20=F0=9F=92=A2=20popup?= =?UTF-8?q?=20margins=20for=20vertical=20bar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .config/quickshell/ii/modules/bar/StyledPopup.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.config/quickshell/ii/modules/bar/StyledPopup.qml b/.config/quickshell/ii/modules/bar/StyledPopup.qml index bc399aa38..47c19ef21 100644 --- a/.config/quickshell/ii/modules/bar/StyledPopup.qml +++ b/.config/quickshell/ii/modules/bar/StyledPopup.qml @@ -33,7 +33,7 @@ LazyLoader { root.hoverTarget, (root.hoverTarget.width - popupBackground.implicitWidth) / 2, 0 ).x; - return Appearance.sizes.barHeight + return Appearance.sizes.verticalBarWidth } top: { if (!Config.options.bar.vertical) return Appearance.sizes.barHeight; @@ -42,7 +42,7 @@ LazyLoader { (root.hoverTarget.height - popupBackground.implicitHeight) / 2, 0 ).y; } - right: Appearance.sizes.barHeight + right: Appearance.sizes.verticalBarWidth bottom: Appearance.sizes.barHeight } WlrLayershell.namespace: "quickshell:popup" From 122b16a720dba1cd6c4f79e872ed4f2379a765ed Mon Sep 17 00:00:00 2001 From: relyadev Date: Sun, 17 Aug 2025 14:41:20 +0000 Subject: [PATCH 21/23] Added micro text editor keybinds.conf --- .config/hypr/hyprland/keybinds.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.config/hypr/hyprland/keybinds.conf b/.config/hypr/hyprland/keybinds.conf index c7e953d94..d9e627981 100644 --- a/.config/hypr/hyprland/keybinds.conf +++ b/.config/hypr/hyprland/keybinds.conf @@ -210,7 +210,7 @@ bind = Super, T, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh bind = Ctrl+Alt, T, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh "$TERMINAL" "kitty -1" "foot" "alacritty" "wezterm" "konsole" "kgx" "uxterm" "xterm" # [hidden] (terminal) (for Ubuntu people) bind = Super, E, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh "dolphin" "nautilus" "nemo" "thunar" "$TERMINAL" "kitty -1 fish -c yazi" # File manager bind = Super, W, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh "google-chrome-stable" "zen-browser" "firefox" "brave" "chromium" "microsoft-edge-stable" "opera" "librewolf" # Browser -bind = Super, C, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh "code" "codium" "cursor" "zed" "zedit" "zeditor" "kate" "gnome-text-editor" "emacs" "command -v nvim && kitty -1 nvim" # Code editor +bind = Super, C, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh "code" "codium" "cursor" "zed" "zedit" "zeditor" "kate" "gnome-text-editor" "emacs" "command -v nvim && kitty -1 nvim" "command -v micro && kitty -1 micro" # Code editor bind = Super+Shift, W, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh "wps" "onlyoffice-desktopeditors" # Office software bind = Super, X, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh "kate" "gnome-text-editor" "emacs" # Text editor bind = Ctrl+Super, V, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh "pavucontrol-qt" "pavucontrol" # Volume mixer From de44a8d91e271a2532f786cd5a94a10fd2fed6c3 Mon Sep 17 00:00:00 2001 From: relyadev Date: Sun, 17 Aug 2025 16:14:29 +0000 Subject: [PATCH 22/23] more updates ru_RU.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "Performance Profile toggle": "Переключатель питания" Didn't fit, changed Translation became more logical Almost the entire system is localized --- .config/quickshell/translations/ru_RU.json | 57 ++++++++++++++-------- 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/.config/quickshell/translations/ru_RU.json b/.config/quickshell/translations/ru_RU.json index fefdfa9df..dc3875b66 100644 --- a/.config/quickshell/translations/ru_RU.json +++ b/.config/quickshell/translations/ru_RU.json @@ -12,7 +12,7 @@ "Switched to search mode. Continue with the user's request.": "Переключено в режим поиска. Продолжай с запросом пользователя.", "No notifications": "Нет уведомлений", "EasyEffects | Right-click to configure": "EasyEffects | ПКМ, чтобы настроить", - "Suspend at": "Переход в режим сна на", + "Suspend at": "Переход в сон", "Brightness": "Яркость", "Volume mixer": "Микшер громкости", "Discussions": "Обсуждения", @@ -25,7 +25,7 @@ "Set temperature (randomness) of the model. Values range between 0 to 2 for Gemini, 0 to 1 for other models. Default is 0.5.": "Установить температуру (предсказуемость) модели. Выберите значение от 0 до 2 для Gemini, от 0 до 1 для других моделей. По умолчанию: 0.5", "Open file link": "Открыть ссылку на файл", "API key is set\nChange with /key YOUR_API_KEY": "API ключ установлен\nПоменять с помощью /key ВАШ_КЛЮЧ_API", - "Advanced": "Продвинутые", + "Advanced": "Прочие", "Title bar": "Заголовок", "Keybinds": "Шорткаты", "Alternatively use /dark, /light, /img in the launcher": "Также можно использовать /dark, /light, /img в лаунчере", @@ -57,13 +57,13 @@ "System prompt": "Системный промпт", "Edit config": "Ред. конфиг", "Page %1": "Страница %1", - "Task description": "Описание задания", - "Fruit Salad": "Фруктовый салад", + "Task description": "Описание задачи", + "Fruit Salad": "Фруктовый салат", "%1 Safe Storage": "Безопасное хранилище %1", "Distro": "Дистрибутив", "Add": "Добавить", "Closet": "Закрытый", - "Task Manager": "Системный монитор", + "Task Manager": "Диспетчер задач", "Configuration": "Настройка", "There might be a download in progress": "Возможно происходит скачивание", "Visibility": "Видимость", @@ -97,7 +97,7 @@ "Current model: %1\nSet it with %2model MODEL": "Текущая модель: %1\nСменить с помощью %2model МОДЕЛЬ", "Dark": "Темный", "Hug": "Захват", - "Hibernate": "Гиберрнация", + "Hibernate": "Гибернация", "Registration failed. Please inspect manually with the warp-cli command": "Ошибка регистрации. Проверьте вручную командой warp-cli", "Calendar": "Календарь", "Save chat to %1": "Сохранить чат в %1", @@ -121,8 +121,8 @@ "Base URL": "Базовый URL", "Not visible to model": "Невидимый для модели", "Auto": "Авто", - "Might look ass. Unsupported.": "Может выглядеть хуево. Не поддерживается", - "%1 • %2 tasks": "%1 • %2 заданий", + "Might look ass. Unsupported.": "Может выглядеть плохо. Не поддерживается", + "%1 • %2 tasks": "%1 • %2 задач", "Search the web": "Искать в интернете", "Scroll to change brightness": "Листайте, чтобы изменить яркость", "Invalid arguments. Must provide `key` and `value`.": "Неправильные аргументы. Нужно предоставить `key` и `value`.", @@ -132,7 +132,7 @@ "No": "Нет", "Such regions could be images or parts of the screen that have some containment.\nMight not always be accurate.\nThis is done with an image processing algorithm run locally and no AI is used.": "Такие регионы могут быть изображениями или части экрана, которые имеют некую ограниченность.\nМожет быть неверно.\nЭто происходит с помощью алгоритма обработки изобржений локально и ИИ не используется", "Select Language": "Выбрать Язык", - "Command rejected by user": "Команда отменена пользователем", + "Command rejected by user": "Команда прервана пользователем", "Approve": "Разрешить", "Terminal": "Терминал", "Search": "Поиск", @@ -172,8 +172,8 @@ "For desktop wallpapers | Good quality": "Для обоев | Отличное качество", "Type /key to get started with online models\nCtrl+O to expand the sidebar\nCtrl+P to detach sidebar into a window": "Введите /key, чтобы начать работу с онлайн моделями\nCtrl+O для расширения панели\nCtrl+P для отсоединения панели", "Close": "Закрыть", - "Search, calculate or run": "Поиск, вычислить, выполнить", - "Add task": "Добавить задание", + "Search, calculate or run": "Найти, вычислить или выполнить", + "Add task": "Добавить задачу", "Enable": "Включить", "Temperature set to %1": "Температура установлена на %1", "No media": "Нет медиа", @@ -185,7 +185,7 @@ "The current system prompt is\n\n---\n\n%1": "Текущий системный промпт\n\n---\n\n%1", "Scroll to change volume": "Листайте, чтобы изменить громкость", "Unknown Title": "Неизвестное Название", - "Policies": "Политики", + "Policies": "Ограничения", "Disable NSFW content": "Отключить NSFW контент", "The current API used. Endpoint:": "Текущий используемый API. Точка входа:", "Humidity": "Влажность", @@ -199,7 +199,7 @@ "Enter text to translate...": "Введите текст для перевода...", "Use Levenshtein distance-based algorithm instead of fuzzy": "Использовать алгоритм, основанный на расстоянии Левенштейна,\n вместо нечёткого сопоставления.", "Depends on workspace": "Зависит от пространства", - "All-rounder | Good quality, decent quantity": "Универсальный | Хорошее качество и количество", + "All-rounder | Good quality, decent quantity": "Универсальный | Хорошее качество, приличное количество", "Timeout (ms)": "Таймаут (мс)", "Plain rectangle": "Обычный прямоугольник", "No API key\nSet it with /key YOUR_API_KEY": "Нет API ключа.\nУстановите его с помощью /key ВАШ_КЛЮЧ_API", @@ -209,7 +209,7 @@ "Precipitation": "Осадки", "The popular one | Best quantity, but quality can vary wildly": "Популярный | Огромный выбор, но качество сильно варьируется", "Temperature: %1": "Температура: %1", - "Qt apps": "Qt", + "Qt apps": "Qt приложения", "Delete": "Удалить", "Saved to %1": "Сохранено в %1", "Temperature\nChange with /temp VALUE": "Температура\nИзмените с помощью /temp ЗНАЧЕНИЕ", @@ -236,7 +236,7 @@ "Screenshot tool": "Инструмент скриншотов", "Get the next page of results": "Получить резултаты следующей страницы", "Drag or click a region • LMB: Copy • RMB: Edit": "Проведите или кликните на регион • ЛКМ: Скопировать • ПКМ: Редактировать", - "Material palette": "Материальная палитра", + "Material palette": "Material палитра", "Columns": "Столбцы", "Bar": "Панель", "Max allowed increase": "Макс. рост", @@ -256,7 +256,7 @@ "Session": "Сессия", "Mic toggle": "Перекл. микрофон", "Reboot to firmware settings": "Перезагрузиться в настройки BIOS/UEFI", - "Low battery": "Низкий", + "Low battery": "Низкий заряд", "Usage": "Использование", "Notifications": "Уведомления", "Consider plugging in your device": "Задумайтесь о подключении ПК к источнику питания", @@ -272,7 +272,7 @@ "On-screen display": "On-screen display", "Download complete": "Загрузка завершена", "Time": "Время", - "Float": "Поверх", + "Float": "Парящая", "Pick wallpaper image on your system": "Выберите изображение для обоев на своём ПК", "Prevents abrupt increments and restricts volume limit": "Предотвращает резкие увеличения громкости и закрепляет лимит громоксти", "Unknown Album": "Неизвестный Альбом", @@ -328,12 +328,31 @@ "Pomodoro": "Pomodoro", "Start": "Начать", "Reset": "Сбросить", + "Pause": "Пауза", + "Resume": "Возобновить", + "Lap": "Круг", + "Battery": "Батарея", + "Fully charged": "Полностью заряжена", + "Time to empty: %1": "Время до полной разрядки: %1", + "Discharging": "Разряжается", + "System uptime: %1": "Время работы системы: %1", + "No pending tasks": "Нет незавершенных задач", + "Corner style": "Стиль панели", + "Bar layout": "Ориентация панели", + "Place at the bottom/right": "Разместить внизу/справа", + "Tray": "Трей", + "Tint icons": "Тень иконок", + "Overall appearance": "Общий внешний вид", + "Keep right slidebar loaded": "Держать правую панель загруженной", + "Slidebars": "Панели", + "Tint app icons": "Тень иконок приложений", + "On-screen display": "Отображение на экране", "We": "Ср/*keep*/", "Mo": "Пн/*keep*/", "Su": "Вс/*keep*/", "Th": "Чт/*keep*/", "Tu": "Вт/*keep*/", - "Experimental | Online | Google's model\nCan do a little more but doesn't search quickly": "Эксперементальная | Онлайн | Модель Google\nМожет немного больше но не ищет очень быстро", + "Experimental | Online | Google's model\nCan do a little more but doesn't search quickly": "Эксперементальная | Онлайн | Модель Google\nИмеет больше возможностей, но ищет не очень быстро", "Sa": "Сб/*keep*/", "Chain of Thought": "Цепочка мыслей", "Fr": "Пт/*keep*/", @@ -342,7 +361,7 @@ "Set the tool to use for the model.": "Установите инструмент для этой модели.", "Invalid tool. Supported tools:\n- %1": "Неправильный инструмент. Доступны:\n- %1", "Usage: %1tool TOOL_NAME": "Использование: %1tool ИНСТРУМЕНТ", - "Performance Profile toggle": "Переключатель Профиля питания", + "Performance Profile toggle": "Переключатель питания", "Usage: %1save CHAT_NAME": "Использование: %1save ИМЯ_ЧАТА", "Online | Google's model\nA Gemini 2.5 Flash model optimized for cost-efficiency and high throughput.": "Онлайн | Модель Google\nМодель Gemini 2.5 Flash оптимизирована под меньшие затраты и высокую производительнность", "Online | Google's model\nNewer model that's slower than its predecessor but should deliver higher quality answers": "Онлайн | Модель Google\nНовая модель, которая медленее, чем ее предшественник, но выдает лучшее качество", From 695dbee5010b790c18bc89a1985a3a2db6d6a698 Mon Sep 17 00:00:00 2001 From: rain022 Date: Mon, 18 Aug 2025 01:21:50 +0900 Subject: [PATCH 23/23] Add Japanese translation --- .config/quickshell/translations/ja_JP.json | 338 +++++++++++++++++++++ 1 file changed, 338 insertions(+) create mode 100644 .config/quickshell/translations/ja_JP.json diff --git a/.config/quickshell/translations/ja_JP.json b/.config/quickshell/translations/ja_JP.json new file mode 100644 index 000000000..4b75fe30f --- /dev/null +++ b/.config/quickshell/translations/ja_JP.json @@ -0,0 +1,338 @@ +{ + "Mo": "月/*keep*/", + "Tu": "火/*keep*/", + "We": "水/*keep*/", + "Th": "木/*keep*/", + "Fr": "金/*keep*/", + "Sa": "土/*keep*/", + "Su": "日/*keep*/", + "%1 characters": "%1 文字", + "**Pricing**: free. Data use policy varies depending on your OpenRouter account settings.\n\n**Instructions**: Log into OpenRouter account, go to Keys on the topright menu, click Create API Key": "**料金**: 無料。データ利用ポリシーはOpenRouterアカウント設定によって異なります。\n\n**手順**: OpenRouterアカウントにログインし、右上メニューのKeysに進み、Create API Keyをクリックしてください。", + "**Pricing**: free. Data used for training.\n\n**Instructions**: Log into Google account, allow AI Studio to create Google Cloud project or whatever it asks, go back and click Get API key": "**料金**: 無料。データは学習に使用されます。\n\n**手順**: Googleアカウントにログインし、AI StudioにGoogle Cloudプロジェクトの作成などを許可し、戻ってAPIキーを取得してください。", + ". Notes for Zerochan:\n- You must enter a color\n- Set your zerochan username in `sidebar.booru.zerochan.username` config option. You [might be banned for not doing so](https://www.zerochan.net/api#:~:text=The%20request%20may%20still%20be%20completed%20successfully%20without%20this%20custom%20header%2C%20but%20your%20project%20may%20be%20banned%20for%20being%20anonymous.)!": "Zerochanの注意:\n- 色を入力する必要があります\n- `sidebar.booru.zerochan.username`設定でユーザー名を設定してください。設定しないと[利用停止になる場合があります](https://www.zerochan.net/api#:~:text=The%20request%20may%20still%20be%20completed%20successfully%20without%20this%20custom%20header%2C%20but%20your%20project%20may%20be%20banned%20for%20being%20anonymous.)!", + "No further instruction provided": "追加の指示はありません", + "Action": "操作", + "Add": "追加", + "Add task": "タスクを追加", + "All-rounder | Good quality, decent quantity": "万能型 | 品質良好、量も十分", + "Allow NSFW": "NSFWを許可", + "Allow NSFW content": "NSFWコンテンツを許可", + "Anime": "アニメ", + "Anime boorus": "アニメ画像掲示板", + "App": "アプリ", + "Arrow keys to navigate, Enter to select\nEsc or click anywhere to cancel": "矢印キーで移動、Enterで選択\nEscまたはどこかをクリックでキャンセル", + "Bluetooth": "Bluetooth", + "Brightness": "明るさ", + "Cancel": "キャンセル", + "Chain of Thought": "思考プロセス", + "Cheat sheet": "チートシート", + "Choose model": "モデルを選択", + "Clean stuff | Excellent quality, no NSFW": "健全系 | 高品質、NSFWなし", + "Clear": "クリア", + "Clear chat history": "チャット履歴を消去", + "Clear the current list of images": "現在の画像リストをクリア", + "Close": "閉じる", + "Copy": "コピー", + "Copy code": "コードをコピー", + "Delete": "削除", + "Desktop": "デスクトップ", + "Disable NSFW content": "NSFWコンテンツを無効化", + "Done": "完了", + "Download": "ダウンロード", + "Edit": "編集", + "Enter text to translate...": "翻訳するテキストを入力...", + "Finished tasks will go here": "完了したタスクはここに表示されます", + "For desktop wallpapers | Good quality": "デスクトップ壁紙向け | 良質", + "For storing API keys and other sensitive information": "APIキーや機密情報の保存用", + "Game mode": "ゲームモード", + "Get the next page of results": "次のページを取得", + "Hibernate": "休止", + "Input": "入力", + "Intelligence": "知能", + "Interface": "インターフェース", + "Invalid arguments. Must provide `key` and `value`.": "無効な引数です。`key`と`value`を指定してください。", + "Jump to current month": "現在の月へ移動", + "Keep system awake": "システムをスリープさせない", + "Large images | God tier quality, no NSFW.": "大きな画像 | 最高品質、NSFWなし。", + "Large language models": "大規模言語モデル", + "Launch": "起動", + "Lock": "ロック", + "Logout": "ログアウト", + "Markdown test": "Markdownテスト", + "Math result": "計算結果", + "Night Light": "夜間モード", + "No audio source": "音声ソースなし", + "No media": "メディアなし", + "No notifications": "通知なし", + "Not visible to model": "モデルには表示されません", + "Nothing here!": "何もありません!", + "Notifications": "通知", + "OK": "OK", + "Open file link": "ファイルリンクを開く", + "Output": "出力", + "Reboot": "再起動", + "Reboot to firmware settings": "ファームウェア設定で再起動", + "Reload Hyprland & Quickshell": "HyprlandとQuickshellを再読み込み", + "Run": "実行", + "Run command": "コマンドを実行", + "Save": "保存", + "Save to Downloads": "ダウンロードに保存", + "Search": "検索", + "Search the web": "ウェブ検索", + "Search, calculate or run": "検索・計算・実行", + "Select Language": "言語を選択", + "Session": "セッション", + "Set API key": "APIキーを設定", + "Set temperature (randomness) of the model. Values range between 0 to 2 for Gemini, 0 to 1 for other models. Default is 0.5.": "モデルの温度(ランダム性)を設定します。Geminiは0~2、他は0~1。デフォルトは0.5。", + "Set the current API provider": "現在のAPIプロバイダーを設定します", + "Shutdown": "シャットダウン", + "Silent": "サイレント", + "Sleep": "スリープ", + "System": "システム", + "Task Manager": "タスクマネージャー", + "Task description": "タスクの説明", + "Temperature must be between 0 and 2": "温度は0~2の間で指定してください", + "The hentai one | Great quantity, a lot of NSFW, quality varies wildly": "エロ系 | 量が多くNSFW多数、品質はバラバラ", + "The popular one | Best quantity, but quality can vary wildly": "人気系 | 量は最多、品質はバラつきあり", + "Thinking": "考え中", + "Translation goes here...": "ここに翻訳が表示されます...", + "Translator": "翻訳", + "Unfinished": "未完了", + "Unknown": "不明", + "Unknown Album": "不明なアルバム", + "Unknown Artist": "不明なアーティスト", + "Unknown Title": "不明なタイトル", + "View Markdown source": "Markdownソースを表示", + "Volume": "音量", + "Volume mixer": "音量ミキサー", + "Waifus only | Excellent quality, limited quantity": "美少女系のみ | 高品質、量は少なめ", + "Waiting for response...": "応答待ち...", + "Workspace": "ワークスペース", + "Set with /mode PROVIDER": "/mode PROVIDER で設定", + "Invalid API provider. Supported: \n-": "無効なAPIプロバイダー。対応: \n-", + "Unknown command:": "不明なコマンド:", + "Type /key to get started with online models\nCtrl+O to expand the sidebar\nCtrl+P to detach sidebar into a window": "/keyでオンラインモデルを開始\nCtrl+Oでサイドバー展開\nCtrl+Pでサイドバーをウィンドウ化", + "The current API used. Endpoint:": "現在使用中のAPIのエンドポイント:", + "Provider set to": "プロバイダーを設定しました:", + "Invalid model. Supported: \n```": "無効なモデル。対応: \n```", + "That didn't work. Tips:\n- Check your tags and NSFW settings\n- If you don't have a tag in mind, type a page number": "うまくいきませんでした。ヒント:\n- タグやNSFW設定を確認\n- タグがなければページ番号を入力", + "Online | Google's model\nGives up-to-date information with search.": "オンライン | Googleのモデル\n検索で最新情報を取得します", + "Switched to search mode. Continue with the user's request.": "検索モードに切り替えました。リクエストを続行します。", + "Experimental | Online | Google's model\nCan do a little more but doesn't search quickly": "実験的 | オンライン | Googleのモデル\n少し多機能ですが、検索は遅めです", + "Settings": "設定", + "Save chat": "チャットを保存", + "Load chat": "チャットを読み込み", + "or": "または", + "Set the system prompt for the model.": "モデルのシステムプロンプトを設定", + "To Do": "やること", + "Calendar": "カレンダー", + "Advanced": "詳細", + "About": "このアプリについて", + "Services": "サービス", + "Style": "スタイル", + "Edit config": "設定を編集", + "Colors & Wallpaper": "色と壁紙", + "Light": "ライト", + "Dark": "ダーク", + "Material palette": "マテリアルパレット", + "Fidelity": "忠実度", + "Fruit Salad": "フルーツサラダ", + "Alternatively use /dark, /light, /img in the launcher": "ランチャーで/dark, /light, /imgも利用可能", + "Fake screen rounding": "画面の角を疑似的に丸める", + "When not fullscreen": "全画面でない場合", + "Choose file": "ファイルを選択", + "Random SFW Anime wallpaper from Konachan\nImage is saved to ~/Pictures/Wallpapers": "KonachanからランダムなSFW(健全)アニメ壁紙\n画像は~/Pictures/Wallpapersに保存されます", + "Be patient...": "しばらくお待ちください...", + "Decorations & Effects": "装飾と効果", + "Tonal Spot": "トーナルスポット", + "Shell windows": "シェルウィンドウ", + "Auto": "自動", + "Wallpaper": "壁紙", + "Content": "コンテンツ", + "Title bar": "タイトルバー", + "Transparency": "透明度", + "Expressive": "表現豊か", + "Yes": "はい", + "Enable": "有効化", + "Rainbow": "レインボー", + "Might look ass. Unsupported.": "見た目が悪くなる場合があります(未サポート)", + "Monochrome": "モノクロ", + "Random: Konachan": "ランダム: Konachan", + "Center title": "タイトルを中央に", + "Neutral": "ニュートラル", + "Pick wallpaper image on your system": "システムから壁紙画像を選択", + "No": "いいえ", + "AI": "AI", + "Local only": "ローカルのみ", + "Policies": "ポリシー", + "Weeb": "オタク向け", + "Closet": "クローゼット", + "Bar style": "バーのスタイル", + "Show next time": "次回も表示する", + "Usage": "使用状況", + "Plain rectangle": "ただの四角形", + "Useless buttons": "ダミーボタン", + "GitHub": "GitHub", + "Style & wallpaper": "スタイルと壁紙", + "Configuration": "設定", + "Change any time later with /dark, /light, /img in the launcher": "ランチャーで/dark, /light, /imgでいつでも変更可能", + "Keybinds": "キー割り当て", + "Float": "フローティング", + "Hug": "ハグ", + "Yooooo hi there": "やあ、こんにちは!", + "illogical-impulse Welcome": "illogical-impulseへようこそ", + "Info": "情報", + "Volume limit": "音量制限", + "Prevents abrupt increments and restricts volume limit": "急激な音量上昇を防ぎ、音量を制限します", + "Resources": "リソース", + "12h am/pm": "12時間(AM/PM)", + "Base URL": "ベースURL", + "Audio": "オーディオ", + "Networking": "ネットワーク", + "Format": "フォーマット", + "Time": "時間", + "Battery": "バッテリー", + "Prefixes": "接頭辞", + "Emojis": "絵文字", + "Earbang protection": "急音防止", + "Automatically suspends the system when battery is low": "バッテリー残量が少ないときに自動でスリープします", + "Automatic suspend": "自動スリープ", + "Suspend at": "スリープ開始残量(%)", + "Max allowed increase": "最大許容増加幅", + "Web search": "ウェブ検索", + "Polling interval (ms)": "ポーリング間隔(ms)", + "Clipboard": "クリップボード", + "Low warning": "バッテリー低下の警告", + "24h": "24時間", + "Use Levenshtein distance-based algorithm instead of fuzzy": "ファジー検索の代わりにレーベンシュタイン距離ベースのアルゴリズムを使用", + "System prompt": "システムプロンプト", + "12h AM/PM": "12時間(AM/PM)", + "Could be better if you make a ton of typos,\nbut results can be weird and might not work with acronyms\n(e.g. \"GIMP\" might not give you the paint program)": "タイプミスが多い場合は便利ですが、結果が変になることもあり、略語には対応しない場合があります\n(例: \"GIMP\"でペイントソフトが出ないことも)", + "Critical warning": "重大な警告", + "User agent (for services that require it)": "ユーザーエージェント(必要なサービス用)", + "Such regions could be images or parts of the screen that have some containment.\nMight not always be accurate.\nThis is done with an image processing algorithm run locally and no AI is used.": "これらの領域は、画像や画面の一部など、一定のまとまりを持つ箇所を指します。\n常に正確とは限りません。\nこれはローカルで実行される画像処理アルゴリズムによるもので、AIは使用していません。", + "Note: turning off can hurt readability": "オフにすると可読性が下がる場合があります", + "Workspaces shown": "表示中のワークスペース", + "Dark/Light toggle": "ダーク/ライト切替", + "Dock": "ドック", + "Weather": "天気", + "Pinned on startup": "起動時にピン留め", + "Tip: Hide icons and always show numbers for\nthe classic illogical-impulse experience": "ヒント: アイコンを隠して常に数字を表示すると、クラシックなillogical-impulse体験になります", + "Appearance": "外観", + "Always show numbers": "常に数字を表示", + "Buttons": "ボタン", + "Keyboard toggle": "キーボード切替", + "Scale (%)": "スケール(%)", + "Overview": "概要", + "Rows": "行数", + "Borderless": "枠なし", + "Screenshot tool": "スクリーンショットツール", + "Number show delay when pressing Super (ms)": "Superキー押下時の数字表示遅延(ms)", + "Timeout (ms)": "タイムアウト(ms)", + "Show app icons": "アプリアイコンを表示", + "Workspaces": "ワークスペース", + "Columns": "列数", + "On-screen display": "オンスクリーン表示", + "Screen snip": "画面切り取り", + "Mic toggle": "マイク切替", + "Hover to reveal": "ホバーで表示", + "Bar": "バー", + "Show background": "背景を表示", + "Show regions of potential interest": "注目領域を表示", + "Color picker": "カラーピッカー", + "Help & Support": "ヘルプとサポート", + "Discussions": "ディスカッション", + "Color generation": "色の生成", + "Dotfiles": "ドットファイル", + "Distro": "ディストリビューション", + "Privacy Policy": "プライバシーポリシー", + "Documentation": "ドキュメント", + "Shell & utilities theming must also be enabled": "シェルとユーティリティのテーマも有効にする必要があります", + "illogical-impulse": "illogical-impulse", + "Donate": "寄付", + "Terminal": "ターミナル", + "Shell & utilities": "シェルとユーティリティ", + "Qt apps": "Qtアプリ", + "Report a Bug": "バグを報告", + "Issues": "課題", + "Drag or click a region • LMB: Copy • RMB: Edit": "領域をドラッグまたはクリック • 左クリック: コピー • 右クリック: 編集", + "Current model: %1\nSet it with %2model MODEL": "現在のモデル: %1\n%2model MODELで設定", + "Message the model... \"%1\" for commands": "モデルにメッセージ... コマンドは「%1」", + "No API key set for %1": "%1のAPIキーが設定されていません", + "Loaded the following system prompt\n\n---\n\n%1": "次のシステムプロンプトを読み込みました\n\n---\n\n%1", + "%1 | Right-click to configure": "%1 | 右クリックで設定", + "API key set for %1": "%1のAPIキーを設定しました", + "Online via %1 | %2's model": "%1経由オンライン | %2のモデル", + "Current API endpoint: %1\nSet it with %2mode PROVIDER": "現在のAPIエンドポイント: %1\n%2mode PROVIDERで設定", + "Go to source (%1)": "ソースを開く(%1)", + "Temperature set to %1": "温度を%1に設定", + "To set an API key, pass it with the command\n\nTo view the key, pass \"get\" with the command
\n\n### For %1:\n\n**Link**: %2\n\n%3": "APIキーを設定するにはコマンドで渡してください\n\nキーを表示するには「get」を指定してください
\n\n### %1の場合:\n\n**リンク**: %2\n\n%3", + "Enter tags, or \"%1\" for commands": "タグを入力、またはコマンドは「%1」", + "%1 queries pending": "%1件のクエリが保留中", + "API key:\n\n```txt\n%1\n```": "APIキー:\n\n```txt\n%1\n```", + "Uptime: %1": "稼働時間: %1", + "%1 Safe Storage": "%1 セーフストレージ", + "%1 does not require an API key": "%1はAPIキー不要です", + "Temperature: %1": "温度: %1", + "Model set to %1": "モデルを%1に設定", + "Page %1": "ページ %1", + "Local Ollama model | %1": "ローカルOllamaモデル | %1", + "The current system prompt is\n\n---\n\n%1": "現在のシステムプロンプトは\n\n---\n\n%1", + "Unknown function call: %1": "不明な関数呼び出し: %1", + "%1 notifications": "%1件の通知", + "Load chat from %1": "%1からチャットを読み込み", + "Load prompt from %1": "%1からプロンプトを読み込み", + "Save chat to %1": "チャットを%1に保存", + "Weather Service": "天気サービス", + "Cannot find a GPS service. Using the fallback method instead.": "GPSサービスが見つかりません。代替手段を使用します。", + "Critically low battery": "バッテリー残量が非常に少ない", + "Select output device": "出力デバイスを選択", + "Code saved to file": "コードをファイルに保存しました", + "Online models disallowed\n\nControlled by `policies.ai` config option": "オンラインモデルは許可されていません\n\n`policies.ai`設定で制御されています", + "Scroll to change volume": "スクロールで音量調整", + "Elements": "要素", + "%1 • %2 tasks": "%1 • %2件のタスク", + "Download complete": "ダウンロード完了", + "Please charge!\nAutomatic suspend triggers at %1": "充電してください!\n%1で自動スリープが作動します", + "Cloudflare WARP": "Cloudflare WARP", + "Cloudflare WARP (1.1.1.1)": "Cloudflare WARP (1.1.1.1)", + "Scroll to change brightness": "スクロールで明るさ調整", + "Connection failed. Please inspect manually with the warp-cli command": "接続に失敗しました。warp-cliコマンドで手動確認してください", + "Select input device": "入力デバイスを選択", + "Registration failed. Please inspect manually with the warp-cli command": "登録に失敗しました。warp-cliコマンドで手動確認してください", + "Consider plugging in your device": "電源に接続してください", + "Low battery": "バッテリー残量低下", + "Saved to %1": "%1に保存しました", + "Sunset": "日没", + "UV Index": "UV指数", + "Humidity": "湿度", + "Wind": "風", + "Sunrise": "日の出", + "Pressure": "気圧", + "Visibility": "視界", + "Precipitation": "降水量", + "Time to full:": "満充電まで:", + "Time to empty:": "空になるまで:", + "Fully charged": "充電完了", + "Charging:": "充電中:", + "Discharging:": "放電中:", + "Uptime:": "稼働時間:", + "Upcoming Tasks:": "今後のタスク:", + "No pending tasks": "保留中のタスクなし", + "... and %1 more": "...他%1件", + "Memory Usage": "メモリ使用量", + "Used:": "使用済み:", + "Free:": "空き:", + "Total:": "合計:", + "Usage:": "使用状況:", + "Swap Usage": "スワップ使用量", + "Swap:": "スワップ:", + "Not configured": "未設定", + "CPU Usage": "CPU使用率", + "Current:": "現在:", + "Load:": "負荷:", + "High": "高", + "Medium": "中", + "Low": "低", + "System Resource": "システムリソース" +}