Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(177)

Side by Side Diff: chrome/browser/ui/views/frame/browser_frame_win.cc

Issue 10638016: Merge 143447 - On Windows 8 when a metro application is snapped running desktop application windows… (Closed) Base URL: svn://svn.chromium.org/chrome/branches/1180/src/
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/ui/views/frame/browser_frame_win.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/views/frame/browser_frame_win.h" 5 #include "chrome/browser/ui/views/frame/browser_frame_win.h"
6 6
7 #include <dwmapi.h> 7 #include <dwmapi.h>
8 #include <shellapi.h> 8 #include <shellapi.h>
9
10 #include <set> 9 #include <set>
11 10
12 #include "base/command_line.h" 11 #include "base/command_line.h"
13 #include "base/utf_string_conversions.h" 12 #include "base/utf_string_conversions.h"
14 #include "base/win/metro.h" 13 #include "base/win/metro.h"
15 #include "chrome/app/chrome_command_ids.h" 14 #include "chrome/app/chrome_command_ids.h"
16 #include "chrome/browser/lifetime/application_lifetime.h" 15 #include "chrome/browser/lifetime/application_lifetime.h"
17 #include "chrome/browser/search_engines/template_url.h" 16 #include "chrome/browser/search_engines/template_url.h"
18 #include "chrome/browser/search_engines/template_url_service.h" 17 #include "chrome/browser/search_engines/template_url_service.h"
19 #include "chrome/browser/search_engines/template_url_service_factory.h" 18 #include "chrome/browser/search_engines/template_url_service_factory.h"
20 #include "chrome/browser/ui/toolbar/wrench_menu_model.h" 19 #include "chrome/browser/ui/toolbar/wrench_menu_model.h"
21 #include "chrome/browser/ui/views/frame/browser_view.h" 20 #include "chrome/browser/ui/views/frame/browser_view.h"
22 #include "chrome/browser/ui/views/frame/system_menu_model.h" 21 #include "chrome/browser/ui/views/frame/system_menu_model.h"
23 #include "chrome/browser/ui/views/frame/system_menu_model_delegate.h" 22 #include "chrome/browser/ui/views/frame/system_menu_model_delegate.h"
24 #include "chrome/browser/ui/views/tabs/tab_strip.h" 23 #include "chrome/browser/ui/views/tabs/tab_strip.h"
25 #include "chrome/common/chrome_constants.h" 24 #include "chrome/common/chrome_constants.h"
26 #include "chrome/common/chrome_switches.h" 25 #include "chrome/common/chrome_switches.h"
27 #include "content/public/browser/browser_accessibility_state.h" 26 #include "content/public/browser/browser_accessibility_state.h"
28 #include "content/public/browser/page_navigator.h" 27 #include "content/public/browser/page_navigator.h"
29 #include "content/public/browser/web_contents.h" 28 #include "content/public/browser/web_contents.h"
30 #include "content/public/common/page_transition_types.h" 29 #include "content/public/common/page_transition_types.h"
31 #include "googleurl/src/gurl.h" 30 #include "googleurl/src/gurl.h"
32 #include "grit/generated_resources.h" 31 #include "grit/generated_resources.h"
33 #include "grit/theme_resources.h" 32 #include "grit/theme_resources.h"
33 #include "ui/base/l10n/l10n_util.h"
34 #include "ui/base/models/simple_menu_model.h" 34 #include "ui/base/models/simple_menu_model.h"
35 #include "ui/base/resource/resource_bundle.h" 35 #include "ui/base/resource/resource_bundle.h"
36 #include "ui/base/theme_provider.h" 36 #include "ui/base/theme_provider.h"
37 #include "ui/gfx/font.h" 37 #include "ui/gfx/font.h"
38 #include "ui/views/controls/menu/native_menu_win.h" 38 #include "ui/views/controls/menu/native_menu_win.h"
39 #include "ui/views/views_delegate.h" 39 #include "ui/views/views_delegate.h"
40 #include "ui/views/widget/native_widget_win.h" 40 #include "ui/views/widget/native_widget_win.h"
41 #include "ui/views/widget/widget.h" 41 #include "ui/views/widget/widget.h"
42 #include "ui/views/window/non_client_view.h" 42 #include "ui/views/window/non_client_view.h"
43 #include "webkit/glue/window_open_disposition.h" 43 #include "webkit/glue/window_open_disposition.h"
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 switcher_button->SetImage( 79 switcher_button->SetImage(
80 views::ImageButton::BS_HOT, 80 views::ImageButton::BS_HOT,
81 ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( 81 ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
82 is_off_the_record ? IDR_INCOGNITO_SWITCH_OFF : 82 is_off_the_record ? IDR_INCOGNITO_SWITCH_OFF :
83 IDR_INCOGNITO_SWITCH_ON)); 83 IDR_INCOGNITO_SWITCH_ON));
84 switcher_button->SetImageAlignment(views::ImageButton::ALIGN_CENTER, 84 switcher_button->SetImageAlignment(views::ImageButton::ALIGN_CENTER,
85 views::ImageButton::ALIGN_MIDDLE); 85 views::ImageButton::ALIGN_MIDDLE);
86 return switcher_button; 86 return switcher_button;
87 } 87 }
88 88
89 static int GetMinimizeButtonOffsetForWindow(gfx::NativeView window) {
90 // The WM_GETTITLEBARINFOEX message can fail if we are not active/visible.
91 TITLEBARINFOEX titlebar_info = {0};
92 titlebar_info.cbSize = sizeof(TITLEBARINFOEX);
93 SendMessage(window, WM_GETTITLEBARINFOEX, 0,
94 reinterpret_cast<WPARAM>(&titlebar_info));
95
96 CPoint minimize_button_corner(titlebar_info.rgrect[2].left,
97 titlebar_info.rgrect[2].top);
98 MapWindowPoints(HWND_DESKTOP, window, &minimize_button_corner, 1);
99 return minimize_button_corner.x;
100 }
101
102
89 /////////////////////////////////////////////////////////////////////////////// 103 ///////////////////////////////////////////////////////////////////////////////
90 // BrowserFrameWin, public: 104 // BrowserFrameWin, public:
91 105
92 BrowserFrameWin::BrowserFrameWin(BrowserFrame* browser_frame, 106 BrowserFrameWin::BrowserFrameWin(BrowserFrame* browser_frame,
93 BrowserView* browser_view) 107 BrowserView* browser_view)
94 : views::NativeWidgetWin(browser_frame), 108 : views::NativeWidgetWin(browser_frame),
95 browser_view_(browser_view), 109 browser_view_(browser_view),
96 browser_frame_(browser_frame), 110 browser_frame_(browser_frame),
97 system_menu_delegate_(new SystemMenuModelDelegate(browser_view, 111 system_menu_delegate_(new SystemMenuModelDelegate(browser_view,
98 browser_view->browser())) { 112 browser_view->browser())),
113 cached_minimize_button_x_delta_(0) {
99 if (base::win::IsMetroProcess()) { 114 if (base::win::IsMetroProcess()) {
100 browser_view->SetWindowSwitcherButton( 115 browser_view->SetWindowSwitcherButton(
101 MakeWindowSwitcherButton(this, browser_view->IsOffTheRecord())); 116 MakeWindowSwitcherButton(this, browser_view->IsOffTheRecord()));
102 } 117 }
103 } 118 }
104 119
105 BrowserFrameWin::~BrowserFrameWin() { 120 BrowserFrameWin::~BrowserFrameWin() {
106 } 121 }
107 122
108 // static 123 // static
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 void BrowserFrameWin::ShowWithWindowState(ui::WindowShowState show_state) { 258 void BrowserFrameWin::ShowWithWindowState(ui::WindowShowState show_state) {
244 AdjustFrameForImmersiveMode(); 259 AdjustFrameForImmersiveMode();
245 views::NativeWidgetWin::ShowWithWindowState(show_state); 260 views::NativeWidgetWin::ShowWithWindowState(show_state);
246 } 261 }
247 262
248 void BrowserFrameWin::Close() { 263 void BrowserFrameWin::Close() {
249 CloseImmersiveFrame(); 264 CloseImmersiveFrame();
250 views::NativeWidgetWin::Close(); 265 views::NativeWidgetWin::Close();
251 } 266 }
252 267
268 void BrowserFrameWin::OnActivate(UINT action, BOOL minimized, HWND window) {
269 if (action != WA_INACTIVE)
270 CacheMinimizeButtonDelta();
271 views::NativeWidgetWin::OnActivate(action, minimized, window);
272 }
273
253 //////////////////////////////////////////////////////////////////////////////// 274 ////////////////////////////////////////////////////////////////////////////////
254 // BrowserFrameWin, NativeBrowserFrame implementation: 275 // BrowserFrameWin, NativeBrowserFrame implementation:
255 276
256 views::NativeWidget* BrowserFrameWin::AsNativeWidget() { 277 views::NativeWidget* BrowserFrameWin::AsNativeWidget() {
257 return this; 278 return this;
258 } 279 }
259 280
260 const views::NativeWidget* BrowserFrameWin::AsNativeWidget() const { 281 const views::NativeWidget* BrowserFrameWin::AsNativeWidget() const {
261 return this; 282 return this;
262 } 283 }
263 284
264 void BrowserFrameWin::InitSystemContextMenu() { 285 void BrowserFrameWin::InitSystemContextMenu() {
265 system_menu_contents_.reset(new SystemMenuModel(system_menu_delegate_.get())); 286 system_menu_contents_.reset(new SystemMenuModel(system_menu_delegate_.get()));
266 // We add the menu items in reverse order so that insertion_index never needs 287 // We add the menu items in reverse order so that insertion_index never needs
267 // to change. 288 // to change.
268 if (browser_view_->IsBrowserTypeNormal()) 289 if (browser_view_->IsBrowserTypeNormal())
269 BuildSystemMenuForBrowserWindow(); 290 BuildSystemMenuForBrowserWindow();
270 else 291 else
271 BuildSystemMenuForAppOrPopupWindow(); 292 BuildSystemMenuForAppOrPopupWindow();
272 system_menu_.reset( 293 system_menu_.reset(
273 new views::NativeMenuWin(system_menu_contents_.get(), GetNativeWindow())); 294 new views::NativeMenuWin(system_menu_contents_.get(), GetNativeWindow()));
274 system_menu_->Rebuild(); 295 system_menu_->Rebuild();
275 } 296 }
276 297
277 int BrowserFrameWin::GetMinimizeButtonOffset() const { 298 int BrowserFrameWin::GetMinimizeButtonOffset() const {
278 TITLEBARINFOEX titlebar_info; 299 int minimize_button_offset =
279 titlebar_info.cbSize = sizeof(TITLEBARINFOEX); 300 GetMinimizeButtonOffsetForWindow(GetNativeView());
280 SendMessage(GetNativeView(), WM_GETTITLEBARINFOEX, 0, (WPARAM)&titlebar_info);
281 301
282 CPoint minimize_button_corner(titlebar_info.rgrect[2].left, 302 if (minimize_button_offset)
283 titlebar_info.rgrect[2].top); 303 return minimize_button_offset;
284 MapWindowPoints(HWND_DESKTOP, GetNativeView(), &minimize_button_corner, 1);
285 304
286 return minimize_button_corner.x; 305 // If we fail to get the minimize button offset via the WM_GETTITLEBARINFOEX
306 // message then calculate and return this via the
307 // cached_minimize_button_x_delta_ member value. Please see
308 // CacheMinimizeButtonDelta() for more details.
309 DCHECK(cached_minimize_button_x_delta_);
310
311 RECT client_rect = {0};
312 GetClientRect(&client_rect);
313
314 if (base::i18n::IsRTL())
315 return cached_minimize_button_x_delta_;
316 else
317 return client_rect.right - cached_minimize_button_x_delta_;
287 } 318 }
288 319
289 void BrowserFrameWin::TabStripDisplayModeChanged() { 320 void BrowserFrameWin::TabStripDisplayModeChanged() {
290 UpdateDWMFrame(); 321 UpdateDWMFrame();
291 } 322 }
292 323
293 void BrowserFrameWin::ButtonPressed(views::Button* sender, 324 void BrowserFrameWin::ButtonPressed(views::Button* sender,
294 const views::Event& event) { 325 const views::Event& event) {
295 HMODULE metro = base::win::GetMetroModule(); 326 HMODULE metro = base::win::GetMetroModule();
296 if (!metro) 327 if (!metro)
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 current_tab_info->title = base::win::LocalAllocAndCopyString( 529 current_tab_info->title = base::win::LocalAllocAndCopyString(
499 browser->GetWindowTitleForCurrentTab()); 530 browser->GetWindowTitleForCurrentTab());
500 531
501 WebContents* current_tab = browser->GetActiveWebContents(); 532 WebContents* current_tab = browser->GetActiveWebContents();
502 DCHECK(current_tab); 533 DCHECK(current_tab);
503 534
504 current_tab_info->url = base::win::LocalAllocAndCopyString( 535 current_tab_info->url = base::win::LocalAllocAndCopyString(
505 UTF8ToWide(current_tab->GetURL().spec())); 536 UTF8ToWide(current_tab->GetURL().spec()));
506 } 537 }
507 538
539 void BrowserFrameWin::CacheMinimizeButtonDelta() {
540 int minimize_offset = GetMinimizeButtonOffsetForWindow(GetNativeView());
541 if (!minimize_offset)
542 return;
543
544 RECT rect = {0};
545 GetClientRect(&rect);
546 // Calculate and cache the value of the minimize button delta, i.e. the
547 // offset to be applied to the left or right edge of the client rect
548 // depending on whether the language is RTL or not.
549 // This cached value is only used if the WM_GETTITLEBARINFOEX message fails
550 // to get the offset of the minimize button.
551 if (base::i18n::IsRTL())
552 cached_minimize_button_x_delta_ = minimize_offset;
553 else
554 cached_minimize_button_x_delta_ = rect.right - minimize_offset;
555 }
508 556
509 //////////////////////////////////////////////////////////////////////////////// 557 ////////////////////////////////////////////////////////////////////////////////
510 // BrowserFrame, public: 558 // BrowserFrame, public:
511 559
512 // static 560 // static
513 const gfx::Font& BrowserFrame::GetTitleFont() { 561 const gfx::Font& BrowserFrame::GetTitleFont() {
514 static gfx::Font* title_font = 562 static gfx::Font* title_font =
515 new gfx::Font(views::NativeWidgetWin::GetWindowTitleFont()); 563 new gfx::Font(views::NativeWidgetWin::GetWindowTitleFont());
516 return *title_font; 564 return *title_font;
517 } 565 }
518 566
519 //////////////////////////////////////////////////////////////////////////////// 567 ////////////////////////////////////////////////////////////////////////////////
520 // NativeBrowserFrame, public: 568 // NativeBrowserFrame, public:
521 569
522 // static 570 // static
523 NativeBrowserFrame* NativeBrowserFrame::CreateNativeBrowserFrame( 571 NativeBrowserFrame* NativeBrowserFrame::CreateNativeBrowserFrame(
524 BrowserFrame* browser_frame, 572 BrowserFrame* browser_frame,
525 BrowserView* browser_view) { 573 BrowserView* browser_view) {
526 return new BrowserFrameWin(browser_frame, browser_view); 574 return new BrowserFrameWin(browser_frame, browser_view);
527 } 575 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/frame/browser_frame_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698