// 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.

#ifndef UI_AURA_ROOT_WINDOW_HOST_DELEGATE_H_
#define UI_AURA_ROOT_WINDOW_HOST_DELEGATE_H_

#include "ui/aura/aura_export.h"

namespace gfx {
class Point;
class Size;
}

namespace ui {
class KeyEvent;
class MouseEvent;
class ScrollEvent;
class TouchEvent;
}

namespace aura {

class RootWindow;

// A private interface used by RootWindowHost implementations to communicate
// with their owning RootWindow.
class AURA_EXPORT RootWindowHostDelegate {
 public:
  virtual bool OnHostKeyEvent(ui::KeyEvent* event) = 0;
  virtual bool OnHostMouseEvent(ui::MouseEvent* event) = 0;
  virtual bool OnHostScrollEvent(ui::ScrollEvent* event) = 0;
  virtual bool OnHostTouchEvent(ui::TouchEvent* event) = 0;

  // Called when the windowing system activates the window.
  virtual void OnHostActivated() = 0;

  // Called when system focus is changed to another window.
  virtual void OnHostLostWindowCapture() = 0;

  // Called when the windowing system has mouse grab because it's performing a
  // window move on our behalf, but we should still paint as if we're active.
  virtual void OnHostLostMouseGrab() = 0;

  virtual void OnHostPaint() = 0;

  virtual void OnHostMoved(const gfx::Point& origin) = 0;
  virtual void OnHostResized(const gfx::Size& size) = 0;

  virtual float GetDeviceScaleFactor() = 0;

  virtual RootWindow* AsRootWindow() = 0;

 protected:
  virtual ~RootWindowHostDelegate() {}
};

}  // namespace aura

#endif  // UI_AURA_ROOT_WINDOW_HOST_DELEGATE_H_
