int daemon_key_event_render_nodes(struct razer_daemon *daemon,int keycode,int pressed) { if(daemon->is_render_nodes_dirty) daemon_compute_render_nodes(daemon); int ret = 0; struct razer_fx_render_node *rn = NULL; for(int i = list_GetLen(daemon->render_nodes)-1;i>=0;i--) { rn = list_Get(daemon->render_nodes,i); ret = daemon_key_event_render_node(daemon,rn,keycode,pressed); if(!ret) { if(rn->next) { //exchange this render_node with the next one list_Set(daemon->render_nodes,i,rn->next); if(rn->move_frame_buffer_linkage_to_next) { if(rn->next->output_frame_linked_uid == -1) razer_free_rgb_frame(rn->next->output_frame); if(rn->next->input_frame_linked_uid == -1) razer_free_rgb_frame(rn->next->input_frame); if(rn->next->second_input_frame_linked_uid == -1) razer_free_rgb_frame(rn->next->second_input_frame); rn->next->input_frame = rn->input_frame; rn->next->second_input_frame = rn->second_input_frame; rn->next->output_frame = rn->output_frame; rn->next->input_frame_linked_uid = rn->input_frame_linked_uid; rn->next->second_input_frame_linked_uid = rn->second_input_frame_linked_uid; //if(rn->output_frame_linked_uid!= -1) rn->next->output_frame_linked_uid = rn->output_frame_linked_uid; } rn->next->prev = rn; rn->next->start_ticks = 0; rn->start_ticks = 0; rn->running = 0; } } } if(!rn->next && !ret) { //root render_node effect returned 0 //start next render_node in chain or default } return(1); }
int daemon_key_event_render_node(struct razer_daemon *daemon,struct razer_fx_render_node *render_node,int keycode,int pressed) { if(!render_node || !render_node->effect) return(-1); if(!render_node->start_ticks) { render_node->start_ticks = razer_get_ticks(); render_node->running = 1; } if(!render_node->running || daemon_has_render_node_reached_render_limit(daemon,render_node)) return(0); if(list_GetLen(render_node->subs)) { for(int i=0;i<list_GetLen(render_node->subs);i++) { struct razer_fx_render_node *sub = list_Get(render_node->subs,i); if(!sub->start_ticks) { sub->start_ticks = razer_get_ticks(); sub->running = 1; } if(!sub->running) continue; int sub_ret = daemon_key_event_render_node(daemon,sub,keycode,pressed); if(!sub_ret || daemon_has_render_node_reached_render_limit(daemon,sub) || !sub->running) { if(sub->next) { list_Set(render_node->subs,i,sub->next); sub->next->parent = render_node; sub->next->start_ticks = 0; } sub->running = 0; //return(0); } } } if(!render_node->effect->key_event) return(-1); int ret = render_node->effect->key_event(render_node,keycode,pressed); return(ret); }