diff --git a/README.md b/README.md index 15a9537..fc3e945 100644 --- a/README.md +++ b/README.md @@ -39,3 +39,5 @@ This module allows you to start applications on linux. #### URL module This module allows you to open urls. +#### Locate +This module allows you to search for files using locate. diff --git a/src/common/local/english.js b/src/common/local/english.js index d9c1488..0042aa1 100644 --- a/src/common/local/english.js +++ b/src/common/local/english.js @@ -51,6 +51,9 @@ const translation_english = { url: 'URL module', url_description: 'This module allows you to open urls', + + locate: 'Locate', + locate_description: 'This module allows you to search for files using locate', }; export default translation_english; diff --git a/src/main/config.js b/src/main/config.js index a2b253a..a92de99 100644 --- a/src/main/config.js +++ b/src/main/config.js @@ -47,6 +47,9 @@ export let config = { active: true, quality: 1.0, }, + locate: { + active: true, + }, }, }; diff --git a/src/main/executor.js b/src/main/executor.js index 5a3e02a..6cba624 100644 --- a/src/main/executor.js +++ b/src/main/executor.js @@ -9,6 +9,7 @@ import HtmlModule from "./modules/html"; import CalculatorModule from "./modules/calculator"; import LinuxApplicationModule from "./modules/linux-applications"; import UrlModule from "./modules/url"; +import LocateModule from "./modules/locate"; const modules = { marvin_quote: MarvinQuoteModule, @@ -19,6 +20,7 @@ const modules = { calculator: CalculatorModule, linux_applications: LinuxApplicationModule, url: UrlModule, + locate: LocateModule, }; let last_query_timeout = null; @@ -35,25 +37,33 @@ export function deinitModules() { return Promise.all(Object.values(modules).map((module) => module.deinit && module.deinit())); } +let exec_id = 0; + export function searchQuery(query, callback) { return new Promise((resolve) => { + exec_id++; + const beginn_id = exec_id; clearTimeout(last_query_timeout); last_query_timeout = setTimeout(async () => { let results = []; let lock = new AsyncLock(); await Promise.all(Object.keys(modules).filter((id) => modules[id].valid(query)).map((id) => { return new Promise((resolve) => lock.acquire('results', async () => { - let result = (await modules[id].search(query)); - results = results - .concat(result.map((option) => ({ ...option, module: id }))) - .filter((option) => option.quality > 0) - .sort((a, b) => b.quality - a.quality) - .slice(0, config.general.max_results); - // callback(results); - resolve(); + if(exec_id === beginn_id) { + let result = (await modules[id].search(query)); + results = results + .concat(result.map((option) => ({ ...option, module: id }))) + .filter((option) => option.quality > 0) + .sort((a, b) => b.quality - a.quality) + .slice(0, config.general.max_results); + callback(results); + resolve(); + } })); })); - callback(results); + if(exec_id === beginn_id) { + callback(results); + } resolve(); }, config.general.debounce_time); }); diff --git a/src/main/modules/locate.js b/src/main/modules/locate.js new file mode 100644 index 0000000..033d0c5 --- /dev/null +++ b/src/main/modules/locate.js @@ -0,0 +1,46 @@ + +import { stringMatchQuality } from "../../common/util"; +import { config } from "../config"; +import { stat, exists, readdir } from "fs"; +import path from 'path'; +import { exec } from "child_process"; +import { app } from "electron"; + +const LocateModule = { + valid: (query) => { + return config.modules.locate.active && query.length >= 1; + }, + search: (query) => { + return new Promise((resolve) => { + exec(`locate -i -e -b ${query}`, async (_, stdout, __) => { + if(stdout) { + resolve(await Promise.all(stdout.split('\n').map((file) => { + return new Promise(async (resolve) => { + let option = { + type: 'icon_list_item', + uri_icon: (await app.getFileIcon(file)).toDataURL(), + primary: path.basename(file), + secondary: file, + executable: true, + quality: query[query.length - 1] === '/' ? 0.25 : 0.5 * stringMatchQuality(path.basename(query), path.basename(file)), + file: file, + }; + resolve(option); + }); + }))); + } else { + resolve([]); + } + }); + }); + }, + execute: (option) => { + return new Promise((resolve) => { + exec(`xdg-open ${option.file}`, () => { + resolve(); + }) + }); + }, +} + +export default LocateModule; \ No newline at end of file diff --git a/src/main/modules/url.js b/src/main/modules/url.js index c5162f0..4eac10f 100644 --- a/src/main/modules/url.js +++ b/src/main/modules/url.js @@ -1,8 +1,6 @@ -import { stringMatchQuality } from "../../common/util"; import { config } from "../config"; import { exec } from 'child_process'; -import { getTranslation } from "../../common/local/locale"; function isValidUrl(str) { let pattern = new RegExp('^(https?:\\/\\/)?' + // protocol @@ -41,7 +39,7 @@ const UrlModule = { return new Promise((resolve) => { exec(`xdg-open ${option.url}`, () => { resolve(); - }) + }); }); }, } diff --git a/src/renderer/settings/config.js b/src/renderer/settings/config.js index 4e54827..04423d6 100644 --- a/src/renderer/settings/config.js +++ b/src/renderer/settings/config.js @@ -46,6 +46,9 @@ const config_definition = [ { name: 'active', type: 'boolean' }, { name: 'quality', type: 'quality' }, ], type: 'page', description: 'url_description' }, + { name: 'locate', active: 'active', options: [ + { name: 'active', type: 'boolean' }, + ], type: 'page', description: 'locate_description' }, ], type: 'subheader' } ];