[gtk+/gtk-2-18] Fix a refcounting issues in GtkPlug
- From: Matthias Clasen <matthiasc src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gtk+/gtk-2-18] Fix a refcounting issues in GtkPlug
- Date: Sat, 13 Feb 2010 00:35:30 +0000 (UTC)
commit a14c8aba5d37df1e0aed15e7fc03d763936d0cb2
Author: Matthias Clasen <mclasen redhat com>
Date: Mon Feb 8 20:08:22 2010 -0500
Fix a refcounting issues in GtkPlug
When the foreign window already has a GdkWindow, we forget to take
an extra references, leading to crashes later on. Patch by
Karl Tomlinson, bug 607061.
(cherry picked from commit beddf67e562e1670d692cb9ba0a2546713cc80fc)
gtk/gtkplug.c | 35 +++++++++++++++++++++--------------
1 files changed, 21 insertions(+), 14 deletions(-)
---
diff --git a/gtk/gtkplug.c b/gtk/gtkplug.c
index 4c31ea7..3b1af66 100644
--- a/gtk/gtkplug.c
+++ b/gtk/gtkplug.c
@@ -325,6 +325,7 @@ _gtk_plug_add_to_socket (GtkPlug *plug,
socket_->plug_widget = widget;
plug->socket_window = GTK_WIDGET (socket_)->window;
+ g_object_ref (plug->socket_window);
if (GTK_WIDGET_REALIZED (widget))
{
@@ -410,10 +411,13 @@ _gtk_plug_remove_from_socket (GtkPlug *plug,
socket_->same_app = FALSE;
plug->same_app = FALSE;
- plug->socket_window = NULL;
-
+ if (plug->socket_window != NULL)
+ {
+ g_object_unref (plug->socket_window);
+ plug->socket_window = NULL;
+ }
gtk_plug_set_is_child (plug, FALSE);
-
+
g_signal_emit_by_name (socket_, "plug-removed", &result);
if (!result)
gtk_widget_destroy (GTK_WIDGET (socket_));
@@ -467,22 +471,25 @@ gtk_plug_construct_for_display (GtkPlug *plug,
gpointer user_data = NULL;
plug->socket_window = gdk_window_lookup_for_display (display, socket_id);
-
if (plug->socket_window)
- gdk_window_get_user_data (plug->socket_window, &user_data);
- else
- plug->socket_window = gdk_window_foreign_new_for_display (display, socket_id);
-
- if (user_data)
{
- if (GTK_IS_SOCKET (user_data))
- _gtk_plug_add_to_socket (plug, user_data);
- else
+ gdk_window_get_user_data (plug->socket_window, &user_data);
+
+ if (user_data)
{
- g_warning (G_STRLOC "Can't create GtkPlug as child of non-GtkSocket");
- plug->socket_window = NULL;
+ if (GTK_IS_SOCKET (user_data))
+ _gtk_plug_add_to_socket (plug, user_data);
+ else
+ {
+ g_warning (G_STRLOC "Can't create GtkPlug as child of non-GtkSocket");
+ plug->socket_window = NULL;
+ }
}
+ else
+ g_object_ref (plug->socket_window);
}
+ else
+ plug->socket_window = gdk_window_foreign_new_for_display (display, socket_id);
if (plug->socket_window) {
g_signal_emit (plug, plug_signals[EMBEDDED], 0);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]