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

Side by Side Diff: chrome/views/window.cc

Issue 27317: Support DWM switching.... (Closed) Base URL: svn://chrome-svn.corp.google.com/chrome/trunk/src/
Patch Set: '' Created 11 years, 9 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
« no previous file with comments | « chrome/views/window.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) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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/views/window.h" 5 #include "chrome/views/window.h"
6 6
7 #include "base/win_util.h" 7 #include "base/win_util.h"
8 #include "chrome/app/chrome_dll_resource.h" 8 #include "chrome/app/chrome_dll_resource.h"
9 #include "chrome/common/gfx/chrome_font.h" 9 #include "chrome/common/gfx/chrome_font.h"
10 #include "chrome/common/gfx/icon_util.h" 10 #include "chrome/common/gfx/icon_util.h"
11 #include "chrome/common/gfx/path.h" 11 #include "chrome/common/gfx/path.h"
12 #include "chrome/common/l10n_util.h" 12 #include "chrome/common/l10n_util.h"
13 #include "chrome/common/notification_service.h" 13 #include "chrome/common/notification_service.h"
14 #include "chrome/common/pref_service.h" 14 #include "chrome/common/pref_service.h"
15 #include "chrome/common/resource_bundle.h" 15 #include "chrome/common/resource_bundle.h"
16 #include "chrome/common/win_util.h" 16 #include "chrome/common/win_util.h"
17 #include "chrome/views/client_view.h" 17 #include "chrome/views/client_view.h"
18 #include "chrome/views/custom_frame_window.h" 18 #include "chrome/views/custom_frame_view.h"
19 #include "chrome/views/default_non_client_view.h" 19 #include "chrome/views/native_frame_view.h"
20 #include "chrome/views/non_client_view.h" 20 #include "chrome/views/non_client_view.h"
21 #include "chrome/views/root_view.h" 21 #include "chrome/views/root_view.h"
22 #include "chrome/views/window_delegate.h" 22 #include "chrome/views/window_delegate.h"
23 #include "grit/generated_resources.h" 23 #include "grit/generated_resources.h"
24 24
25 namespace views { 25 namespace views {
26 26
27 // A scoping class that prevents a window from being able to redraw in response 27 // A scoping class that prevents a window from being able to redraw in response
28 // to invalidations that may occur within it for the lifetime of the object. 28 // to invalidations that may occur within it for the lifetime of the object.
29 // 29 //
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 //////////////////////////////////////////////////////////////////////////////// 74 ////////////////////////////////////////////////////////////////////////////////
75 // Window, public: 75 // Window, public:
76 76
77 Window::~Window() { 77 Window::~Window() {
78 } 78 }
79 79
80 // static 80 // static
81 Window* Window::CreateChromeWindow(HWND parent, 81 Window* Window::CreateChromeWindow(HWND parent,
82 const gfx::Rect& bounds, 82 const gfx::Rect& bounds,
83 WindowDelegate* window_delegate) { 83 WindowDelegate* window_delegate) {
84 Window* window = NULL; 84 Window* window = new Window(window_delegate);
85 if (win_util::ShouldUseVistaFrame()) { 85 window->non_client_view_->SetFrameView(window->CreateFrameViewForWindow());
86 window = new Window(window_delegate);
87 } else {
88 window = new CustomFrameWindow(window_delegate);
89 }
90 window->Init(parent, bounds); 86 window->Init(parent, bounds);
91 return window; 87 return window;
92 } 88 }
93 89
94 gfx::Size Window::CalculateMaximumSize() const { 90 gfx::Size Window::CalculateMaximumSize() const {
95 // If this is a top level window, the maximum size is the size of the working 91 // If this is a top level window, the maximum size is the size of the working
96 // rect of the display the window is on, less padding. If this is a child 92 // rect of the display the window is on, less padding. If this is a child
97 // (constrained) window, the maximum size of this Window are the bounds of the 93 // (constrained) window, the maximum size of this Window are the bounds of the
98 // parent window, less padding. 94 // parent window, less padding.
99 DCHECK(GetHWND()) << "Cannot calculate maximum size before Init() is called"; 95 DCHECK(GetHWND()) << "Cannot calculate maximum size before Init() is called";
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 EnableMenuItem(GetSystemMenu(GetHWND(), false), 193 EnableMenuItem(GetSystemMenu(GetHWND(), false),
198 SC_CLOSE, enable ? MF_ENABLED : MF_GRAYED); 194 SC_CLOSE, enable ? MF_ENABLED : MF_GRAYED);
199 195
200 // Let the window know the frame changed. 196 // Let the window know the frame changed.
201 SetWindowPos(NULL, 0, 0, 0, 0, 197 SetWindowPos(NULL, 0, 0, 0, 0,
202 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOCOPYBITS | 198 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOCOPYBITS |
203 SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOREPOSITION | 199 SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOREPOSITION |
204 SWP_NOSENDCHANGING | SWP_NOSIZE | SWP_NOZORDER); 200 SWP_NOSENDCHANGING | SWP_NOSIZE | SWP_NOZORDER);
205 } 201 }
206 202
207 void Window::DisableInactiveRendering(bool disable) { 203 void Window::DisableInactiveRendering() {
208 disable_inactive_rendering_ = disable; 204 disable_inactive_rendering_ = true;
209 if (!disable_inactive_rendering_) 205 non_client_view_->DisableInactiveRendering(disable_inactive_rendering_);
210 DefWindowProc(GetHWND(), WM_NCACTIVATE, FALSE, 0);
211
212 if (!non_client_view_->UseNativeFrame()) {
213 // If the non-client view is rendering its own frame, we need to forcibly
214 // schedule a paint so it updates when we unset this mode.
215 non_client_view_->set_paint_as_active(disable);
216 if (!disable)
217 non_client_view_->SchedulePaint();
218 }
219 } 206 }
220 207
221 void Window::UpdateWindowTitle() { 208 void Window::UpdateWindowTitle() {
222 // If the non-client view is rendering its own title, it'll need to relayout 209 // If the non-client view is rendering its own title, it'll need to relayout
223 // now. 210 // now.
224 non_client_view_->Layout(); 211 non_client_view_->Layout();
225 212
226 // Update the native frame's text. We do this regardless of whether or not 213 // Update the native frame's text. We do this regardless of whether or not
227 // the native frame is being used, since this also updates the taskbar, etc. 214 // the native frame is being used, since this also updates the taskbar, etc.
228 std::wstring window_title = window_delegate_->GetWindowTitle(); 215 std::wstring window_title = window_delegate_->GetWindowTitle();
(...skipping 25 matching lines...) Expand all
254 if (old_icon) 241 if (old_icon)
255 DestroyIcon(old_icon); 242 DestroyIcon(old_icon);
256 } 243 }
257 } 244 }
258 245
259 void Window::ExecuteSystemMenuCommand(int command) { 246 void Window::ExecuteSystemMenuCommand(int command) {
260 if (command) 247 if (command)
261 SendMessage(GetHWND(), WM_SYSCOMMAND, command, 0); 248 SendMessage(GetHWND(), WM_SYSCOMMAND, command, 0);
262 } 249 }
263 250
251 gfx::Rect Window::GetWindowBoundsForClientBounds(
252 const gfx::Rect& client_bounds) {
253 return non_client_view_->GetWindowBoundsForClientBounds(client_bounds);
254 }
255
264 // static 256 // static
265 int Window::GetLocalizedContentsWidth(int col_resource_id) { 257 int Window::GetLocalizedContentsWidth(int col_resource_id) {
266 double chars = _wtof(l10n_util::GetString(col_resource_id).c_str()); 258 double chars = _wtof(l10n_util::GetString(col_resource_id).c_str());
267 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 259 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
268 ChromeFont font = rb.GetFont(ResourceBundle::BaseFont); 260 ChromeFont font = rb.GetFont(ResourceBundle::BaseFont);
269 int width = font.GetExpectedTextWidth(static_cast<int>(chars)); 261 int width = font.GetExpectedTextWidth(static_cast<int>(chars));
270 DCHECK(width > 0); 262 DCHECK(width > 0);
271 return width; 263 return width;
272 } 264 }
273 265
(...skipping 27 matching lines...) Expand all
301 Close(); 293 Close();
302 } 294 }
303 295
304 /////////////////////////////////////////////////////////////////////////////// 296 ///////////////////////////////////////////////////////////////////////////////
305 // Window, protected: 297 // Window, protected:
306 298
307 Window::Window(WindowDelegate* window_delegate) 299 Window::Window(WindowDelegate* window_delegate)
308 : WidgetWin(), 300 : WidgetWin(),
309 focus_on_creation_(true), 301 focus_on_creation_(true),
310 window_delegate_(window_delegate), 302 window_delegate_(window_delegate),
311 non_client_view_(new NonClientView), 303 non_client_view_(new NonClientView(this)),
312 owning_hwnd_(NULL), 304 owning_hwnd_(NULL),
313 minimum_size_(100, 100), 305 minimum_size_(100, 100),
314 is_modal_(false), 306 is_modal_(false),
315 restored_enabled_(false), 307 restored_enabled_(false),
316 is_always_on_top_(false), 308 is_always_on_top_(false),
317 window_closed_(false), 309 window_closed_(false),
318 disable_inactive_rendering_(false), 310 disable_inactive_rendering_(false),
319 is_active_(false), 311 is_active_(false),
320 lock_updates_(false), 312 lock_updates_(false),
321 saved_window_style_(0), 313 saved_window_style_(0),
(...skipping 19 matching lines...) Expand all
341 is_always_on_top_ = window_delegate_->IsAlwaysOnTop(); 333 is_always_on_top_ = window_delegate_->IsAlwaysOnTop();
342 334
343 if (window_style() == 0) 335 if (window_style() == 0)
344 set_window_style(CalculateWindowStyle()); 336 set_window_style(CalculateWindowStyle());
345 if (window_ex_style() == 0) 337 if (window_ex_style() == 0)
346 set_window_ex_style(CalculateWindowExStyle()); 338 set_window_ex_style(CalculateWindowExStyle());
347 339
348 WidgetWin::Init(parent, bounds, true); 340 WidgetWin::Init(parent, bounds, true);
349 win_util::SetWindowUserData(GetHWND(), this); 341 win_util::SetWindowUserData(GetHWND(), this);
350 342
351 std::wstring window_title = window_delegate_->GetWindowTitle(); 343 // Create the ClientView, add it to the NonClientView and add the
352 std::wstring localized_text; 344 // NonClientView to the RootView. This will cause everything to be parented.
353 if (l10n_util::AdjustStringForLocaleDirection(window_title, &localized_text)) 345 non_client_view_->set_client_view(window_delegate_->CreateClientView(this));
354 window_title.assign(localized_text); 346 WidgetWin::SetContentsView(non_client_view_);
355 SetWindowText(GetHWND(), window_title.c_str());
356 347
357 SetClientView(window_delegate_->CreateClientView(this)); 348 UpdateWindowTitle();
349
358 SetInitialBounds(bounds); 350 SetInitialBounds(bounds);
359 InitAlwaysOnTopState(); 351 InitAlwaysOnTopState();
360 352
361 if (!IsAppWindow()) { 353 if (!IsAppWindow()) {
362 notification_registrar_.Add( 354 notification_registrar_.Add(
363 this, 355 this,
364 NotificationType::ALL_APPWINDOWS_CLOSED, 356 NotificationType::ALL_APPWINDOWS_CLOSED,
365 NotificationService::AllSources()); 357 NotificationService::AllSources());
366 } 358 }
367 359
368 ResetWindowRegion(); 360 ResetWindowRegion(false);
361 }
362
363 NonClientFrameView* Window::CreateFrameViewForWindow() {
364 if (non_client_view_->UseNativeFrame())
365 return new NativeFrameView(this);
366 return new CustomFrameView(this);
367 }
368
369 void Window::UpdateFrameAfterFrameChange() {
370 // We've either gained or lost a custom window region, so reset it now.
371 ResetWindowRegion(true);
369 } 372 }
370 373
371 void Window::SizeWindowToDefault() { 374 void Window::SizeWindowToDefault() {
372 // CenterAndSizeWindow adjusts the window size to accommodate the non-client 375 // CenterAndSizeWindow adjusts the window size to accommodate the non-client
373 // area if we're using a native frame. 376 // area if we're using a native frame.
374 win_util::CenterAndSizeWindow(owning_window(), GetHWND(), 377 win_util::CenterAndSizeWindow(owning_window(), GetHWND(),
375 non_client_view_->GetPreferredSize().ToSIZE(), 378 non_client_view_->GetPreferredSize().ToSIZE(),
376 non_client_view_->UseNativeFrame()); 379 non_client_view_->UseNativeFrame());
377 } 380 }
378 381
(...skipping 11 matching lines...) Expand all
390 } 393 }
391 394
392 /////////////////////////////////////////////////////////////////////////////// 395 ///////////////////////////////////////////////////////////////////////////////
393 // Window, WidgetWin overrides: 396 // Window, WidgetWin overrides:
394 397
395 void Window::OnActivate(UINT action, BOOL minimized, HWND window) { 398 void Window::OnActivate(UINT action, BOOL minimized, HWND window) {
396 if (action == WA_INACTIVE) 399 if (action == WA_INACTIVE)
397 SaveWindowPosition(); 400 SaveWindowPosition();
398 } 401 }
399 402
403 void Window::OnActivateApp(BOOL active, DWORD thread_id) {
404 if (!active && thread_id != GetCurrentThreadId()) {
405 // Another application was activated, we should reset any state that
406 // disables inactive rendering now.
407 disable_inactive_rendering_ = false;
408 non_client_view_->DisableInactiveRendering(false);
409 }
410 }
411
400 LRESULT Window::OnAppCommand(HWND window, short app_command, WORD device, 412 LRESULT Window::OnAppCommand(HWND window, short app_command, WORD device,
401 int keystate) { 413 int keystate) {
402 // We treat APPCOMMAND ids as an extension of our command namespace, and just 414 // We treat APPCOMMAND ids as an extension of our command namespace, and just
403 // let the delegate figure out what to do... 415 // let the delegate figure out what to do...
404 if (!window_delegate_->ExecuteWindowsCommand(app_command)) 416 if (!window_delegate_->ExecuteWindowsCommand(app_command))
405 return WidgetWin::OnAppCommand(window, app_command, device, keystate); 417 return WidgetWin::OnAppCommand(window, app_command, device, keystate);
406 return 0; 418 return 0;
407 } 419 }
408 420
409 void Window::OnCommand(UINT notification_code, int command_id, HWND window) { 421 void Window::OnCommand(UINT notification_code, int command_id, HWND window) {
410 // We NULL check |window_delegate_| here because we can be sent WM_COMMAND 422 // We NULL check |window_delegate_| here because we can be sent WM_COMMAND
411 // messages even after the window is destroyed. 423 // messages even after the window is destroyed.
412 // If the notification code is > 1 it means it is control specific and we 424 // If the notification code is > 1 it means it is control specific and we
413 // should ignore it. 425 // should ignore it.
414 if (notification_code > 1 || !window_delegate_ || 426 if (notification_code > 1 || !window_delegate_ ||
415 window_delegate_->ExecuteWindowsCommand(command_id)) { 427 window_delegate_->ExecuteWindowsCommand(command_id)) {
416 WidgetWin::OnCommand(notification_code, command_id, window); 428 WidgetWin::OnCommand(notification_code, command_id, window);
417 } 429 }
418 } 430 }
419 431
420 void Window::OnDestroy() { 432 void Window::OnDestroy() {
421 non_client_view_->WindowClosing(); 433 non_client_view_->WindowClosing();
422 window_delegate_ = NULL; 434 window_delegate_ = NULL;
423 RestoreEnabledIfNecessary(); 435 RestoreEnabledIfNecessary();
424 WidgetWin::OnDestroy(); 436 WidgetWin::OnDestroy();
425 } 437 }
426 438
427 namespace { 439 namespace {
440 static BOOL CALLBACK SendDwmCompositionChanged(HWND window, LPARAM param) {
441 SendMessage(window, WM_DWMCOMPOSITIONCHANGED, 0, 0);
442 return TRUE;
443 }
444 } // namespace
445
446 LRESULT Window::OnDwmCompositionChanged(UINT msg, WPARAM w_param,
447 LPARAM l_param) {
448 // We respond to this in response to WM_DWMCOMPOSITIONCHANGED since that is
449 // the only thing we care about - we don't actually respond to WM_THEMECHANGED
450 // messages.
451 non_client_view_->SystemThemeChanged();
452
453 // WM_DWMCOMPOSITIONCHANGED is only sent to top level windows, however we want
454 // to notify our children too, since we can have MDI child windows who need to
455 // update their appearance.
456 EnumChildWindows(GetHWND(), &SendDwmCompositionChanged, NULL);
457 return 0;
458 }
459
460 namespace {
428 static void EnableMenuItem(HMENU menu, UINT command, bool enabled) { 461 static void EnableMenuItem(HMENU menu, UINT command, bool enabled) {
429 UINT flags = MF_BYCOMMAND | (enabled ? MF_ENABLED : MF_DISABLED | MF_GRAYED); 462 UINT flags = MF_BYCOMMAND | (enabled ? MF_ENABLED : MF_DISABLED | MF_GRAYED);
430 EnableMenuItem(menu, command, flags); 463 EnableMenuItem(menu, command, flags);
431 } 464 }
432 } // namespace 465 } // namespace
433 466
434 void Window::OnInitMenu(HMENU menu) { 467 void Window::OnInitMenu(HMENU menu) {
435 // We only need to manually enable the system menu if we're not using a native 468 // We only need to manually enable the system menu if we're not using a native
436 // frame. 469 // frame.
437 if (non_client_view_->UseNativeFrame()) { 470 if (non_client_view_->UseNativeFrame())
438 SetMsgHandled(FALSE); 471 WidgetWin::OnInitMenu(menu);
439 return;
440 }
441 472
442 bool is_minimized = IsMinimized(); 473 bool is_minimized = IsMinimized();
443 bool is_maximized = IsMaximized(); 474 bool is_maximized = IsMaximized();
444 bool is_restored = !is_minimized && !is_maximized; 475 bool is_restored = !is_minimized && !is_maximized;
445 476
446 ScopedRedrawLock lock(this); 477 ScopedRedrawLock lock(this);
447 EnableMenuItem(menu, SC_RESTORE, !is_restored); 478 EnableMenuItem(menu, SC_RESTORE, !is_restored);
448 EnableMenuItem(menu, SC_MOVE, is_restored); 479 EnableMenuItem(menu, SC_MOVE, is_restored);
449 EnableMenuItem(menu, SC_SIZE, window_delegate()->CanResize() && is_restored); 480 EnableMenuItem(menu, SC_SIZE, window_delegate()->CanResize() && is_restored);
450 EnableMenuItem(menu, SC_MAXIMIZE, 481 EnableMenuItem(menu, SC_MAXIMIZE,
(...skipping 23 matching lines...) Expand all
474 // mouse really will have left the bounds of the RootView. 505 // mouse really will have left the bounds of the RootView.
475 process_mouse_exited = false; 506 process_mouse_exited = false;
476 } 507 }
477 } 508 }
478 509
479 if (process_mouse_exited) 510 if (process_mouse_exited)
480 ProcessMouseExited(); 511 ProcessMouseExited();
481 } 512 }
482 513
483 LRESULT Window::OnNCActivate(BOOL active) { 514 LRESULT Window::OnNCActivate(BOOL active) {
515 is_active_ = !!active;
516
484 // If we're not using the native frame, we need to force a synchronous repaint 517 // If we're not using the native frame, we need to force a synchronous repaint
485 // otherwise we'll be left in the wrong activation state until something else 518 // otherwise we'll be left in the wrong activation state until something else
486 // causes a repaint later. 519 // causes a repaint later.
487 if (!non_client_view_->UseNativeFrame()) { 520 if (!non_client_view_->UseNativeFrame()) {
488 is_active_ = !!active;
489
490 // We can get WM_NCACTIVATE before we're actually visible. If we're not 521 // We can get WM_NCACTIVATE before we're actually visible. If we're not
491 // visible, no need to paint. 522 // visible, no need to paint.
492 if (IsWindowVisible(GetHWND())) { 523 if (IsWindowVisible(GetHWND())) {
493 non_client_view_->SchedulePaint(); 524 non_client_view_->SchedulePaint();
494 // We need to force a paint now, as a user dragging a window will block 525 // We need to force a paint now, as a user dragging a window will block
495 // painting operations while the move is in progress. 526 // painting operations while the move is in progress.
496 PaintNow(root_view_->GetScheduledPaintRect()); 527 PaintNow(root_view_->GetScheduledPaintRect());
497 } 528 }
498 } 529 }
499 530
531 // If we're active again, we should be allowed to render as inactive, so
532 // tell the non-client view. This must be done independently of the check for
533 // disable_inactive_rendering_ since that check is valid even if the frame
534 // is not active, but this can only be done if we've become active.
535 if (is_active_)
536 non_client_view_->DisableInactiveRendering(false);
537
538 // Reset the disable inactive rendering state since activation has changed.
500 if (disable_inactive_rendering_) { 539 if (disable_inactive_rendering_) {
501 disable_inactive_rendering_ = false; 540 disable_inactive_rendering_ = false;
502 return DefWindowProc(GetHWND(), WM_NCACTIVATE, TRUE, 0); 541 return CallDefaultNCActivateHandler(TRUE);
503 } 542 }
504 // Otherwise just do the default thing. 543 return CallDefaultNCActivateHandler(active);
505 return WidgetWin::OnNCActivate(active);
506 } 544 }
507 545
508 LRESULT Window::OnNCCalcSize(BOOL mode, LPARAM l_param) { 546 LRESULT Window::OnNCCalcSize(BOOL mode, LPARAM l_param) {
509 // We only need to adjust the client size/paint handling when we're not using 547 // We only need to adjust the client size/paint handling when we're not using
510 // the native frame. 548 // the native frame.
511 if (non_client_view_->UseNativeFrame()) { 549 if (non_client_view_->UseNativeFrame())
512 SetMsgHandled(FALSE); 550 return WidgetWin::OnNCCalcSize(mode, l_param);
513 return 0;
514 }
515 551
516 // We need to repaint all when the window bounds change. 552 // We need to repaint all when the window bounds change.
517 return WVR_REDRAW; 553 return WVR_REDRAW;
518 } 554 }
519 555
520 LRESULT Window::OnNCHitTest(const CPoint& point) { 556 LRESULT Window::OnNCHitTest(const CPoint& point) {
521 // First, give the NonClientView a chance to test the point to see if it 557 // First, give the NonClientView a chance to test the point to see if it
522 // provides any of the non-client area. 558 // provides any of the non-client area.
523 CPoint temp = point; 559 CPoint temp = point;
524 MapWindowPoints(HWND_DESKTOP, GetHWND(), &temp, 1); 560 MapWindowPoints(HWND_DESKTOP, GetHWND(), &temp, 1);
525 int component = non_client_view_->NonClientHitTest(gfx::Point(temp)); 561 int component = non_client_view_->NonClientHitTest(gfx::Point(temp));
526 if (component != HTNOWHERE) 562 if (component != HTNOWHERE)
527 return component; 563 return component;
528 564
529 // Otherwise, we let Windows do all the native frame non-client handling for 565 // Otherwise, we let Windows do all the native frame non-client handling for
530 // us. 566 // us.
531 SetMsgHandled(FALSE); 567 return WidgetWin::OnNCHitTest(point);
532 return 0;
533 } 568 }
534 569
535 namespace { 570 namespace {
536 struct ClipState { 571 struct ClipState {
537 // The window being painted. 572 // The window being painted.
538 HWND parent; 573 HWND parent;
539 574
540 // DC painting to. 575 // DC painting to.
541 HDC dc; 576 HDC dc;
542 577
(...skipping 13 matching lines...) Expand all
556 bounds.top - clip_state->y, 591 bounds.top - clip_state->y,
557 bounds.right - clip_state->x, 592 bounds.right - clip_state->x,
558 bounds.bottom - clip_state->y); 593 bounds.bottom - clip_state->y);
559 } 594 }
560 return TRUE; 595 return TRUE;
561 } 596 }
562 } // namespace 597 } // namespace
563 598
564 void Window::OnNCPaint(HRGN rgn) { 599 void Window::OnNCPaint(HRGN rgn) {
565 // We only do non-client painting if we're not using the native frame. 600 // We only do non-client painting if we're not using the native frame.
566 if (non_client_view_->UseNativeFrame()) { 601 if (non_client_view_->UseNativeFrame())
567 SetMsgHandled(FALSE); 602 return WidgetWin::OnNCPaint(rgn);
568 return;
569 }
570 603
571 // We have an NC region and need to paint it. We expand the NC region to 604 // We have an NC region and need to paint it. We expand the NC region to
572 // include the dirty region of the root view. This is done to minimize 605 // include the dirty region of the root view. This is done to minimize
573 // paints. 606 // paints.
574 CRect window_rect; 607 CRect window_rect;
575 GetWindowRect(&window_rect); 608 GetWindowRect(&window_rect);
576 609
577 if (window_rect.Width() != root_view_->width() || 610 if (window_rect.Width() != root_view_->width() ||
578 window_rect.Height() != root_view_->height()) { 611 window_rect.Height() != root_view_->height()) {
579 // If the size of the window differs from the size of the root view it 612 // If the size of the window differs from the size of the root view it
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
757 void Window::OnSize(UINT size_param, const CSize& new_size) { 790 void Window::OnSize(UINT size_param, const CSize& new_size) {
758 // Don't no-op if the new_size matches current size. If our normal bounds 791 // Don't no-op if the new_size matches current size. If our normal bounds
759 // and maximized bounds are the same, then we need to layout (because we 792 // and maximized bounds are the same, then we need to layout (because we
760 // layout differently when maximized). 793 // layout differently when maximized).
761 SaveWindowPosition(); 794 SaveWindowPosition();
762 ChangeSize(size_param, new_size); 795 ChangeSize(size_param, new_size);
763 RedrawWindow(GetHWND(), NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); 796 RedrawWindow(GetHWND(), NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
764 797
765 // ResetWindowRegion is going to trigger WM_NCPAINT. By doing it after we've 798 // ResetWindowRegion is going to trigger WM_NCPAINT. By doing it after we've
766 // invoked OnSize we ensure the RootView has been laid out. 799 // invoked OnSize we ensure the RootView has been laid out.
767 ResetWindowRegion(); 800 ResetWindowRegion(false);
768 } 801 }
769 802
770 void Window::OnSysCommand(UINT notification_code, CPoint click) { 803 void Window::OnSysCommand(UINT notification_code, CPoint click) {
771 if (!non_client_view_->UseNativeFrame()) { 804 if (!non_client_view_->UseNativeFrame()) {
772 // Windows uses the 4 lower order bits of |notification_code| for type- 805 // Windows uses the 4 lower order bits of |notification_code| for type-
773 // specific information so we must exclude this when comparing. 806 // specific information so we must exclude this when comparing.
774 static const int sc_mask = 0xFFF0; 807 static const int sc_mask = 0xFFF0;
775 if ((notification_code & sc_mask) == SC_MINIMIZE || 808 if ((notification_code & sc_mask) == SC_MINIMIZE ||
776 (notification_code & sc_mask) == SC_MAXIMIZE || 809 (notification_code & sc_mask) == SC_MAXIMIZE ||
777 (notification_code & sc_mask) == SC_RESTORE) { 810 (notification_code & sc_mask) == SC_RESTORE) {
(...skipping 10 matching lines...) Expand all
788 } 821 }
789 822
790 // First see if the delegate can handle it. 823 // First see if the delegate can handle it.
791 if (window_delegate_->ExecuteWindowsCommand(notification_code)) 824 if (window_delegate_->ExecuteWindowsCommand(notification_code))
792 return; 825 return;
793 826
794 if (notification_code == IDC_ALWAYS_ON_TOP) { 827 if (notification_code == IDC_ALWAYS_ON_TOP) {
795 is_always_on_top_ = !is_always_on_top_; 828 is_always_on_top_ = !is_always_on_top_;
796 829
797 // Change the menu check state. 830 // Change the menu check state.
798 HMENU system_menu = ::GetSystemMenu(GetHWND(), FALSE); 831 HMENU system_menu = GetSystemMenu(GetHWND(), FALSE);
799 MENUITEMINFO menu_info; 832 MENUITEMINFO menu_info;
800 memset(&menu_info, 0, sizeof(MENUITEMINFO)); 833 memset(&menu_info, 0, sizeof(MENUITEMINFO));
801 menu_info.cbSize = sizeof(MENUITEMINFO); 834 menu_info.cbSize = sizeof(MENUITEMINFO);
802 BOOL r = ::GetMenuItemInfo(system_menu, IDC_ALWAYS_ON_TOP, 835 BOOL r = GetMenuItemInfo(system_menu, IDC_ALWAYS_ON_TOP,
803 FALSE, &menu_info); 836 FALSE, &menu_info);
804 DCHECK(r); 837 DCHECK(r);
805 menu_info.fMask = MIIM_STATE; 838 menu_info.fMask = MIIM_STATE;
806 if (is_always_on_top_) 839 if (is_always_on_top_)
807 menu_info.fState = MFS_CHECKED; 840 menu_info.fState = MFS_CHECKED;
808 r = ::SetMenuItemInfo(system_menu, IDC_ALWAYS_ON_TOP, FALSE, &menu_info); 841 r = SetMenuItemInfo(system_menu, IDC_ALWAYS_ON_TOP, FALSE, &menu_info);
809 842
810 // Now change the actual window's behavior. 843 // Now change the actual window's behavior.
811 AlwaysOnTopChanged(); 844 AlwaysOnTopChanged();
812 } else if ((notification_code == SC_KEYMENU) && (click.x == VK_SPACE)) { 845 } else if ((notification_code == SC_KEYMENU) && (click.x == VK_SPACE)) {
813 // Run the system menu at the NonClientView's desired location. 846 // Run the system menu at the NonClientView's desired location.
814 RunSystemMenu(non_client_view_->GetSystemMenuPoint()); 847 RunSystemMenu(non_client_view_->GetSystemMenuPoint());
815 } else { 848 } else {
816 // Use the default implementation for any other command. 849 // Use the default implementation for any other command.
817 DefWindowProc(GetHWND(), WM_SYSCOMMAND, notification_code, 850 DefWindowProc(GetHWND(), WM_SYSCOMMAND, notification_code,
818 MAKELPARAM(click.y, click.x)); 851 MAKELPARAM(click.y, click.x));
819 } 852 }
820 } 853 }
821 854
822 //////////////////////////////////////////////////////////////////////////////// 855 ////////////////////////////////////////////////////////////////////////////////
823 // Window, private: 856 // Window, private:
824 857
825 void Window::SetClientView(ClientView* client_view) {
826 DCHECK(client_view && GetHWND());
827 non_client_view_->set_client_view(client_view);
828 // This will trigger the ClientView to be added by the non-client view.
829 WidgetWin::SetContentsView(non_client_view_);
830 }
831
832 void Window::BecomeModal() { 858 void Window::BecomeModal() {
833 // We implement modality by crawling up the hierarchy of windows starting 859 // We implement modality by crawling up the hierarchy of windows starting
834 // at the owner, disabling all of them so that they don't receive input 860 // at the owner, disabling all of them so that they don't receive input
835 // messages. 861 // messages.
836 DCHECK(owning_hwnd_) << "Can't create a modal dialog without an owner"; 862 DCHECK(owning_hwnd_) << "Can't create a modal dialog without an owner";
837 HWND start = owning_hwnd_; 863 HWND start = owning_hwnd_;
838 while (start != NULL) { 864 while (start != NULL) {
839 ::EnableWindow(start, FALSE); 865 ::EnableWindow(start, FALSE);
840 start = ::GetParent(start); 866 start = ::GetParent(start);
841 } 867 }
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
1015 lock_updates_ = true; 1041 lock_updates_ = true;
1016 saved_window_style_ = GetWindowLong(GetHWND(), GWL_STYLE); 1042 saved_window_style_ = GetWindowLong(GetHWND(), GWL_STYLE);
1017 SetWindowLong(GetHWND(), GWL_STYLE, saved_window_style_ & ~WS_VISIBLE); 1043 SetWindowLong(GetHWND(), GWL_STYLE, saved_window_style_ & ~WS_VISIBLE);
1018 } 1044 }
1019 1045
1020 void Window::UnlockUpdates() { 1046 void Window::UnlockUpdates() {
1021 SetWindowLong(GetHWND(), GWL_STYLE, saved_window_style_); 1047 SetWindowLong(GetHWND(), GWL_STYLE, saved_window_style_);
1022 lock_updates_ = false; 1048 lock_updates_ = false;
1023 } 1049 }
1024 1050
1025 void Window::ResetWindowRegion() { 1051 void Window::ResetWindowRegion(bool force) {
1026 // A native frame uses the native window region, and we don't want to mess 1052 // A native frame uses the native window region, and we don't want to mess
1027 // with it. 1053 // with it.
1028 if (non_client_view_->UseNativeFrame()) 1054 if (non_client_view_->UseNativeFrame()) {
1055 if (force)
1056 SetWindowRgn(NULL, TRUE);
1029 return; 1057 return;
1058 }
1030 1059
1031 // Changing the window region is going to force a paint. Only change the 1060 // Changing the window region is going to force a paint. Only change the
1032 // window region if the region really differs. 1061 // window region if the region really differs.
1033 HRGN current_rgn = CreateRectRgn(0, 0, 0, 0); 1062 HRGN current_rgn = CreateRectRgn(0, 0, 0, 0);
1034 int current_rgn_result = GetWindowRgn(GetHWND(), current_rgn); 1063 int current_rgn_result = GetWindowRgn(GetHWND(), current_rgn);
1035 1064
1036 CRect window_rect; 1065 CRect window_rect;
1037 GetWindowRect(&window_rect); 1066 GetWindowRect(&window_rect);
1038 HRGN new_region; 1067 HRGN new_region;
1039 if (IsMaximized()) { 1068 if (IsMaximized()) {
(...skipping 27 matching lines...) Expand all
1067 MapWindowPoints(HWND_DESKTOP, GetHWND(), &temp, 1); 1096 MapWindowPoints(HWND_DESKTOP, GetHWND(), &temp, 1);
1068 UINT message_flags = 0; 1097 UINT message_flags = 0;
1069 if ((GetKeyState(VK_CONTROL) & 0x80) == 0x80) 1098 if ((GetKeyState(VK_CONTROL) & 0x80) == 0x80)
1070 message_flags |= MK_CONTROL; 1099 message_flags |= MK_CONTROL;
1071 if ((GetKeyState(VK_SHIFT) & 0x80) == 0x80) 1100 if ((GetKeyState(VK_SHIFT) & 0x80) == 0x80)
1072 message_flags |= MK_SHIFT; 1101 message_flags |= MK_SHIFT;
1073 message_flags |= flags; 1102 message_flags |= flags;
1074 ProcessMousePressed(temp, message_flags, false, false); 1103 ProcessMousePressed(temp, message_flags, false, false);
1075 } 1104 }
1076 1105
1106 LRESULT Window::CallDefaultNCActivateHandler(BOOL active) {
1107 // The DefWindowProc handling for WM_NCACTIVATE renders the classic-look
1108 // window title bar directly, so we need to use a redraw lock here to prevent
1109 // it from doing so.
1110 ScopedRedrawLock lock(this);
1111 return DefWindowProc(GetHWND(), WM_NCACTIVATE, active, 0);
1112 }
1113
1077 void Window::InitClass() { 1114 void Window::InitClass() {
1078 static bool initialized = false; 1115 static bool initialized = false;
1079 if (!initialized) { 1116 if (!initialized) {
1080 resize_cursors_[RC_NORMAL] = LoadCursor(NULL, IDC_ARROW); 1117 resize_cursors_[RC_NORMAL] = LoadCursor(NULL, IDC_ARROW);
1081 resize_cursors_[RC_VERTICAL] = LoadCursor(NULL, IDC_SIZENS); 1118 resize_cursors_[RC_VERTICAL] = LoadCursor(NULL, IDC_SIZENS);
1082 resize_cursors_[RC_HORIZONTAL] = LoadCursor(NULL, IDC_SIZEWE); 1119 resize_cursors_[RC_HORIZONTAL] = LoadCursor(NULL, IDC_SIZEWE);
1083 resize_cursors_[RC_NESW] = LoadCursor(NULL, IDC_SIZENESW); 1120 resize_cursors_[RC_NESW] = LoadCursor(NULL, IDC_SIZENESW);
1084 resize_cursors_[RC_NWSE] = LoadCursor(NULL, IDC_SIZENWSE); 1121 resize_cursors_[RC_NWSE] = LoadCursor(NULL, IDC_SIZENWSE);
1085 initialized = true; 1122 initialized = true;
1086 } 1123 }
1087 } 1124 }
1088 1125
1089 } // namespace views 1126 } // namespace views
1090 1127
OLDNEW
« no previous file with comments | « chrome/views/window.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698