Compare commits

...

7 Commits

Author SHA1 Message Date
Timm Bäder
d8baf606b8 main: Use the new widget depth when delivering events 2018-12-25 12:19:32 +01:00
Timm Bäder
cc56dca251 window: Don't allocate GLists when changing cursors
We do this all the time when moving the cursor and we can now do it
without the GList allocations.
2018-12-25 12:06:06 +01:00
Timm Bäder
1cfbca09b5 widget: Save the depth of a widget in the tree
This is handy whenever we do some operation on all parent widgets of a
widget.
2018-12-25 12:01:22 +01:00
Timm Bäder
8377b4cd64 stack: Don't queue an unnecessary redraw
Both queue_allocate and queue_resize already queue a draw.
2018-12-23 08:23:03 +01:00
Timm Bäder
fd9879e5ff picture: Avoid some unnecessary signal connections
We don't need to ever invalidate the picture size if the paintable tells
us its size is static. Same for the contents.
2018-12-22 15:05:37 +01:00
Timm Bäder
817303a41e image: Remove private struct from public header 2018-12-21 09:14:20 +01:00
Timm Bäder
84645366a4 image: Remove some outdated comments 2018-12-21 09:11:31 +01:00
8 changed files with 95 additions and 37 deletions

View File

@@ -77,16 +77,16 @@
*/ */
struct _GtkImagePrivate typedef struct
{ {
GtkIconHelper *icon_helper; GtkIconHelper *icon_helper;
GtkIconSize icon_size; GtkIconSize icon_size;
float baseline_align; float baseline_align;
gchar *filename; /* Only used with GTK_IMAGE_SURFACE */ char *filename;
gchar *resource_path; /* Only used with GTK_IMAGE_SURFACE */ char *resource_path;
}; } GtkImagePrivate;
static void gtk_image_snapshot (GtkWidget *widget, static void gtk_image_snapshot (GtkWidget *widget,

View File

@@ -45,7 +45,6 @@ G_BEGIN_DECLS
typedef struct _GtkImage GtkImage; typedef struct _GtkImage GtkImage;
typedef struct _GtkImagePrivate GtkImagePrivate;
typedef struct _GtkImageClass GtkImageClass; typedef struct _GtkImageClass GtkImageClass;
/** /**

View File

@@ -2459,26 +2459,35 @@ propagate_event_down (GtkWidget *widget,
GdkEvent *event, GdkEvent *event,
GtkWidget *topmost) GtkWidget *topmost)
{ {
gint handled_event = FALSE; gboolean handled_event = FALSE;
GList *widgets = NULL; GtkWidget **widgets;
GList *l; int n_widgets = 0;
int topmost_depth;
int i;
widgets = g_list_prepend (widgets, g_object_ref (widget)); if (topmost)
topmost_depth = gtk_widget_get_depth (topmost);
else
topmost_depth = 0;
widgets = g_alloca (sizeof (*widgets) *
(gtk_widget_get_depth (widget) - topmost_depth));
while (widget && widget != topmost) while (widget && widget != topmost)
{ {
widget = gtk_widget_get_parent (widget); widget = gtk_widget_get_parent (widget);
if (!widget) if (!widget)
break; break;
widgets = g_list_prepend (widgets, g_object_ref (widget)); widgets[n_widgets] = g_object_ref (widget);
n_widgets ++;
if (widget == topmost) if (widget == topmost)
break; break;
} }
for (l = widgets; l && !handled_event; l = l->next) for (i = n_widgets - 1; i >= 0; i --)
{ {
widget = (GtkWidget *)l->data; widget = widgets[i];
if (!gtk_widget_is_sensitive (widget)) if (!gtk_widget_is_sensitive (widget))
{ {
@@ -2491,9 +2500,17 @@ propagate_event_down (GtkWidget *widget,
handled_event = TRUE; handled_event = TRUE;
} }
else else
handled_event = _gtk_widget_captured_event (widget, event); {
handled_event = _gtk_widget_captured_event (widget, event);
}
if (handled_event)
break;
} }
g_list_free_full (widgets, (GDestroyNotify)g_object_unref);
/* Unref all now */
for (i = 0; i < n_widgets; i ++)
g_object_unref (widgets[i]);
return handled_event; return handled_event;
} }

View File

@@ -798,26 +798,36 @@ gtk_picture_set_paintable (GtkPicture *self,
if (self->paintable) if (self->paintable)
{ {
g_signal_handlers_disconnect_by_func (self->paintable, const guint flags = gdk_paintable_get_flags (self->paintable);
gtk_picture_paintable_invalidate_contents,
self); if ((flags & GDK_PAINTABLE_STATIC_CONTENTS) == 0)
g_signal_handlers_disconnect_by_func (self->paintable, g_signal_handlers_disconnect_by_func (self->paintable,
gtk_picture_paintable_invalidate_size, gtk_picture_paintable_invalidate_contents,
self); self);
if ((flags & GDK_PAINTABLE_STATIC_SIZE) == 0)
g_signal_handlers_disconnect_by_func (self->paintable,
gtk_picture_paintable_invalidate_size,
self);
} }
self->paintable = paintable; self->paintable = paintable;
if (paintable) if (paintable)
{ {
g_signal_connect (paintable, const guint flags = gdk_paintable_get_flags (paintable);
"invalidate-contents",
G_CALLBACK (gtk_picture_paintable_invalidate_contents), if ((flags & GDK_PAINTABLE_STATIC_CONTENTS) == 0)
self); g_signal_connect (paintable,
g_signal_connect (paintable, "invalidate-contents",
"invalidate-size", G_CALLBACK (gtk_picture_paintable_invalidate_contents),
G_CALLBACK (gtk_picture_paintable_invalidate_size), self);
self);
if ((flags & GDK_PAINTABLE_STATIC_SIZE) == 0)
g_signal_connect (paintable,
"invalidate-size",
G_CALLBACK (gtk_picture_paintable_invalidate_size),
self);
} }
gtk_widget_queue_resize (GTK_WIDGET (self)); gtk_widget_queue_resize (GTK_WIDGET (self));

View File

@@ -768,12 +768,12 @@ gtk_stack_progress_updated (GtkStack *stack)
{ {
GtkStackPrivate *priv = gtk_stack_get_instance_private (stack); GtkStackPrivate *priv = gtk_stack_get_instance_private (stack);
gtk_widget_queue_draw (GTK_WIDGET (stack));
if (!priv->vhomogeneous || !priv->hhomogeneous) if (!priv->vhomogeneous || !priv->hhomogeneous)
gtk_widget_queue_resize (GTK_WIDGET (stack)); gtk_widget_queue_resize (GTK_WIDGET (stack));
else if (is_window_moving_transition (priv->active_transition_type)) else if (is_window_moving_transition (priv->active_transition_type))
gtk_widget_queue_allocate (GTK_WIDGET (stack)); gtk_widget_queue_allocate (GTK_WIDGET (stack));
else
gtk_widget_queue_draw (GTK_WIDGET (stack));
if (gtk_progress_tracker_get_state (&priv->tracker) == GTK_PROGRESS_STATE_AFTER) if (gtk_progress_tracker_get_state (&priv->tracker) == GTK_PROGRESS_STATE_AFTER)
{ {

View File

@@ -2802,6 +2802,7 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class)
priv->last_child = NULL; priv->last_child = NULL;
priv->prev_sibling = NULL; priv->prev_sibling = NULL;
priv->next_sibling = NULL; priv->next_sibling = NULL;
priv->depth = 1;
priv->allocated_baseline = -1; priv->allocated_baseline = -1;
priv->allocated_size_baseline = -1; priv->allocated_size_baseline = -1;
@@ -2979,6 +2980,22 @@ gtk_widget_new (GType type,
return widget; return widget;
} }
static void
gtk_widget_propagate_depth (GtkWidget *widget,
int new_depth)
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
GtkWidget *child;
priv->depth = new_depth;
for (child = _gtk_widget_get_first_child (widget);
child != NULL;
child = _gtk_widget_get_next_sibling (child))
gtk_widget_propagate_depth (child, new_depth + 1);
}
/** /**
* gtk_widget_unparent: * gtk_widget_unparent:
* @widget: a #GtkWidget * @widget: a #GtkWidget
@@ -3062,6 +3079,7 @@ gtk_widget_unparent (GtkWidget *widget)
priv->parent = NULL; priv->parent = NULL;
priv->prev_sibling = NULL; priv->prev_sibling = NULL;
priv->next_sibling = NULL; priv->next_sibling = NULL;
gtk_widget_propagate_depth (widget, 1);
/* parent may no longer expand if the removed /* parent may no longer expand if the removed
* child was expand=TRUE and could therefore * child was expand=TRUE and could therefore
@@ -6505,6 +6523,7 @@ gtk_widget_reposition_after (GtkWidget *widget,
gtk_widget_push_verify_invariants (widget); gtk_widget_push_verify_invariants (widget);
priv->parent = parent; priv->parent = parent;
gtk_widget_propagate_depth (widget, gtk_widget_get_depth (parent) + 1);
if (previous_sibling) if (previous_sibling)
{ {

View File

@@ -167,6 +167,7 @@ struct _GtkWidgetPrivate
GtkWidget *next_sibling; GtkWidget *next_sibling;
GtkWidget *first_child; GtkWidget *first_child;
GtkWidget *last_child; GtkWidget *last_child;
int depth;
/* only created on-demand */ /* only created on-demand */
GtkListListModel *children_observer; GtkListListModel *children_observer;
@@ -481,6 +482,12 @@ _gtk_widget_get_last_child (GtkWidget *widget)
return widget->priv->last_child; return widget->priv->last_child;
} }
static inline int
gtk_widget_get_depth (GtkWidget *widget)
{
return widget->priv->depth;
}
G_END_DECLS G_END_DECLS
#endif /* __GTK_WIDGET_PRIVATE_H__ */ #endif /* __GTK_WIDGET_PRIVATE_H__ */

View File

@@ -11260,39 +11260,45 @@ update_cursor (GtkWindow *toplevel,
GtkWidget *target) GtkWidget *target)
{ {
GdkCursor *cursor = NULL; GdkCursor *cursor = NULL;
GList *widgets = NULL, *l; GtkWidget **widgets;
int n_widgets = 0;
int i;
if (grab_widget && !gtk_widget_is_ancestor (target, grab_widget)) if (grab_widget && !gtk_widget_is_ancestor (target, grab_widget))
{ {
/* Outside the grab widget, cursor stays to whatever the grab /* Outside the grab widget, cursor stays to whatever the grab
* widget says. * widget says.
*/ */
widgets = g_list_prepend (widgets, grab_widget); widgets = g_alloca (sizeof (*widgets));
widgets[0] = grab_widget;
n_widgets = 1;
} }
else else
{ {
/* Inside the grab widget or in absence of grabs, allow walking /* Inside the grab widget or in absence of grabs, allow walking
* up the hierarchy to find out the cursor. * up the hierarchy to find out the cursor.
*/ */
widgets = g_alloca (sizeof (*widgets) * gtk_widget_get_depth (target));
while (target) while (target)
{ {
widgets = g_list_prepend (widgets, target); widgets[n_widgets] = target;
n_widgets ++;
if (grab_widget && target == grab_widget) if (grab_widget && target == grab_widget)
break; break;
target = _gtk_widget_get_parent (target); target = _gtk_widget_get_parent (target);
} }
} }
for (l = g_list_last (widgets); l; l = l->prev) for (i = 0; i < n_widgets; i ++)
{ {
cursor = gtk_widget_get_cursor (l->data); cursor = gtk_widget_get_cursor (widgets[i]);
if (cursor) if (cursor)
break; break;
} }
gdk_surface_set_device_cursor (gtk_widget_get_surface (GTK_WIDGET (toplevel)), gdk_surface_set_device_cursor (gtk_widget_get_surface (GTK_WIDGET (toplevel)),
device, cursor); device, cursor);
g_list_free (widgets);
} }
void void