void html_interval_forall (HTMLInterval *i, HTMLEngine *e, HTMLObjectForallFunc f, gpointer data) { GSList *from_downline, *to_downline; HTMLEngine *engine; g_return_if_fail (i->from.object); g_return_if_fail (i->to.object); i = html_interval_flat (i); from_downline = get_downtree_line (i->from.object); to_downline = get_downtree_line (i->to.object); engine = do_downtree_lines_intersection (&from_downline, &to_downline, e); if (from_downline) interval_forall (HTML_OBJECT (from_downline->data)->parent, from_downline, to_downline, html_object_get_engine (HTML_OBJECT (from_downline->data)->parent, engine), f, data); else { g_assert (i->from.object == i->to.object); html_object_forall (i->from.object, html_object_get_engine (i->from.object, engine), f, data); } g_slist_free (from_downline); g_slist_free (to_downline); html_interval_destroy (i); }
static void forall (HTMLObject *self, HTMLEngine *e, HTMLObjectForallFunc func, gpointer data) { HTMLFrame *frame; frame = HTML_FRAME (self); (* func) (self, html_object_get_engine (self, e), data); html_object_forall (GTK_HTML (frame->html)->engine->clue, html_object_get_engine (self, e), func, data); }
static void interval_forall (HTMLObject *parent, GSList *from_down, GSList *to_down, HTMLEngine *e, HTMLObjectForallFunc f, gpointer data) { HTMLObject *o, *from, *to; from = from_down ? HTML_OBJECT (from_down->data) : html_object_head (parent); to = to_down ? HTML_OBJECT (to_down->data) : NULL; for (o = from; o; o = html_object_next_not_slave (o)) { interval_forall (o, (from_down && o == HTML_OBJECT (from_down->data)) ? from_down->next : NULL, (to_down && o == HTML_OBJECT (to_down->data)) ? to_down->next : NULL, html_object_get_engine (o, e), f, data); if (o == to) break; } (*f) (parent, e, data); }
static HTMLEngine * do_downtree_lines_intersection (GSList **l1, GSList **l2, HTMLEngine *e) { GSList *link; g_assert ((*l1)->data == (*l2)->data); while (*l1 && *l2 && (*l1)->data == (*l2)->data) { e = html_object_get_engine (HTML_OBJECT ((*l1)->data), e); link = *l1; *l1 = g_slist_remove_link (*l1, link); g_slist_free (link); link = *l2; *l2 = g_slist_remove_link (*l2, link); g_slist_free (link); } return e; }