Index: chrome/browser/gtk/rounded_window.cc |
diff --git a/chrome/browser/gtk/rounded_window.cc b/chrome/browser/gtk/rounded_window.cc |
index 52bedc95a1d36d0f404b3e39fa1c8e6a46e80782..c223425f63c3df9fb0a9621d94ed9b8ffe879ee1 100644 |
--- a/chrome/browser/gtk/rounded_window.cc |
+++ b/chrome/browser/gtk/rounded_window.cc |
@@ -7,6 +7,7 @@ |
#include <gtk/gtk.h> |
#include <math.h> |
+#include "app/gtk_signal.h" |
#include "base/i18n/rtl.h" |
#include "chrome/browser/gtk/gtk_util.h" |
@@ -36,6 +37,9 @@ struct RoundedWindowData { |
// Which sides of the window should have an internal border? |
int drawn_borders; |
+ |
+ // Keeps track of attached signal handlers. |
+ GtkSignalRegistrar signals; |
}; |
// Callback from GTK to release allocated memory. |
@@ -256,11 +260,12 @@ void ActAsRoundedWindow( |
DCHECK(!g_object_get_data(G_OBJECT(widget), kRoundedData)); |
gtk_widget_set_app_paintable(widget, TRUE); |
- g_signal_connect(widget, "expose-event", |
- G_CALLBACK(OnRoundedWindowExpose), NULL); |
- g_signal_connect(widget, "style-set", G_CALLBACK(OnStyleSet), NULL); |
RoundedWindowData* data = new RoundedWindowData; |
+ data->signals.Connect(widget, "expose-event", |
+ G_CALLBACK(OnRoundedWindowExpose), NULL); |
+ data->signals.Connect(widget, "style-set", G_CALLBACK(OnStyleSet), NULL); |
+ |
data->expected_width = -1; |
data->expected_height = -1; |
@@ -275,13 +280,7 @@ void ActAsRoundedWindow( |
} |
void StopActingAsRoundedWindow(GtkWidget* widget) { |
- g_signal_handlers_disconnect_by_func(widget, |
- reinterpret_cast<gpointer>(OnRoundedWindowExpose), NULL); |
- g_signal_handlers_disconnect_by_func(widget, |
- reinterpret_cast<gpointer>(OnStyleSet), NULL); |
- |
- delete static_cast<RoundedWindowData*>( |
- g_object_steal_data(G_OBJECT(widget), kRoundedData)); |
+ g_object_set_data(G_OBJECT(widget), kRoundedData, NULL); |
if (GTK_WIDGET_REALIZED(widget)) |
gdk_window_shape_combine_mask(widget->window, NULL, 0, 0); |