summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2004-02-13 03:03:21 +0000
committerOwen Taylor <otaylor@src.gnome.org>2004-02-13 03:03:21 +0000
commit3588aeb4af12621b16faeac0ccb3001ebe48f0e9 (patch)
treebbc61d29237642b0a6b459e3404828170f7f21b1
parente4d55e75e037452cc4ef7bfcdbae182d7f6a004d (diff)
downloadgtk+-3588aeb4af12621b16faeac0ccb3001ebe48f0e9.tar.gz
Various reentrancy fixes for widgets being destroyed out of
Thu Feb 12 21:58:20 2004 Owen Taylor <otaylor@redhat.com> Various reentrancy fixes for widgets being destroyed out of focus-out-event. (#128821, Grant Gayed) * gtk/gtkwindow.c (_gtk_window_unset_focus_and_default): Ref window and widget over callbacks. * gtk/gtkwidget.c (gtk_widget_hide) gtk/gtkwidget.c (gtk_widget_set_child_visible): Ref the widget before calling _gtk_window_unset_focus_and_default(), since that can call user callbacks. * gtk/gtkwidget.c (gtk_widget_invalidate_widget_windows): Do nothing if the widget isn't realized.
-rw-r--r--ChangeLog16
-rw-r--r--ChangeLog.pre-2-1016
-rw-r--r--ChangeLog.pre-2-416
-rw-r--r--ChangeLog.pre-2-616
-rw-r--r--ChangeLog.pre-2-816
-rw-r--r--gtk/gtkwidget.c10
-rw-r--r--gtk/gtkwindow.c6
7 files changed, 95 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 5dff674309..f6c17e4a98 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+Thu Feb 12 21:58:20 2004 Owen Taylor <otaylor@redhat.com>
+
+ Various reentrancy fixes for widgets being destroyed
+ out of focus-out-event. (#128821, Grant Gayed)
+
+ * gtk/gtkwindow.c (_gtk_window_unset_focus_and_default):
+ Ref window and widget over callbacks.
+
+ * gtk/gtkwidget.c (gtk_widget_hide)
+ gtk/gtkwidget.c (gtk_widget_set_child_visible):
+ Ref the widget before calling _gtk_window_unset_focus_and_default(),
+ since that can call user callbacks.
+
+ * gtk/gtkwidget.c (gtk_widget_invalidate_widget_windows):
+ Do nothing if the widget isn't realized.
+
Fri Feb 13 01:31:44 2004 Matthias Clasen <maclas@gmx.de>
* gtk/gtkbutton.c (_gtk_button_paint): Don't draw bevels around
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index 5dff674309..f6c17e4a98 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,19 @@
+Thu Feb 12 21:58:20 2004 Owen Taylor <otaylor@redhat.com>
+
+ Various reentrancy fixes for widgets being destroyed
+ out of focus-out-event. (#128821, Grant Gayed)
+
+ * gtk/gtkwindow.c (_gtk_window_unset_focus_and_default):
+ Ref window and widget over callbacks.
+
+ * gtk/gtkwidget.c (gtk_widget_hide)
+ gtk/gtkwidget.c (gtk_widget_set_child_visible):
+ Ref the widget before calling _gtk_window_unset_focus_and_default(),
+ since that can call user callbacks.
+
+ * gtk/gtkwidget.c (gtk_widget_invalidate_widget_windows):
+ Do nothing if the widget isn't realized.
+
Fri Feb 13 01:31:44 2004 Matthias Clasen <maclas@gmx.de>
* gtk/gtkbutton.c (_gtk_button_paint): Don't draw bevels around
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index 5dff674309..f6c17e4a98 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,3 +1,19 @@
+Thu Feb 12 21:58:20 2004 Owen Taylor <otaylor@redhat.com>
+
+ Various reentrancy fixes for widgets being destroyed
+ out of focus-out-event. (#128821, Grant Gayed)
+
+ * gtk/gtkwindow.c (_gtk_window_unset_focus_and_default):
+ Ref window and widget over callbacks.
+
+ * gtk/gtkwidget.c (gtk_widget_hide)
+ gtk/gtkwidget.c (gtk_widget_set_child_visible):
+ Ref the widget before calling _gtk_window_unset_focus_and_default(),
+ since that can call user callbacks.
+
+ * gtk/gtkwidget.c (gtk_widget_invalidate_widget_windows):
+ Do nothing if the widget isn't realized.
+
Fri Feb 13 01:31:44 2004 Matthias Clasen <maclas@gmx.de>
* gtk/gtkbutton.c (_gtk_button_paint): Don't draw bevels around
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index 5dff674309..f6c17e4a98 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,19 @@
+Thu Feb 12 21:58:20 2004 Owen Taylor <otaylor@redhat.com>
+
+ Various reentrancy fixes for widgets being destroyed
+ out of focus-out-event. (#128821, Grant Gayed)
+
+ * gtk/gtkwindow.c (_gtk_window_unset_focus_and_default):
+ Ref window and widget over callbacks.
+
+ * gtk/gtkwidget.c (gtk_widget_hide)
+ gtk/gtkwidget.c (gtk_widget_set_child_visible):
+ Ref the widget before calling _gtk_window_unset_focus_and_default(),
+ since that can call user callbacks.
+
+ * gtk/gtkwidget.c (gtk_widget_invalidate_widget_windows):
+ Do nothing if the widget isn't realized.
+
Fri Feb 13 01:31:44 2004 Matthias Clasen <maclas@gmx.de>
* gtk/gtkbutton.c (_gtk_button_paint): Don't draw bevels around
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index 5dff674309..f6c17e4a98 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,19 @@
+Thu Feb 12 21:58:20 2004 Owen Taylor <otaylor@redhat.com>
+
+ Various reentrancy fixes for widgets being destroyed
+ out of focus-out-event. (#128821, Grant Gayed)
+
+ * gtk/gtkwindow.c (_gtk_window_unset_focus_and_default):
+ Ref window and widget over callbacks.
+
+ * gtk/gtkwidget.c (gtk_widget_hide)
+ gtk/gtkwidget.c (gtk_widget_set_child_visible):
+ Ref the widget before calling _gtk_window_unset_focus_and_default(),
+ since that can call user callbacks.
+
+ * gtk/gtkwidget.c (gtk_widget_invalidate_widget_windows):
+ Do nothing if the widget isn't realized.
+
Fri Feb 13 01:31:44 2004 Matthias Clasen <maclas@gmx.de>
* gtk/gtkbutton.c (_gtk_button_paint): Don't draw bevels around
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index f43e994345..874a3d1360 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -2040,10 +2040,11 @@ gtk_widget_hide (GtkWidget *widget)
if (GTK_WIDGET_VISIBLE (widget))
{
GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
+
+ g_object_ref (widget);
if (toplevel != widget && GTK_WIDGET_TOPLEVEL (toplevel))
_gtk_window_unset_focus_and_default (GTK_WINDOW (toplevel), widget);
- g_object_ref (widget);
g_signal_emit (widget, widget_signals[HIDE], 0);
if (!GTK_WIDGET_TOPLEVEL (widget))
gtk_widget_queue_resize (widget);
@@ -2613,6 +2614,9 @@ static void
gtk_widget_invalidate_widget_windows (GtkWidget *widget,
GdkRegion *region)
{
+ if (!GTK_WIDGET_REALIZED (widget))
+ return;
+
if (!GTK_WIDGET_NO_WINDOW (widget) && widget->parent)
{
int x, y;
@@ -5114,6 +5118,8 @@ gtk_widget_set_child_visible (GtkWidget *widget,
g_return_if_fail (GTK_IS_WIDGET (widget));
g_return_if_fail (!GTK_WIDGET_TOPLEVEL (widget));
+ g_object_ref (widget);
+
if (is_visible)
GTK_PRIVATE_SET_FLAG (widget, GTK_CHILD_VISIBLE);
else
@@ -5136,6 +5142,8 @@ gtk_widget_set_child_visible (GtkWidget *widget,
else
gtk_widget_unmap (widget);
}
+
+ g_object_unref (widget);
}
/**
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 2fb60ba450..0e3c5f3db1 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -4562,6 +4562,9 @@ _gtk_window_unset_focus_and_default (GtkWindow *window,
{
GtkWidget *child;
+
+ g_object_ref (window);
+ g_object_ref (widget);
if (GTK_CONTAINER (widget->parent)->focus_child == widget)
{
@@ -4581,6 +4584,9 @@ _gtk_window_unset_focus_and_default (GtkWindow *window,
if (child == widget)
gtk_window_set_default (window, NULL);
+
+ g_object_unref (widget);
+ g_object_unref (window);
}
/*********************************