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

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

Issue 10596005: On Windows 8 when a metro application is snapped running desktop application windows are resized as (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/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
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 9 #include <vssym32.h>
10 #include <set> 10 #include <set>
11 11
12 #include "base/command_line.h" 12 #include "base/command_line.h"
13 #include "base/utf_string_conversions.h" 13 #include "base/utf_string_conversions.h"
14 #include "base/win/metro.h" 14 #include "base/win/metro.h"
15 #include "chrome/app/chrome_command_ids.h" 15 #include "chrome/app/chrome_command_ids.h"
16 #include "chrome/browser/lifetime/application_lifetime.h" 16 #include "chrome/browser/lifetime/application_lifetime.h"
17 #include "chrome/browser/search_engines/template_url.h" 17 #include "chrome/browser/search_engines/template_url.h"
18 #include "chrome/browser/search_engines/template_url_service.h" 18 #include "chrome/browser/search_engines/template_url_service.h"
19 #include "chrome/browser/search_engines/template_url_service_factory.h" 19 #include "chrome/browser/search_engines/template_url_service_factory.h"
20 #include "chrome/browser/ui/toolbar/wrench_menu_model.h" 20 #include "chrome/browser/ui/toolbar/wrench_menu_model.h"
21 #include "chrome/browser/ui/views/frame/browser_view.h" 21 #include "chrome/browser/ui/views/frame/browser_view.h"
22 #include "chrome/browser/ui/views/frame/system_menu_model.h" 22 #include "chrome/browser/ui/views/frame/system_menu_model.h"
23 #include "chrome/browser/ui/views/frame/system_menu_model_delegate.h" 23 #include "chrome/browser/ui/views/frame/system_menu_model_delegate.h"
24 #include "chrome/browser/ui/views/tabs/tab_strip.h" 24 #include "chrome/browser/ui/views/tabs/tab_strip.h"
25 #include "chrome/common/chrome_constants.h" 25 #include "chrome/common/chrome_constants.h"
26 #include "chrome/common/chrome_switches.h" 26 #include "chrome/common/chrome_switches.h"
27 #include "content/public/browser/browser_accessibility_state.h" 27 #include "content/public/browser/browser_accessibility_state.h"
28 #include "content/public/browser/page_navigator.h" 28 #include "content/public/browser/page_navigator.h"
29 #include "content/public/browser/web_contents.h" 29 #include "content/public/browser/web_contents.h"
30 #include "content/public/common/page_transition_types.h" 30 #include "content/public/common/page_transition_types.h"
31 #include "googleurl/src/gurl.h" 31 #include "googleurl/src/gurl.h"
32 #include "grit/generated_resources.h" 32 #include "grit/generated_resources.h"
33 #include "grit/theme_resources.h" 33 #include "grit/theme_resources.h"
34 #include "ui/base/l10n/l10n_util.h"
34 #include "ui/base/models/simple_menu_model.h" 35 #include "ui/base/models/simple_menu_model.h"
35 #include "ui/base/resource/resource_bundle.h" 36 #include "ui/base/resource/resource_bundle.h"
36 #include "ui/base/theme_provider.h" 37 #include "ui/base/theme_provider.h"
37 #include "ui/gfx/font.h" 38 #include "ui/gfx/font.h"
38 #include "ui/views/controls/menu/native_menu_win.h" 39 #include "ui/views/controls/menu/native_menu_win.h"
39 #include "ui/views/views_delegate.h" 40 #include "ui/views/views_delegate.h"
40 #include "ui/views/widget/native_widget_win.h" 41 #include "ui/views/widget/native_widget_win.h"
41 #include "ui/views/widget/widget.h" 42 #include "ui/views/widget/widget.h"
42 #include "ui/views/window/non_client_view.h" 43 #include "ui/views/window/non_client_view.h"
43 #include "webkit/glue/window_open_disposition.h" 44 #include "webkit/glue/window_open_disposition.h"
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 89
89 /////////////////////////////////////////////////////////////////////////////// 90 ///////////////////////////////////////////////////////////////////////////////
90 // BrowserFrameWin, public: 91 // BrowserFrameWin, public:
91 92
92 BrowserFrameWin::BrowserFrameWin(BrowserFrame* browser_frame, 93 BrowserFrameWin::BrowserFrameWin(BrowserFrame* browser_frame,
93 BrowserView* browser_view) 94 BrowserView* browser_view)
94 : views::NativeWidgetWin(browser_frame), 95 : views::NativeWidgetWin(browser_frame),
95 browser_view_(browser_view), 96 browser_view_(browser_view),
96 browser_frame_(browser_frame), 97 browser_frame_(browser_frame),
97 system_menu_delegate_(new SystemMenuModelDelegate(browser_view, 98 system_menu_delegate_(new SystemMenuModelDelegate(browser_view,
98 browser_view->browser())) { 99 browser_view->browser())),
100 cached_minimize_button_x_delta_(0) {
99 if (base::win::IsMetroProcess()) { 101 if (base::win::IsMetroProcess()) {
100 browser_view->SetWindowSwitcherButton( 102 browser_view->SetWindowSwitcherButton(
101 MakeWindowSwitcherButton(this, browser_view->IsOffTheRecord())); 103 MakeWindowSwitcherButton(this, browser_view->IsOffTheRecord()));
102 } 104 }
103 } 105 }
104 106
105 BrowserFrameWin::~BrowserFrameWin() { 107 BrowserFrameWin::~BrowserFrameWin() {
106 } 108 }
107 109
108 // static 110 // static
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 void BrowserFrameWin::ShowWithWindowState(ui::WindowShowState show_state) { 245 void BrowserFrameWin::ShowWithWindowState(ui::WindowShowState show_state) {
244 AdjustFrameForImmersiveMode(); 246 AdjustFrameForImmersiveMode();
245 views::NativeWidgetWin::ShowWithWindowState(show_state); 247 views::NativeWidgetWin::ShowWithWindowState(show_state);
246 } 248 }
247 249
248 void BrowserFrameWin::Close() { 250 void BrowserFrameWin::Close() {
249 CloseImmersiveFrame(); 251 CloseImmersiveFrame();
250 views::NativeWidgetWin::Close(); 252 views::NativeWidgetWin::Close();
251 } 253 }
252 254
255 void BrowserFrameWin::OnActivate(UINT action, BOOL minimized, HWND window) {
256 views::NativeWidgetWin::OnActivate(action, minimized, window);
257 if (action != WA_INACTIVE)
sky 2012/06/21 16:38:40 Can you move this before the call to NativeWidgetW
ananta 2012/06/21 17:39:40 Done.
258 CacheMinimizeButtonDelta();
259 }
260
253 //////////////////////////////////////////////////////////////////////////////// 261 ////////////////////////////////////////////////////////////////////////////////
254 // BrowserFrameWin, NativeBrowserFrame implementation: 262 // BrowserFrameWin, NativeBrowserFrame implementation:
255 263
256 views::NativeWidget* BrowserFrameWin::AsNativeWidget() { 264 views::NativeWidget* BrowserFrameWin::AsNativeWidget() {
257 return this; 265 return this;
258 } 266 }
259 267
260 const views::NativeWidget* BrowserFrameWin::AsNativeWidget() const { 268 const views::NativeWidget* BrowserFrameWin::AsNativeWidget() const {
261 return this; 269 return this;
262 } 270 }
263 271
264 void BrowserFrameWin::InitSystemContextMenu() { 272 void BrowserFrameWin::InitSystemContextMenu() {
265 system_menu_contents_.reset(new SystemMenuModel(system_menu_delegate_.get())); 273 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 274 // We add the menu items in reverse order so that insertion_index never needs
267 // to change. 275 // to change.
268 if (browser_view_->IsBrowserTypeNormal()) 276 if (browser_view_->IsBrowserTypeNormal())
269 BuildSystemMenuForBrowserWindow(); 277 BuildSystemMenuForBrowserWindow();
270 else 278 else
271 BuildSystemMenuForAppOrPopupWindow(); 279 BuildSystemMenuForAppOrPopupWindow();
272 system_menu_.reset( 280 system_menu_.reset(
273 new views::NativeMenuWin(system_menu_contents_.get(), GetNativeWindow())); 281 new views::NativeMenuWin(system_menu_contents_.get(), GetNativeWindow()));
274 system_menu_->Rebuild(); 282 system_menu_->Rebuild();
275 } 283 }
276 284
277 int BrowserFrameWin::GetMinimizeButtonOffset() const { 285 int BrowserFrameWin::GetMinimizeButtonOffset() const {
286 // The WM_GETTITLEBARINFOEX message can fail if we are not active/visible.
278 TITLEBARINFOEX titlebar_info; 287 TITLEBARINFOEX titlebar_info;
279 titlebar_info.cbSize = sizeof(TITLEBARINFOEX); 288 titlebar_info.cbSize = sizeof(TITLEBARINFOEX);
280 SendMessage(GetNativeView(), WM_GETTITLEBARINFOEX, 0, (WPARAM)&titlebar_info); 289 BOOL ret = SendMessage(GetNativeView(), WM_GETTITLEBARINFOEX, 0,
sky 2012/06/21 16:38:40 If this does fail, won't titlebar_info contain gar
ananta 2012/06/21 17:39:40 Unfortunately SendMessage always returns success.
290 reinterpret_cast<WPARAM>(&titlebar_info));
281 291
282 CPoint minimize_button_corner(titlebar_info.rgrect[2].left, 292 CPoint minimize_button_corner(titlebar_info.rgrect[2].left,
283 titlebar_info.rgrect[2].top); 293 titlebar_info.rgrect[2].top);
284 MapWindowPoints(HWND_DESKTOP, GetNativeView(), &minimize_button_corner, 1); 294 MapWindowPoints(HWND_DESKTOP, GetNativeView(), &minimize_button_corner, 1);
285 295
286 return minimize_button_corner.x; 296 if (minimize_button_corner.x)
297 return minimize_button_corner.x;
298
299 DCHECK(cached_minimize_button_x_delta_);
300
301 RECT client_rect = {0};
302 GetClientRect(&client_rect);
303
304 if (base::i18n::IsRTL()) {
sky 2012/06/21 16:38:40 no {}
ananta 2012/06/21 17:39:40 Done.
305 return cached_minimize_button_x_delta_;
306 } else {
307 return client_rect.right - cached_minimize_button_x_delta_;
308 }
287 } 309 }
288 310
289 void BrowserFrameWin::TabStripDisplayModeChanged() { 311 void BrowserFrameWin::TabStripDisplayModeChanged() {
290 UpdateDWMFrame(); 312 UpdateDWMFrame();
291 } 313 }
292 314
293 void BrowserFrameWin::ButtonPressed(views::Button* sender, 315 void BrowserFrameWin::ButtonPressed(views::Button* sender,
294 const views::Event& event) { 316 const views::Event& event) {
295 HMODULE metro = base::win::GetMetroModule(); 317 HMODULE metro = base::win::GetMetroModule();
296 if (!metro) 318 if (!metro)
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 current_tab_info->title = base::win::LocalAllocAndCopyString( 520 current_tab_info->title = base::win::LocalAllocAndCopyString(
499 browser->GetWindowTitleForCurrentTab()); 521 browser->GetWindowTitleForCurrentTab());
500 522
501 WebContents* current_tab = browser->GetActiveWebContents(); 523 WebContents* current_tab = browser->GetActiveWebContents();
502 DCHECK(current_tab); 524 DCHECK(current_tab);
503 525
504 current_tab_info->url = base::win::LocalAllocAndCopyString( 526 current_tab_info->url = base::win::LocalAllocAndCopyString(
505 UTF8ToWide(current_tab->GetURL().spec())); 527 UTF8ToWide(current_tab->GetURL().spec()));
506 } 528 }
507 529
530 void BrowserFrameWin::CacheMinimizeButtonDelta() {
531 int minimize_offset = GetMinimizeButtonOffset();
532 if (!minimize_offset)
533 return;
534
535 RECT rect = {0};
536 GetClientRect(&rect);
537 // Calculate and cache the value of the minimize button delta, i.e. the
538 // offset to be applied to the left or right edge of the client rect
539 // depending on whether the language is RTL or not.
540 // This cached value is only used if the WM_GETTITLEBARINFOEX message fails
541 // to get the offset of the minimize button.
542 if (base::i18n::IsRTL()) {
sky 2012/06/21 16:38:40 no {}
ananta 2012/06/21 17:39:40 Done.
543 cached_minimize_button_x_delta_ = minimize_offset;
544 } else {
545 cached_minimize_button_x_delta_ = rect.right - minimize_offset;
546 }
547 }
508 548
509 //////////////////////////////////////////////////////////////////////////////// 549 ////////////////////////////////////////////////////////////////////////////////
510 // BrowserFrame, public: 550 // BrowserFrame, public:
511 551
512 // static 552 // static
513 const gfx::Font& BrowserFrame::GetTitleFont() { 553 const gfx::Font& BrowserFrame::GetTitleFont() {
514 static gfx::Font* title_font = 554 static gfx::Font* title_font =
515 new gfx::Font(views::NativeWidgetWin::GetWindowTitleFont()); 555 new gfx::Font(views::NativeWidgetWin::GetWindowTitleFont());
516 return *title_font; 556 return *title_font;
517 } 557 }
518 558
519 //////////////////////////////////////////////////////////////////////////////// 559 ////////////////////////////////////////////////////////////////////////////////
520 // NativeBrowserFrame, public: 560 // NativeBrowserFrame, public:
521 561
522 // static 562 // static
523 NativeBrowserFrame* NativeBrowserFrame::CreateNativeBrowserFrame( 563 NativeBrowserFrame* NativeBrowserFrame::CreateNativeBrowserFrame(
524 BrowserFrame* browser_frame, 564 BrowserFrame* browser_frame,
525 BrowserView* browser_view) { 565 BrowserView* browser_view) {
526 return new BrowserFrameWin(browser_frame, browser_view); 566 return new BrowserFrameWin(browser_frame, browser_view);
527 } 567 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698