desktop_native_cursor_manager.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_native_cursor_manager.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/root_window.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/cursor/cursor_loader.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_cursor_loader_updater.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace views {
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DesktopNativeCursorManager::DesktopNativeCursorManager(
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    aura::RootWindow* window,
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<DesktopCursorLoaderUpdater> cursor_loader_updater)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : root_window_(window),
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      cursor_loader_updater_(cursor_loader_updater.Pass()),
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cursor_loader_(ui::CursorLoader::Create()) {
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (cursor_loader_updater_.get())
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cursor_loader_updater_->OnCreate(root_window_, cursor_loader_.get());
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DesktopNativeCursorManager::~DesktopNativeCursorManager() {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochgfx::NativeCursor DesktopNativeCursorManager::GetInitializedCursor(int type) {
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::NativeCursor cursor(type);
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  cursor_loader_->SetPlatformCursor(&cursor);
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return cursor;
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopNativeCursorManager::SetDisplay(
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Display& display,
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::corewm::NativeCursorManagerDelegate* delegate) {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cursor_loader_->UnloadAll();
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cursor_loader_->set_display(display);
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (cursor_loader_updater_.get())
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cursor_loader_updater_->OnDisplayUpdated(display, cursor_loader_.get());
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetCursor(delegate->GetCurrentCursor(), delegate);
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopNativeCursorManager::SetCursor(
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeCursor cursor,
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::corewm::NativeCursorManagerDelegate* delegate) {
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::NativeCursor new_cursor = cursor;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cursor_loader_->SetPlatformCursor(&new_cursor);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate->CommitCursor(new_cursor);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate->GetCurrentVisibility())
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_window_->SetCursor(new_cursor);
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopNativeCursorManager::SetVisibility(
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool visible,
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::corewm::NativeCursorManagerDelegate* delegate) {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate->CommitVisibility(visible);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (visible) {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetCursor(delegate->GetCurrentCursor(), delegate);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeCursor invisible_cursor(ui::kCursorNone);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cursor_loader_->SetPlatformCursor(&invisible_cursor);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_window_->SetCursor(invisible_cursor);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_window_->OnCursorVisibilityChanged(visible);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void DesktopNativeCursorManager::SetScale(
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    float scale,
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    views::corewm::NativeCursorManagerDelegate* delegate) {
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NOTIMPLEMENTED();
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopNativeCursorManager::SetMouseEventsEnabled(
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool enabled,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::corewm::NativeCursorManagerDelegate* delegate) {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate->CommitMouseEventsEnabled(enabled);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(erg): In the ash version, we set the last mouse location on Env. I'm
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // not sure this concept makes sense on the desktop.
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetVisibility(delegate->GetCurrentVisibility(), delegate);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_window_->OnMouseEventsEnableStateChanged(enabled);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace views
92