qs: handle toggles internally instead of relying on hyprctl dispatch global (#1745)

This commit is contained in:
end-4
2025-07-31 12:35:16 +07:00
parent 968e8195ef
commit a08a39b620
21 changed files with 77 additions and 63 deletions
+5
View File
@@ -12,7 +12,12 @@ Singleton {
property bool barOpen: true property bool barOpen: true
property bool sidebarLeftOpen: false property bool sidebarLeftOpen: false
property bool sidebarRightOpen: false property bool sidebarRightOpen: false
property bool mediaControlsOpen: false
property bool osdBrightnessOpen: false
property bool osdVolumeOpen: false
property bool oskOpen: false
property bool overviewOpen: false property bool overviewOpen: false
property bool sessionOpen: false
property bool workspaceShowNumbers: false property bool workspaceShowNumbers: false
property bool superReleaseMightTrigger: true property bool superReleaseMightTrigger: true
property bool screenLocked: false property bool screenLocked: false
+8 -8
View File
@@ -132,7 +132,7 @@ Scope {
} }
onPressed: event => { onPressed: event => {
if (event.button === Qt.LeftButton) { if (event.button === Qt.LeftButton) {
Hyprland.dispatch('global quickshell:sidebarLeftOpen'); GlobalStates.sidebarLeftOpen = !GlobalStates.sidebarLeftOpen;
} }
} }
// Scroll to change brightness // Scroll to change brightness
@@ -154,7 +154,7 @@ Scope {
const dx = mouse.x - barLeftSideMouseArea.lastScrollX; const dx = mouse.x - barLeftSideMouseArea.lastScrollX;
const dy = mouse.y - barLeftSideMouseArea.lastScrollY; const dy = mouse.y - barLeftSideMouseArea.lastScrollY;
if (Math.sqrt(dx * dx + dy * dy) > osdHideMouseMoveThreshold) { if (Math.sqrt(dx * dx + dy * dy) > osdHideMouseMoveThreshold) {
Hyprland.dispatch('global quickshell:osdBrightnessHide'); GlobalStates.osdBrightnessOpen = false;
barLeftSideMouseArea.trackingScroll = false; barLeftSideMouseArea.trackingScroll = false;
} }
} }
@@ -199,7 +199,7 @@ Scope {
property color colText: toggled ? Appearance.m3colors.m3onSecondaryContainer : Appearance.colors.colOnLayer0 property color colText: toggled ? Appearance.m3colors.m3onSecondaryContainer : Appearance.colors.colOnLayer0
onPressed: { onPressed: {
Hyprland.dispatch('global quickshell:sidebarLeftToggle'); GlobalStates.sidebarLeftOpen = !GlobalStates.sidebarLeftOpen;
} }
CustomIcon { CustomIcon {
@@ -265,7 +265,7 @@ Scope {
onPressed: event => { onPressed: event => {
if (event.button === Qt.RightButton) { if (event.button === Qt.RightButton) {
Hyprland.dispatch('global quickshell:overviewToggle'); GlobalStates.overviewOpen = !GlobalStates.overviewOpen;
} }
} }
} }
@@ -284,7 +284,7 @@ Scope {
Layout.fillHeight: true Layout.fillHeight: true
onPressed: { onPressed: {
Hyprland.dispatch('global quickshell:sidebarRightToggle'); GlobalStates.sidebarRightOpen = !GlobalStates.sidebarRightOpen;
} }
BarGroup { BarGroup {
@@ -339,7 +339,7 @@ Scope {
} }
onPressed: event => { onPressed: event => {
if (event.button === Qt.LeftButton) { if (event.button === Qt.LeftButton) {
Hyprland.dispatch('global quickshell:sidebarRightOpen'); GlobalStates.sidebarRightOpen = !GlobalStates.sidebarRightOpen;
} else if (event.button === Qt.RightButton) { } else if (event.button === Qt.RightButton) {
MprisController.activePlayer.next(); MprisController.activePlayer.next();
} }
@@ -365,7 +365,7 @@ Scope {
const dx = mouse.x - barRightSideMouseArea.lastScrollX; const dx = mouse.x - barRightSideMouseArea.lastScrollX;
const dy = mouse.y - barRightSideMouseArea.lastScrollY; const dy = mouse.y - barRightSideMouseArea.lastScrollY;
if (Math.sqrt(dx * dx + dy * dy) > osdHideMouseMoveThreshold) { if (Math.sqrt(dx * dx + dy * dy) > osdHideMouseMoveThreshold) {
Hyprland.dispatch('global quickshell:osdVolumeHide'); GlobalStates.osdVolumeOpen = false;
barRightSideMouseArea.trackingScroll = false; barRightSideMouseArea.trackingScroll = false;
} }
} }
@@ -416,7 +416,7 @@ Scope {
} }
onPressed: { onPressed: {
Hyprland.dispatch('global quickshell:sidebarRightToggle'); GlobalStates.sidebarRightOpen = !GlobalStates.sidebarRightOpen;
} }
RowLayout { RowLayout {
+1 -1
View File
@@ -37,7 +37,7 @@ Item {
} else if (event.button === Qt.ForwardButton || event.button === Qt.RightButton) { } else if (event.button === Qt.ForwardButton || event.button === Qt.RightButton) {
activePlayer.next(); activePlayer.next();
} else if (event.button === Qt.LeftButton) { } else if (event.button === Qt.LeftButton) {
Hyprland.dispatch("global quickshell:mediaControlsToggle") GlobalStates.mediaControlsOpen = !GlobalStates.mediaControlsOpen
} }
} }
} }
@@ -1,3 +1,4 @@
import qs
import qs.modules.common import qs.modules.common
import qs.modules.common.widgets import qs.modules.common.widgets
import QtQuick import QtQuick
@@ -56,7 +57,7 @@ Item {
visible: Config.options.bar.utilButtons.showKeyboardToggle visible: Config.options.bar.utilButtons.showKeyboardToggle
sourceComponent: CircleUtilButton { sourceComponent: CircleUtilButton {
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
onClicked: Hyprland.dispatch("global quickshell:oskToggle") onClicked: GlobalStates.oskOpen = !GlobalStates.oskOpen
MaterialSymbol { MaterialSymbol {
horizontalAlignment: Qt.AlignHCenter horizontalAlignment: Qt.AlignHCenter
fill: 0 fill: 0
@@ -214,7 +214,7 @@ Item { // Notification item area
onLinkActivated: (link) => { onLinkActivated: (link) => {
Qt.openUrlExternally(link) Qt.openUrlExternally(link)
Hyprland.dispatch("global quickshell:sidebarRightClose") GlobalStates.sidebarRightOpen = false
} }
PointingHandLinkHover {} PointingHandLinkHover {}
+1 -1
View File
@@ -129,7 +129,7 @@ Scope { // Scope
DockSeparator {} DockSeparator {}
DockButton { DockButton {
Layout.fillHeight: true Layout.fillHeight: true
onClicked: Hyprland.dispatch("global quickshell:overviewToggle") onClicked: GlobalStates.overviewOpen = !GlobalStates.overviewOpen
contentItem: MaterialSymbol { contentItem: MaterialSymbol {
anchors.fill: parent anchors.fill: parent
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
@@ -88,7 +88,12 @@ Scope {
Loader { Loader {
id: mediaControlsLoader id: mediaControlsLoader
active: false active: GlobalStates.mediaControlsOpen
onActiveChanged: {
if (!mediaControlsLoader.active && Mpris.players.values.filter(player => isRealPlayer(player)).length === 0) {
GlobalStates.mediaControlsOpen = false;
}
}
sourceComponent: PanelWindow { sourceComponent: PanelWindow {
id: mediaControlsRoot id: mediaControlsRoot
@@ -160,11 +165,7 @@ Scope {
description: "Toggles media controls on press" description: "Toggles media controls on press"
onPressed: { onPressed: {
if (!mediaControlsLoader.active && Mpris.players.values.filter(player => isRealPlayer(player)).length === 0) { GlobalStates.mediaControlsOpen = !GlobalStates.mediaControlsOpen;
return;
}
mediaControlsLoader.active = !mediaControlsLoader.active;
if(mediaControlsLoader.active) Notifications.timeoutAll();
} }
} }
GlobalShortcut { GlobalShortcut {
@@ -172,8 +173,7 @@ Scope {
description: "Opens media controls on press" description: "Opens media controls on press"
onPressed: { onPressed: {
mediaControlsLoader.active = true; GlobalStates.mediaControlsOpen = true;
Notifications.timeoutAll();
} }
} }
GlobalShortcut { GlobalShortcut {
@@ -181,7 +181,7 @@ Scope {
description: "Closes media controls on press" description: "Closes media controls on press"
onPressed: { onPressed: {
mediaControlsLoader.active = false; GlobalStates.mediaControlsOpen = false;
} }
} }
@@ -12,12 +12,11 @@ import Quickshell.Wayland
Scope { Scope {
id: root id: root
property bool showOsdValues: false
property var focusedScreen: Quickshell.screens.find(s => s.name === Hyprland.focusedMonitor?.name) property var focusedScreen: Quickshell.screens.find(s => s.name === Hyprland.focusedMonitor?.name)
property var brightnessMonitor: Brightness.getMonitorForScreen(focusedScreen) property var brightnessMonitor: Brightness.getMonitorForScreen(focusedScreen)
function triggerOsd() { function triggerOsd() {
showOsdValues = true GlobalStates.osdBrightnessOpen = true
osdTimeout.restart() osdTimeout.restart()
} }
@@ -27,7 +26,7 @@ Scope {
repeat: false repeat: false
running: false running: false
onTriggered: { onTriggered: {
showOsdValues = false GlobalStates.osdBrightnessOpen = false
} }
} }
@@ -35,7 +34,7 @@ Scope {
target: Audio.sink?.audio ?? null target: Audio.sink?.audio ?? null
function onVolumeChanged() { function onVolumeChanged() {
if (!Audio.ready) return if (!Audio.ready) return
root.showOsdValues = false GlobalStates.osdBrightnessOpen = false
} }
} }
@@ -49,7 +48,7 @@ Scope {
Loader { Loader {
id: osdLoader id: osdLoader
active: showOsdValues active: GlobalStates.osdBrightnessOpen
sourceComponent: PanelWindow { sourceComponent: PanelWindow {
id: osdRoot id: osdRoot
@@ -91,7 +90,7 @@ Scope {
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
onEntered: root.showOsdValues = false onEntered: GlobalStates.osdBrightnessOpen = false
} }
Behavior on implicitHeight { Behavior on implicitHeight {
@@ -125,11 +124,11 @@ Scope {
} }
function hide() { function hide() {
showOsdValues = false GlobalStates.osdBrightnessOpen = false
} }
function toggle() { function toggle() {
showOsdValues = !showOsdValues GlobalStates.osdBrightnessOpen = !GlobalStates.osdBrightnessOpen
} }
} }
@@ -146,7 +145,7 @@ Scope {
description: "Hides brightness OSD on press" description: "Hides brightness OSD on press"
onPressed: { onPressed: {
root.showOsdValues = false GlobalStates.osdBrightnessOpen = false
} }
} }
@@ -12,12 +12,11 @@ import Quickshell.Hyprland
Scope { Scope {
id: root id: root
property bool showOsdValues: false
property string protectionMessage: "" property string protectionMessage: ""
property var focusedScreen: Quickshell.screens.find(s => s.name === Hyprland.focusedMonitor?.name) property var focusedScreen: Quickshell.screens.find(s => s.name === Hyprland.focusedMonitor?.name)
function triggerOsd() { function triggerOsd() {
showOsdValues = true GlobalStates.osdVolumeOpen = true
osdTimeout.restart() osdTimeout.restart()
} }
@@ -27,7 +26,7 @@ Scope {
repeat: false repeat: false
running: false running: false
onTriggered: { onTriggered: {
root.showOsdValues = false GlobalStates.osdVolumeOpen = false
root.protectionMessage = "" root.protectionMessage = ""
} }
} }
@@ -35,7 +34,7 @@ Scope {
Connections { Connections {
target: Brightness target: Brightness
function onBrightnessChanged() { function onBrightnessChanged() {
showOsdValues = false GlobalStates.osdVolumeOpen = false
} }
} }
@@ -61,7 +60,7 @@ Scope {
Loader { Loader {
id: osdLoader id: osdLoader
active: showOsdValues active: GlobalStates.osdVolumeOpen
sourceComponent: PanelWindow { sourceComponent: PanelWindow {
id: osdRoot id: osdRoot
@@ -103,7 +102,7 @@ Scope {
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
onEntered: root.showOsdValues = false onEntered: GlobalStates.osdVolumeOpen = false
} }
ColumnLayout { ColumnLayout {
@@ -177,11 +176,11 @@ Scope {
} }
function hide() { function hide() {
showOsdValues = false GlobalStates.osdVolumeOpen = false
} }
function toggle() { function toggle() {
showOsdValues = !showOsdValues GlobalStates.osdVolumeOpen = !GlobalStates.osdVolumeOpen
} }
} }
GlobalShortcut { GlobalShortcut {
@@ -197,7 +196,7 @@ Scope {
description: "Hides volume OSD on press" description: "Hides volume OSD on press"
onPressed: { onPressed: {
root.showOsdValues = false GlobalStates.osdVolumeOpen = false
} }
} }
@@ -24,7 +24,7 @@ Scope { // Scope
Loader { Loader {
id: oskLoader id: oskLoader
active: false active: GlobalStates.oskOpen
onActiveChanged: { onActiveChanged: {
if (!oskLoader.active) { if (!oskLoader.active) {
Ydotool.releaseAllKeys(); Ydotool.releaseAllKeys();
@@ -124,15 +124,15 @@ Scope { // Scope
target: "osk" target: "osk"
function toggle(): void { function toggle(): void {
oskLoader.active = !oskLoader.active GlobalStates.oskOpen = !GlobalStates.oskOpen;
} }
function close(): void { function close(): void {
oskLoader.active = false GlobalStates.oskOpen = false
} }
function open(): void { function open(): void {
oskLoader.active = true GlobalStates.oskOpen = true
} }
} }
@@ -141,7 +141,7 @@ Scope { // Scope
description: "Toggles on screen keyboard on press" description: "Toggles on screen keyboard on press"
onPressed: { onPressed: {
oskLoader.active = !oskLoader.active; GlobalStates.oskOpen = !GlobalStates.oskOpen;
} }
} }
@@ -150,7 +150,7 @@ Scope { // Scope
description: "Opens on screen keyboard on press" description: "Opens on screen keyboard on press"
onPressed: { onPressed: {
oskLoader.active = true; GlobalStates.oskOpen = true
} }
} }
@@ -159,7 +159,7 @@ Scope { // Scope
description: "Closes on screen keyboard on press" description: "Closes on screen keyboard on press"
onPressed: { onPressed: {
oskLoader.active = false; GlobalStates.oskOpen = false
} }
} }
@@ -90,7 +90,7 @@ RippleButton {
onClicked: { onClicked: {
root.itemExecute() root.itemExecute()
Hyprland.dispatch("global quickshell:overviewClose") GlobalStates.overviewOpen = false
} }
Keys.onPressed: (event) => { Keys.onPressed: (event) => {
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) {
@@ -73,7 +73,7 @@ Scope {
Loader { Loader {
id: sessionLoader id: sessionLoader
active: false active: GlobalStates.sessionOpen
onActiveChanged: { onActiveChanged: {
if (sessionLoader.active) root.detectRunningStuff(); if (sessionLoader.active) root.detectRunningStuff();
} }
@@ -275,15 +275,15 @@ Scope {
target: "session" target: "session"
function toggle(): void { function toggle(): void {
sessionLoader.active = !sessionLoader.active; GlobalStates.sessionOpen = !GlobalStates.sessionOpen;
} }
function close(): void { function close(): void {
sessionLoader.active = false; GlobalStates.sessionOpen = false
} }
function open(): void { function open(): void {
sessionLoader.active = true; GlobalStates.sessionOpen = true
} }
} }
@@ -292,7 +292,7 @@ Scope {
description: "Toggles session screen on press" description: "Toggles session screen on press"
onPressed: { onPressed: {
sessionLoader.active = !sessionLoader.active; GlobalStates.sessionOpen = !GlobalStates.sessionOpen;
} }
} }
@@ -301,7 +301,16 @@ Scope {
description: "Opens session screen on press" description: "Opens session screen on press"
onPressed: { onPressed: {
sessionLoader.active = true; GlobalStates.sessionOpen = true
}
}
GlobalShortcut {
name: "sessionClose"
description: "Closes session screen on press"
onPressed: {
GlobalStates.sessionOpen = false
} }
} }
@@ -24,7 +24,7 @@ RippleButton {
onClicked: { onClicked: {
if (url) { if (url) {
Qt.openUrlExternally(url) Qt.openUrlExternally(url)
Hyprland.dispatch("global quickshell:sidebarLeftClose") GlobalStates.sidebarLeftOpen = false
} }
} }
@@ -128,7 +128,7 @@ ColumnLayout {
onLinkActivated: (link) => { onLinkActivated: (link) => {
Qt.openUrlExternally(link) Qt.openUrlExternally(link)
Hyprland.dispatch("global quickshell:sidebarLeftClose") GlobalStates.sidebarLeftOpen = false
} }
MouseArea { // Pointing hand for links MouseArea { // Pointing hand for links
@@ -1,3 +1,4 @@
import qs
import qs.modules.common import qs.modules.common
import qs.modules.common.widgets import qs.modules.common.widgets
import qs.services import qs.services
@@ -25,7 +26,7 @@ RippleButton {
url += ` -site:${site}`; url += ` -site:${site}`;
} }
Qt.openUrlExternally(url); Qt.openUrlExternally(url);
Hyprland.dispatch("global quickshell:sidebarLeftClose") GlobalStates.sidebarLeftOpen = false;
} }
contentItem: Item { contentItem: Item {
@@ -158,7 +158,7 @@ Rectangle {
textFormat: Text.MarkdownText textFormat: Text.MarkdownText
onLinkActivated: (link) => { onLinkActivated: (link) => {
Qt.openUrlExternally(link) Qt.openUrlExternally(link)
Hyprland.dispatch("global quickshell:sidebarLeftClose") GlobalStates.sidebarLeftOpen = false
} }
PointingHandLinkHover {} PointingHandLinkHover {}
} }
@@ -145,7 +145,7 @@ Scope {
toggled: false toggled: false
buttonIcon: "settings" buttonIcon: "settings"
onClicked: { onClicked: {
Hyprland.dispatch("global quickshell:sidebarRightClose") GlobalStates.sidebarRightOpen = false
Quickshell.execDetached(["qs", "-p", root.settingsQmlPath]) Quickshell.execDetached(["qs", "-p", root.settingsQmlPath])
} }
StyledToolTip { StyledToolTip {
@@ -156,7 +156,7 @@ Scope {
toggled: false toggled: false
buttonIcon: "power_settings_new" buttonIcon: "power_settings_new"
onClicked: { onClicked: {
Hyprland.dispatch("global quickshell:sessionOpen") GlobalStates.sessionOpen = true
} }
StyledToolTip { StyledToolTip {
content: Translation.tr("Session") content: Translation.tr("Session")
@@ -16,7 +16,7 @@ QuickToggleButton {
} }
altAction: () => { altAction: () => {
Quickshell.execDetached(["bash", "-c", `${Config.options.apps.bluetooth}`]) Quickshell.execDetached(["bash", "-c", `${Config.options.apps.bluetooth}`])
Hyprland.dispatch("global quickshell:sidebarRightClose") GlobalStates.sidebarRightOpen = false
} }
Process { Process {
id: toggleBluetooth id: toggleBluetooth
@@ -22,7 +22,7 @@ QuickToggleButton {
altAction: () => { altAction: () => {
Quickshell.execDetached(["easyeffects"]) Quickshell.execDetached(["easyeffects"])
Hyprland.dispatch("global quickshell:sidebarRightClose") GlobalStates.sidebarRightOpen = false
} }
Process { Process {
@@ -17,7 +17,7 @@ QuickToggleButton {
} }
altAction: () => { altAction: () => {
Quickshell.execDetached(["bash", "-c", `${Network.ethernet ? Config.options.apps.networkEthernet : Config.options.apps.network}`]) Quickshell.execDetached(["bash", "-c", `${Network.ethernet ? Config.options.apps.networkEthernet : Config.options.apps.network}`])
Hyprland.dispatch("global quickshell:sidebarRightClose") GlobalStates.sidebarRightOpen = false
} }
Process { Process {
id: toggleNetwork id: toggleNetwork
+1 -1
View File
@@ -265,7 +265,7 @@ ApplicationWindow {
RippleButtonWithIcon { RippleButtonWithIcon {
materialIcon: "keyboard_alt" materialIcon: "keyboard_alt"
onClicked: { onClicked: {
Hyprland.dispatch("global quickshell:cheatsheetOpen") Quickshell.execDetached(["qs", "-p", Quickshell.shellPath(""), "ipc", "call", "cheatsheet", "toggle"])
} }
mainContentComponent: Component { mainContentComponent: Component {
RowLayout { RowLayout {