diff --git a/Commons/Settings.qml b/Commons/Settings.qml index eb124bf..0b4abaa 100644 --- a/Commons/Settings.qml +++ b/Commons/Settings.qml @@ -203,6 +203,17 @@ Singleton { BluetoothService.init() } + // ----------------------------------------------------- + // Update font defaults when system fonts are detected + function updateFontDefaults() { + if (FontService.systemFontsDetected) { + Logger.log("Settings", "Updating font defaults with detected system fonts") + adapter.ui.fontDefault = FontService.getSystemSansFont() + adapter.ui.fontFixed = FontService.getSystemMonospaceFont() + adapter.ui.fontBillboard = FontService.getSystemDisplayFont() + } + } + // ----------------------------------------------------- // Ensure directories exist before FileView tries to read files Component.onCompleted: { @@ -213,6 +224,9 @@ Singleton { // Mark directories as created and trigger file loading directoriesCreated = true + + // Connect to font service signal to update defaults when system fonts are detected + FontService.systemFontsDetected.connect(updateFontDefaults) } // Don't write settings to disk immediately @@ -415,9 +429,9 @@ Singleton { // ui property JsonObject ui: JsonObject { - property string fontDefault: "Roboto" - property string fontFixed: "DejaVu Sans Mono" - property string fontBillboard: "Inter" + property string fontDefault: FontService.getSystemSansFont() + property string fontFixed: FontService.getSystemMonospaceFont() + property string fontBillboard: FontService.getSystemDisplayFont() property list monitorsScaling: [] property bool idleInhibitorEnabled: false } diff --git a/Modules/SettingsPanel/Tabs/GeneralTab.qml b/Modules/SettingsPanel/Tabs/GeneralTab.qml index aed5758..5c9c577 100644 --- a/Modules/SettingsPanel/Tabs/GeneralTab.qml +++ b/Modules/SettingsPanel/Tabs/GeneralTab.qml @@ -195,6 +195,15 @@ ColumnLayout { Layout.bottomMargin: Style.marginS * scaling } + NText { + text: "Fonts are automatically detected from your system. Inter/Roboto are used as fallbacks when system fonts cannot be detected." + font.pointSize: Style.fontSizeS * scaling + color: Color.mOnSurfaceVariant + wrapMode: Text.WordWrap + Layout.fillWidth: true + Layout.bottomMargin: Style.marginM * scaling + } + // Font configuration section ColumnLayout { spacing: Style.marginL * scaling diff --git a/Services/FontService.qml b/Services/FontService.qml index ebf03e3..2c25534 100644 --- a/Services/FontService.qml +++ b/Services/FontService.qml @@ -3,6 +3,7 @@ pragma Singleton import QtQuick import QtQuick.Controls import Quickshell +import Quickshell.Io import qs.Commons Singleton { @@ -13,12 +14,29 @@ Singleton { property ListModel displayFonts: ListModel {} property bool fontsLoaded: false + // System font detection + property string systemSansFont: "" + property string systemMonospaceFont: "" + property string systemDisplayFont: "" + property bool systemFontsDetected: false + + // Signal emitted when system font detection is complete + signal systemFontsDetected + // ------------------------------------------- function init() { Logger.log("Font", "Service started") + detectSystemFonts() loadSystemFonts() } + function detectSystemFonts() { + Logger.log("Font", "Detecting system fonts...") + + // Start detecting sans-serif font + sansFontProcess.running = true + } + function loadSystemFonts() { Logger.log("Font", "Loading system fonts...") @@ -158,4 +176,86 @@ Singleton { return results } + + // Get system font with fallback + function getSystemSansFont() { + if (systemSansFont && systemSansFont !== "") { + return systemSansFont + } + return "Roboto" // Fallback + } + + function getSystemMonospaceFont() { + if (systemMonospaceFont && systemMonospaceFont !== "") { + return systemMonospaceFont + } + return "DejaVu Sans Mono" // Fallback + } + + function getSystemDisplayFont() { + if (systemDisplayFont && systemDisplayFont !== "") { + return systemDisplayFont + } + return "Inter" // Fallback + } + + // Process for detecting sans fonts + Process { + id: sansFontProcess + command: ["fc-match", "-f", "%{family[0]}\n", "sans"] + onExited: function (exitCode) { + if (exitCode === 0) { + var fontName = stdout.text.trim() + if (fontName !== "") { + systemSansFont = fontName + Logger.log("Font", "Detected system sans font:", systemSansFont) + } else { + Logger.warn("Font", "Empty result for system sans font, will use fallback") + } + } else { + Logger.warn("Font", "Failed to detect system sans font, will use fallback") + } + // Start detecting monospace font + monoFontProcess.running = true + } + stdout: StdioCollector {} + stderr: StdioCollector {} + } + + // Process for detecting mono fonts + Process { + id: monoFontProcess + command: ["fc-match", "-f", "%{family[0]}\n", "monospace"] + onExited: function (exitCode) { + if (exitCode === 0) { + var fontName = stdout.text.trim() + if (fontName !== "") { + systemMonospaceFont = fontName + Logger.log("Font", "Detected system monospace font:", systemMonospaceFont) + } else { + Logger.warn("Font", "Empty result for system monospace font, will use fallback") + } + } else { + Logger.warn("Font", "Failed to detect system monospace font, will use fallback") + } + // for now we'll use the same font for display as sans + systemDisplayFont = systemSansFont + + // Log the final font choices after all detection is complete + Logger.log("Font", "=== FONT DETECTION RESULTS ===") + Logger.log("Font", "System Sans Font:", systemSansFont || "NOT DETECTED") + Logger.log("Font", "System Monospace Font:", systemMonospaceFont || "NOT DETECTED") + Logger.log("Font", "System Display Font:", systemDisplayFont || "NOT DETECTED") + Logger.log("Font", "=== FINAL FONT DEFAULTS ===") + Logger.log("Font", "Default Font (getSystemSansFont):", getSystemSansFont()) + Logger.log("Font", "Fixed Font (getSystemMonospaceFont):", getSystemMonospaceFont()) + Logger.log("Font", "Billboard Font (getSystemDisplayFont):", getSystemDisplayFont()) + + // Mark detection as complete and emit signal + systemFontsDetected = true + systemFontsDetected() + } + stdout: StdioCollector {} + stderr: StdioCollector {} + } }