172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian 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
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#ifndef CHROME_BROWSER_UI_GTK_FOCUS_STORE_GTK_H_
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define CHROME_BROWSER_UI_GTK_FOCUS_STORE_GTK_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef struct _GtkWidget GtkWidget;
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass FocusStoreGtk {
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FocusStoreGtk();
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~FocusStoreGtk();
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* widget() const { return widget_; }
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Save the widget that is currently focused for |widget|'s toplevel (NOT
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // |widget|).
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Store(GtkWidget* widget);
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Save |widget| as the focus widget. Call with NULL to clear |widget_|.
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void SetWidget(GtkWidget* widget);
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Disconnect the previous destroy handler (if any).
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DisconnectDestroyHandler();
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The widget which last had focus.
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* widget_;
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The widget for which we've stored focus might be destroyed by the time we
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // want to restore focus. Thus we connect to the "destroy" signal on that
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // widget. This is the ID for the destroy handler.
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  unsigned int destroy_handler_id_;
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(FocusStoreGtk);
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif  // CHROME_BROWSER_UI_GTK_FOCUS_STORE_GTK_H_
44