mirror of
https://github.com/zoriya/noctalia-shell.git
synced 2026-08-15 18:43:59 +00:00
Switched to qmlformat.
This commit is contained in:
@@ -26,223 +26,222 @@ Singleton {
|
||||
|
||||
// -------------------------------------------
|
||||
function init() {
|
||||
Logger.i("Font", "Service started")
|
||||
loadFontconfigMonospaceFonts()
|
||||
Logger.i("Font", "Service started");
|
||||
loadFontconfigMonospaceFonts();
|
||||
}
|
||||
|
||||
function loadFontconfigMonospaceFonts() {
|
||||
fontconfigProcess.command = ["fc-list", ":mono", "family"]
|
||||
fontconfigProcess.running = true
|
||||
fontconfigProcess.command = ["fc-list", ":mono", "family"];
|
||||
fontconfigProcess.running = true;
|
||||
}
|
||||
|
||||
function loadSystemFonts() {
|
||||
if (isLoading)
|
||||
return
|
||||
return;
|
||||
Logger.d("Font", "Loading system fonts...");
|
||||
isLoading = true;
|
||||
|
||||
Logger.d("Font", "Loading system fonts...")
|
||||
isLoading = true
|
||||
|
||||
var fontFamilies = Qt.fontFamilies()
|
||||
var fontFamilies = Qt.fontFamilies();
|
||||
|
||||
// Pre-sort fonts before processing to ensure consistent order
|
||||
fontFamilies.sort(function (a, b) {
|
||||
return a.localeCompare(b)
|
||||
})
|
||||
return a.localeCompare(b);
|
||||
});
|
||||
|
||||
// Clear existing models
|
||||
availableFonts.clear()
|
||||
monospaceFonts.clear()
|
||||
displayFonts.clear()
|
||||
fontCache = {}
|
||||
availableFonts.clear();
|
||||
monospaceFonts.clear();
|
||||
displayFonts.clear();
|
||||
fontCache = {};
|
||||
|
||||
// Process fonts in chunks to avoid blocking
|
||||
processFontsAsync(fontFamilies, 0)
|
||||
processFontsAsync(fontFamilies, 0);
|
||||
}
|
||||
|
||||
function processFontsAsync(fontFamilies, startIndex) {
|
||||
var endIndex = Math.min(startIndex + chunkSize, fontFamilies.length)
|
||||
var hasMore = endIndex < fontFamilies.length
|
||||
var endIndex = Math.min(startIndex + chunkSize, fontFamilies.length);
|
||||
var hasMore = endIndex < fontFamilies.length;
|
||||
|
||||
// Batch arrays to append all at once (much faster than individual appends)
|
||||
var availableBatch = []
|
||||
var monospaceBatch = []
|
||||
var displayBatch = []
|
||||
var availableBatch = [];
|
||||
var monospaceBatch = [];
|
||||
var displayBatch = [];
|
||||
|
||||
for (var i = startIndex; i < endIndex; i++) {
|
||||
var fontName = fontFamilies[i]
|
||||
var fontName = fontFamilies[i];
|
||||
if (!fontName || fontName.trim() === "")
|
||||
continue
|
||||
continue;
|
||||
|
||||
// Add to available fonts
|
||||
var fontObj = {
|
||||
"key": fontName,
|
||||
"name": fontName
|
||||
}
|
||||
availableBatch.push(fontObj)
|
||||
};
|
||||
availableBatch.push(fontObj);
|
||||
|
||||
// Check monospace (with caching)
|
||||
if (isMonospaceFont(fontName)) {
|
||||
monospaceBatch.push(fontObj)
|
||||
monospaceBatch.push(fontObj);
|
||||
}
|
||||
|
||||
// Check display font (with caching)
|
||||
if (isDisplayFont(fontName)) {
|
||||
displayBatch.push(fontObj)
|
||||
displayBatch.push(fontObj);
|
||||
}
|
||||
}
|
||||
|
||||
// Batch append to models
|
||||
batchAppendToModel(availableFonts, availableBatch)
|
||||
batchAppendToModel(monospaceFonts, monospaceBatch)
|
||||
batchAppendToModel(displayFonts, displayBatch)
|
||||
batchAppendToModel(availableFonts, availableBatch);
|
||||
batchAppendToModel(monospaceFonts, monospaceBatch);
|
||||
batchAppendToModel(displayFonts, displayBatch);
|
||||
|
||||
if (hasMore) {
|
||||
// Continue processing in next frame
|
||||
Qt.callLater(function () {
|
||||
processFontsAsync(fontFamilies, endIndex)
|
||||
})
|
||||
processFontsAsync(fontFamilies, endIndex);
|
||||
});
|
||||
} else {
|
||||
// Finished loading all fonts
|
||||
finalizeFontLoading()
|
||||
finalizeFontLoading();
|
||||
}
|
||||
}
|
||||
|
||||
function batchAppendToModel(model, items) {
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
model.append(items[i])
|
||||
model.append(items[i]);
|
||||
}
|
||||
}
|
||||
|
||||
function finalizeFontLoading() {
|
||||
// Add fallbacks if needed (models are already sorted)
|
||||
if (monospaceFonts.count === 0) {
|
||||
addFallbackFonts(monospaceFonts, ["DejaVu Sans Mono"])
|
||||
addFallbackFonts(monospaceFonts, ["DejaVu Sans Mono"]);
|
||||
}
|
||||
|
||||
if (displayFonts.count === 0) {
|
||||
addFallbackFonts(displayFonts, ["Inter", "Roboto", "DejaVu Sans"])
|
||||
addFallbackFonts(displayFonts, ["Inter", "Roboto", "DejaVu Sans"]);
|
||||
}
|
||||
|
||||
fontsLoaded = true
|
||||
isLoading = false
|
||||
Logger.d("Font", "Loaded", availableFonts.count, "fonts:", monospaceFonts.count, "monospace,", displayFonts.count, "display")
|
||||
fontsLoaded = true;
|
||||
isLoading = false;
|
||||
Logger.d("Font", "Loaded", availableFonts.count, "fonts:", monospaceFonts.count, "monospace,", displayFonts.count, "display");
|
||||
}
|
||||
|
||||
function isMonospaceFont(fontName) {
|
||||
// Check cache first
|
||||
if (fontCache.hasOwnProperty(fontName)) {
|
||||
return fontCache[fontName].isMonospace
|
||||
return fontCache[fontName].isMonospace;
|
||||
}
|
||||
|
||||
var result = false
|
||||
var result = false;
|
||||
|
||||
// O(1) lookup using object instead of indexOf
|
||||
if (fontconfigMonospaceFonts.hasOwnProperty(fontName)) {
|
||||
result = true
|
||||
result = true;
|
||||
} else {
|
||||
// Fallback: check for basic monospace patterns
|
||||
var lowerFontName = fontName.toLowerCase()
|
||||
var lowerFontName = fontName.toLowerCase();
|
||||
if (lowerFontName.includes("mono") || lowerFontName.includes("monospace")) {
|
||||
result = true
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Cache the result
|
||||
if (!fontCache[fontName]) {
|
||||
fontCache[fontName] = {}
|
||||
fontCache[fontName] = {};
|
||||
}
|
||||
fontCache[fontName].isMonospace = result
|
||||
fontCache[fontName].isMonospace = result;
|
||||
|
||||
return result
|
||||
return result;
|
||||
}
|
||||
|
||||
function isDisplayFont(fontName) {
|
||||
// Check cache first
|
||||
if (fontCache.hasOwnProperty(fontName) && fontCache[fontName].hasOwnProperty('isDisplay')) {
|
||||
return fontCache[fontName].isDisplay
|
||||
return fontCache[fontName].isDisplay;
|
||||
}
|
||||
|
||||
var result = false
|
||||
var lowerFontName = fontName.toLowerCase()
|
||||
var result = false;
|
||||
var lowerFontName = fontName.toLowerCase();
|
||||
|
||||
if (lowerFontName.includes("display") || lowerFontName.includes("headline") || lowerFontName.includes("title")) {
|
||||
result = true
|
||||
result = true;
|
||||
}
|
||||
|
||||
// Essential fallback fonts only
|
||||
var essentialFonts = ["Inter", "Roboto", "DejaVu Sans"]
|
||||
var essentialFonts = ["Inter", "Roboto", "DejaVu Sans"];
|
||||
if (essentialFonts.indexOf(fontName) !== -1) {
|
||||
result = true
|
||||
result = true;
|
||||
}
|
||||
|
||||
// Cache the result
|
||||
if (!fontCache[fontName]) {
|
||||
fontCache[fontName] = {}
|
||||
fontCache[fontName] = {};
|
||||
}
|
||||
fontCache[fontName].isDisplay = result
|
||||
fontCache[fontName].isDisplay = result;
|
||||
|
||||
return result
|
||||
return result;
|
||||
}
|
||||
|
||||
function sortModel(model) {
|
||||
// Convert to array
|
||||
var fontsArray = []
|
||||
var fontsArray = [];
|
||||
for (var i = 0; i < model.count; i++) {
|
||||
fontsArray.push({
|
||||
"key": model.get(i).key,
|
||||
"name": model.get(i).name
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
// Sort
|
||||
fontsArray.sort(function (a, b) {
|
||||
return a.name.localeCompare(b.name)
|
||||
})
|
||||
return a.name.localeCompare(b.name);
|
||||
});
|
||||
|
||||
// Clear and rebuild
|
||||
model.clear()
|
||||
batchAppendToModel(model, fontsArray)
|
||||
model.clear();
|
||||
batchAppendToModel(model, fontsArray);
|
||||
}
|
||||
|
||||
function addFallbackFonts(model, fallbackFonts) {
|
||||
// Build a set of existing fonts for O(1) lookup
|
||||
var existingFonts = {}
|
||||
var existingFonts = {};
|
||||
for (var i = 0; i < model.count; i++) {
|
||||
existingFonts[model.get(i).name] = true
|
||||
existingFonts[model.get(i).name] = true;
|
||||
}
|
||||
|
||||
var toAdd = []
|
||||
var toAdd = [];
|
||||
for (var j = 0; j < fallbackFonts.length; j++) {
|
||||
var fontName = fallbackFonts[j]
|
||||
var fontName = fallbackFonts[j];
|
||||
if (!existingFonts[fontName]) {
|
||||
toAdd.push({
|
||||
"key": fontName,
|
||||
"name": fontName
|
||||
})
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (toAdd.length > 0) {
|
||||
batchAppendToModel(model, toAdd)
|
||||
sortModel(model)
|
||||
batchAppendToModel(model, toAdd);
|
||||
sortModel(model);
|
||||
}
|
||||
}
|
||||
|
||||
function searchFonts(query) {
|
||||
if (!query || query.trim() === "")
|
||||
return availableFonts
|
||||
return availableFonts;
|
||||
|
||||
var results = []
|
||||
var lowerQuery = query.toLowerCase()
|
||||
var results = [];
|
||||
var lowerQuery = query.toLowerCase();
|
||||
|
||||
for (var i = 0; i < availableFonts.count; i++) {
|
||||
var font = availableFonts.get(i)
|
||||
var font = availableFonts.get(i);
|
||||
if (font.name.toLowerCase().includes(lowerQuery)) {
|
||||
results.push(font)
|
||||
results.push(font);
|
||||
}
|
||||
}
|
||||
|
||||
return results
|
||||
return results;
|
||||
}
|
||||
|
||||
// Process for fontconfig commands
|
||||
@@ -253,28 +252,28 @@ Singleton {
|
||||
stdout: StdioCollector {
|
||||
onStreamFinished: {
|
||||
if (this.text !== "") {
|
||||
var lines = this.text.split('\n')
|
||||
var lines = this.text.split('\n');
|
||||
// Use object for O(1) lookup instead of array
|
||||
var monospaceLookup = {}
|
||||
var monospaceLookup = {};
|
||||
|
||||
for (var i = 0; i < lines.length; i++) {
|
||||
var line = lines[i].trim()
|
||||
var line = lines[i].trim();
|
||||
if (line && line !== "") {
|
||||
monospaceLookup[line] = true
|
||||
monospaceLookup[line] = true;
|
||||
}
|
||||
}
|
||||
|
||||
fontconfigMonospaceFonts = monospaceLookup
|
||||
fontconfigMonospaceFonts = monospaceLookup;
|
||||
}
|
||||
loadSystemFonts()
|
||||
loadSystemFonts();
|
||||
}
|
||||
}
|
||||
|
||||
onExited: function (exitCode, exitStatus) {
|
||||
if (exitCode !== 0) {
|
||||
fontconfigMonospaceFonts = {}
|
||||
fontconfigMonospaceFonts = {};
|
||||
}
|
||||
loadSystemFonts()
|
||||
loadSystemFonts();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user