diff options
author | Owen Taylor <otaylor@redhat.com> | 2004-02-13 03:03:21 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2004-02-13 03:03:21 +0000 |
commit | 3588aeb4af12621b16faeac0ccb3001ebe48f0e9 (patch) | |
tree | bbc61d29237642b0a6b459e3404828170f7f21b1 | |
parent | e4d55e75e037452cc4ef7bfcdbae182d7f6a004d (diff) | |
download | gtk+-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-- | ChangeLog | 16 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 16 | ||||
-rw-r--r-- | ChangeLog.pre-2-4 | 16 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 16 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 16 | ||||
-rw-r--r-- | gtk/gtkwidget.c | 10 | ||||
-rw-r--r-- | gtk/gtkwindow.c | 6 |
7 files changed, 95 insertions, 1 deletions
@@ -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); } /********************************* |