static void anchor_activation(GF_Node *node, AnchorStack *st, GF_Compositor *compositor) { GF_Event evt; u32 i; MFURL *url = NULL; switch (gf_node_get_tag(node)) { case TAG_MPEG4_Anchor: url = & ((M_Anchor *)node)->url; evt.navigate.param_count = ((M_Anchor *)node)->parameter.count; evt.navigate.parameters = (const char **) ((M_Anchor *)node)->parameter.vals; break; #ifndef GPAC_DISABLE_X3D case TAG_X3D_Anchor: url = & ((X_Anchor *)node)->url; evt.navigate.param_count = ((X_Anchor *)node)->parameter.count; evt.navigate.parameters = (const char **) ((X_Anchor *)node)->parameter.vals; break; #endif } evt.type = GF_EVENT_NAVIGATE; i=0; while (url && i<url->count) { evt.navigate.to_url = url->vals[i].url; if (!evt.navigate.to_url) break; /*current scene navigation*/ if (evt.navigate.to_url[0] == '#') { GF_Node *bindable; evt.navigate.to_url++; bindable = gf_sg_find_node_by_name(gf_node_get_graph(node), (char *) evt.navigate.to_url); if (bindable) { Bindable_SetSetBind(bindable, 1); break; } } else if (compositor->term) { if (gf_scene_process_anchor(node, &evt)) break; } else if (gf_term_send_event(compositor->term, &evt)) { break; } i++; } }
static void svg_a_handle_event(GF_Node *handler, GF_DOM_Event *event, GF_Node *observer) { GF_Compositor *compositor; GF_Event evt; SVG_Element *a; SVGAllAttributes all_atts; if (event->event_phase & GF_DOM_EVENT_PHASE_PREVENT) return; assert(gf_node_get_tag((GF_Node*)event->currentTarget->ptr)==TAG_SVG_a); a = (SVG_Element *) event->currentTarget->ptr; gf_svg_flatten_attributes(a, &all_atts); compositor = (GF_Compositor *)gf_node_get_private((GF_Node *)handler); if (!compositor->user->EventProc) return; if (!all_atts.xlink_href) return; if (event->type==GF_EVENT_MOUSEOVER) { evt.type = GF_EVENT_NAVIGATE_INFO; if (all_atts.xlink_title) evt.navigate.to_url = *all_atts.xlink_title; else if (all_atts.xlink_href->string) evt.navigate.to_url = all_atts.xlink_href->string; else { evt.navigate.to_url = gf_node_get_name(all_atts.xlink_href->target); if (!evt.navigate.to_url) evt.navigate.to_url = "document internal link"; } gf_term_send_event(compositor->term, &evt); return; } evt.type = GF_EVENT_NAVIGATE; if (all_atts.xlink_href->type == XMLRI_STRING) { evt.navigate.to_url = gf_term_resolve_xlink(handler, all_atts.xlink_href->string); if (evt.navigate.to_url) { if (all_atts.target) { evt.navigate.parameters = (const char **) &all_atts.target; evt.navigate.param_count = 1; } else { evt.navigate.parameters = NULL; evt.navigate.param_count = 0; } if (evt.navigate.to_url[0] != '#') { if (compositor->term) { gf_scene_process_anchor(handler, &evt); } else { gf_term_send_event(compositor->term, &evt); } gf_free((char *)evt.navigate.to_url); return; } all_atts.xlink_href->target = gf_sg_find_node_by_name(gf_node_get_graph(handler), (char *) evt.navigate.to_url+1); if (all_atts.xlink_href->target) { all_atts.xlink_href->type = XMLRI_ELEMENTID; gf_free((char *)evt.navigate.to_url); } else { svg_a_set_view(handler, compositor, evt.navigate.to_url + 1); gf_free((char *)evt.navigate.to_url); return; } } } if (!all_atts.xlink_href->target) { return; } /*this is a time event*/ if (is_timing_target(all_atts.xlink_href->target)) { gf_smil_timing_insert_clock(all_atts.xlink_href->target, 0, gf_node_get_scene_time((GF_Node *)handler) ); } /*this is an implicit SVGView event*/ else { svg_a_set_view(handler, compositor, gf_node_get_name(all_atts.xlink_href->target)); } }