| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "ui/views/widget/desktop_root_window_host_win.h" | |
| 6 | |
| 7 #include "third_party/skia/include/core/SkPath.h" | |
| 8 #include "third_party/skia/include/core/SkRegion.h" | |
| 9 #include "ui/aura/client/aura_constants.h" | |
| 10 #include "ui/aura/client/default_capture_client.h" | |
| 11 #include "ui/aura/focus_manager.h" | |
| 12 #include "ui/aura/root_window.h" | |
| 13 #include "ui/views/corewm/compound_event_filter.h" | |
| 14 #include "ui/views/corewm/input_method_event_filter.h" | |
| 15 #include "ui/aura/window_property.h" | |
| 16 #include "ui/base/cursor/cursor_loader_win.h" | |
| 17 #include "ui/base/native_theme/native_theme_aura.h" | |
| 18 #include "ui/base/native_theme/native_theme_win.h" | |
| 19 #include "ui/base/win/shell.h" | |
| 20 #include "ui/gfx/native_widget_types.h" | |
| 21 #include "ui/gfx/path_win.h" | |
| 22 #include "ui/views/ime/input_method_win.h" | |
| 23 #include "ui/views/widget/desktop_aura/desktop_activation_client.h" | |
| 24 #include "ui/views/widget/desktop_aura/desktop_cursor_client.h" | |
| 25 #include "ui/views/widget/desktop_aura/desktop_dispatcher_client.h" | |
| 26 #include "ui/views/widget/desktop_native_widget_aura.h" | |
| 27 #include "ui/views/widget/desktop_screen_position_client.h" | |
| 28 #include "ui/views/widget/widget_delegate.h" | |
| 29 #include "ui/views/widget/widget_hwnd_utils.h" | |
| 30 #include "ui/views/win/fullscreen_handler.h" | |
| 31 #include "ui/views/win/hwnd_message_handler.h" | |
| 32 #include "ui/views/window/native_frame_view.h" | |
| 33 | |
| 34 namespace views { | |
| 35 | |
| 36 DEFINE_WINDOW_PROPERTY_KEY(aura::Window*, kContentWindowForRootWindow, NULL); | |
| 37 | |
| 38 //////////////////////////////////////////////////////////////////////////////// | |
| 39 // DesktopRootWindowHostWin, public: | |
| 40 | |
| 41 DesktopRootWindowHostWin::DesktopRootWindowHostWin( | |
| 42 internal::NativeWidgetDelegate* native_widget_delegate, | |
| 43 DesktopNativeWidgetAura* desktop_native_widget_aura, | |
| 44 const gfx::Rect& initial_bounds) | |
| 45 : ALLOW_THIS_IN_INITIALIZER_LIST( | |
| 46 message_handler_(new HWNDMessageHandler(this))), | |
| 47 native_widget_delegate_(native_widget_delegate), | |
| 48 desktop_native_widget_aura_(desktop_native_widget_aura), | |
| 49 root_window_host_delegate_(NULL), | |
| 50 content_window_(NULL) { | |
| 51 } | |
| 52 | |
| 53 DesktopRootWindowHostWin::~DesktopRootWindowHostWin() { | |
| 54 } | |
| 55 | |
| 56 // static | |
| 57 aura::Window* DesktopRootWindowHostWin::GetContentWindowForHWND(HWND hwnd) { | |
| 58 aura::RootWindow* root = aura::RootWindow::GetForAcceleratedWidget(hwnd); | |
| 59 return root ? root->GetProperty(kContentWindowForRootWindow) : NULL; | |
| 60 } | |
| 61 | |
| 62 // static | |
| 63 ui::NativeTheme* DesktopRootWindowHost::GetNativeTheme(aura::Window* window) { | |
| 64 // Use NativeThemeWin for windows shown on the desktop, those not on the | |
| 65 // desktop come from Ash and get NativeThemeAura. | |
| 66 aura::RootWindow* root = window->GetRootWindow(); | |
| 67 if (root) { | |
| 68 HWND root_hwnd = root->GetAcceleratedWidget(); | |
| 69 if (root_hwnd && | |
| 70 DesktopRootWindowHostWin::GetContentWindowForHWND(root_hwnd)) { | |
| 71 return ui::NativeThemeWin::instance(); | |
| 72 } | |
| 73 } | |
| 74 return ui::NativeThemeAura::instance(); | |
| 75 } | |
| 76 | |
| 77 //////////////////////////////////////////////////////////////////////////////// | |
| 78 // DesktopRootWindowHostWin, DesktopRootWindowHost implementation: | |
| 79 | |
| 80 aura::RootWindow* DesktopRootWindowHostWin::Init( | |
| 81 aura::Window* content_window, | |
| 82 const Widget::InitParams& params) { | |
| 83 // TODO(beng): SetInitParams(). | |
| 84 content_window_ = content_window; | |
| 85 | |
| 86 ConfigureWindowStyles(message_handler_.get(), params, | |
| 87 GetWidget()->widget_delegate(), | |
| 88 native_widget_delegate_); | |
| 89 | |
| 90 message_handler_->Init(NULL, params.bounds); | |
| 91 | |
| 92 message_handler_->set_remove_standard_frame(!ShouldUseNativeFrame()); | |
| 93 | |
| 94 aura::RootWindow::CreateParams rw_params(params.bounds); | |
| 95 rw_params.host = this; | |
| 96 root_window_ = new aura::RootWindow(rw_params); | |
| 97 | |
| 98 // TODO(beng): We probably need to move these two calls to some function that | |
| 99 // can change depending on the native-ness of the frame. For right | |
| 100 // now in the hack-n-slash days of win-aura, we can just | |
| 101 // unilaterally turn this on. | |
| 102 root_window_->compositor()->SetHostHasTransparentBackground(true); | |
| 103 root_window_->SetTransparent(true); | |
| 104 | |
| 105 root_window_->Init(); | |
| 106 root_window_->AddChild(content_window_); | |
| 107 | |
| 108 native_widget_delegate_->OnNativeWidgetCreated(); | |
| 109 | |
| 110 capture_client_.reset(new aura::client::DefaultCaptureClient(root_window_)); | |
| 111 aura::client::SetCaptureClient(root_window_, capture_client_.get()); | |
| 112 | |
| 113 focus_manager_.reset(new aura::FocusManager); | |
| 114 root_window_->set_focus_manager(focus_manager_.get()); | |
| 115 | |
| 116 activation_client_.reset( | |
| 117 new DesktopActivationClient(root_window_->GetFocusManager())); | |
| 118 aura::client::SetActivationClient(root_window_, | |
| 119 activation_client_.get()); | |
| 120 | |
| 121 dispatcher_client_.reset(new DesktopDispatcherClient); | |
| 122 aura::client::SetDispatcherClient(root_window_, | |
| 123 dispatcher_client_.get()); | |
| 124 | |
| 125 cursor_client_.reset(new DesktopCursorClient(root_window_)); | |
| 126 aura::client::SetCursorClient(root_window_, cursor_client_.get()); | |
| 127 | |
| 128 | |
| 129 position_client_.reset(new DesktopScreenPositionClient()); | |
| 130 aura::client::SetScreenPositionClient(root_window_, | |
| 131 position_client_.get()); | |
| 132 | |
| 133 // CEF sets focus to the window the user clicks down on. | |
| 134 // TODO(beng): see if we can't do this some other way. CEF seems a heavy- | |
| 135 // handed way of accomplishing focus. | |
| 136 root_window_event_filter_ = new views::corewm::CompoundEventFilter; | |
| 137 root_window_->SetEventFilter(root_window_event_filter_); | |
| 138 | |
| 139 input_method_filter_.reset(new views::corewm::InputMethodEventFilter); | |
| 140 input_method_filter_->SetInputMethodPropertyInRootWindow(root_window_); | |
| 141 root_window_event_filter_->AddFilter(input_method_filter_.get()); | |
| 142 | |
| 143 focus_manager_->SetFocusedWindow(content_window_, NULL); | |
| 144 root_window_->SetProperty(kContentWindowForRootWindow, content_window_); | |
| 145 return root_window_; | |
| 146 } | |
| 147 | |
| 148 void DesktopRootWindowHostWin::Close() { | |
| 149 message_handler_->Close(); | |
| 150 } | |
| 151 | |
| 152 void DesktopRootWindowHostWin::CloseNow() { | |
| 153 message_handler_->CloseNow(); | |
| 154 } | |
| 155 | |
| 156 aura::RootWindowHost* DesktopRootWindowHostWin::AsRootWindowHost() { | |
| 157 return this; | |
| 158 } | |
| 159 | |
| 160 void DesktopRootWindowHostWin::ShowWindowWithState( | |
| 161 ui::WindowShowState show_state) { | |
| 162 message_handler_->ShowWindowWithState(show_state); | |
| 163 } | |
| 164 | |
| 165 void DesktopRootWindowHostWin::ShowMaximizedWithBounds( | |
| 166 const gfx::Rect& restored_bounds) { | |
| 167 message_handler_->ShowMaximizedWithBounds(restored_bounds); | |
| 168 } | |
| 169 | |
| 170 bool DesktopRootWindowHostWin::IsVisible() const { | |
| 171 return message_handler_->IsVisible(); | |
| 172 } | |
| 173 | |
| 174 void DesktopRootWindowHostWin::SetSize(const gfx::Size& size) { | |
| 175 message_handler_->SetSize(size); | |
| 176 } | |
| 177 | |
| 178 void DesktopRootWindowHostWin::CenterWindow(const gfx::Size& size) { | |
| 179 message_handler_->CenterWindow(size); | |
| 180 } | |
| 181 | |
| 182 void DesktopRootWindowHostWin::GetWindowPlacement( | |
| 183 gfx::Rect* bounds, | |
| 184 ui::WindowShowState* show_state) const { | |
| 185 message_handler_->GetWindowPlacement(bounds, show_state); | |
| 186 } | |
| 187 | |
| 188 gfx::Rect DesktopRootWindowHostWin::GetWindowBoundsInScreen() const { | |
| 189 return message_handler_->GetWindowBoundsInScreen(); | |
| 190 } | |
| 191 | |
| 192 gfx::Rect DesktopRootWindowHostWin::GetClientAreaBoundsInScreen() const { | |
| 193 return message_handler_->GetClientAreaBoundsInScreen(); | |
| 194 } | |
| 195 | |
| 196 gfx::Rect DesktopRootWindowHostWin::GetRestoredBounds() const { | |
| 197 return message_handler_->GetRestoredBounds(); | |
| 198 } | |
| 199 | |
| 200 gfx::Rect DesktopRootWindowHostWin::GetWorkAreaBoundsInScreen() const { | |
| 201 MONITORINFO monitor_info; | |
| 202 monitor_info.cbSize = sizeof(monitor_info); | |
| 203 GetMonitorInfo(MonitorFromWindow(message_handler_->hwnd(), | |
| 204 MONITOR_DEFAULTTONEAREST), | |
| 205 &monitor_info); | |
| 206 return gfx::Rect(monitor_info.rcWork); | |
| 207 } | |
| 208 | |
| 209 void DesktopRootWindowHostWin::SetShape(gfx::NativeRegion native_region) { | |
| 210 SkPath path; | |
| 211 native_region->getBoundaryPath(&path); | |
| 212 message_handler_->SetRegion(gfx::CreateHRGNFromSkPath(path)); | |
| 213 } | |
| 214 | |
| 215 void DesktopRootWindowHostWin::Activate() { | |
| 216 message_handler_->Activate(); | |
| 217 } | |
| 218 | |
| 219 void DesktopRootWindowHostWin::Deactivate() { | |
| 220 message_handler_->Deactivate(); | |
| 221 } | |
| 222 | |
| 223 bool DesktopRootWindowHostWin::IsActive() const { | |
| 224 return message_handler_->IsActive(); | |
| 225 } | |
| 226 | |
| 227 void DesktopRootWindowHostWin::Maximize() { | |
| 228 message_handler_->Maximize(); | |
| 229 } | |
| 230 | |
| 231 void DesktopRootWindowHostWin::Minimize() { | |
| 232 message_handler_->Minimize(); | |
| 233 } | |
| 234 | |
| 235 void DesktopRootWindowHostWin::Restore() { | |
| 236 message_handler_->Restore(); | |
| 237 } | |
| 238 | |
| 239 bool DesktopRootWindowHostWin::IsMaximized() const { | |
| 240 return message_handler_->IsMaximized(); | |
| 241 } | |
| 242 | |
| 243 bool DesktopRootWindowHostWin::IsMinimized() const { | |
| 244 return message_handler_->IsMinimized(); | |
| 245 } | |
| 246 | |
| 247 bool DesktopRootWindowHostWin::HasCapture() const { | |
| 248 return message_handler_->HasCapture(); | |
| 249 } | |
| 250 | |
| 251 void DesktopRootWindowHostWin::SetAlwaysOnTop(bool always_on_top) { | |
| 252 message_handler_->SetAlwaysOnTop(always_on_top); | |
| 253 } | |
| 254 | |
| 255 InputMethod* DesktopRootWindowHostWin::CreateInputMethod() { | |
| 256 // TODO(ime): This is wrong. We need to hook up the native win32 IME on the | |
| 257 // InputMethodEventFilter, and instead create an InputMethodBridge | |
| 258 // per-NativeWidget implementation. Once we achieve that we can get rid of | |
| 259 // this function on this object and DesktopRootWindowHostLinux and just | |
| 260 // create the InputMethodBridge directly in DesktopNativeWidgetAura. Also | |
| 261 // at that time DNWA can become the InputMethodDelegate. | |
| 262 ui::InputMethod* host = | |
| 263 root_window_->GetProperty(aura::client::kRootWindowInputMethodKey); | |
| 264 return new InputMethodWin(message_handler_.get(), | |
| 265 message_handler_->hwnd(), | |
| 266 host); | |
| 267 } | |
| 268 | |
| 269 internal::InputMethodDelegate* | |
| 270 DesktopRootWindowHostWin::GetInputMethodDelegate() { | |
| 271 return message_handler_.get(); | |
| 272 } | |
| 273 | |
| 274 void DesktopRootWindowHostWin::SetWindowTitle(const string16& title) { | |
| 275 message_handler_->SetTitle(title); | |
| 276 } | |
| 277 | |
| 278 void DesktopRootWindowHostWin::ClearNativeFocus() { | |
| 279 message_handler_->ClearNativeFocus(); | |
| 280 } | |
| 281 | |
| 282 Widget::MoveLoopResult DesktopRootWindowHostWin::RunMoveLoop( | |
| 283 const gfx::Vector2d& drag_offset) { | |
| 284 return message_handler_->RunMoveLoop(drag_offset) ? | |
| 285 Widget::MOVE_LOOP_SUCCESSFUL : Widget::MOVE_LOOP_CANCELED; | |
| 286 } | |
| 287 | |
| 288 void DesktopRootWindowHostWin::EndMoveLoop() { | |
| 289 message_handler_->EndMoveLoop(); | |
| 290 } | |
| 291 | |
| 292 void DesktopRootWindowHostWin::SetVisibilityChangedAnimationsEnabled( | |
| 293 bool value) { | |
| 294 message_handler_->SetVisibilityChangedAnimationsEnabled(value); | |
| 295 } | |
| 296 | |
| 297 bool DesktopRootWindowHostWin::ShouldUseNativeFrame() { | |
| 298 return ui::win::IsAeroGlassEnabled(); | |
| 299 } | |
| 300 | |
| 301 void DesktopRootWindowHostWin::FrameTypeChanged() { | |
| 302 message_handler_->FrameTypeChanged(); | |
| 303 } | |
| 304 | |
| 305 NonClientFrameView* DesktopRootWindowHostWin::CreateNonClientFrameView() { | |
| 306 return GetWidget()->ShouldUseNativeFrame() ? | |
| 307 new NativeFrameView(GetWidget()) : NULL; | |
| 308 } | |
| 309 | |
| 310 void DesktopRootWindowHostWin::SetFullscreen(bool fullscreen) { | |
| 311 message_handler_->fullscreen_handler()->SetFullscreen(fullscreen); | |
| 312 } | |
| 313 | |
| 314 bool DesktopRootWindowHostWin::IsFullscreen() const { | |
| 315 return message_handler_->fullscreen_handler()->fullscreen(); | |
| 316 } | |
| 317 | |
| 318 void DesktopRootWindowHostWin::SetOpacity(unsigned char opacity) { | |
| 319 message_handler_->SetOpacity(static_cast<BYTE>(opacity)); | |
| 320 GetWidget()->GetRootView()->SchedulePaint(); | |
| 321 } | |
| 322 | |
| 323 void DesktopRootWindowHostWin::SetWindowIcons( | |
| 324 const gfx::ImageSkia& window_icon, const gfx::ImageSkia& app_icon) { | |
| 325 message_handler_->SetWindowIcons(window_icon, app_icon); | |
| 326 } | |
| 327 | |
| 328 void DesktopRootWindowHostWin::SetAccessibleName(const string16& name) { | |
| 329 message_handler_->SetAccessibleName(name); | |
| 330 } | |
| 331 | |
| 332 void DesktopRootWindowHostWin::SetAccessibleRole( | |
| 333 ui::AccessibilityTypes::Role role) { | |
| 334 message_handler_->SetAccessibleRole(role); | |
| 335 } | |
| 336 | |
| 337 void DesktopRootWindowHostWin::SetAccessibleState( | |
| 338 ui::AccessibilityTypes::State state) { | |
| 339 message_handler_->SetAccessibleState(state); | |
| 340 } | |
| 341 | |
| 342 void DesktopRootWindowHostWin::InitModalType(ui::ModalType modal_type) { | |
| 343 message_handler_->InitModalType(modal_type); | |
| 344 } | |
| 345 | |
| 346 void DesktopRootWindowHostWin::FlashFrame(bool flash_frame) { | |
| 347 message_handler_->FlashFrame(flash_frame); | |
| 348 } | |
| 349 | |
| 350 void DesktopRootWindowHostWin::OnNativeWidgetFocus() { | |
| 351 // HWNDMessageHandler will perform the proper updating on its own. | |
| 352 } | |
| 353 | |
| 354 void DesktopRootWindowHostWin::OnNativeWidgetBlur() { | |
| 355 } | |
| 356 | |
| 357 //////////////////////////////////////////////////////////////////////////////// | |
| 358 // DesktopRootWindowHostWin, RootWindowHost implementation: | |
| 359 | |
| 360 | |
| 361 void DesktopRootWindowHostWin::SetDelegate( | |
| 362 aura::RootWindowHostDelegate* delegate) { | |
| 363 root_window_host_delegate_ = delegate; | |
| 364 } | |
| 365 | |
| 366 aura::RootWindow* DesktopRootWindowHostWin::GetRootWindow() { | |
| 367 return root_window_; | |
| 368 } | |
| 369 | |
| 370 gfx::AcceleratedWidget DesktopRootWindowHostWin::GetAcceleratedWidget() { | |
| 371 return message_handler_->hwnd(); | |
| 372 } | |
| 373 | |
| 374 void DesktopRootWindowHostWin::Show() { | |
| 375 message_handler_->Show(); | |
| 376 } | |
| 377 | |
| 378 void DesktopRootWindowHostWin::Hide() { | |
| 379 message_handler_->Hide(); | |
| 380 } | |
| 381 | |
| 382 void DesktopRootWindowHostWin::ToggleFullScreen() { | |
| 383 } | |
| 384 | |
| 385 gfx::Rect DesktopRootWindowHostWin::GetBounds() const { | |
| 386 return GetClientAreaBoundsInScreen(); | |
| 387 } | |
| 388 | |
| 389 void DesktopRootWindowHostWin::SetBounds(const gfx::Rect& bounds) { | |
| 390 message_handler_->SetBounds(bounds); | |
| 391 } | |
| 392 | |
| 393 gfx::Point DesktopRootWindowHostWin::GetLocationOnNativeScreen() const { | |
| 394 return gfx::Point(1, 1); | |
| 395 } | |
| 396 | |
| 397 void DesktopRootWindowHostWin::SetCapture() { | |
| 398 message_handler_->SetCapture(); | |
| 399 } | |
| 400 | |
| 401 void DesktopRootWindowHostWin::ReleaseCapture() { | |
| 402 message_handler_->ReleaseCapture(); | |
| 403 } | |
| 404 | |
| 405 void DesktopRootWindowHostWin::SetCursor(gfx::NativeCursor cursor) { | |
| 406 // Custom web cursors are handled directly. | |
| 407 if (cursor == ui::kCursorCustom) | |
| 408 return; | |
| 409 ui::CursorLoaderWin cursor_loader; | |
| 410 cursor_loader.SetPlatformCursor(&cursor); | |
| 411 | |
| 412 message_handler_->SetCursor(cursor.platform()); | |
| 413 } | |
| 414 | |
| 415 bool DesktopRootWindowHostWin::QueryMouseLocation(gfx::Point* location_return) { | |
| 416 return false; | |
| 417 } | |
| 418 | |
| 419 bool DesktopRootWindowHostWin::ConfineCursorToRootWindow() { | |
| 420 return false; | |
| 421 } | |
| 422 | |
| 423 void DesktopRootWindowHostWin::UnConfineCursor() { | |
| 424 } | |
| 425 | |
| 426 void DesktopRootWindowHostWin::MoveCursorTo(const gfx::Point& location) { | |
| 427 } | |
| 428 | |
| 429 void DesktopRootWindowHostWin::SetFocusWhenShown(bool focus_when_shown) { | |
| 430 } | |
| 431 | |
| 432 bool DesktopRootWindowHostWin::CopyAreaToSkCanvas( | |
| 433 const gfx::Rect& source_bounds, | |
| 434 const gfx::Point& dest_offset, | |
| 435 SkCanvas* canvas) { | |
| 436 NOTIMPLEMENTED(); | |
| 437 return false; | |
| 438 } | |
| 439 | |
| 440 bool DesktopRootWindowHostWin::GrabSnapshot( | |
| 441 const gfx::Rect& snapshot_bounds, | |
| 442 std::vector<unsigned char>* png_representation) { | |
| 443 NOTIMPLEMENTED(); | |
| 444 return false; | |
| 445 } | |
| 446 | |
| 447 void DesktopRootWindowHostWin::PostNativeEvent( | |
| 448 const base::NativeEvent& native_event) { | |
| 449 } | |
| 450 | |
| 451 void DesktopRootWindowHostWin::OnDeviceScaleFactorChanged( | |
| 452 float device_scale_factor) { | |
| 453 } | |
| 454 | |
| 455 void DesktopRootWindowHostWin::PrepareForShutdown() { | |
| 456 } | |
| 457 | |
| 458 //////////////////////////////////////////////////////////////////////////////// | |
| 459 // DesktopRootWindowHostWin, HWNDMessageHandlerDelegate implementation: | |
| 460 | |
| 461 bool DesktopRootWindowHostWin::IsWidgetWindow() const { | |
| 462 return true; | |
| 463 } | |
| 464 | |
| 465 bool DesktopRootWindowHostWin::IsUsingCustomFrame() const { | |
| 466 return !GetWidget()->ShouldUseNativeFrame(); | |
| 467 } | |
| 468 | |
| 469 void DesktopRootWindowHostWin::SchedulePaint() { | |
| 470 GetWidget()->GetRootView()->SchedulePaint(); | |
| 471 } | |
| 472 | |
| 473 void DesktopRootWindowHostWin::EnableInactiveRendering() { | |
| 474 native_widget_delegate_->EnableInactiveRendering(); | |
| 475 } | |
| 476 | |
| 477 bool DesktopRootWindowHostWin::IsInactiveRenderingDisabled() { | |
| 478 return native_widget_delegate_->IsInactiveRenderingDisabled(); | |
| 479 } | |
| 480 | |
| 481 bool DesktopRootWindowHostWin::CanResize() const { | |
| 482 return GetWidget()->widget_delegate()->CanResize(); | |
| 483 } | |
| 484 | |
| 485 bool DesktopRootWindowHostWin::CanMaximize() const { | |
| 486 return GetWidget()->widget_delegate()->CanMaximize(); | |
| 487 } | |
| 488 | |
| 489 bool DesktopRootWindowHostWin::CanActivate() const { | |
| 490 return native_widget_delegate_->CanActivate(); | |
| 491 } | |
| 492 | |
| 493 bool DesktopRootWindowHostWin::WidgetSizeIsClientSize() const { | |
| 494 const Widget* widget = GetWidget()->GetTopLevelWidget(); | |
| 495 return IsMaximized() || (widget && widget->ShouldUseNativeFrame()); | |
| 496 } | |
| 497 | |
| 498 bool DesktopRootWindowHostWin::CanSaveFocus() const { | |
| 499 return GetWidget()->is_top_level(); | |
| 500 } | |
| 501 | |
| 502 void DesktopRootWindowHostWin::SaveFocusOnDeactivate() { | |
| 503 GetWidget()->GetFocusManager()->StoreFocusedView(); | |
| 504 } | |
| 505 | |
| 506 void DesktopRootWindowHostWin::RestoreFocusOnActivate() { | |
| 507 RestoreFocusOnEnable(); | |
| 508 } | |
| 509 | |
| 510 void DesktopRootWindowHostWin::RestoreFocusOnEnable() { | |
| 511 GetWidget()->GetFocusManager()->RestoreFocusedView(); | |
| 512 } | |
| 513 | |
| 514 bool DesktopRootWindowHostWin::IsModal() const { | |
| 515 return native_widget_delegate_->IsModal(); | |
| 516 } | |
| 517 | |
| 518 int DesktopRootWindowHostWin::GetInitialShowState() const { | |
| 519 return SW_SHOWNORMAL; | |
| 520 } | |
| 521 | |
| 522 bool DesktopRootWindowHostWin::WillProcessWorkAreaChange() const { | |
| 523 return GetWidget()->widget_delegate()->WillProcessWorkAreaChange(); | |
| 524 } | |
| 525 | |
| 526 int DesktopRootWindowHostWin::GetNonClientComponent( | |
| 527 const gfx::Point& point) const { | |
| 528 return native_widget_delegate_->GetNonClientComponent(point); | |
| 529 } | |
| 530 | |
| 531 void DesktopRootWindowHostWin::GetWindowMask(const gfx::Size& size, | |
| 532 gfx::Path* path) { | |
| 533 if (GetWidget()->non_client_view()) | |
| 534 GetWidget()->non_client_view()->GetWindowMask(size, path); | |
| 535 } | |
| 536 | |
| 537 bool DesktopRootWindowHostWin::GetClientAreaInsets(gfx::Insets* insets) const { | |
| 538 return false; | |
| 539 } | |
| 540 | |
| 541 void DesktopRootWindowHostWin::GetMinMaxSize(gfx::Size* min_size, | |
| 542 gfx::Size* max_size) const { | |
| 543 *min_size = native_widget_delegate_->GetMinimumSize(); | |
| 544 *max_size = native_widget_delegate_->GetMaximumSize(); | |
| 545 } | |
| 546 | |
| 547 gfx::Size DesktopRootWindowHostWin::GetRootViewSize() const { | |
| 548 return GetWidget()->GetRootView()->size(); | |
| 549 } | |
| 550 | |
| 551 void DesktopRootWindowHostWin::ResetWindowControls() { | |
| 552 GetWidget()->non_client_view()->ResetWindowControls(); | |
| 553 } | |
| 554 | |
| 555 void DesktopRootWindowHostWin::PaintLayeredWindow(gfx::Canvas* canvas) { | |
| 556 GetWidget()->GetRootView()->Paint(canvas); | |
| 557 } | |
| 558 | |
| 559 gfx::NativeViewAccessible DesktopRootWindowHostWin::GetNativeViewAccessible() { | |
| 560 return GetWidget()->GetRootView()->GetNativeViewAccessible(); | |
| 561 } | |
| 562 | |
| 563 InputMethod* DesktopRootWindowHostWin::GetInputMethod() { | |
| 564 return GetWidget()->GetInputMethodDirect(); | |
| 565 } | |
| 566 | |
| 567 void DesktopRootWindowHostWin::HandleAppDeactivated() { | |
| 568 native_widget_delegate_->EnableInactiveRendering(); | |
| 569 } | |
| 570 | |
| 571 void DesktopRootWindowHostWin::HandleActivationChanged(bool active) { | |
| 572 native_widget_delegate_->OnNativeWidgetActivationChanged(active); | |
| 573 } | |
| 574 | |
| 575 bool DesktopRootWindowHostWin::HandleAppCommand(short command) { | |
| 576 // We treat APPCOMMAND ids as an extension of our command namespace, and just | |
| 577 // let the delegate figure out what to do... | |
| 578 return GetWidget()->widget_delegate() && | |
| 579 GetWidget()->widget_delegate()->ExecuteWindowsCommand(command); | |
| 580 } | |
| 581 | |
| 582 void DesktopRootWindowHostWin::HandleCaptureLost() { | |
| 583 native_widget_delegate_->OnMouseCaptureLost(); | |
| 584 } | |
| 585 | |
| 586 void DesktopRootWindowHostWin::HandleClose() { | |
| 587 GetWidget()->Close(); | |
| 588 } | |
| 589 | |
| 590 bool DesktopRootWindowHostWin::HandleCommand(int command) { | |
| 591 return GetWidget()->widget_delegate()->ExecuteWindowsCommand(command); | |
| 592 } | |
| 593 | |
| 594 void DesktopRootWindowHostWin::HandleAccelerator( | |
| 595 const ui::Accelerator& accelerator) { | |
| 596 GetWidget()->GetFocusManager()->ProcessAccelerator(accelerator); | |
| 597 } | |
| 598 | |
| 599 void DesktopRootWindowHostWin::HandleCreate() { | |
| 600 // TODO(beng): moar | |
| 601 NOTIMPLEMENTED(); | |
| 602 | |
| 603 native_widget_delegate_->OnNativeWidgetCreated(); | |
| 604 | |
| 605 // 1. Window property association | |
| 606 // 2. MouseWheel. | |
| 607 // 3. Drop target. | |
| 608 // 4. Tooltip Manager. | |
| 609 } | |
| 610 | |
| 611 void DesktopRootWindowHostWin::HandleDestroying() { | |
| 612 native_widget_delegate_->OnNativeWidgetDestroying(); | |
| 613 } | |
| 614 | |
| 615 void DesktopRootWindowHostWin::HandleDestroyed() { | |
| 616 root_window_event_filter_->RemoveFilter(input_method_filter_.get()); | |
| 617 desktop_native_widget_aura_->OnHostClosed(); | |
| 618 } | |
| 619 | |
| 620 bool DesktopRootWindowHostWin::HandleInitialFocus() { | |
| 621 return GetWidget()->SetInitialFocus(); | |
| 622 } | |
| 623 | |
| 624 void DesktopRootWindowHostWin::HandleDisplayChange() { | |
| 625 GetWidget()->widget_delegate()->OnDisplayChanged(); | |
| 626 } | |
| 627 | |
| 628 void DesktopRootWindowHostWin::HandleBeginWMSizeMove() { | |
| 629 native_widget_delegate_->OnNativeWidgetBeginUserBoundsChange(); | |
| 630 } | |
| 631 | |
| 632 void DesktopRootWindowHostWin::HandleEndWMSizeMove() { | |
| 633 native_widget_delegate_->OnNativeWidgetEndUserBoundsChange(); | |
| 634 } | |
| 635 | |
| 636 void DesktopRootWindowHostWin::HandleMove() { | |
| 637 native_widget_delegate_->OnNativeWidgetMove(); | |
| 638 } | |
| 639 | |
| 640 void DesktopRootWindowHostWin::HandleWorkAreaChanged() { | |
| 641 GetWidget()->widget_delegate()->OnWorkAreaChanged(); | |
| 642 } | |
| 643 | |
| 644 void DesktopRootWindowHostWin::HandleVisibilityChanged(bool visible) { | |
| 645 native_widget_delegate_->OnNativeWidgetVisibilityChanged(visible); | |
| 646 } | |
| 647 | |
| 648 void DesktopRootWindowHostWin::HandleClientSizeChanged( | |
| 649 const gfx::Size& new_size) { | |
| 650 if (root_window_host_delegate_) | |
| 651 root_window_host_delegate_->OnHostResized(new_size); | |
| 652 // TODO(beng): replace with a layout manager?? | |
| 653 content_window_->SetBounds(gfx::Rect(new_size)); | |
| 654 } | |
| 655 | |
| 656 void DesktopRootWindowHostWin::HandleFrameChanged() { | |
| 657 // Replace the frame and layout the contents. | |
| 658 GetWidget()->non_client_view()->UpdateFrame(true); | |
| 659 } | |
| 660 | |
| 661 void DesktopRootWindowHostWin::HandleNativeFocus(HWND last_focused_window) { | |
| 662 // TODO(beng): inform the native_widget_delegate_. | |
| 663 InputMethod* input_method = GetInputMethod(); | |
| 664 if (input_method) | |
| 665 input_method->OnFocus(); | |
| 666 } | |
| 667 | |
| 668 void DesktopRootWindowHostWin::HandleNativeBlur(HWND focused_window) { | |
| 669 // TODO(beng): inform the native_widget_delegate_. | |
| 670 InputMethod* input_method = GetInputMethod(); | |
| 671 if (input_method) | |
| 672 input_method->OnBlur(); | |
| 673 } | |
| 674 | |
| 675 bool DesktopRootWindowHostWin::HandleMouseEvent(const ui::MouseEvent& event) { | |
| 676 if (event.flags() & ui::EF_IS_NON_CLIENT) | |
| 677 return false; | |
| 678 return root_window_host_delegate_->OnHostMouseEvent( | |
| 679 const_cast<ui::MouseEvent*>(&event)); | |
| 680 } | |
| 681 | |
| 682 bool DesktopRootWindowHostWin::HandleKeyEvent(const ui::KeyEvent& event) { | |
| 683 return root_window_host_delegate_->OnHostKeyEvent( | |
| 684 const_cast<ui::KeyEvent*>(&event)); | |
| 685 } | |
| 686 | |
| 687 bool DesktopRootWindowHostWin::HandleUntranslatedKeyEvent( | |
| 688 const ui::KeyEvent& event) { | |
| 689 InputMethod* input_method = GetInputMethod(); | |
| 690 if (input_method) | |
| 691 input_method->DispatchKeyEvent(event); | |
| 692 return !!input_method; | |
| 693 } | |
| 694 | |
| 695 bool DesktopRootWindowHostWin::HandleIMEMessage(UINT message, | |
| 696 WPARAM w_param, | |
| 697 LPARAM l_param, | |
| 698 LRESULT* result) { | |
| 699 InputMethod* input_method = GetInputMethod(); | |
| 700 if (!input_method || input_method->IsMock()) { | |
| 701 *result = 0; | |
| 702 return false; | |
| 703 } | |
| 704 | |
| 705 InputMethodWin* ime_win = static_cast<InputMethodWin*>(input_method); | |
| 706 BOOL handled = FALSE; | |
| 707 *result = ime_win->OnImeMessages(message, w_param, l_param, &handled); | |
| 708 return !!handled; | |
| 709 } | |
| 710 | |
| 711 void DesktopRootWindowHostWin::HandleInputLanguageChange( | |
| 712 DWORD character_set, | |
| 713 HKL input_language_id) { | |
| 714 InputMethod* input_method = GetInputMethod(); | |
| 715 if (input_method && !input_method->IsMock()) { | |
| 716 static_cast<InputMethodWin*>(input_method)->OnInputLangChange( | |
| 717 character_set, input_language_id); | |
| 718 } | |
| 719 } | |
| 720 | |
| 721 bool DesktopRootWindowHostWin::HandlePaintAccelerated( | |
| 722 const gfx::Rect& invalid_rect) { | |
| 723 return native_widget_delegate_->OnNativeWidgetPaintAccelerated(invalid_rect); | |
| 724 } | |
| 725 | |
| 726 void DesktopRootWindowHostWin::HandlePaint(gfx::Canvas* canvas) { | |
| 727 root_window_host_delegate_->OnHostPaint(); | |
| 728 } | |
| 729 | |
| 730 void DesktopRootWindowHostWin::HandleScreenReaderDetected() { | |
| 731 } | |
| 732 | |
| 733 bool DesktopRootWindowHostWin::HandleTooltipNotify(int w_param, | |
| 734 NMHDR* l_param, | |
| 735 LRESULT* l_result) { | |
| 736 return false; | |
| 737 } | |
| 738 | |
| 739 void DesktopRootWindowHostWin::HandleTooltipMouseMove(UINT message, | |
| 740 WPARAM w_param, | |
| 741 LPARAM l_param) { | |
| 742 } | |
| 743 | |
| 744 bool DesktopRootWindowHostWin::PreHandleMSG(UINT message, | |
| 745 WPARAM w_param, | |
| 746 LPARAM l_param, | |
| 747 LRESULT* result) { | |
| 748 return false; | |
| 749 } | |
| 750 | |
| 751 void DesktopRootWindowHostWin::PostHandleMSG(UINT message, | |
| 752 WPARAM w_param, | |
| 753 LPARAM l_param) { | |
| 754 } | |
| 755 | |
| 756 //////////////////////////////////////////////////////////////////////////////// | |
| 757 // DesktopRootWindowHostWin, private: | |
| 758 | |
| 759 Widget* DesktopRootWindowHostWin::GetWidget() { | |
| 760 return native_widget_delegate_->AsWidget(); | |
| 761 } | |
| 762 | |
| 763 const Widget* DesktopRootWindowHostWin::GetWidget() const { | |
| 764 return native_widget_delegate_->AsWidget(); | |
| 765 } | |
| 766 | |
| 767 HWND DesktopRootWindowHostWin::GetHWND() const { | |
| 768 return message_handler_->hwnd(); | |
| 769 } | |
| 770 | |
| 771 //////////////////////////////////////////////////////////////////////////////// | |
| 772 // DesktopRootWindowHost, public: | |
| 773 | |
| 774 // static | |
| 775 DesktopRootWindowHost* DesktopRootWindowHost::Create( | |
| 776 internal::NativeWidgetDelegate* native_widget_delegate, | |
| 777 DesktopNativeWidgetAura* desktop_native_widget_aura, | |
| 778 const gfx::Rect& initial_bounds) { | |
| 779 return new DesktopRootWindowHostWin(native_widget_delegate, | |
| 780 desktop_native_widget_aura, | |
| 781 initial_bounds); | |
| 782 } | |
| 783 | |
| 784 } // namespace views | |
| OLD | NEW |