Commit 087cbd1d09b63b10538446b812cc21191787de24

Fix ordering of setting embedder vs unrealize

Fixes a crash on unrealize
  
580580
581581 priv->children = g_list_prepend (priv->children, widget);
582582 gtk_widget_set_parent (widget, GTK_WIDGET (container));
583 if (GTK_CLUTTER_OFFSCREEN (widget)->active)
584 _gtk_clutter_embedd_set_child_active (GTK_CLUTTER_EMBED (container),
585 widget, TRUE);
586583}
587584
588585static void
592592 l = g_list_find (priv->children, widget);
593593 if (l)
594594 {
595 if (GTK_CLUTTER_OFFSCREEN (widget)->active)
596 _gtk_clutter_embedd_set_child_active (GTK_CLUTTER_EMBED (container),
597 widget, FALSE);
598 gtk_widget_unparent (widget);
599595 priv->children = g_list_delete_link (priv->children, l);
596 gtk_widget_unparent (widget);
600597 }
601598}
602599
  
2121
2222G_DEFINE_TYPE (GtkClutterOffscreen, gtk_clutter_offscreen, GTK_TYPE_BIN);
2323
24void _gtk_clutter_embedd_set_child_active (GtkClutterEmbed *embed,
25 GtkWidget *child,
26 gboolean active);
27
2428static gint
2529gtk_clutter_offscreen_expose (GtkWidget *widget,
2630 GdkEventExpose *event)
7979 return GTK_WIDGET (offscreen);
8080}
8181
82GdkWindow *
83get_embedding_window (GtkClutterOffscreen *offscreen)
84{
85 GtkWidget *embed;
86 embed = _gtk_clutter_actor_get_embed (GTK_CLUTTER_ACTOR (offscreen->actor));
87 return embed->window;
88}
89
9082static void
9183offscreen_window_to_parent (GdkWindow *offscreen_window,
9284 double offscreen_x,
129129 GdkWindowAttr attributes;
130130 gint attributes_mask;
131131 gint border_width;
132 GdkWindow *parent;
132 GtkWidget *parent;
133133
134134 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
135135
148148
149149 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
150150
151 parent = get_embedding_window (offscreen);
151 parent = gtk_widget_get_parent (widget);
152152
153 widget->window = gdk_window_new (gdk_screen_get_root_window (gdk_drawable_get_screen (GDK_DRAWABLE (parent))),
153 widget->window = gdk_window_new (gdk_screen_get_root_window (gdk_drawable_get_screen (GDK_DRAWABLE (parent->window))),
154154 &attributes, attributes_mask);
155155 gdk_window_set_user_data (widget->window, widget);
156156
162162 widget->style = gtk_style_attach (widget->style, widget->window);
163163
164164 gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
165
166 if (offscreen->active)
167 _gtk_clutter_embedd_set_child_active (GTK_CLUTTER_EMBED (parent),
168 widget, TRUE);
169
165170}
166171
167172static void
168173gtk_clutter_offscreen_unrealize (GtkWidget *widget)
169174{
175 GtkClutterOffscreen *offscreen = GTK_CLUTTER_OFFSCREEN (widget);
176
177 if (offscreen->active)
178 _gtk_clutter_embedd_set_child_active (GTK_CLUTTER_EMBED (widget->parent),
179 widget, FALSE);
170180 GTK_WIDGET_CLASS (gtk_clutter_offscreen_parent_class)->unrealize (widget);
171181}
172182
246246
247247 return TRUE;
248248}
249
250void
251_gtk_clutter_embedd_set_child_active (GtkClutterEmbed *embed,
252 GtkWidget *child,
253 gboolean active);
254249
255250void
256251gtk_clutter_offscreen_set_active (GtkClutterOffscreen *offscreen,