172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/owned_widget_gtk.h" 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <gtk/gtk.h> 8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/logging.h" 10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenOwnedWidgetGtk::~OwnedWidgetGtk() { 12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Destroy(); 13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid OwnedWidgetGtk::Own(GtkWidget* widget) { 16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!widget) 17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(!widget_); 20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // We want to make sure that Own() was called properly, right after the 21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // widget was created. There should be a floating reference. 22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(g_object_is_floating(widget)); 23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Sink the floating reference, we should now own this reference. 25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen g_object_ref_sink(widget); 26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen widget_ = widget; 27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid OwnedWidgetGtk::Destroy() { 30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!widget_) 31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GtkWidget* widget = widget_; 34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen widget_ = NULL; 35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gtk_widget_destroy(widget); 36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(!g_object_is_floating(widget)); 38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // NOTE: Assumes some implementation details about glib internals. 39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK_EQ(G_OBJECT(widget)->ref_count, 1U); 40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen g_object_unref(widget); 41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 42