diff --git a/.config/ags/modules/.configuration/user_options.js b/.config/ags/modules/.configuration/user_options.js index 1ddfdbcd..751f6f15 100644 --- a/.config/ags/modules/.configuration/user_options.js +++ b/.config/ags/modules/.configuration/user_options.js @@ -93,6 +93,12 @@ let configOptions = { }, 'search': { + 'enableActions': true, + 'enableCommands': true, + 'enableMathResults': true, + 'enableDirectorySearch': true, + 'enableAiSearch': true, + 'enableWebSearch': true, 'engineBaseUrl': "https://www.google.com/search?q=", 'excludedSites': ["quora.com"], }, diff --git a/.config/ags/modules/overview/searchbuttons.js b/.config/ags/modules/overview/searchbuttons.js index 86d2ffbc..58f51607 100644 --- a/.config/ags/modules/overview/searchbuttons.js +++ b/.config/ags/modules/overview/searchbuttons.js @@ -7,6 +7,15 @@ import { searchItem } from './searchitem.js'; import { execAndClose, couldBeMath, launchCustomCommand } from './miscfunctions.js'; import GeminiService from '../../services/gemini.js'; +export const NoResultButton = () => searchItem({ + materialIconName: 'Error', + name: "Search invalid", + content: "No results found!", + onActivate: () => { + App.closeWindow('overview'); + }, +}); + export const DirectoryButton = ({ parentPath, name, type, icon }) => { const actionText = Widget.Revealer({ revealChild: false, @@ -159,7 +168,11 @@ export const SearchButton = ({ text = '' }) => searchItem({ content: `${text}`, onActivate: () => { App.closeWindow('overview'); - execAsync(['bash', '-c', `xdg-open '${userOptions.search.engineBaseUrl}${text} ${['', ...userOptions.search.excludedSites].join(' -site:')}' &`]).catch(print); + let search = userOptions.search.engineBaseUrl + text; + for (let site of userOptions.search.excludedSites) { + if (site) search += ` -site:${site}`; + } + execAsync(['bash', '-c', `xdg-open '${search}' &`]).catch(print); }, }); diff --git a/.config/ags/modules/overview/windowcontent.js b/.config/ags/modules/overview/windowcontent.js index 2f50a690..95026f72 100644 --- a/.config/ags/modules/overview/windowcontent.js +++ b/.config/ags/modules/overview/windowcontent.js @@ -8,7 +8,7 @@ const { execAsync, exec } = Utils; import { execAndClose, expandTilde, hasUnterminatedBackslash, couldBeMath, launchCustomCommand, ls } from './miscfunctions.js'; import { CalculationResultButton, CustomCommandButton, DirectoryButton, - DesktopEntryButton, ExecuteCommandButton, SearchButton, AiButton + DesktopEntryButton, ExecuteCommandButton, SearchButton, AiButton, NoResultButton, } from './searchbuttons.js'; import { checkKeybind } from '../.widgetutils/keybind.js'; import GeminiService from '../../services/gemini.js'; @@ -94,50 +94,7 @@ export const SearchAndWindows = () => { className: 'overview-search-box txt-small txt', hpack: 'center', onAccept: (self) => { // This is when you hit Enter - const text = self.text; - if (text.length == 0) return; - const isAction = text.startsWith('>'); - const isDir = (['/', '~'].includes(entry.text[0])); - - if (couldBeMath(text)) { // Eval on typing is dangerous, this is a workaround - try { - const fullResult = eval(text.replace(/\^/g, "**")); - // copy - execAsync(['wl-copy', `${fullResult}`]).catch(print); - App.closeWindow('overview'); - return; - } catch (e) { - // console.log(e); - } - } - if (isDir) { - App.closeWindow('overview'); - execAsync(['bash', '-c', `xdg-open "${expandTilde(text)}"`, `&`]).catch(print); - return; - } - if (_appSearchResults.length > 0) { - App.closeWindow('overview'); - _appSearchResults[0].launch(); - return; - } - else if (text[0] == '>') { // Custom commands - App.closeWindow('overview'); - launchCustomCommand(text); - return; - } - // Fallback: Execute command - if (!isAction && exec(`bash -c "command -v ${text.split(' ')[0]}"`) != '') { - if (text.startsWith('sudo')) - execAndClose(text, true); - else - execAndClose(text, false); - } - - else { - GeminiService.send(text); - App.closeWindow('overview'); - App.openWindow('sideleft'); - } + resultsBox.children[0].onClicked(); }, onChange: (entry) => { // this is when you type const isAction = entry.text[0] == '>'; @@ -162,7 +119,7 @@ export const SearchAndWindows = () => { _appSearchResults = Applications.query(text); // Calculate - if (couldBeMath(text)) { // Eval on typing is dangerous; this is a small workaround. + if (userOptions.search.enableMathResults && couldBeMath(text)) { // Eval on typing is dangerous; this is a small workaround. try { const fullResult = eval(text.replace(/\^/g, "**")); resultsBox.add(CalculationResultButton({ result: fullResult, text: text })); @@ -170,14 +127,14 @@ export const SearchAndWindows = () => { // console.log(e); } } - if (isDir) { + if (userOptions.search.enableDirectorySearch && isDir) { var contents = []; contents = ls({ path: text, silent: true }); contents.forEach((item) => { resultsBox.add(DirectoryButton(item)); }) } - if (isAction) { // Eval on typing is dangerous, this is a workaround. + if (userOptions.search.enableActions && isAction) { // Eval on typing is dangerous, this is a workaround. resultsBox.add(CustomCommandButton({ text: entry.text })); } // Add application entries @@ -190,13 +147,16 @@ export const SearchAndWindows = () => { // Fallbacks // if the first word is an actual command - if (!isAction && !hasUnterminatedBackslash(text) && exec(`bash -c "command -v ${text.split(' ')[0]}"`) != '') { + if (userOptions.search.enableCommands && !isAction && !hasUnterminatedBackslash(text) && exec(`bash -c "command -v ${text.split(' ')[0]}"`) != '') { resultsBox.add(ExecuteCommandButton({ command: entry.text, terminal: entry.text.startsWith('sudo') })); } // Add fallback: search - resultsBox.add(AiButton({ text: entry.text })); - resultsBox.add(SearchButton({ text: entry.text })); + if (userOptions.search.enableAiSearch) + resultsBox.add(AiButton({ text: entry.text })); + if (userOptions.search.enableWebSearch) + resultsBox.add(SearchButton({ text: entry.text })); + if (resultsBox.children.length == 0) resultsBox.add(NoResultButton()); resultsBox.show_all(); }, });