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