1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef UI_VIEWS_TEST_X11_PROPERTY_CHANGE_WAITER_H_
6#define UI_VIEWS_TEST_X11_PROPERTY_CHANGE_WAITER_H_
7
8#include "base/callback.h"
9#include "base/memory/scoped_ptr.h"
10#include "ui/events/platform/platform_event_dispatcher.h"
11#include "ui/events/platform/platform_event_types.h"
12#include "ui/gfx/x/x11_types.h"
13
14namespace ui {
15class ScopedEventDispatcher;
16class X11AtomCache;
17}
18
19namespace views {
20
21// Blocks till the value of |property| on |window| changes.
22class X11PropertyChangeWaiter : public ui::PlatformEventDispatcher {
23 public:
24  X11PropertyChangeWaiter(XID window, const char* property);
25  virtual ~X11PropertyChangeWaiter();
26
27  // Blocks till the value of |property_| changes.
28  virtual void Wait();
29
30 protected:
31  // Returns whether the run loop can exit.
32  virtual bool ShouldKeepOnWaiting(const ui::PlatformEvent& event);
33
34  XID xwindow() const {
35    return x_window_;
36  }
37
38 private:
39  // ui::PlatformEventDispatcher:
40  virtual bool CanDispatchEvent(const ui::PlatformEvent& event) OVERRIDE;
41  virtual uint32_t DispatchEvent(const ui::PlatformEvent& event) OVERRIDE;
42
43  XID x_window_;
44  const char* property_;
45
46  // Whether Wait() should block.
47  bool wait_;
48
49  // Ends the run loop.
50  base::Closure quit_closure_;
51
52  // The event mask to be restored upon X11PropertyChangeWaiter's destruction.
53  long old_event_mask_;
54
55  scoped_ptr<ui::ScopedEventDispatcher> dispatcher_;
56
57  scoped_ptr<ui::X11AtomCache> atom_cache_;
58
59  DISALLOW_COPY_AND_ASSIGN(X11PropertyChangeWaiter);
60};
61
62}  // namespace views
63
64#endif  // UI_VIEWS_TEST_X11_PROPERTY_CHANGE_WAITER_H_
65