• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 #include "chrome/browser/ui/gtk/focus_store_gtk.h"
6 
7 #include <gtk/gtk.h>
8 
9 #include "chrome/browser/platform_util.h"
10 
FocusStoreGtk()11 FocusStoreGtk::FocusStoreGtk()
12     : widget_(NULL),
13       destroy_handler_id_(0) {
14 }
15 
~FocusStoreGtk()16 FocusStoreGtk::~FocusStoreGtk() {
17   DisconnectDestroyHandler();
18 }
19 
Store(GtkWidget * widget)20 void FocusStoreGtk::Store(GtkWidget* widget) {
21   GtkWidget* focus_widget = NULL;
22   if (widget) {
23     GtkWindow* window = platform_util::GetTopLevel(widget);
24     if (window)
25       focus_widget = window->focus_widget;
26   }
27 
28   SetWidget(focus_widget);
29 }
30 
SetWidget(GtkWidget * widget)31 void FocusStoreGtk::SetWidget(GtkWidget* widget) {
32   DisconnectDestroyHandler();
33 
34   // We don't add a ref. The signal handler below effectively gives us a weak
35   // reference.
36   widget_ = widget;
37   if (widget_) {
38     // When invoked, |gtk_widget_destroyed| will set |widget_| to NULL.
39     destroy_handler_id_ = g_signal_connect(widget_, "destroy",
40                                            G_CALLBACK(gtk_widget_destroyed),
41                                            &widget_);
42   }
43 }
44 
DisconnectDestroyHandler()45 void FocusStoreGtk::DisconnectDestroyHandler() {
46   if (widget_) {
47     g_signal_handler_disconnect(widget_, destroy_handler_id_);
48     widget_ = NULL;
49   }
50 }
51