forked from Shinonome/dots-hyprland
Merge branch 'weather-bar-feat' of https://github.com/tekeoglan/dots-hyprland into weather-bar-feat
This commit is contained in:
@@ -18,14 +18,14 @@ Singleton {
|
||||
readonly property string interfaceRole: "interface"
|
||||
readonly property string apiKeyEnvVarName: "API_KEY"
|
||||
property Component aiMessageComponent: AiMessageData {}
|
||||
property string systemPrompt: ConfigOptions?.ai?.systemPrompt ?? ""
|
||||
property string systemPrompt: Config.options?.ai?.systemPrompt ?? ""
|
||||
property var messages: []
|
||||
property var messageIDs: []
|
||||
property var messageByID: ({})
|
||||
readonly property var apiKeys: KeyringStorage.keyringData?.apiKeys ?? {}
|
||||
readonly property var apiKeysLoaded: KeyringStorage.loaded
|
||||
property var postResponseHook
|
||||
property real temperature: PersistentStates?.ai?.temperature ?? 0.5
|
||||
property real temperature: Persistent.states?.ai?.temperature ?? 0.5
|
||||
|
||||
function idForMessage(message) {
|
||||
// Generate a unique ID using timestamp and random value
|
||||
@@ -202,10 +202,10 @@ Singleton {
|
||||
},
|
||||
}
|
||||
property var modelList: Object.keys(root.models)
|
||||
property var currentModelId: PersistentStates?.ai?.model || modelList[0]
|
||||
property var currentModelId: Persistent.states?.ai?.model || modelList[0]
|
||||
|
||||
Component.onCompleted: {
|
||||
setModel(currentModelId, false); // Do necessary setup for model
|
||||
setModel(currentModelId, false, false); // Do necessary setup for model
|
||||
getOllamaModels.running = true
|
||||
}
|
||||
|
||||
@@ -293,7 +293,7 @@ Singleton {
|
||||
return models[currentModelId];
|
||||
}
|
||||
|
||||
function setModel(modelId, feedback = true) {
|
||||
function setModel(modelId, feedback = true, setPersistentState = true) {
|
||||
if (!modelId) modelId = ""
|
||||
modelId = modelId.toLowerCase()
|
||||
if (modelList.indexOf(modelId) !== -1) {
|
||||
@@ -301,11 +301,11 @@ Singleton {
|
||||
// Fetch API keys if needed
|
||||
if (model?.requires_key) KeyringStorage.fetchKeyringData();
|
||||
// See if policy prevents online models
|
||||
if (ConfigOptions.policies.ai === 2 && !model.endpoint.includes("localhost")) {
|
||||
if (Config.options.policies.ai === 2 && !model.endpoint.includes("localhost")) {
|
||||
root.addMessage(StringUtils.format(StringUtils.format("Online models disallowed\n\nControlled by `policies.ai` config option"), model.name), root.interfaceRole);
|
||||
return;
|
||||
}
|
||||
PersistentStateManager.setState("ai.model", modelId);
|
||||
if (setPersistentState) Persistent.states.ai.model = modelId;
|
||||
if (feedback) root.addMessage(StringUtils.format(StringUtils.format("Model set to {0}"), model.name), root.interfaceRole);
|
||||
if (model.requires_key) {
|
||||
// If key not there show advice
|
||||
@@ -327,7 +327,7 @@ Singleton {
|
||||
root.addMessage(qsTr("Temperature must be between 0 and 2"), Ai.interfaceRole);
|
||||
return;
|
||||
}
|
||||
PersistentStateManager.setState("ai.temperature", value);
|
||||
Persistent.states.ai.temperature = value;
|
||||
root.temperature = value;
|
||||
root.addMessage(StringUtils.format(qsTr("Temperature set to {0}"), value), Ai.interfaceRole);
|
||||
}
|
||||
@@ -704,7 +704,7 @@ Singleton {
|
||||
addFunctionOutputMessage(name, qsTr("Switched to search mode. Continue with the user's request."))
|
||||
requester.makeRequest();
|
||||
} else if (name === "get_shell_config") {
|
||||
const configJson = ObjectUtils.toPlainObject(ConfigOptions)
|
||||
const configJson = ObjectUtils.toPlainObject(Config.options)
|
||||
addFunctionOutputMessage(name, JSON.stringify(configJson));
|
||||
requester.makeRequest();
|
||||
} else if (name === "set_shell_config") {
|
||||
@@ -714,8 +714,7 @@ Singleton {
|
||||
}
|
||||
const key = args.key;
|
||||
const value = args.value;
|
||||
ConfigLoader.setLiveConfigValue(key, value);
|
||||
ConfigLoader.saveConfig();
|
||||
Config.setNestedValue(key, value);
|
||||
}
|
||||
else root.addMessage(qsTr("Unknown function call: {0}"), "assistant");
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import Quickshell.Io
|
||||
*/
|
||||
Singleton {
|
||||
id: root
|
||||
property bool sloppySearch: ConfigOptions?.search.sloppy ?? false
|
||||
property bool sloppySearch: Config.options?.search.sloppy ?? false
|
||||
property real scoreThreshold: 0.2
|
||||
property var substitutions: ({
|
||||
"code-url-handler": "visual-studio-code",
|
||||
|
||||
@@ -26,15 +26,15 @@ Singleton {
|
||||
property bool lastReady: false
|
||||
property real lastVolume: 0
|
||||
function onVolumeChanged() {
|
||||
if (!ConfigOptions.audio.protection.enable) return;
|
||||
if (!Config.options.audio.protection.enable) return;
|
||||
if (!lastReady) {
|
||||
lastVolume = sink.audio.volume;
|
||||
lastReady = true;
|
||||
return;
|
||||
}
|
||||
const newVolume = sink.audio.volume;
|
||||
const maxAllowedIncrease = ConfigOptions.audio.protection.maxAllowedIncrease / 100;
|
||||
const maxAllowed = ConfigOptions.audio.protection.maxAllowed / 100;
|
||||
const maxAllowedIncrease = Config.options.audio.protection.maxAllowedIncrease / 100;
|
||||
const maxAllowed = Config.options.audio.protection.maxAllowed / 100;
|
||||
|
||||
if (newVolume - lastVolume > maxAllowedIncrease) {
|
||||
sink.audio.volume = lastVolume;
|
||||
|
||||
@@ -12,11 +12,11 @@ Singleton {
|
||||
property bool isCharging: chargeState == UPowerDeviceState.Charging
|
||||
property bool isPluggedIn: isCharging || chargeState == UPowerDeviceState.PendingCharge
|
||||
property real percentage: UPower.displayDevice.percentage
|
||||
readonly property bool allowAutomaticSuspend: ConfigOptions.battery.automaticSuspend
|
||||
readonly property bool allowAutomaticSuspend: Config.options.battery.automaticSuspend
|
||||
|
||||
property bool isLow: percentage <= ConfigOptions.battery.low / 100
|
||||
property bool isCritical: percentage <= ConfigOptions.battery.critical / 100
|
||||
property bool isSuspending: percentage <= ConfigOptions.battery.suspend / 100
|
||||
property bool isLow: percentage <= Config.options.battery.low / 100
|
||||
property bool isCritical: percentage <= Config.options.battery.critical / 100
|
||||
property bool isSuspending: percentage <= Config.options.battery.suspend / 100
|
||||
|
||||
property bool isLowAndNotCharging: isLow && !isCharging
|
||||
property bool isCriticalAndNotCharging: isCritical && !isCharging
|
||||
@@ -29,7 +29,7 @@ Singleton {
|
||||
|
||||
onIsCriticalAndNotChargingChanged: {
|
||||
if (available && isCriticalAndNotCharging)
|
||||
Quickshell.execDetached(["bash", "-c", `notify-send "Critically low battery" "🙏 I beg for pleas charg\nAutomatic suspend triggers at ${ConfigOptions.battery.suspend}%" -u critical -a "Shell"`]);
|
||||
Quickshell.execDetached(["bash", "-c", `notify-send "Critically low battery" "🙏 I beg for pleas charg\nAutomatic suspend triggers at ${Config.options.battery.suspend}%" -u critical -a "Shell"`]);
|
||||
}
|
||||
|
||||
onIsSuspendingAndNotChargingChanged: {
|
||||
|
||||
@@ -19,7 +19,7 @@ Singleton {
|
||||
property string failMessage: qsTr("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")
|
||||
property var responses: []
|
||||
property int runningRequests: 0
|
||||
property var defaultUserAgent: ConfigOptions?.networking?.userAgent || "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
|
||||
property var defaultUserAgent: Config.options?.networking?.userAgent || "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
|
||||
property var providerList: Object.keys(providers).filter(provider => provider !== "system" && providers[provider].api)
|
||||
property var providers: {
|
||||
"system": { "name": qsTr("System") },
|
||||
@@ -274,7 +274,7 @@ Singleton {
|
||||
},
|
||||
}
|
||||
}
|
||||
property var currentProvider: PersistentStates.booru.provider
|
||||
property var currentProvider: Persistent.states.booru.provider
|
||||
|
||||
function getWorkingImageSource(url) {
|
||||
if (url.includes('pximg.net')) {
|
||||
@@ -286,7 +286,7 @@ Singleton {
|
||||
function setProvider(provider) {
|
||||
provider = provider.toLowerCase()
|
||||
if (providerList.indexOf(provider) !== -1) {
|
||||
PersistentStateManager.setState("booru.provider", provider)
|
||||
Persistent.states.booru.provider = provider
|
||||
root.addSystemMessage(qsTr("Provider set to ") + providers[provider].name
|
||||
+ (provider == "zerochan" ? qsTr(". 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.)!") : ""))
|
||||
} else {
|
||||
@@ -408,7 +408,7 @@ Singleton {
|
||||
xhr.setRequestHeader("User-Agent", defaultUserAgent)
|
||||
}
|
||||
else if (currentProvider == "zerochan") {
|
||||
const userAgent = ConfigOptions?.sidebar?.booru?.zerochan?.username ? `Desktop sidebar booru viewer - username: ${ConfigOptions.sidebar.booru.zerochan.username}` : defaultUserAgent
|
||||
const userAgent = Config.options?.sidebar?.booru?.zerochan?.username ? `Desktop sidebar booru viewer - username: ${Config.options.sidebar.booru.zerochan.username}` : defaultUserAgent
|
||||
xhr.setRequestHeader("User-Agent", userAgent)
|
||||
}
|
||||
root.runningRequests++;
|
||||
|
||||
@@ -11,7 +11,7 @@ import Quickshell.Io
|
||||
|
||||
Singleton {
|
||||
id: root
|
||||
property bool sloppySearch: ConfigOptions?.search.sloppy ?? false
|
||||
property bool sloppySearch: Config.options?.search.sloppy ?? false
|
||||
property real scoreThreshold: 0.2
|
||||
property list<string> entries: []
|
||||
readonly property var preparedEntries: entries.map(a => ({
|
||||
@@ -51,7 +51,7 @@ Singleton {
|
||||
|
||||
Timer {
|
||||
id: delayedUpdateTimer
|
||||
interval: ConfigOptions.hacks.arbitraryRaceConditionDelay
|
||||
interval: Config.options.hacks.arbitraryRaceConditionDelay
|
||||
repeat: false
|
||||
onTriggered: {
|
||||
root.refresh()
|
||||
|
||||
@@ -1,137 +0,0 @@
|
||||
pragma Singleton
|
||||
pragma ComponentBehavior: Bound
|
||||
|
||||
import "root:/modules/common"
|
||||
import "root:/modules/common/functions/file_utils.js" as FileUtils
|
||||
import "root:/modules/common/functions/string_utils.js" as StringUtils
|
||||
import "root:/modules/common/functions/object_utils.js" as ObjectUtils
|
||||
import QtQuick
|
||||
import Quickshell
|
||||
import Quickshell.Io
|
||||
import Quickshell.Hyprland
|
||||
import Qt.labs.platform
|
||||
|
||||
/**
|
||||
* Loads and manages the shell configuration file.
|
||||
* The config file is by default at XDG_CONFIG_HOME/illogical-impulse/config.json.
|
||||
* Automatically reloaded when the file changes.
|
||||
*/
|
||||
Singleton {
|
||||
id: root
|
||||
property string filePath: Directories.shellConfigPath
|
||||
property bool firstLoad: true
|
||||
property bool preventNextLoad: false
|
||||
property var preventNextNotification: false
|
||||
|
||||
function loadConfig() {
|
||||
configFileView.reload()
|
||||
}
|
||||
|
||||
function applyConfig(fileContent) {
|
||||
try {
|
||||
if (fileContent.trim() === "") {
|
||||
console.warn("[ConfigLoader] Config file is empty, skipping load.");
|
||||
return;
|
||||
}
|
||||
const json = JSON.parse(fileContent);
|
||||
|
||||
ObjectUtils.applyToQtObject(ConfigOptions, json);
|
||||
if (root.firstLoad) {
|
||||
root.firstLoad = false;
|
||||
root.preventNextLoad = true;
|
||||
root.saveConfig(); // Make sure new properties are added to the user's config file
|
||||
}
|
||||
} catch (e) {
|
||||
console.error("[ConfigLoader] Error reading file:", e);
|
||||
console.log("[ConfigLoader] File content was:", fileContent);
|
||||
Quickshell.execDetached(["bash", "-c", `notify-send '${qsTr("Shell configuration failed to load")}' '${root.filePath}'`])
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
function setLiveConfigValue(nestedKey, value) {
|
||||
let keys = nestedKey.split(".");
|
||||
let obj = ConfigOptions;
|
||||
let parents = [obj];
|
||||
|
||||
// Traverse and collect parent objects
|
||||
for (let i = 0; i < keys.length - 1; ++i) {
|
||||
if (!obj[keys[i]] || typeof obj[keys[i]] !== "object") {
|
||||
obj[keys[i]] = {};
|
||||
}
|
||||
obj = obj[keys[i]];
|
||||
parents.push(obj);
|
||||
}
|
||||
|
||||
// Convert value to correct type using JSON.parse when safe
|
||||
let convertedValue = value;
|
||||
if (typeof value === "string") {
|
||||
let trimmed = value.trim();
|
||||
if (trimmed === "true" || trimmed === "false" || !isNaN(Number(trimmed))) {
|
||||
try {
|
||||
convertedValue = JSON.parse(trimmed);
|
||||
} catch (e) {
|
||||
convertedValue = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
obj[keys[keys.length - 1]] = convertedValue;
|
||||
}
|
||||
|
||||
function saveConfig() {
|
||||
const plainConfig = ObjectUtils.toPlainObject(ConfigOptions)
|
||||
Quickshell.execDetached(["bash", "-c", `echo '${StringUtils.shellSingleQuoteEscape(JSON.stringify(plainConfig, null, 2))}' > '${FileUtils.trimFileProtocol(root.filePath)}'`])
|
||||
}
|
||||
|
||||
function setConfigValueAndSave(nestedKey, value, preventNextNotification = true) {
|
||||
setLiveConfigValue(nestedKey, value);
|
||||
root.preventNextNotification = preventNextNotification;
|
||||
saveConfig();
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: delayedFileRead
|
||||
interval: ConfigOptions.hacks.arbitraryRaceConditionDelay
|
||||
running: false
|
||||
onTriggered: {
|
||||
if (root.preventNextLoad) {
|
||||
root.preventNextLoad = false;
|
||||
return;
|
||||
}
|
||||
if (root.firstLoad) {
|
||||
root.applyConfig(configFileView.text())
|
||||
} else {
|
||||
root.applyConfig(configFileView.text())
|
||||
if (!root.preventNextNotification) {
|
||||
// Quickshell.execDetached(["bash", "-c", `notify-send '${qsTr("Shell configuration reloaded")}' '${root.filePath}'`])
|
||||
} else {
|
||||
root.preventNextNotification = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FileView {
|
||||
id: configFileView
|
||||
path: Qt.resolvedUrl(root.filePath)
|
||||
watchChanges: true
|
||||
onFileChanged: {
|
||||
this.reload()
|
||||
delayedFileRead.start()
|
||||
}
|
||||
onLoadedChanged: {
|
||||
const fileContent = configFileView.text()
|
||||
delayedFileRead.start()
|
||||
}
|
||||
onLoadFailed: (error) => {
|
||||
if(error == FileViewError.FileNotFound) {
|
||||
console.log("[ConfigLoader] File not found, creating new file.")
|
||||
root.saveConfig()
|
||||
Quickshell.execDetached(["bash", "-c", `notify-send '${qsTr("Shell configuration created")}' '${root.filePath}'`])
|
||||
} else {
|
||||
Quickshell.execDetached(["bash", "-c", `notify-send '${qsTr("Shell configuration failed to load")}' '${root.filePath}'`])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,8 +9,8 @@ pragma ComponentBehavior: Bound
|
||||
* A nice wrapper for date and time strings.
|
||||
*/
|
||||
Singleton {
|
||||
property string time: Qt.locale().toString(clock.date, ConfigOptions?.time.format ?? "hh:mm")
|
||||
property string date: Qt.locale().toString(clock.date, ConfigOptions?.time.dateFormat ?? "dddd, dd/MM")
|
||||
property string time: Qt.locale().toString(clock.date, Config.options?.time.format ?? "hh: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"
|
||||
|
||||
@@ -39,7 +39,7 @@ Singleton {
|
||||
if (hours > 0) formatted += `${formatted ? ", " : ""}${hours}h`
|
||||
if (minutes > 0 || !formatted) formatted += `${formatted ? ", " : ""}${minutes}m`
|
||||
uptime = formatted
|
||||
interval = ConfigOptions?.resources?.updateInterval ?? 3000
|
||||
interval = Config.options?.resources?.updateInterval ?? 3000
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,14 +16,20 @@ Singleton {
|
||||
property var addresses: []
|
||||
property var windowByAddress: ({})
|
||||
property var monitors: []
|
||||
property var layers: ({})
|
||||
|
||||
function updateWindowList() {
|
||||
getClients.running = true
|
||||
getMonitors.running = true
|
||||
}
|
||||
|
||||
function updateLayers() {
|
||||
getLayers.running = true
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
updateWindowList()
|
||||
updateLayers()
|
||||
}
|
||||
|
||||
Connections {
|
||||
@@ -56,6 +62,7 @@ Singleton {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Process {
|
||||
id: getMonitors
|
||||
command: ["bash", "-c", "hyprctl monitors -j | jq -c"]
|
||||
@@ -65,5 +72,15 @@ Singleton {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Process {
|
||||
id: getLayers
|
||||
command: ["bash", "-c", "hyprctl layers -j | jq -c"]
|
||||
stdout: SplitParser {
|
||||
onRead: (data) => {
|
||||
root.layers = JSON.parse(data)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ Singleton {
|
||||
|
||||
Timer {
|
||||
id: delayedFileRead
|
||||
interval: ConfigOptions?.hacks?.arbitraryRaceConditionDelay ?? 100
|
||||
interval: Config.options?.hacks?.arbitraryRaceConditionDelay ?? 100
|
||||
repeat: false
|
||||
running: false
|
||||
onTriggered: {
|
||||
|
||||
@@ -1,105 +0,0 @@
|
||||
pragma Singleton
|
||||
pragma ComponentBehavior: Bound
|
||||
|
||||
import "root:/modules/common"
|
||||
import "root:/modules/common/functions/object_utils.js" as ObjectUtils
|
||||
import QtQuick
|
||||
import Quickshell
|
||||
import Quickshell.Io
|
||||
import Quickshell.Hyprland
|
||||
import Qt.labs.platform
|
||||
|
||||
/**
|
||||
* Manages persistent states across sessions.
|
||||
* Run loadStates() once at startup to load the states, then use setState() and getState() to modify and access them.
|
||||
*/
|
||||
Singleton {
|
||||
id: root
|
||||
property string fileDir: Directories.state
|
||||
property string fileName: "states.json"
|
||||
property string filePath: `${root.fileDir}/${root.fileName}`
|
||||
property bool allowWriteback: false
|
||||
|
||||
function getState(nestedKey) {
|
||||
let keys = nestedKey.split(".");
|
||||
let obj = PersistentStates;
|
||||
for (let i = 0; i < keys.length; ++i) {
|
||||
if (obj[keys[i]] === undefined) {
|
||||
console.error(`[PersistentStateManager] Key "${keys[i]}" not found in PersistentStates`);
|
||||
return null;
|
||||
}
|
||||
obj = obj[keys[i]];
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
function setState(nestedKey, value) {
|
||||
if (!root.allowWriteback) return;
|
||||
let keys = nestedKey.split(".");
|
||||
let obj = PersistentStates;
|
||||
let parents = [obj];
|
||||
|
||||
// Traverse and collect parent objects
|
||||
for (let i = 0; i < keys.length - 1; ++i) {
|
||||
if (!obj[keys[i]] || typeof obj[keys[i]] !== "object") {
|
||||
obj[keys[i]] = {};
|
||||
}
|
||||
obj = obj[keys[i]];
|
||||
parents.push(obj);
|
||||
}
|
||||
|
||||
// Set the value at the innermost key
|
||||
obj[keys[keys.length - 1]] = value;
|
||||
|
||||
saveStates()
|
||||
}
|
||||
|
||||
function loadStates() {
|
||||
stateFileView.reload()
|
||||
}
|
||||
|
||||
function saveStates() {
|
||||
const plainStates = ObjectUtils.toPlainObject(PersistentStates)
|
||||
stateFileView.setText(JSON.stringify(plainStates, null, 2))
|
||||
}
|
||||
|
||||
function applyStates(fileContent) {
|
||||
try {
|
||||
const json = JSON.parse(fileContent);
|
||||
ObjectUtils.applyToQtObject(PersistentStates, json);
|
||||
root.allowWriteback = true
|
||||
} catch (e) {
|
||||
console.error("[PersistentStateManager] Error reading file:", e);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: delayedFileRead
|
||||
interval: ConfigOptions?.hacks?.arbitraryRaceConditionDelay ?? 100
|
||||
repeat: false
|
||||
running: false
|
||||
onTriggered: {
|
||||
root.applyStates(stateFileView.text())
|
||||
}
|
||||
}
|
||||
|
||||
FileView {
|
||||
id: stateFileView
|
||||
path: root.filePath
|
||||
watchChanges: true
|
||||
// onFileChanged: {
|
||||
// console.log("[PersistentStateManager] File changed, reloading...")
|
||||
// this.reload()
|
||||
// delayedFileRead.start()
|
||||
// }
|
||||
onLoadedChanged: {
|
||||
const fileContent = stateFileView.text()
|
||||
root.applyStates(fileContent)
|
||||
}
|
||||
onLoadFailed: (error) => {
|
||||
console.log("[PersistentStateManager] File not found, creating new file")
|
||||
root.saveStates()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -53,7 +53,7 @@ Singleton {
|
||||
|
||||
previousCpuStats = { total, idle }
|
||||
}
|
||||
interval = ConfigOptions?.resources?.updateInterval ?? 3000
|
||||
interval = Config.options?.resources?.updateInterval ?? 3000
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user