diff --git a/src/apps/webpositive/BrowserWindow.cpp b/src/apps/webpositive/BrowserWindow.cpp index 47f56403d5..b1b21dbf87 100644 --- a/src/apps/webpositive/BrowserWindow.cpp +++ b/src/apps/webpositive/BrowserWindow.cpp @@ -380,6 +380,7 @@ BrowserWindow::BrowserWindow(BRect frame, SettingsMessage* appSettings, kDefaultStartPageURL); fSearchPageURL = fAppSettings->GetValue(kSettingsKeySearchPageURL, kDefaultSearchPageURL); + _InitSearchEngines(); // Create the interface elements BMessage* newTabMessage = new BMessage(NEW_TAB); @@ -698,6 +699,7 @@ BrowserWindow::~BrowserWindow() delete fTabManager; delete fPulseRunner; delete fSavePanel; + delete[] fSearchEngines; } @@ -2478,6 +2480,30 @@ BrowserWindow::_EncodeURIComponent(const BString& search) } +void +BrowserWindow::_InitSearchEngines() +{ + // TODO make these configurable + fSearchEngines = new SearchEngine[kSearchEngineCount]; + fSearchEngines[0].url="https://google.com/search?q=%s"; + fSearchEngines[0].shortcut="g "; + fSearchEngines[1].url="https://bing.com/search?q=%s"; + fSearchEngines[1].shortcut="b "; + fSearchEngines[2].url="https://en.wikipedia.org/w/index.php?search=%s"; + fSearchEngines[2].shortcut="w "; + fSearchEngines[3].url="https://duckduckgo.com/?q=%s"; + fSearchEngines[3].shortcut="d "; + fSearchEngines[4].url="https://www.baidu.com/s?wd=%s"; + fSearchEngines[4].shortcut="a "; + fSearchEngines[5].url="https://yandex.com/search/?text=%s"; + fSearchEngines[5].shortcut="y "; + fSearchEngines[6].url="https://www.ecosia.org/search?q=%s"; + fSearchEngines[6].shortcut="e "; + fSearchEngines[7].url="https://www.qwant.com/?q=%s"; + fSearchEngines[7].shortcut="q "; +} + + void BrowserWindow::_VisitURL(const BString& url) { @@ -2489,9 +2515,24 @@ BrowserWindow::_VisitURL(const BString& url) void BrowserWindow::_VisitSearchEngine(const BString& search) { + BString searchQuery = search; + searchQuery.Remove(0, 2); + BString searchPrefix; + + search.CopyCharsInto(searchPrefix, 0, 2); + + // Default search URL BString engine(fSearchPageURL); - engine.ReplaceAll("%s", _EncodeURIComponent(search).String()); + // Check if the string starts with one of the search engine shortcuts + for (int i = 0; i < kSearchEngineCount; i++) { + if (search.StartsWith(fSearchEngines[i].shortcut)) { + engine = fSearchEngines[i].url; + break; + } + } + + engine.ReplaceAll("%s", _EncodeURIComponent(searchQuery)); _VisitURL(engine); } diff --git a/src/apps/webpositive/BrowserWindow.h b/src/apps/webpositive/BrowserWindow.h index 20597974ad..ba9869f689 100644 --- a/src/apps/webpositive/BrowserWindow.h +++ b/src/apps/webpositive/BrowserWindow.h @@ -194,6 +194,8 @@ private: void _SetPageIcon(BWebView* view, const BBitmap* icon); + void _InitSearchEngines(); + void _UpdateHistoryMenu(); void _UpdateClipboardItems(); @@ -281,8 +283,15 @@ private: BMenuItem* fBookmarkBarMenuItem; BookmarkBar* fBookmarkBar; BFilePanel* fSavePanel; + int kSearchEngineCount = 8; + struct SearchEngine { + const char* shortcut; + const char* url; + }; + + // FIXME use a BObjectList + SearchEngine* fSearchEngines; }; #endif // BROWSER_WINDOW_H -