⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dom_events.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 2 页
字号:
	if (!node || !event) return 0;	GF_LOG(GF_LOG_DEBUG, GF_LOG_COMPOSE, ("[DOM Events    ] Time %f - Firing event  %s.%s\n", gf_node_get_scene_time(node), gf_node_get_name(node), gf_dom_event_get_name(event->type)));	/*flush any pending add_listener*/	gf_dom_listener_process_add(node->sgprivate->scenegraph);	event->target = node;	event->currentTarget = NULL;	/*capture phase - not 100% sure, the actual capture phase should be determined by the std using the DOM events	SVGT doesn't use this phase, so we don't add it for now.*/	if (0) {		u32 i, count;		GF_List *parents;		event->event_phase = 0;		parents = gf_list_new();		/*get all parents to top*/		gf_sg_dom_stack_parents(gf_node_get_parent(node, 0), parents);		count = gf_list_count(parents);		for (i=0; i<count; i++) {			GF_Node *n = (GF_Node *)gf_list_get(parents, i);			sg_fire_dom_event(n, event);			/*event has been canceled*/			if (event->event_phase==4) break;		}		gf_list_del(parents);		if (event->event_phase>=3) return 1;	}	/*target + bubbling phase*/	event->event_phase = 0;	if (sg_fire_dom_event(node, event) && event->bubbles) {		event->event_phase = 1;		if (!parent_use) parent_use = gf_node_get_parent(node, 0);		/*TODO check in the specs*/		else event->target = parent_use;		gf_sg_dom_event_bubble(parent_use, event);	}	return event->currentTarget ? 1 : 0;}GF_EXPORTGF_DOMHandler *gf_dom_listener_build(GF_Node *node, u32 event_type, u32 event_parameter, GF_Node *owner){	u32 tag;	GF_ChildNodeItem *last = NULL;	if (!owner) owner = node;	tag = gf_node_get_tag(node);	if ((tag>=GF_NODE_RANGE_FIRST_SVG) && (tag<=GF_NODE_RANGE_LAST_SVG)) {		SVG_Element *listener;		SVG_handlerElement *handler;		GF_FieldInfo info;		listener = (SVG_Element *) gf_node_new(node->sgprivate->scenegraph, TAG_SVG_listener);		handler = (SVG_handlerElement *) gf_node_new(node->sgprivate->scenegraph, TAG_SVG_handler);		gf_node_register((GF_Node *)listener, owner);		gf_node_list_add_child_last( & ((GF_ParentNode *)owner)->children, (GF_Node*)listener, &last);		gf_node_register((GF_Node *)handler, owner);		gf_node_list_add_child_last(& ((GF_ParentNode *)owner)->children, (GF_Node*)handler, &last);		gf_svg_get_attribute_by_tag((GF_Node*)handler, TAG_SVG_ATT_ev_event, 1, 0, &info);		((XMLEV_Event *)info.far_ptr)->type = event_type;		((XMLEV_Event *)info.far_ptr)->parameter = event_parameter;				gf_svg_get_attribute_by_tag((GF_Node*)listener, TAG_SVG_ATT_event, 1, 0, &info);		((XMLEV_Event *)info.far_ptr)->type = event_type;		((XMLEV_Event *)info.far_ptr)->parameter = event_parameter;		gf_svg_get_attribute_by_tag((GF_Node*)listener, TAG_SVG_ATT_handler, 1, 0, &info);		((XMLRI *)info.far_ptr)->target = handler;		gf_svg_get_attribute_by_tag((GF_Node*)listener, TAG_SVG_ATT_listener_target, 1, 0, &info);		((XMLRI *)info.far_ptr)->target = node;				gf_dom_listener_add((GF_Node *) node, (GF_Node *) listener);		/*set default handler*/		handler->handle_event = gf_sg_handle_dom_event;		return handler;	} #ifdef GPAC_ENABLE_SVG_SA	else if ((tag>=GF_NODE_RANGE_FIRST_SVG_SA) && (tag<=GF_NODE_RANGE_LAST_SVG_SA)) {		SVG_SA_listenerElement *listener;		SVG_SA_handlerElement *handler;		/*emulate a listener for onClick event*/		listener = (SVG_SA_listenerElement *) gf_node_new(node->sgprivate->scenegraph, TAG_SVG_SA_listener);		handler = (SVG_SA_handlerElement *) gf_node_new(node->sgprivate->scenegraph, TAG_SVG_SA_handler);		gf_node_register((GF_Node *)listener, owner);		gf_node_list_add_child_last( & ((GF_ParentNode *)owner)->children, (GF_Node*)listener, &last);		gf_node_register((GF_Node *)handler, owner);		gf_node_list_add_child_last(& ((GF_ParentNode *)owner)->children, (GF_Node*)handler, &last);		listener->event.type = event_type;		listener->event.parameter = event_parameter;		handler->ev_event = listener->event;		listener->handler.target = (SVG_SA_Element *) handler;		listener->target.target = (SVG_SA_Element *)node;		gf_dom_listener_add((GF_Node *) node, (GF_Node *) listener);		/*set default handler*/		handler->handle_event = gf_sg_handle_dom_event;		return handler;	} #endif /*GPAC_ENABLE_SVG_SA*/#ifdef GPAC_ENABLE_SVG_SANI	else if ((tag>=GF_NODE_RANGE_FIRST_SVG_SANI) && (tag<=GF_NODE_RANGE_LAST_SVG_SANI)) {		SVG_SA_listenerElement *listener;		SVG_SA_handlerElement *handler;		/*emulate a listener for onClick event*/		listener = (SVG_SA_listenerElement *) gf_node_new(node->sgprivate->scenegraph, TAG_SVG_SANI_listener);		handler = (SVG_SA_handlerElement *) gf_node_new(node->sgprivate->scenegraph, TAG_SVG_SANI_handler);		gf_node_register((GF_Node *)listener, owner);		gf_node_list_add_child_last( & ((GF_ParentNode *)owner)->children, (GF_Node*)listener, &last);		gf_node_register((GF_Node *)handler, owner);		gf_node_list_add_child_last(& ((GF_ParentNode *)owner)->children, (GF_Node*)handler, &last);		listener->event.type = event_type;		listener->event.parameter = event_parameter;		handler->ev_event = listener->event;		listener->handler.target = (SVG_SA_Element *) handler;		listener->target.target = (SVG_SA_Element *)node;		gf_dom_listener_add((GF_Node *) node, (GF_Node *) listener);		/*set default handler*/		handler->handle_event = gf_sg_handle_dom_event;		return handler;	} #endif /*GPAC_ENABLE_SVG_SANI*/	else {		return NULL;	}}static void gf_smil_handle_event(GF_Node *timed_elt, GF_FieldInfo *info, GF_DOM_Event *evt, Bool is_end){	SMIL_Time *resolved, *proto;	Double scene_time = gf_node_get_scene_time(evt->target);	GF_List *times = *(GF_List **)info->far_ptr;	u32 found = 0;	u32 i, j, count = gf_list_count(times);	/*remove all previously instantiated times that are in the past	TODO FIXME: this is not 100% correct, a begin val in the past can be interpreted!!*/	for (i=0; i<count; i++) {		proto = (SMIL_Time*)gf_list_get(times, i);		if ((proto->type == GF_SMIL_TIME_EVENT_RESOLVED) && (proto->clock<scene_time) ) {			free(proto);			gf_list_rem(times, i);			i--;			count--;		}	}	for (i=0; i<count; i++) {		proto = (SMIL_Time*)gf_list_get(times, i);		if (proto->type != GF_SMIL_TIME_EVENT) continue;		if (proto->event.type != evt->type) continue;		if ((evt->type == GF_EVENT_KEYDOWN) || (evt->type == GF_EVENT_REPEAT_EVENT)) {			if (proto->event.parameter!=evt->detail) continue;		}		/*solve*/		GF_SAFEALLOC(resolved, SMIL_Time);		resolved->type = GF_SMIL_TIME_EVENT_RESOLVED;		if (proto->is_absolute_event) {			resolved->clock = evt->smil_event_time + proto->clock;		} else {			resolved->clock = scene_time + proto->clock;		}		/*insert in sorted order*/		for (j=0; j<count; j++) {			proto = (SMIL_Time*)gf_list_get(times, j);			if ( GF_SMIL_TIME_IS_CLOCK(proto->type) ) {				if (proto->clock > resolved->clock) break;			} else {				break;			}		}		gf_list_insert(times, resolved, j);		if (j!=count) i++;		count++;		found++;		GF_LOG(GF_LOG_DEBUG, GF_LOG_COMPOSE, ("[SMIL Timing] Inserting new time in %s.%s: %f\n", gf_node_get_name(timed_elt), (is_end?"end":"begin"), resolved->clock));	}	if (found) gf_node_changed(timed_elt, info);}static void gf_smil_handle_event_begin(GF_Node *hdl, GF_DOM_Event *evt){	GF_FieldInfo info;	GF_Node *timed_elt = (GF_Node *)gf_node_get_private(hdl);	u32 tag = timed_elt->sgprivate->tag;	memset(&info, 0, sizeof(GF_FieldInfo));	info.name = "begin";	if ((tag>=GF_NODE_RANGE_FIRST_SVG) && (tag<=GF_NODE_RANGE_LAST_SVG)) {		info.far_ptr = ((SVGTimedAnimBaseElement *)timed_elt)->timingp->begin;	}#ifdef GPAC_ENABLE_SVG_SA	else if ( (tag>=GF_NODE_RANGE_FIRST_SVG_SA) && (tag<=GF_NODE_RANGE_LAST_SVG_SA) ) {		info.far_ptr = &((SVG_SA_Element *)timed_elt)->timing->begin;	}#endif#ifdef GPAC_ENABLE_SVG_SANI	else if ( (tag>=GF_NODE_RANGE_FIRST_SVG_SANI) && (tag<=GF_NODE_RANGE_LAST_SVG_SANI) ) {		info.far_ptr = &((SVG_SA_Element *)timed_elt)->timing->begin;	}#endif	else {		return; 	}	info.fieldType = SMIL_Times_datatype;	gf_smil_handle_event(timed_elt, &info, evt, 0);}static void gf_smil_handle_event_end(GF_Node *hdl, GF_DOM_Event *evt){	GF_FieldInfo info;	GF_Node *timed_elt = (GF_Node *)gf_node_get_private(hdl);	u32 tag = timed_elt->sgprivate->tag;	memset(&info, 0, sizeof(GF_FieldInfo));	info.name = "end";	if ((tag>=GF_NODE_RANGE_FIRST_SVG) && (tag<=GF_NODE_RANGE_LAST_SVG)) {		info.far_ptr = ((SVGTimedAnimBaseElement *)timed_elt)->timingp->end;	} #ifdef GPAC_ENABLE_SVG_SA	else if ((tag>=GF_NODE_RANGE_FIRST_SVG_SA) && (tag<=GF_NODE_RANGE_LAST_SVG_SA) ) {		info.far_ptr = &((SVG_SA_Element *)timed_elt)->timing->end;	} #endif#ifdef GPAC_ENABLE_SVG_SANI	else if ((tag>=GF_NODE_RANGE_FIRST_SVG_SANI) && (tag<=GF_NODE_RANGE_LAST_SVG_SANI)) {		info.far_ptr = &((SVG_SA_Element *)timed_elt)->timing->end;	} #endif	else {		return; 	}	info.fieldType = SMIL_Times_datatype;	gf_smil_handle_event((GF_Node *)timed_elt, &info, evt, 1);}static void gf_smil_setup_event_list(GF_Node *node, GF_List *l, Bool is_begin){	void *hdl;	u32 i, count;	u32 tag = node->sgprivate->tag;	count = gf_list_count(l);	for (i=0; i<count; i++) {		SMIL_Time *t = (SMIL_Time*)gf_list_get(l, i);		if (t->type != GF_SMIL_TIME_EVENT) continue;		/*not resolved yet*/		if (!t->element && t->element_id) continue;		if (t->event.type==GF_EVENT_BEGIN) {			t->event.type=GF_EVENT_BEGIN_EVENT;			t->is_absolute_event = 1;		} else if (t->event.type==GF_EVENT_END) {			t->event.type=GF_EVENT_END_EVENT;			t->is_absolute_event = 1;		} else if (t->event.type==GF_EVENT_REPEAT) {			t->event.type=GF_EVENT_REPEAT_EVENT;			t->is_absolute_event = 1;		} 		/*create a new listener but register it with the anim node. This ensures that if the node is destroed,		the listener will be removed*/		hdl = gf_dom_listener_build(t->element, t->event.type, t->event.parameter, node);				if ((tag>=GF_NODE_RANGE_FIRST_SVG) && (tag<=GF_NODE_RANGE_LAST_SVG)) {			((SVG_handlerElement *)hdl)->handle_event = is_begin ? gf_smil_handle_event_begin : gf_smil_handle_event_end;		}#ifdef GPAC_ENABLE_SVG_SA		else if ((tag>=GF_NODE_RANGE_FIRST_SVG_SA) && (tag<=GF_NODE_RANGE_LAST_SVG_SA)) {			((SVG_SA_handlerElement *)hdl)->handle_event = is_begin ? gf_smil_handle_event_begin : gf_smil_handle_event_end;		}#endif#ifdef GPAC_ENABLE_SVG_SANI		else if ((tag>=GF_NODE_RANGE_FIRST_SVG_SANI) && (tag<=GF_NODE_RANGE_LAST_SVG_SANI)) {			((SVG_SANI_handlerElement *)hdl)->handle_event = is_begin ? gf_smil_handle_event_begin : gf_smil_handle_event_end;		}#endif		else {			continue;		}		gf_node_set_private((GF_Node *)hdl, node);		t->element = NULL;	}}void gf_smil_setup_events(GF_Node *node){	GF_FieldInfo info;	if (gf_node_get_field_by_name(node, "begin", &info) != GF_OK) return;	gf_smil_setup_event_list(node, * (GF_List **)info.far_ptr, 1);	if (gf_node_get_field_by_name(node, "end", &info) != GF_OK) return;	gf_smil_setup_event_list(node, * (GF_List **)info.far_ptr, 0);}GF_DOMText *gf_dom_add_text_node(GF_Node *parent, char *text_data){	GF_DOMText *text;	GF_SAFEALLOC(text, GF_DOMText);	gf_node_setup((GF_Node *)text, TAG_DOMText);	text->sgprivate->scenegraph = parent->sgprivate->scenegraph;	text->textContent = text_data;	gf_node_register((GF_Node *)text, parent);	gf_node_list_add_child_last(&((GF_ParentNode *)parent)->children, (GF_Node*)text, NULL);	return text;}GF_DOMText *gf_dom_new_text_node(GF_SceneGraph *sg){	GF_DOMText *text;	GF_SAFEALLOC(text, GF_DOMText);	gf_node_setup((GF_Node *)text, TAG_DOMText);	text->sgprivate->scenegraph = sg;	return text;}GF_DOMUpdates *gf_dom_add_updates_node(GF_Node *parent){	GF_DOMUpdates *text;	GF_SAFEALLOC(text, GF_DOMUpdates);	gf_node_setup((GF_Node *)text, TAG_DOMUpdates);	text->sgprivate->scenegraph = parent->sgprivate->scenegraph;	text->updates = gf_list_new();	gf_node_register((GF_Node *)text, parent);	gf_node_list_add_child_last(&((GF_ParentNode *)parent)->children, (GF_Node*)text, NULL);	return text;}GF_DOMUpdates *gf_dom_add_update_node(GF_Node *parent){	GF_DOMUpdates *update;	GF_SAFEALLOC(update, GF_DOMUpdates);	gf_node_setup((GF_Node *)update, TAG_DOMUpdates);	update->sgprivate->scenegraph = parent->sgprivate->scenegraph;	update->updates = gf_list_new();	gf_node_register((GF_Node *)update, parent);	gf_node_list_add_child_last(&((GF_ParentNode *)parent)->children, (GF_Node*)update, NULL);	return update;}#endif	//GPAC_DISABLE_SVG

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -