// Copyright 2013 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_VIEWS_WIN_APPBAR_H_
#define UI_VIEWS_WIN_APPBAR_H_
#include <map>
#include <windows.h>
#include "base/basictypes.h"
#include "base/callback_forward.h"
#include "base/memory/weak_ptr.h"
namespace views {
// Appbar provides an API to query for the edges of the monitor that have an
// autohide bar.
// NOTE: querying is done on a separate thread as it spawns a nested message
// loop. The nested message loop is particularly problematic here as it's
// possible for the nested message loop to run during window creation and
// startup time (WM_NCCALCSIZE is called at creation time).
class Appbar {
public:
enum Edge {
EDGE_TOP = 1 << 0,
EDGE_LEFT = 1 << 1,
EDGE_BOTTOM = 1 << 2,
EDGE_RIGHT = 1 << 3,
};
// Returns the singleton instance.
static Appbar* instance();
// Starts a query for the autohide edges of the specified monitor and returns
// the current value. If the edges have changed |callback| is subsequently
// invoked. If the edges have not changed |callback| is never run.
//
// Return value is a bitmask of Edges.
int GetAutohideEdges(HMONITOR monitor, const base::Closure& callback);
private:
typedef std::map<HMONITOR, int> EdgeMap;
Appbar();
~Appbar();
// Callback on main thread with the edges. |returned_edges| is the value that
// was returned from the call to GetAutohideEdges() that initiated the lookup.
void OnGotEdges(const base::Closure& callback,
HMONITOR monitor,
int returned_edges,
int* edges);
EdgeMap edge_map_;
base::WeakPtrFactory<Appbar> weak_factory_;
// If true we're in the process of notifying a callback. When true we do not
// start a new query.
bool in_callback_;
DISALLOW_COPY_AND_ASSIGN(Appbar);
};
} // namespace views
#endif // UI_VIEWS_WIN_APPBAR_H_