1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_CHROMEOS_WM_MESSAGE_LISTENER_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_CHROMEOS_WM_MESSAGE_LISTENER_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gtk/gtk.h>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/observer_list.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/wm_ipc.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Browser;
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BrowserView;
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WmMessageListener listens for messages from the window manager that need to
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// be dealt with by Chrome.
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// To listen for window manager messages add an observer.
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WmMessageListener : public MessageLoopForUI::Observer {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Observer is notified any time a message is received from the window
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // manager.
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class Observer {
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void ProcessWmMessage(const WmIpc::Message& message,
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  GdkWindow* window) = 0;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  static WmMessageListener* GetInstance();
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddObserver(Observer* observer) {
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    observers_.AddObserver(observer);
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RemoveObserver(Observer* observer) {
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    observers_.RemoveObserver(observer);
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // MessageLoopForUI::Observer overrides.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void WillProcessEvent(GdkEvent* event);
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void DidProcessEvent(GdkEvent* event);
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend struct DefaultSingletonTraits<WmMessageListener>;
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WmMessageListener();
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~WmMessageListener();
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invoked when a valid WmIpc::Message is received.
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ProcessMessage(const WmIpc::Message& message, GdkWindow* window);
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ObserverList<Observer> observers_;
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(WmMessageListener);
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_CHROMEOS_WM_MESSAGE_LISTENER_H_
65