main: Inline propagate_{down,up} in propagate_internal()

Don't have to worry about anyone calling the up/down variants on their
own this way.
This commit is contained in:
Timm Bäder 2020-05-08 10:32:57 +02:00
parent ddaf50dfcc
commit a50bf27cf2

View File

@ -2097,55 +2097,10 @@ gtk_get_event_widget (GdkEvent *event)
return NULL; return NULL;
} }
static gboolean gboolean
propagate_event_up (GtkWidget *widget, gtk_propagate_event_internal (GtkWidget *widget,
GdkEvent *event, GdkEvent *event,
GtkWidget *topmost) GtkWidget *topmost)
{
gboolean handled_event = FALSE;
GtkWidget *target = widget;
/* Propagate event up the widget tree so that
* parents can see the button and motion
* events of the children.
*/
while (TRUE)
{
GtkWidget *tmp;
g_object_ref (widget);
/* Scroll events are special cased here because it
* feels wrong when scrolling a GtkViewport, say,
* to have children of the viewport eat the scroll
* event
*/
if (!_gtk_widget_is_sensitive (widget))
handled_event = gdk_event_get_event_type (event) != GDK_SCROLL;
else if (_gtk_widget_get_realized (widget))
handled_event = gtk_widget_event (widget, event, target);
handled_event |= !_gtk_widget_get_realized (widget);
tmp = _gtk_widget_get_parent (widget);
g_object_unref (widget);
if (widget == topmost)
break;
widget = tmp;
if (handled_event || !widget)
break;
}
return handled_event;
}
static gboolean
propagate_event_down (GtkWidget *widget,
GdkEvent *event,
GtkWidget *topmost)
{ {
gint handled_event = FALSE; gint handled_event = FALSE;
GtkWidget *target = widget; GtkWidget *target = widget;
@ -2153,6 +2108,7 @@ propagate_event_down (GtkWidget *widget,
GtkWidget *stack_widgets[16]; GtkWidget *stack_widgets[16];
int i; int i;
/* First, propagate event down */
gtk_array_init (&widget_array, (void**)stack_widgets, 16); gtk_array_init (&widget_array, (void**)stack_widgets, 16);
gtk_array_add (&widget_array, g_object_ref (widget)); gtk_array_add (&widget_array, g_object_ref (widget));
@ -2197,26 +2153,38 @@ propagate_event_down (GtkWidget *widget,
i--; i--;
} }
/* If not yet handled, also propagate down */
if (!handled_event)
{
/* Propagate event up the widget tree so that
* parents can see the button and motion
* events of the children.
*/
for (i = 0; i < widget_array.len; i++)
{
widget = gtk_array_index (&widget_array, i);
/* Scroll events are special cased here because it
* feels wrong when scrolling a GtkViewport, say,
* to have children of the viewport eat the scroll
* event
*/
if (!_gtk_widget_is_sensitive (widget))
handled_event = gdk_event_get_event_type (event) != GDK_SCROLL;
else if (_gtk_widget_get_realized (widget))
handled_event = gtk_widget_event (widget, event, target);
handled_event |= !_gtk_widget_get_realized (widget);
if (handled_event)
break;
}
}
gtk_array_free (&widget_array, g_object_unref); gtk_array_free (&widget_array, g_object_unref);
return handled_event; return handled_event;
} }
gboolean
gtk_propagate_event_internal (GtkWidget *widget,
GdkEvent *event,
GtkWidget *topmost)
{
/* Propagate the event down and up */
if (propagate_event_down (widget, event, topmost))
return TRUE;
if (propagate_event_up (widget, event, topmost))
return TRUE;
return FALSE;
}
/** /**
* gtk_propagate_event: * gtk_propagate_event:
* @widget: a #GtkWidget * @widget: a #GtkWidget