diff --git a/src/apps/webpositive/LauncherApp.cpp b/src/apps/webpositive/LauncherApp.cpp index 22c8eb05f6..5b60e09a66 100644 --- a/src/apps/webpositive/LauncherApp.cpp +++ b/src/apps/webpositive/LauncherApp.cpp @@ -171,7 +171,9 @@ void LauncherApp::MessageReceived(BMessage* message) break; BString url; message->FindString("url", &url); - newTab(window, url); + bool select = false; + message->FindBool("select", &select); + newTab(window, url, select); break; } case WINDOW_OPENED: @@ -279,15 +281,12 @@ void LauncherApp::newWindow(const BString& url) window->currentWebView()->loadRequest(url.String()); } -void LauncherApp::newTab(LauncherWindow* window, const BString& url) +void LauncherApp::newTab(LauncherWindow* window, const BString& url, bool select) { if (!window->Lock()) return; - window->newTab(); + window->newTab(url, select); window->Unlock(); - - if (url.Length()) - window->currentWebView()->loadRequest(url.String()); } // #pragma mark - diff --git a/src/apps/webpositive/LauncherApp.h b/src/apps/webpositive/LauncherApp.h index 69b60bcc78..15dabba6a2 100644 --- a/src/apps/webpositive/LauncherApp.h +++ b/src/apps/webpositive/LauncherApp.h @@ -51,7 +51,7 @@ public: private: bool openSettingsFile(BFile& file, uint32 mode); void newWindow(const BString& url); - void newTab(LauncherWindow* window, const BString& url); + void newTab(LauncherWindow* window, const BString& url, bool select); int m_windowCount; BRect m_lastWindowFrame; diff --git a/src/apps/webpositive/LauncherWindow.cpp b/src/apps/webpositive/LauncherWindow.cpp index d434b7934a..d1ef7f15eb 100644 --- a/src/apps/webpositive/LauncherWindow.cpp +++ b/src/apps/webpositive/LauncherWindow.cpp @@ -226,7 +226,7 @@ LauncherWindow::LauncherWindow(BRect frame, const BMessenger& downloadListener, ); } - newTab(); + newTab("", true); currentWebView()->webPage()->SetDownloadListener(downloadListener); m_findGroup->SetVisible(false); @@ -406,17 +406,23 @@ void LauncherWindow::MenusBeginning() history->Unlock(); } -void LauncherWindow::newTab() +void LauncherWindow::newTab(const BString& url, bool select) { // Executed in app thread (new BWebPage needs to be created in app thread). WebView* webView = new WebView("web_view"); m_tabView->AddTab(webView); m_tabView->TabAt(m_tabView->CountTabs() - 1)->SetLabel("New tab"); - m_tabView->Select(m_tabView->CountTabs() - 1); - setCurrentWebView(webView); - navigationCapabilitiesChanged(false, false, false, webView); - if (m_url) - m_url->MakeFocus(true); + + if (url.Length()) + webView->loadRequest(url.String()); + + if (select) { + m_tabView->Select(m_tabView->CountTabs() - 1); + setCurrentWebView(webView); + navigationCapabilitiesChanged(false, false, false, webView); + if (m_url) + m_url->MakeFocus(true); + } } // #pragma mark - Notification API @@ -434,9 +440,12 @@ void LauncherWindow::newWindowRequested(const BString& url) // Always open new windows in the application thread, since // creating a WebView will try to grab the application lock. // But our own WebPage may already try to lock us from within - // the application thread -> dead-lock. - BMessage message(NEW_WINDOW); + // the application thread -> dead-lock. Thus we can't wait for + // a reply here. + BMessage message(NEW_TAB); + message.AddPointer("window", this); message.AddString("url", url); + message.AddBool("select", false); be_app->PostMessage(&message); } diff --git a/src/apps/webpositive/LauncherWindow.h b/src/apps/webpositive/LauncherWindow.h index b113541683..e660d8d1df 100644 --- a/src/apps/webpositive/LauncherWindow.h +++ b/src/apps/webpositive/LauncherWindow.h @@ -67,7 +67,7 @@ public: virtual bool QuitRequested(); virtual void MenusBeginning(); - void newTab(); + void newTab(const BString& url, bool select); private: // WebPage notification API implementations