Re: Redundant code in gtk_propagate_event()
- From: Owen Taylor <otaylor redhat com>
- To: "Padraig O'Briain" <Padraig Obriain Sun COM>
- Cc: gtk-devel-list gnome org
- Subject: Re: Redundant code in gtk_propagate_event()
- Date: 04 Oct 2001 08:57:28 -0400
"Padraig O'Briain" <Padraig Obriain Sun COM> writes:
> The code is gtk_prtopagate_event() currently is as below. What I was proposing
> was to remove the second call to gtk_widget_get_toplevel().
Oh, misread the patch. The second gtk_widget_get_toplevel()
is not at all redundant. It's there because
a) we don't keep a reference on the 'window' widget so
it might have been destroyed out from under us
in the call to gtk_widget_event()
b) 'window' might no longer be the toplevel widget for the widget
even if it still exists.
Regards,
Owen
> ------------- Begin Included Message -------------
>
> GtkWidget *window;
>
> window = gtk_widget_get_toplevel (widget);
> if (window && GTK_IS_WINDOW (window))
> {
> /* If there is a grab within the window, give the grab widget
> * a first crack at the key event
> */
> if (widget != window && GTK_WIDGET_HAS_GRAB (widget))
> handled_event = gtk_widget_event (widget, event);
>
> if (!handled_event)
> {
> window = gtk_widget_get_toplevel (widget);
> if (window && GTK_IS_WINDOW (window))
> {
> if (GTK_WIDGET_IS_SENSITIVE (window))
> gtk_widget_event (window, event);
> }
> }
>
> handled_event = TRUE; /* don't send to widget */
> }
>
> ------------- End Included Message -------------
>
> >
> > Since get_toplevel() never returns NULL for valid arguments;
> > but the GTK_IS_WINDOW() check is needed; in various
> > pathological cases you can have widgets that receive events
> > where the toplevel widget is not GtkWindow. Those would
> > mostly be:
> >
> > - Someone called gtk_propagate_event() directly.
> > - A widget was force-realized via gtk_widget_realize()
> > while anchored.
> >
> > Both of those are programmer errors .... but still, I think
> > it's worth having this check to get a bit of extra safety.
> >
> > Regards,
> > Owen
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]