diff --git a/src/apps/webpositive/BrowserApp.cpp b/src/apps/webpositive/BrowserApp.cpp index 11bb6a4703..09aaae9bf4 100644 --- a/src/apps/webpositive/BrowserApp.cpp +++ b/src/apps/webpositive/BrowserApp.cpp @@ -248,29 +248,31 @@ BrowserApp::ReadyToRun() int32 pagesCreated = 0; bool fullscreen = false; - if (fLaunchRefsMessage) { - _RefsReceived(fLaunchRefsMessage, &pagesCreated, &fullscreen); - delete fLaunchRefsMessage; - fLaunchRefsMessage = NULL; - } - // If no refs led to a new open page, open new session if set - if (fSession->InitCheck() == B_OK && pagesCreated == 0) { + // Handle startup session / page + if (fSession->InitCheck() == B_OK) { const char* kSettingsKeyStartUpPolicy = "start up policy"; uint32 fStartUpPolicy = fSettings->GetValue(kSettingsKeyStartUpPolicy, (uint32)ResumePriorSession); + // If requested not to load previous session if (fStartUpPolicy == StartNewSession) { - PostMessage(NEW_WINDOW); + // Check if lauchrefs will open a page + if (fLaunchRefsMessage == NULL) { + // else open new window + PostMessage(NEW_WINDOW); + } } else { // otherwise, restore previous session BMessage archivedWindow; for (int i = 0; fSession->FindMessage("window", i, &archivedWindow) == B_OK; i++) { BRect frame = archivedWindow.FindRect("window frame"); + uint32 workspaces = B_CURRENT_WORKSPACE; + archivedWindow.FindUInt32("window workspaces", 0, &workspaces); BString url; archivedWindow.FindString("tab", 0, &url); - BrowserWindow* window = new(std::nothrow) BrowserWindow(frame, - fSettings, url, fContext); + BrowserWindow* window = new(std::nothrow) BrowserWindow(frame, fSettings, url, + fContext, INTERFACE_ELEMENT_ALL, NULL, workspaces); if (window != NULL) { window->Show(); @@ -286,9 +288,16 @@ BrowserApp::ReadyToRun() } } } + // If there is fLauchRefs message, + if (fLaunchRefsMessage != NULL) { + _RefsReceived(fLaunchRefsMessage, &pagesCreated, &fullscreen); + delete fLaunchRefsMessage; + fLaunchRefsMessage = NULL; + } - // If previous session did not contain any window, create a new empty one. - if (pagesCreated == 0) + // If previous session did not contain any window on this workspace, create a new empty one. + BrowserWindow* window = _FindWindowOnCurrentWorkspace(); + if (pagesCreated == 0 || window == NULL) _CreateNewWindow("", fullscreen); PostMessage(PRELOAD_BROWSING_HISTORY); @@ -470,6 +479,8 @@ BrowserApp::_RefsReceived(BMessage* message, int32* _pagesCreated, bool* _fullscreen) { int32 pagesCreated = 0; + if (_pagesCreated != NULL) + pagesCreated = *_pagesCreated; BrowserWindow* window = NULL; if (message->FindPointer("window", (void**)&window) != B_OK) @@ -506,6 +517,29 @@ BrowserApp::_RefsReceived(BMessage* message, int32* _pagesCreated, } +BrowserWindow* +BrowserApp::_FindWindowOnCurrentWorkspace() +{ + BrowserWindow* windowOnCurrentWorkspace = NULL; + uint32 workspace = 1 << current_workspace(); + + for (int i = 0; BWindow* window = WindowAt(i); i++) { + BrowserWindow* webWindow = dynamic_cast(window); + if (webWindow == NULL) + continue; + + if (webWindow->Lock()) { + if (webWindow->Workspaces() & workspace) + windowOnCurrentWorkspace = webWindow; + webWindow->Unlock(); + if (windowOnCurrentWorkspace) + return windowOnCurrentWorkspace; + } + } + return NULL; +} + + BrowserWindow* BrowserApp::_CreateNewPage(const BString& url, BrowserWindow* webWindow, bool fullscreen, bool useBlankTab) @@ -524,30 +558,28 @@ BrowserApp::_CreateNewPage(const BString& url, BrowserWindow* webWindow, } // Otherwise, try to find one in the current workspace - uint32 workspace = 1 << current_workspace(); - bool loadedInWindowOnCurrentWorkspace = false; - for (int i = 0; BWindow* window = WindowAt(i); i++) { - webWindow = dynamic_cast(window); - if (!webWindow) - continue; + BrowserWindow* window = _FindWindowOnCurrentWorkspace(); - if (webWindow->Lock()) { - if (webWindow->Workspaces() & workspace) { - if (useBlankTab && webWindow->IsBlankTab()) { - if (url.Length() != 0) - webWindow->CurrentWebView()->LoadURL(url); - } else - webWindow->CreateNewTab(url, true); - webWindow->Activate(); - webWindow->CurrentWebView()->MakeFocus(true); - loadedInWindowOnCurrentWorkspace = true; - } - webWindow->Unlock(); + if (window == NULL) + return _CreateNewWindow(url, fullscreen); + + + if (window->Lock()) { + if (useBlankTab && window->IsBlankTab()) { + if (url.Length() != 0) + window->CurrentWebView()->LoadURL(url); + } else { + window->CreateNewTab(url, true); } - if (loadedInWindowOnCurrentWorkspace) - return webWindow; + window->Activate(); + window->CurrentWebView()->MakeFocus(true); + loadedInWindowOnCurrentWorkspace = true; + + window->Unlock(); } + if (loadedInWindowOnCurrentWorkspace) + return window; // Finally, if no window is available, let's create one. return _CreateNewWindow(url, fullscreen); diff --git a/src/apps/webpositive/BrowserApp.h b/src/apps/webpositive/BrowserApp.h index 845c9085a1..44666d39e6 100644 --- a/src/apps/webpositive/BrowserApp.h +++ b/src/apps/webpositive/BrowserApp.h @@ -57,6 +57,8 @@ public: virtual bool QuitRequested(); private: +/*! @param[in,out] _pagesCreated if set, the pointed integer will be incremented by the number of created pages +*/ void _RefsReceived(BMessage* message, int32* pagesCreated = NULL, bool* fullscreen = NULL); @@ -66,6 +68,7 @@ private: bool useBlankTab = true); BrowserWindow* _CreateNewWindow(const BString& url, bool fullscreen = false); + BrowserWindow* _FindWindowOnCurrentWorkspace(); void _CreateNewTab(BrowserWindow* window, const BString& url, bool select); void _ShowWindow(const BMessage* message, diff --git a/src/apps/webpositive/BrowserWindow.cpp b/src/apps/webpositive/BrowserWindow.cpp index a0c370640b..04c3e2eeb0 100644 --- a/src/apps/webpositive/BrowserWindow.cpp +++ b/src/apps/webpositive/BrowserWindow.cpp @@ -345,13 +345,12 @@ private: // #pragma mark - BrowserWindow -BrowserWindow::BrowserWindow(BRect frame, SettingsMessage* appSettings, - const BString& url, BPrivate::Network::BUrlContext* context, - uint32 interfaceElements, BWebView* webView) +BrowserWindow::BrowserWindow(BRect frame, SettingsMessage* appSettings, const BString& url, + BPrivate::Network::BUrlContext* context, uint32 interfaceElements, BWebView* webView, + uint32 workspaces) : - BWebWindow(frame, kApplicationName, - B_DOCUMENT_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, - B_AUTO_UPDATE_SIZE_LIMITS | B_ASYNCHRONOUS_CONTROLS), + BWebWindow(frame, kApplicationName, B_DOCUMENT_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, + B_AUTO_UPDATE_SIZE_LIMITS | B_ASYNCHRONOUS_CONTROLS, workspaces), fIsFullscreen(false), fInterfaceVisible(false), fMenusRunning(false), @@ -1239,7 +1238,9 @@ BrowserWindow::MessageReceived(BMessage* message) status_t BrowserWindow::Archive(BMessage* archive, bool deep) const { - status_t ret = archive->AddRect("window frame", Frame()); + status_t status = archive->AddRect("window frame", Frame()); + if (status == B_OK) + status = archive->AddUInt32("window workspaces", Workspaces()); for (int i = 0; i < fTabManager->CountTabs(); i++) { BWebView* view = dynamic_cast(fTabManager->ViewForTab(i)); @@ -1247,11 +1248,11 @@ BrowserWindow::Archive(BMessage* archive, bool deep) const continue; } - if (ret == B_OK) - ret = archive->AddString("tab", view->MainFrameURL()); + if (status == B_OK) + status = archive->AddString("tab", view->MainFrameURL()); } - return ret; + return status; } diff --git a/src/apps/webpositive/BrowserWindow.h b/src/apps/webpositive/BrowserWindow.h index 3b5dc4356f..1acb8156a1 100644 --- a/src/apps/webpositive/BrowserWindow.h +++ b/src/apps/webpositive/BrowserWindow.h @@ -97,13 +97,9 @@ enum { class BrowserWindow : public BWebWindow { public: - BrowserWindow(BRect frame, - SettingsMessage* appSettings, - const BString& url, - BPrivate::Network::BUrlContext* context, - uint32 interfaceElements - = INTERFACE_ELEMENT_ALL, - BWebView* webView = NULL); + BrowserWindow(BRect frame, SettingsMessage* appSettings, const BString& url, + BPrivate::Network::BUrlContext* context, uint32 interfaceElements = INTERFACE_ELEMENT_ALL, + BWebView* webView = NULL, uint32 workspaces = B_CURRENT_WORKSPACE); virtual ~BrowserWindow(); virtual void DispatchMessage(BMessage* message,