diff options
Diffstat (limited to 'chrome/common/owned_widget_gtk.cc')
-rw-r--r-- | chrome/common/owned_widget_gtk.cc | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/chrome/common/owned_widget_gtk.cc b/chrome/common/owned_widget_gtk.cc new file mode 100644 index 0000000..f9b8bef --- /dev/null +++ b/chrome/common/owned_widget_gtk.cc @@ -0,0 +1,38 @@ +// Copyright (c) 2009 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. + +#include "chrome/common/owned_widget_gtk.h" + +#include <gtk/gtk.h> + +#include "base/logging.h" + +OwnedWidgetGtk::~OwnedWidgetGtk() { + DCHECK(!widget_) << "You must explicitly call OwnerWidgetGtk::Destroy()."; +} + +void OwnedWidgetGtk::Own(GtkWidget* widget) { + DCHECK(!widget_); + // We want to make sure that Own() was called properly, right after the + // widget was created. There should be a floating reference. + DCHECK(g_object_is_floating(widget)); + + // Sink the floating reference, we should now own this reference. + g_object_ref_sink(widget); + widget_ = widget; +} + +void OwnedWidgetGtk::Destroy() { + if (!widget_) + return; + + GtkWidget* widget = widget_; + widget_ = NULL; + gtk_widget_destroy(widget); + + DCHECK(!g_object_is_floating(widget)); + // NOTE: Assumes some implementation details about glib internals. + DCHECK_EQ(G_OBJECT(widget)->ref_count, 1U); + g_object_unref(widget); +} |