summaryrefslogtreecommitdiffstats
path: root/chrome/browser/frame_util.cc
diff options
context:
space:
mode:
authorbeng@google.com <beng@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-07-30 04:48:39 +0000
committerbeng@google.com <beng@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-07-30 04:48:39 +0000
commitf3e99e3d1dd8d37c7d0e37daa24df7717cd7783b (patch)
tree4d46a6020077f2385a8720882e76158ce878f432 /chrome/browser/frame_util.cc
parent43a973aeb04b5d0ac64bb730cadf0737de8b0cd9 (diff)
downloadchromium_src-f3e99e3d1dd8d37c7d0e37daa24df7717cd7783b.zip
chromium_src-f3e99e3d1dd8d37c7d0e37daa24df7717cd7783b.tar.gz
chromium_src-f3e99e3d1dd8d37c7d0e37daa24df7717cd7783b.tar.bz2
Rename ChromeFrame->BrowserWindow
Move static utility functions to FrameUtil class. B=1294302 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@102 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/frame_util.cc')
-rw-r--r--chrome/browser/frame_util.cc210
1 files changed, 210 insertions, 0 deletions
diff --git a/chrome/browser/frame_util.cc b/chrome/browser/frame_util.cc
new file mode 100644
index 0000000..949d5c7
--- /dev/null
+++ b/chrome/browser/frame_util.cc
@@ -0,0 +1,210 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "chrome/browser/frame_util.h"
+
+#include "base/message_loop.h"
+#include "chrome/app/result_codes.h"
+#include "chrome/browser/app_modal_dialog_queue.h"
+#include "chrome/browser/browser.h"
+#include "chrome/browser/browser_list.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/browser_shutdown.h"
+#include "chrome/browser/profile.h"
+#include "chrome/browser/profile_manager.h"
+#include "chrome/browser/render_view_host.h"
+#include "chrome/browser/simple_vista_frame.h"
+#include "chrome/browser/simple_xp_frame.h"
+#include "chrome/browser/vista_frame.h"
+#include "chrome/browser/xp_frame.h"
+#include "chrome/common/notification_source.h"
+#include "chrome/common/win_util.h"
+#include "chrome/views/focus_manager.h"
+
+// static
+void FrameUtil::RegisterBrowserWindow(BrowserWindow* frame) {
+ HWND h = reinterpret_cast<HWND>(frame->GetPlatformID());
+ win_util::SetWindowUserData(h, frame);
+}
+
+// static
+BrowserWindow* FrameUtil::GetBrowserWindowForHWND(HWND hwnd) {
+ if (hwnd) {
+ std::wstring class_name = win_util::GetClassName(hwnd);
+ if (class_name == VISTA_FRAME_CLASSNAME ||
+ class_name == XP_FRAME_CLASSNAME) {
+ // Need to check for both, as it's possible to have vista and xp frames
+ // at the same time (you can get into this state when connecting via
+ // remote desktop to a vista machine with Chrome already running).
+ return static_cast<BrowserWindow*>(win_util::GetWindowUserData(hwnd));
+ }
+ }
+ return NULL;
+}
+
+// static
+BrowserWindow* FrameUtil::CreateBrowserWindow(const gfx::Rect& bounds,
+ Browser* browser) {
+ BrowserWindow* frame = NULL;
+
+ switch (browser->GetType()) {
+ case BrowserType::TABBED_BROWSER: {
+ bool is_off_the_record = browser->profile()->IsOffTheRecord();
+ if (win_util::ShouldUseVistaFrame())
+ frame = VistaFrame::CreateFrame(bounds, browser, is_off_the_record);
+ else
+ frame = XPFrame::CreateFrame(bounds, browser, is_off_the_record);
+ break;
+ }
+ case BrowserType::APPLICATION:
+ case BrowserType::BROWSER:
+ if (win_util::ShouldUseVistaFrame())
+ frame = SimpleVistaFrame::CreateFrame(bounds, browser);
+ else
+ frame = SimpleXPFrame::CreateFrame(bounds, browser);
+ break;
+ default:
+ NOTREACHED() << "Browser type unknown or not yet implemented";
+ return NULL;
+ }
+ frame->Init();
+ return frame;
+}
+
+// static
+bool FrameUtil::LoadAccelerators(BrowserWindow* frame,
+ HACCEL accelerator_table,
+ ChromeViews::AcceleratorTarget* accelerator_target) {
+ // We have to copy the table to access its contents.
+ int count = CopyAcceleratorTable(accelerator_table, 0, 0);
+ if (count == 0) {
+ // Nothing to do in that case.
+ return false;
+ }
+
+ ACCEL* accelerators = static_cast<ACCEL*>(malloc(sizeof(ACCEL) * count));
+ CopyAcceleratorTable(accelerator_table, accelerators, count);
+
+ HWND hwnd = static_cast<HWND>(frame->GetPlatformID());
+ ChromeViews::FocusManager* focus_manager =
+ ChromeViews::FocusManager::GetFocusManager(hwnd);
+ DCHECK(focus_manager);
+
+ // Let's build our own accelerator table.
+ std::map<ChromeViews::Accelerator, int>* our_accelerators =
+ new std::map<ChromeViews::Accelerator, int>;
+ for (int i = 0; i < count; ++i) {
+ bool alt_down = (accelerators[i].fVirt & FALT) == FALT;
+ bool ctrl_down = (accelerators[i].fVirt & FCONTROL) == FCONTROL;
+ bool shift_down = (accelerators[i].fVirt & FSHIFT) == FSHIFT;
+ ChromeViews::Accelerator accelerator(accelerators[i].key,
+ shift_down, ctrl_down, alt_down);
+ (*our_accelerators)[accelerator] = accelerators[i].cmd;
+
+ // Also register with the focus manager.
+ focus_manager->RegisterAccelerator(accelerator, accelerator_target);
+ }
+
+ // We don't need the Windows accelerator table anymore.
+ free(accelerators);
+
+ // Now set the accelerator table on the frame who becomes the owner.
+ frame->SetAcceleratorTable(our_accelerators);
+
+ return true;
+}
+
+// static
+bool FrameUtil::ActivateAppModalDialog(Browser* browser) {
+ // If another browser is app modal, flash and activate the modal browser.
+ if (BrowserList::IsShowingAppModalDialog()) {
+ if (browser != BrowserList::GetLastActive()) {
+ BrowserList::GetLastActive()->window()->FlashFrame();
+ BrowserList::GetLastActive()->MoveToFront(true);
+ }
+ AppModalDialogQueue::ActivateModalDialog();
+ return true;
+ }
+ return false;
+}
+
+// static
+void FrameUtil::EndSession() {
+ // EndSession is invoked once per frame. Only do something the first time.
+ static bool already_ended = false;
+ if (already_ended)
+ return;
+ already_ended = true;
+
+ browser_shutdown::OnShutdownStarting(browser_shutdown::END_SESSION);
+
+ // Write important data first.
+ g_browser_process->EndSession();
+
+ // Close all the browsers.
+ BrowserList::CloseAllBrowsers(false);
+
+ // Send out notification. This is used during testing so that the test harness
+ // can properly shutdown before we exit.
+ NotificationService::current()->Notify(NOTIFY_SESSION_END,
+ NotificationService::AllSources(),
+ NotificationService::NoDetails());
+
+ // And shutdown.
+ browser_shutdown::Shutdown();
+
+ // At this point the message loop is still running yet we've shut everything
+ // down. If any messages are processed we'll likely crash. Exit now.
+ ExitProcess(ResultCodes::NORMAL_EXIT);
+}
+
+
+// static
+void FrameUtil::NotifyTabsOfThemeChange(Browser* browser) {
+ if (!browser) {
+ NOTREACHED();
+ return;
+ }
+
+ int tab_count = browser->tab_count();
+ for (int tab_index = 0; tab_index < tab_count; ++tab_index) {
+ TabContents* tab_contents = browser->GetTabContentsAt(tab_index);
+ DCHECK(tab_contents != NULL);
+
+ WebContents* web_contents = tab_contents->AsWebContents();
+ if (!web_contents) {
+ continue;
+ }
+
+ RenderViewHost* render_view_host = web_contents->render_view_host();
+ if (render_view_host) {
+ render_view_host->OnThemeChanged();
+ }
+ }
+}