From d39eed0b8a0338346bbfcc7a12a534ef3679dbbb Mon Sep 17 00:00:00 2001 From: Roland Bernard Date: Thu, 18 Mar 2021 22:18:24 +0100 Subject: [PATCH 1/6] Improved main window opening/closing responsiveness --- src/main/modules/main.js | 52 +++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/src/main/modules/main.js b/src/main/modules/main.js index b548afc..c630cce 100644 --- a/src/main/modules/main.js +++ b/src/main/modules/main.js @@ -15,9 +15,37 @@ let tray; let main_window; let last_loading = null; +let last_query = null; const MAX_TRANSFER_LEN = 1000; +const original_option = new Map(); + +function handleQuery(query, sender) { + if (query !== last_query) { + clearTimeout(last_loading); + last_loading = setTimeout(() => msg.sender.send('update-options', null), config.general.debounce_time + 100); + searchQuery(query, (results) => { + clearTimeout(last_loading); + original_option.clear(); + sender.send('update-options', results.map((opt) => { + const new_opt = { ...opt }; + if (new_opt.text?.length > MAX_TRANSFER_LEN) { + new_opt.text = new_opt.text.substr(0, MAX_TRANSFER_LEN) + '...'; + } + if (new_opt.primary?.length > MAX_TRANSFER_LEN) { + new_opt.primary = new_opt.primary.substr(0, MAX_TRANSFER_LEN) + '...'; + } + if (new_opt.secondary?.length > MAX_TRANSFER_LEN) { + new_opt.secondary = new_opt.secondary.substr(0, MAX_TRANSFER_LEN) + '...'; + } + original_option.set(JSON.stringify(new_opt), opt); + return new_opt; + })); + }); + } +} + export function createMainWindow() { main_window = new BrowserWindow({ webPreferences: { @@ -68,28 +96,8 @@ export function createMainWindow() { main_window.on('blur', hideWindow); } - const original_option = new Map(); ipcMain.on('search-options', (msg, query) => { - clearTimeout(last_loading); - last_loading = setTimeout(() => msg.sender.send('update-options', null), config.general.debounce_time + 100); - searchQuery(query, (results) => { - clearTimeout(last_loading); - original_option.clear(); - msg.sender.send('update-options', results.map((opt) => { - const new_opt = { ...opt }; - if (new_opt.text?.length > MAX_TRANSFER_LEN) { - new_opt.text = new_opt.text.substr(0, MAX_TRANSFER_LEN) + '...'; - } - if (new_opt.primary?.length > MAX_TRANSFER_LEN) { - new_opt.primary = new_opt.primary.substr(0, MAX_TRANSFER_LEN) + '...'; - } - if (new_opt.secondary?.length > MAX_TRANSFER_LEN) { - new_opt.secondary = new_opt.secondary.substr(0, MAX_TRANSFER_LEN) + '...'; - } - original_option.set(JSON.stringify(new_opt), opt); - return new_opt; - })); - }); + handleQuery(query, msg.sender); }); ipcMain.on('execute-option', (_, option) => { if (option && option.executable) { @@ -116,8 +124,8 @@ export async function toggleMain(op) { if (main_window && !main_window.isDestroyed()) { main_window.webContents.send('update-config', config); main_window.webContents.send('reset'); + handleQuery('', main_window); if ((op === undefined || !op) && main_window.isVisible()) { - await new Promise(res => setTimeout(() => res(), 50)); main_window.hide(); } else if ((op === undefined || op) && !main_window.isVisible()) { main_window.show(); From 6a6dcf7c757d52ad767cac357d88b4c5476f5f6e Mon Sep 17 00:00:00 2001 From: Roland Bernard Date: Sat, 20 Mar 2021 21:20:40 +0100 Subject: [PATCH 2/6] Fixed an exception --- src/main/modules/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/modules/main.js b/src/main/modules/main.js index c630cce..cb1bca0 100644 --- a/src/main/modules/main.js +++ b/src/main/modules/main.js @@ -24,7 +24,7 @@ const original_option = new Map(); function handleQuery(query, sender) { if (query !== last_query) { clearTimeout(last_loading); - last_loading = setTimeout(() => msg.sender.send('update-options', null), config.general.debounce_time + 100); + last_loading = setTimeout(() => sender.send('update-options', null), config.general.debounce_time + 100); searchQuery(query, (results) => { clearTimeout(last_loading); original_option.clear(); From fb9368b33b5903566f6bcebee5de6294888525e0 Mon Sep 17 00:00:00 2001 From: Roland Bernard Date: Sat, 20 Mar 2021 21:21:56 +0100 Subject: [PATCH 3/6] Improved performance by using file urls and not data urls --- src/main/modules/linux-applications.js | 28 +++++++++----------------- 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/src/main/modules/linux-applications.js b/src/main/modules/linux-applications.js index 414a082..ee1a2b0 100644 --- a/src/main/modules/linux-applications.js +++ b/src/main/modules/linux-applications.js @@ -1,9 +1,11 @@ -import { config } from "../config"; import { readdir, readFile, writeFileSync, existsSync, readFileSync, stat } from "fs"; import { app, ipcMain } from 'electron'; import path from 'path'; import { exec } from "child_process"; +import { format as formatUrl } from 'url'; + +import { config } from "../config"; import { stringMatchQuality } from '../search'; let applications = []; @@ -157,23 +159,13 @@ function findIconPath(name) { }); } -function pathToDataUrl(path) { +function pathToUrl(path) { return new Promise((resolve) => { - readFile(path, (_, data) => { - if (data) { - const mime_endings = { - '__default__': 'text/plain', - '.png': 'image/png', - '.jpg': 'image/jpeg', - '.jpeg': 'image/jpeg', - '.svg': 'image/svg+xml', - }; - let mime = mime_endings[Object.keys(mime_endings).find((ending) => path.endsWith(ending)) || '__default__']; - resolve(`data:${mime};base64,${Buffer.from(data).toString('base64')}`); - } else { - resolve(null); - } - }); + resolve(formatUrl({ + pathname: path, + protocol: 'file', + slashes: true + })); }); } @@ -243,7 +235,7 @@ async function loadApplications() { if (getProp(value, 'Icon') && !icons[getProp(value, 'Icon')]) { const path = await findIconPath(getProp(value, 'Icon'), theme, fallback_theme); if (path) { - icons[getProp(value, 'Icon')] = await pathToDataUrl(path); + icons[getProp(value, 'Icon')] = await pathToUrl(path); } } value.icon = icons[getProp(value, 'Icon')]; From e5d0b21ce7b88a05e2eb6de9fbe95b54ebc239d5 Mon Sep 17 00:00:00 2001 From: Roland Bernard Date: Sat, 20 Mar 2021 21:24:13 +0100 Subject: [PATCH 4/6] Fixed application search sorting --- src/main/modules/linux-applications.js | 7 +++---- src/main/modules/main.js | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/modules/linux-applications.js b/src/main/modules/linux-applications.js index ee1a2b0..a5a9d86 100644 --- a/src/main/modules/linux-applications.js +++ b/src/main/modules/linux-applications.js @@ -39,7 +39,7 @@ function getProps(object, name) { if (object[name] instanceof Object) { return Object.keys(object[name]).map(key => [object[name][key], key.toLowerCase()]); } else if (object[name]) { - return [ [object[name], ''] ]; + return [ [object[name], 'default'] ]; } else { return []; } @@ -246,9 +246,9 @@ async function loadApplications() { } function getQualityForProp(object, prop, text, regex, scale) { - return Math.max(...(getProps(object, prop) + return Math.max(0, ...(getProps(object, prop) .map(([value, lang]) => - scale * (lang === 'default' || lang.includes(config.general.language) ? 1 : 0.5) * stringMatchQuality(text, value, regex) + scale * (lang === 'default' || lang.toLowerCase().includes(config.general.language) ? 1 : 0.5) * stringMatchQuality(text, value, regex) ) )); } @@ -278,7 +278,6 @@ const LinuxApplicationModule = { return query.trim().length >= 1; }, search: async (query, regex) => { - const language = config.general.language; return applications.map((app) => { const name = getProp(app.desktop, 'Name', app.application.replace('.desktop', '')); const app_match = Math.max( diff --git a/src/main/modules/main.js b/src/main/modules/main.js index cb1bca0..c101db7 100644 --- a/src/main/modules/main.js +++ b/src/main/modules/main.js @@ -17,7 +17,7 @@ let main_window; let last_loading = null; let last_query = null; -const MAX_TRANSFER_LEN = 1000; +const MAX_TRANSFER_LEN = 200; const original_option = new Map(); From 8a96ae0be08cf85dc8aea400baf7a859e5b52949 Mon Sep 17 00:00:00 2001 From: Roland Bernard Date: Sat, 20 Mar 2021 21:32:55 +0100 Subject: [PATCH 5/6] Added the hide delay back in --- src/main/modules/main.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/modules/main.js b/src/main/modules/main.js index c101db7..5a58c3d 100644 --- a/src/main/modules/main.js +++ b/src/main/modules/main.js @@ -124,10 +124,11 @@ export async function toggleMain(op) { if (main_window && !main_window.isDestroyed()) { main_window.webContents.send('update-config', config); main_window.webContents.send('reset'); - handleQuery('', main_window); if ((op === undefined || !op) && main_window.isVisible()) { + await new Promise(res => setTimeout(() => res(), 50)); main_window.hide(); } else if ((op === undefined || op) && !main_window.isVisible()) { + handleQuery('', main_window); main_window.show(); if (config.general.recenter_on_show) { main_window.center(); From c02bb0278e63d2d9ad5102962473a28d245168a8 Mon Sep 17 00:00:00 2001 From: Roland Bernard Date: Sun, 21 Mar 2021 13:04:29 +0100 Subject: [PATCH 6/6] Increased the version number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6fdd5ad..971cfab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "marvin", - "version": "0.0.21", + "version": "0.0.22", "license": "MIT", "scripts": { "dev": "electron-webpack dev",