summaryrefslogtreecommitdiffstats
path: root/views/widget
diff options
context:
space:
mode:
Diffstat (limited to 'views/widget')
-rw-r--r--views/widget/widget_gtk.cc40
1 files changed, 14 insertions, 26 deletions
diff --git a/views/widget/widget_gtk.cc b/views/widget/widget_gtk.cc
index 5ca89a5..055c855 100644
--- a/views/widget/widget_gtk.cc
+++ b/views/widget/widget_gtk.cc
@@ -17,7 +17,6 @@
#include "base/auto_reset.h"
#include "base/compiler_specific.h"
#include "base/message_loop.h"
-#include "base/ref_counted.h"
#include "base/utf_string_conversions.h"
#include "gfx/path.h"
#include "views/widget/default_theme_provider.h"
@@ -42,9 +41,9 @@ const char* kCompositePainterKey = "__VIEWS_COMPOSITE_PAINTER__";
const char* kCompositeEnabledKey = "__VIEWS_COMPOSITE_ENABLED__";
// CompositePainter draws a composited child widgets image into its
-// drawing area. This object is ref counted so that it can disconnect
-// expose event handler when all transparent widgets are deleted.
-class CompositePainter : public base::RefCounted<CompositePainter> {
+// drawing area. This object is created at most once for a widget and kept
+// until the widget is destroyed.
+class CompositePainter {
public:
explicit CompositePainter(GtkWidget* parent)
: parent_object_(G_OBJECT(parent)) {
@@ -55,21 +54,14 @@ class CompositePainter : public base::RefCounted<CompositePainter> {
static void AddCompositePainter(GtkWidget* widget) {
CompositePainter* painter = static_cast<CompositePainter*>(
g_object_get_data(G_OBJECT(widget), kCompositePainterKey));
- if (painter) {
- painter->AddRef();
- } else {
+ if (!painter) {
g_object_set_data(G_OBJECT(widget), kCompositePainterKey,
new CompositePainter(widget));
+ g_signal_connect(widget, "destroy",
+ G_CALLBACK(&DestroyPainter), NULL);
}
}
- static void RemoveCompositePainter(GtkWidget* widget) {
- CompositePainter* painter = reinterpret_cast<CompositePainter*>(
- g_object_get_data(G_OBJECT(widget), kCompositePainterKey));
- DCHECK(painter);
- painter->Release();
- }
-
// Enable the composition.
static void SetComposited(GtkWidget* widget) {
DCHECK(GTK_WIDGET_REALIZED(widget));
@@ -84,11 +76,7 @@ class CompositePainter : public base::RefCounted<CompositePainter> {
}
private:
- friend class base::RefCounted<CompositePainter>;
- virtual ~CompositePainter() {
- g_signal_handler_disconnect(parent_object_, handler_id_);
- g_object_set_data(parent_object_, kCompositePainterKey, NULL);
- }
+ virtual ~CompositePainter() {}
// Composes a image from one child.
static void CompositeChildWidget(GtkWidget* child, gpointer data) {
@@ -119,6 +107,13 @@ class CompositePainter : public base::RefCounted<CompositePainter> {
return false;
}
+ static void DestroyPainter(GtkWidget* object) {
+ CompositePainter* painter = reinterpret_cast<CompositePainter*>(
+ g_object_get_data(G_OBJECT(object), kCompositePainterKey));
+ DCHECK(painter);
+ delete painter;
+ }
+
GObject* parent_object_;
gulong handler_id_;
@@ -678,13 +673,6 @@ void WidgetGtk::Close() {
void WidgetGtk::CloseNow() {
if (widget_) {
- if (transparent_ && type_ == TYPE_CHILD) {
- GtkWidget* parent = gtk_widget_get_parent(widget_);
- if (parent) {
- DCHECK(parent != null_parent_);
- CompositePainter::RemoveCompositePainter(parent);
- }
- }
gtk_widget_destroy(widget_);
widget_ = NULL;
}