// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/aura/client/default_capture_client.h"

#include "ui/aura/root_window.h"

namespace aura {
namespace client {

DefaultCaptureClient::DefaultCaptureClient(RootWindow* root_window)
    : root_window_(root_window),
      capture_window_(NULL) {
  client::SetCaptureClient(root_window_, this);
}

DefaultCaptureClient::~DefaultCaptureClient() {
  client::SetCaptureClient(root_window_, NULL);
}

void DefaultCaptureClient::SetCapture(Window* window) {
  if (capture_window_ == window)
    return;
  if (window) {
    ui::GestureRecognizer::Get()->TransferEventsTo(
        capture_window_, window);
  }

  Window* old_capture_window = capture_window_;
  capture_window_ = window;

  CaptureDelegate* capture_delegate = root_window_;
  if (capture_window_)
    capture_delegate->SetNativeCapture();
  else
    capture_delegate->ReleaseNativeCapture();

  capture_delegate->UpdateCapture(old_capture_window, capture_window_);
}

void DefaultCaptureClient::ReleaseCapture(Window* window) {
  if (capture_window_ != window)
    return;
  SetCapture(NULL);
}

Window* DefaultCaptureClient::GetCaptureWindow() {
  return capture_window_;
}

}  // namespace client
}  // namespace aura
