mirror of https://github.com/roytam1/kmeleon.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
350 lines
11 KiB
350 lines
11 KiB
/* |
|
* Copyright (C) 2001 Jeff Doozan |
|
* |
|
* This program is free software; you can redistribute it and/or modify |
|
* it under the terms of the GNU General Public License as published by |
|
* the Free Software Foundation; either version 2, or (at your option) |
|
* any later version. |
|
* |
|
* This program is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
* GNU General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU General Public License |
|
* along with this program; if not, write to the Free Software |
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
|
*/ |
|
|
|
#include "stdafx.h" |
|
#include "HiddenWnd.h" |
|
#include "BrowserView.h" //XX |
|
#include "SaveAsHandler.h" |
|
|
|
BEGIN_MESSAGE_MAP(CHiddenWnd, CFrameWnd) |
|
//{{AFX_MSG_MAP(CHiddenWnd) |
|
ON_WM_CREATE() |
|
ON_WM_CLOSE() |
|
ON_WM_COPYDATA() |
|
ON_WM_ENDSESSION() |
|
ON_MESSAGE(UWM_NEWWINDOW, OnNewWindow) |
|
ON_MESSAGE(UWM_PERSIST_SET, OnSetPersist) |
|
ON_MESSAGE(UWM_PERSIST_SHOW, OnShowBrowser) |
|
ON_MESSAGE(WM_DEFERSHOW, OnDeferShow) |
|
ON_MESSAGE(WM_DEFERSAVEAS, OnDeferSaveAs) |
|
//}}AFX_MSG_MAP |
|
END_MESSAGE_MAP() |
|
|
|
|
|
BOOL CHiddenWnd::PreCreateWindow(CREATESTRUCT& cs) { |
|
|
|
if( !CFrameWnd::PreCreateWindow(cs) ) |
|
return FALSE; |
|
cs.lpszClass = HIDDEN_WINDOW_CLASS; |
|
|
|
return TRUE; |
|
} |
|
|
|
int CHiddenWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) { |
|
|
|
// Check if the tray control is running, and get the persist setting from it |
|
QueryPersistFlags(); |
|
USES_CONVERSION; |
|
if (m_bStayResident) |
|
StayResident(); |
|
else { |
|
BOOL webapp = theApp.cmdline.GetSwitch("-webapp", NULL, TRUE)>=0; |
|
if (!ShowBrowser(A2T(theApp.cmdline.m_sCmdLine), webapp, TRUE)) |
|
return -1; |
|
} |
|
|
|
return CFrameWnd::OnCreate(lpCreateStruct); |
|
} |
|
|
|
void CHiddenWnd::QueryPersistFlags() { |
|
HWND hwndLoader = ::FindWindowEx(NULL, NULL, _T("KMeleon Tray Control"), NULL); |
|
if (hwndLoader) { |
|
LRESULT flags = ::SendMessage(hwndLoader, UWM_PERSIST_GET, NULL, NULL); |
|
|
|
m_bStayResident = ((flags & PERSIST_BROWSER)); |
|
m_bPreloadWindow = ((flags & PERSIST_WINDOW)); |
|
m_bPreloadStartPage = ((flags & PERSIST_STARTPAGE)); |
|
m_bShowNow = ((flags & PERSIST_SHOWNOW)); |
|
|
|
// a little sanity checking |
|
if (m_bPreloadWindow && !m_bStayResident) |
|
m_bPreloadWindow = FALSE; |
|
if (m_bPreloadStartPage && ! m_bPreloadWindow) |
|
m_bPreloadStartPage = FALSE; |
|
} |
|
else { |
|
m_bStayResident = FALSE; |
|
m_bPreloadWindow = FALSE; |
|
m_bPreloadStartPage = FALSE; |
|
m_bShowNow = FALSE; |
|
} |
|
} |
|
|
|
void CHiddenWnd::OnClose() { |
|
// if we're not staying resident, call the default handler, which will exit |
|
if (!m_bStayResident) { |
|
CFrameWnd::OnClose(); |
|
return; |
|
} |
|
|
|
// make sure the loader hasn't exited without notifying us |
|
HWND hwndLoader = ::FindWindowEx(NULL, NULL, _T("KMeleon Tray Control"), NULL); |
|
if (!hwndLoader) { |
|
CFrameWnd::OnClose(); |
|
return; |
|
} |
|
|
|
// else close all the browser windows and stay resident |
|
CBrowserFrame* pBrowserFrame = NULL; |
|
|
|
POSITION pos = theApp.m_FrameWndLst.GetHeadPosition(); |
|
while( pos != NULL ) { |
|
pBrowserFrame = (CBrowserFrame *) theApp.m_FrameWndLst.GetNext(pos); |
|
if(pBrowserFrame) { |
|
pBrowserFrame->ShowWindow(false); |
|
pBrowserFrame->DestroyWindow(); |
|
} |
|
} |
|
theApp.m_FrameWndLst.RemoveAll(); |
|
StayResident(); |
|
} |
|
|
|
LRESULT CHiddenWnd::OnSetPersist(WPARAM flags, LPARAM lParam) { |
|
BOOL bNewStayResident = (flags & PERSIST_BROWSER); |
|
BOOL bNewPreloadWindow = (flags & PERSIST_WINDOW); |
|
BOOL bNewPreloadStartPage = (flags & PERSIST_STARTPAGE); |
|
|
|
// a little sanity checking |
|
if (bNewPreloadWindow && !bNewStayResident) |
|
bNewPreloadWindow = FALSE; |
|
if (bNewPreloadStartPage && ! bNewPreloadWindow) |
|
bNewPreloadStartPage = FALSE; |
|
|
|
|
|
// update the hidden window with the new settings |
|
if (m_bPersisting) { |
|
|
|
// exit kmeleon if the stay resident flag is cleared |
|
if (!bNewStayResident) |
|
PostMessage(WM_QUIT); |
|
/* |
|
// preload the window |
|
if (bNewPreloadWindow && !m_bPreloadWindow) { |
|
m_pHiddenBrowser = theApp.CreateNewBrowserFrame(nsIWebBrowserChrome::CHROME_ALL, |
|
-1, -1, -1, -1, PR_FALSE); |
|
if (bNewPreloadStartPage) |
|
m_pHiddenBrowser->m_wndBrowserView.LoadHomePage(); |
|
else |
|
m_pHiddenBrowser->m_wndBrowserView.OpenURL("about:blank"); |
|
} |
|
|
|
// don't preload the window |
|
if (!bNewPreloadWindow && m_bPreloadWindow) { |
|
m_pHiddenBrowser->DestroyWindow(); |
|
POSITION pos = theApp.m_FrameWndLst.Find(m_pHiddenBrowser); |
|
theApp.m_FrameWndLst.RemoveAt(pos); |
|
} |
|
|
|
// preload the start page |
|
if (bNewPreloadStartPage && !m_bPreloadStartPage) |
|
m_pHiddenBrowser->m_wndBrowserView.LoadHomePage(); |
|
|
|
// don't preload the start page |
|
if (bNewPreloadWindow && !bNewPreloadStartPage && m_bPreloadStartPage) |
|
m_pHiddenBrowser->m_wndBrowserView.OpenURL("about:blank");*/ |
|
} |
|
|
|
m_bStayResident = bNewStayResident; |
|
m_bPreloadWindow = bNewPreloadWindow; |
|
m_bPreloadStartPage = bNewPreloadStartPage; |
|
|
|
return 0; |
|
} |
|
|
|
LRESULT CHiddenWnd::OnShowBrowser(WPARAM URI, LPARAM lParam) { |
|
USES_CONVERSION; |
|
ShowBrowser(A2T((char*)URI)); |
|
|
|
return 0; |
|
} |
|
|
|
BOOL CHiddenWnd::ShowBrowser(LPTSTR URI, BOOL webapp, BOOL atStart) { |
|
|
|
// if we already have a browser, load home page (if necessary), and show the window |
|
/* if (m_bPersisting && m_bPreloadWindow) { |
|
if (URI && *URI) { |
|
if (*URI == _T('\"')) URI++; |
|
int len = _tcslen(URI); |
|
if (URI[len-1] == _T('\"')) URI[len-1] = 0; |
|
m_pHiddenBrowser->m_wndBrowserView.OpenURL(URI); |
|
} |
|
else { |
|
m_pHiddenBrowser->SetFocus(); |
|
// m_pHiddenBrowser->m_wndUrlBar.MaintainFocus(); |
|
if (!m_bPreloadStartPage) |
|
m_pHiddenBrowser->m_wndBrowserView.LoadHomePage(); |
|
} |
|
|
|
if (theApp.preferences.bMaximized) m_pHiddenBrowser->ShowWindow(SW_MAXIMIZE); |
|
else m_pHiddenBrowser->ShowWindow(SW_SHOW); |
|
m_pHiddenBrowser->SetWindowPos(&wndTop, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW); |
|
} |
|
|
|
// otherwise, just create a new browser |
|
else */{ |
|
|
|
// If we already have a browser and no url, do nothing. |
|
// This is to accomodate the session plugin |
|
if ( atStart && (!URI || !*URI) && theApp.m_pMostRecentBrowserFrame) |
|
return TRUE; |
|
|
|
int openmode = theApp.preferences.GetInt("browser.link.open_external", 2); |
|
CBrowserFrame* browser = NULL; |
|
CBrowserWrapper* wrapper = NULL; |
|
if (webapp) { |
|
PRUint32 chromeMask = nsIWebBrowserChrome::CHROME_WINDOW_RESIZE | |
|
nsIWebBrowserChrome::CHROME_WINDOW_CLOSE | |
|
nsIWebBrowserChrome::CHROME_TITLEBAR | |
|
nsIWebBrowserChrome::CHROME_WINDOW_MIN; |
|
browser = theApp.CreateNewBrowserFrame(chromeMask, FALSE, NULL); |
|
} else if (openmode == 2 || !theApp.m_pMostRecentBrowserFrame ) { |
|
browser = theApp.CreateNewBrowserFrame(); |
|
wrapper = browser->GetActiveView()->GetBrowserWrapper(); |
|
//browser->ShowWindow(SW_SHOW); |
|
} else { |
|
if (theApp.m_pMostRecentBrowserFrame) { |
|
browser = theApp.m_pMostRecentBrowserFrame; |
|
CBrowserGlue* glue = browser->GetActiveView()->GetBrowserGlue(); |
|
if (glue) { |
|
wrapper = glue->ReuseWindow(openmode == 1); |
|
if (!wrapper) browser = theApp.CreateNewBrowserFrame(); //XXXXXX |
|
} |
|
} |
|
} |
|
|
|
if (!wrapper) { |
|
AfxMessageBox(IDS_FAILED_TO_CREATE_BROWSER); |
|
return FALSE; |
|
} |
|
|
|
if (URI && *URI) { |
|
// if the URI is in quotes, strip them off |
|
int len = _tcslen(URI); |
|
if (URI[0] == _T('"')) { |
|
if (URI[len-1] == _T('"')) URI[len-1] = 0; |
|
URI++; |
|
} |
|
//browser->OpenURL(URI); |
|
wrapper->LoadURL(URI); |
|
} |
|
else { |
|
// browser->m_wndUrlBar.MaintainFocus(); |
|
//browser->GetActiveView()->LoadHomePage(); |
|
CString homePage = theApp.preferences.bStartHome ? theApp.preferences.GetString("browser.startup.homepage", _T("about:home")) : _T("about:blank"); |
|
wrapper->LoadURL(homePage); |
|
} |
|
|
|
// Bullshit: the first window in never maximized |
|
if (atStart && theApp.preferences.bMaximized) |
|
browser->ShowWindow(SW_SHOWMAXIMIZED); |
|
else |
|
browser->ShowWindow(SW_SHOW); |
|
browser->SetForegroundWindow(); |
|
} |
|
|
|
m_bPersisting = FALSE; |
|
return TRUE; |
|
} |
|
|
|
int CHiddenWnd::Persisting() { |
|
if (m_bPersisting) |
|
return PERSIST_STATE_PERSISTING; |
|
if (m_bStayResident) |
|
return PERSIST_STATE_ENABLED; |
|
return PERSIST_STATE_DISABLED; |
|
} |
|
|
|
|
|
BOOL CHiddenWnd::StayResident() { |
|
|
|
// if the ShowNow flag is set, we're not really going to stay resident |
|
if (m_bShowNow) { |
|
m_bShowNow = FALSE; |
|
m_bPersisting = FALSE; |
|
|
|
ShowBrowser(); |
|
} |
|
|
|
else { |
|
m_bPersisting = TRUE; |
|
/* |
|
if (m_bPreloadWindow) { |
|
m_pHiddenBrowser = theApp.CreateNewBrowserFrame(nsIWebBrowserChrome::CHROME_ALL, |
|
-1, -1, -1, -1, PR_FALSE); |
|
if (!m_pHiddenBrowser) |
|
return FALSE; |
|
|
|
if (m_bPreloadStartPage) |
|
m_pHiddenBrowser->m_wndBrowserView.LoadHomePage(); |
|
else |
|
m_pHiddenBrowser->m_wndBrowserView.OpenURL("about:blank"); |
|
}*/ |
|
} |
|
|
|
return TRUE; |
|
} |
|
|
|
|
|
|
|
// This is called from another instance of Kmeleon (via the UWM_NEWWINDOW message), |
|
// when no command line paramaters have been specified |
|
LRESULT CHiddenWnd::OnNewWindow(WPARAM wParam, LPARAM lParam) { |
|
ShowBrowser(); |
|
|
|
return 0; |
|
} |
|
|
|
// This is called from another instance of Kmeleon, |
|
// and contains any command line parameters specified |
|
BOOL CHiddenWnd::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) { |
|
|
|
CCmdLine cmdline; |
|
USES_CONVERSION; |
|
cmdline.Initialize((LPSTR) pCopyDataStruct->lpData); |
|
BOOL webapp = cmdline.GetSwitch("-webapp", NULL, TRUE)>=0; |
|
ShowBrowser(A2T(cmdline.m_sCmdLine), webapp); |
|
|
|
return true; |
|
} |
|
|
|
//////////////////////////////////////////////////////////////////////// |
|
// Lame download defering |
|
|
|
#include "UnknownContentTypeHandler.h" |
|
|
|
LRESULT CHiddenWnd::OnDeferShow(WPARAM wParam, LPARAM lParam) |
|
{ |
|
if (!lParam) return 0; |
|
return ((CUnknownContentTypeHandler*)lParam)->Show((CWnd*)wParam); |
|
} |
|
|
|
LRESULT CHiddenWnd::OnDeferSaveAs(WPARAM wParam, LPARAM lParam) |
|
{ |
|
if (!lParam || !wParam) return 0; |
|
CSaveAsHandler* handler = (CSaveAsHandler*)wParam; |
|
|
|
nsresult rv = handler->Save((char*)lParam); |
|
NS_RELEASE(handler); |
|
free((char*)lParam); |
|
return rv; |
|
} |
|
|
|
void CHiddenWnd::OnEndSession(BOOL bEnding) |
|
{ |
|
CFrameWnd::OnEndSession(bEnding); |
|
}
|
|
|