diff options
author | deanm@chromium.org <deanm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-16 18:03:11 +0000 |
---|---|---|
committer | deanm@chromium.org <deanm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-16 18:03:11 +0000 |
commit | 339c6794663eaceb331b01569d372ca9ffb032d4 (patch) | |
tree | e6e910b606aceee06597ab699b69bafed318cc56 /chrome/common/owned_widget_gtk.cc | |
parent | 5bba02a7d415d2e20798e589de112a2dd7e3a03e (diff) | |
download | chromium_src-339c6794663eaceb331b01569d372ca9ffb032d4.zip chromium_src-339c6794663eaceb331b01569d372ca9ffb032d4.tar.gz chromium_src-339c6794663eaceb331b01569d372ca9ffb032d4.tar.bz2 |
Add OwnedWidgetGtk, and abstraction to help manage the lifetime and ownership of a GtkWidget encapsulated (and exposed) from a C++ object.
Debugging checks help verify that the GtkWidget is not leaked, and that it was destroyed when expected.
Review URL: http://codereview.chromium.org/42226
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@11740 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/common/owned_widget_gtk.cc')
-rw-r--r-- | chrome/common/owned_widget_gtk.cc | 40 |
1 files changed, 40 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..846cd1e --- /dev/null +++ b/chrome/common/owned_widget_gtk.cc @@ -0,0 +1,40 @@ +// 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. We should have a floating refcount of 1. + DCHECK(g_object_is_floating(widget)); + // NOTE: Assumes some implementation details about glib internals. + DCHECK(G_OBJECT(widget)->ref_count == 1); + + // 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(G_OBJECT(widget)->ref_count == 1); + g_object_unref(widget); +} |