int effect_transition_mouse_event_handler(struct razer_fx_render_node *render,struct razer_chroma_event *event)
{
	struct razer_pos_range *range = daemon_get_parameter_pos_range(daemon_effect_get_parameter_by_index(render->effect,0));
	int dir = daemon_get_parameter_int(daemon_effect_get_parameter_by_index(render->effect,1));
	struct razer_pos *pos = daemon_get_parameter_pos(daemon_effect_get_parameter_by_index(render->effect,2));
	float opacity = 0.0f;
	if(event->type == RAZER_CHROMA_EVENT_TYPE_MOUSE && event->sub_type == RAZER_CHROMA_EVENT_SUBTYPE_MOUSE_X_AXIS_MOVEMENT)
	{
		int new_x = event->value + pos->x;
		if(new_x <= range->max->x && new_x >= range->min->x)
			pos->x = new_x;
		//#ifdef USE_DEBUGGING
		//	printf(" (Compute::Mouse Trans.%d ## pos:%d,%d,dir:%d,opacity:%f)",render->id,pos->x,pos->y,dir,opacity);
		//#endif
	}

	if(event->type == RAZER_CHROMA_EVENT_TYPE_MOUSE && event->sub_type == RAZER_CHROMA_EVENT_SUBTYPE_MOUSE_Y_AXIS_MOVEMENT)
	{
		int new_y = event->value + pos->y;
		if(new_y <= range->max->y && new_y >= range->min->y)
			pos->y = new_y;

		//#ifdef USE_DEBUGGING
		//	printf(" (Compute::Mouse Trans.%d ## pos:%d,%d,dir:%d,opacity:%f)",render->id,pos->x,pos->y,dir,opacity);
		//#endif
	}

	if(dir == 0)
		opacity = (float)pos->y / (float)range->max->y;
	else
		opacity = (float)pos->x / (float)range->max->x;
	

	if(render->parent) //compute effects should only be added as sub so this should be always fine
		render->parent->opacity = opacity;
	//daemon_set_parameter_int(daemon_effect_get_parameter_by_index(render->effect,1),dir);	
	//daemon_set_parameter_(daemon_effect_get_parameter_by_index(render->effect,1),dir);	
	return(1);
}
char *daemon_parameter_to_json(struct razer_parameter *parameter)
{
	char *parameter_json = str_CreateEmpty();
	parameter_json = str_CatFree(parameter_json,"{\n \"key\": \"");
	parameter_json = str_CatFree(parameter_json,parameter->key);
	parameter_json = str_CatFree(parameter_json,"\",\n");
	parameter_json = str_CatFree(parameter_json," \"id\" : ");
	char *id_string = str_FromLong(parameter->id);
	parameter_json = str_CatFree(parameter_json,id_string);
	parameter_json = str_CatFree(parameter_json," ,\n");
	free(id_string);
	parameter_json = str_CatFree(parameter_json," \"type\" : ");
	char *type_string = str_FromLong(parameter->type);
	parameter_json = str_CatFree(parameter_json,type_string);
	parameter_json = str_CatFree(parameter_json," ,\n");
	free(type_string);
	parameter_json = str_CatFree(parameter_json," \"value\" : ");
	switch(parameter->type)
	{
		case RAZER_PARAMETER_TYPE_STRING:
			{
				parameter_json = str_CatFree(parameter_json,"\"");
				parameter_json = str_CatFree(parameter_json,daemon_get_parameter_string(parameter));
				parameter_json = str_CatFree(parameter_json,"\" ,\n");
			}
			break;
		case RAZER_PARAMETER_TYPE_INT:
			{
				char *int_string = str_FromLong(daemon_get_parameter_int(parameter));
				parameter_json = str_CatFree(parameter_json,int_string);
				free(int_string);
				parameter_json = str_CatFree(parameter_json," ,\n");
			}
			break;
		case RAZER_PARAMETER_TYPE_UINT:
			{
				char *int_string = str_FromLong(daemon_get_parameter_int(parameter));
				parameter_json = str_CatFree(parameter_json,int_string);
				free(int_string);
				parameter_json = str_CatFree(parameter_json," ,\n");
			}
			break;
		case RAZER_PARAMETER_TYPE_FLOAT:
			{
				char *float_string = str_FromDouble(daemon_get_parameter_float(parameter));
				parameter_json = str_CatFree(parameter_json,float_string);
				free(float_string);
				parameter_json = str_CatFree(parameter_json," ,\n");
			}
			break;
		case RAZER_PARAMETER_TYPE_RGB:
			{
				parameter_json = str_CatFree(parameter_json,"[");
				struct razer_rgb *color = daemon_get_parameter_rgb(parameter);
				char *r_string = str_FromLong(color->r);
				parameter_json = str_CatFree(parameter_json,r_string);
				parameter_json = str_CatFree(parameter_json," ,");
				free(r_string);
				char *g_string = str_FromLong(color->g);
				parameter_json = str_CatFree(parameter_json,g_string);
				parameter_json = str_CatFree(parameter_json," ,");
				free(g_string);
				char *b_string = str_FromLong(color->b);
				parameter_json = str_CatFree(parameter_json,b_string);
				free(b_string);
				parameter_json = str_CatFree(parameter_json,"] ,\n");
			}
			break;
		case RAZER_PARAMETER_TYPE_POS:
			{
				parameter_json = str_CatFree(parameter_json,"[");
				struct razer_pos *pos = daemon_get_parameter_pos(parameter);
				char *x_string = str_FromLong(pos->x);
				parameter_json = str_CatFree(parameter_json,x_string);
				parameter_json = str_CatFree(parameter_json," ,");
				free(x_string);
				char *y_string = str_FromLong(pos->y);
				parameter_json = str_CatFree(parameter_json,y_string);
				free(y_string);
				parameter_json = str_CatFree(parameter_json,"] ,\n");
			}
			break;
		case RAZER_PARAMETER_TYPE_RENDER_NODE:
			{
				struct razer_fx_render_node *render_node = daemon_get_parameter_render_node(parameter);
				char *render_node_string = str_FromLong(render_node->id);
				parameter_json = str_CatFree(parameter_json,render_node_string);
				free(render_node_string);
				parameter_json = str_CatFree(parameter_json," ,\n");
			}
			break;
		case RAZER_PARAMETER_TYPE_FLOAT_RANGE:
			{
				parameter_json = str_CatFree(parameter_json,"[");
				struct razer_float_range *range = daemon_get_parameter_float_range(parameter);
				char *min_string = str_FromDouble(range->min);
				parameter_json = str_CatFree(parameter_json,min_string);
				parameter_json = str_CatFree(parameter_json," ,");
				free(min_string);
				char *max_string = str_FromDouble(range->max);
				parameter_json = str_CatFree(parameter_json,max_string);
				free(max_string);
				parameter_json = str_CatFree(parameter_json,"] ,\n");
			}
			break;
		case RAZER_PARAMETER_TYPE_INT_RANGE:
			{
				parameter_json = str_CatFree(parameter_json,"[");
				struct razer_int_range *range = daemon_get_parameter_int_range(parameter);
				char *min_string = str_FromLong(range->min);
				parameter_json = str_CatFree(parameter_json,min_string);
				parameter_json = str_CatFree(parameter_json," ,");
				free(min_string);
				char *max_string = str_FromLong(range->max);
				parameter_json = str_CatFree(parameter_json,max_string);
				free(max_string);
				parameter_json = str_CatFree(parameter_json,"] ,\n");
			}
			break;
		case RAZER_PARAMETER_TYPE_UINT_RANGE:
			{
				parameter_json = str_CatFree(parameter_json,"[");
				struct razer_uint_range *range = daemon_get_parameter_uint_range(parameter);
				char *min_string = str_FromLong(range->min);
				parameter_json = str_CatFree(parameter_json,min_string);
				parameter_json = str_CatFree(parameter_json," ,");
				free(min_string);
				char *max_string = str_FromLong(range->max);
				parameter_json = str_CatFree(parameter_json,max_string);
				free(max_string);
				parameter_json = str_CatFree(parameter_json,"] ,\n");
			}
			break;
		case RAZER_PARAMETER_TYPE_RGB_RANGE:
			{
				parameter_json = str_CatFree(parameter_json,"[");
				struct razer_rgb_range *range = daemon_get_parameter_rgb_range(parameter);
				struct razer_rgb *min = range->min;
				parameter_json = str_CatFree(parameter_json,"{\n\"R\" : ");
				char *min_r_string = str_FromLong(min->r);
				parameter_json = str_CatFree(parameter_json,min_r_string);
				parameter_json = str_CatFree(parameter_json," ,\n\"G\" : ");
				free(min_r_string);
				char *min_g_string = str_FromLong(min->g);
				parameter_json = str_CatFree(parameter_json,min_g_string);
				parameter_json = str_CatFree(parameter_json," ,\n\"B\" : ");
				free(min_g_string);
				char *min_b_string = str_FromLong(min->b);
				parameter_json = str_CatFree(parameter_json,min_b_string);
				free(min_b_string);
				parameter_json = str_CatFree(parameter_json,"} ,\n");
				parameter_json = str_CatFree(parameter_json," ,");
				parameter_json = str_CatFree(parameter_json,"{");
				struct razer_rgb *max = range->max;
				parameter_json = str_CatFree(parameter_json,"{\n\"R\" : ");
				char *max_r_string = str_FromLong(max->r);
				parameter_json = str_CatFree(parameter_json,max_r_string);
				parameter_json = str_CatFree(parameter_json," ,\n\"G\" : ");
				free(max_r_string);
				char *max_g_string = str_FromLong(max->g);
				parameter_json = str_CatFree(parameter_json,max_g_string);
				parameter_json = str_CatFree(parameter_json," ,\n\"B\" : ");
				free(max_g_string);
				char *max_b_string = str_FromLong(max->b);
				parameter_json = str_CatFree(parameter_json,max_b_string);
				free(max_b_string);
				parameter_json = str_CatFree(parameter_json,"} ,\n");
				parameter_json = str_CatFree(parameter_json,"] ,\n");
			}
			break;
		case RAZER_PARAMETER_TYPE_POS_RANGE:
			{
				parameter_json = str_CatFree(parameter_json,"[");
				struct razer_pos_range *range = daemon_get_parameter_pos_range(parameter);
				struct razer_pos *min = range->min;
				parameter_json = str_CatFree(parameter_json,"{\n\"X\" : ");
				char *min_x_string = str_FromLong(min->x);
				parameter_json = str_CatFree(parameter_json,min_x_string);
				parameter_json = str_CatFree(parameter_json," ,\n\"Y\" : ");
				free(min_x_string);
				char *min_y_string = str_FromLong(min->y);
				parameter_json = str_CatFree(parameter_json,min_y_string);
				free(min_y_string);
				parameter_json = str_CatFree(parameter_json,"} ,\n");
				parameter_json = str_CatFree(parameter_json," ,");
				parameter_json = str_CatFree(parameter_json,"{");
				struct razer_pos *max = range->max;
				parameter_json = str_CatFree(parameter_json,"{\n\"X\" : ");
				char *max_x_string = str_FromLong(max->x);
				parameter_json = str_CatFree(parameter_json,max_x_string);
				parameter_json = str_CatFree(parameter_json," ,\n\"Y\" : ");
				free(max_x_string);
				char *max_y_string = str_FromLong(max->y);
				parameter_json = str_CatFree(parameter_json,max_y_string);
				free(max_y_string);
				parameter_json = str_CatFree(parameter_json,"} ,\n");
				parameter_json = str_CatFree(parameter_json,"] ,\n");
			}
			break;
		/*case RAZER_PARAMETER_TYPE_INT_ARRAY:
		case RAZER_PARAMETER_TYPE_UINT_ARRAY:
		case RAZER_PARAMETER_TYPE_FLOAT_ARRAY:
		case RAZER_PARAMETER_TYPE_RGB_ARRAY:
		case RAZER_PARAMETER_TYPE_POS_ARRAY:
		*/
	}

	parameter_json = str_CatFree(parameter_json," \"description\": \"");
	parameter_json = str_CatFree(parameter_json,parameter->description);
	parameter_json = str_CatFree(parameter_json,"\" },\n");
	return(parameter_json);
}
struct razer_parameter *daemon_copy_parameter(struct razer_parameter *parameter)
{
	struct razer_parameter *copy = daemon_create_parameter();
	copy->id = parameter->id;
	copy->key = str_Copy(parameter->key);
	copy->description = str_Copy(parameter->description);
	copy->type = parameter->type;
	switch(parameter->type)
	{
		case RAZER_PARAMETER_TYPE_STRING:
			daemon_set_parameter_string(copy,str_Copy(daemon_get_parameter_string(parameter)));
			break;
		case RAZER_PARAMETER_TYPE_INT:
			daemon_set_parameter_int(copy,daemon_get_parameter_int(parameter));
			break;
		case RAZER_PARAMETER_TYPE_FLOAT:
			daemon_set_parameter_float(copy,daemon_get_parameter_float(parameter));
			break;
		case RAZER_PARAMETER_TYPE_RGB:
			{
				struct razer_rgb *color = rgb_copy(daemon_get_parameter_rgb(parameter));
				daemon_set_parameter_rgb(copy,color);
			}
			break;
		case RAZER_PARAMETER_TYPE_POS:
			{
				struct razer_pos *pos = razer_pos_copy(daemon_get_parameter_pos(parameter));
				daemon_set_parameter_pos(copy,pos);
			}
			break;
		case RAZER_PARAMETER_TYPE_RENDER_NODE:
			daemon_set_parameter_render_node(copy,daemon_get_parameter_render_node(parameter));
			break;
		case RAZER_PARAMETER_TYPE_FLOAT_RANGE:
			{
				struct razer_float_range *range = razer_float_range_copy(daemon_get_parameter_float_range(parameter));
				daemon_set_parameter_float_range(copy,range);
			}
			break;
		case RAZER_PARAMETER_TYPE_INT_RANGE:
			{
				struct razer_int_range *range = razer_int_range_copy(daemon_get_parameter_int_range(parameter));
				daemon_set_parameter_int_range(copy,range);
			}
			break;
		case RAZER_PARAMETER_TYPE_UINT_RANGE:
			{
				struct razer_uint_range *range = razer_uint_range_copy(daemon_get_parameter_uint_range(parameter));
				daemon_set_parameter_uint_range(copy,range);
			}
			break;
		case RAZER_PARAMETER_TYPE_RGB_RANGE:
			{
				struct razer_rgb_range *range = razer_rgb_range_copy(daemon_get_parameter_rgb_range(parameter));
				daemon_set_parameter_rgb_range(copy,range);
			}
			break;
		case RAZER_PARAMETER_TYPE_POS_RANGE:
			{
				struct razer_pos_range *range = razer_pos_range_copy(daemon_get_parameter_pos_range(parameter));
				daemon_set_parameter_pos_range(copy,range);
			}
			break;
		case RAZER_PARAMETER_TYPE_FLOAT_ARRAY:
			{
				struct razer_float_array *array = razer_float_array_copy(daemon_get_parameter_float_array(parameter));
				daemon_set_parameter_float_array(copy,array);
			}
			break;
		case RAZER_PARAMETER_TYPE_INT_ARRAY:
			{
				struct razer_int_array *array = razer_int_array_copy(daemon_get_parameter_int_array(parameter));
				daemon_set_parameter_int_array(copy,array);
			}
			break;
		case RAZER_PARAMETER_TYPE_UINT_ARRAY:
			{
				struct razer_uint_array *array = razer_uint_array_copy(daemon_get_parameter_uint_array(parameter));
				daemon_set_parameter_uint_array(copy,array);
			}
			break;
		case RAZER_PARAMETER_TYPE_RGB_ARRAY:
			{
				struct razer_rgb_array *array = razer_rgb_array_copy(daemon_get_parameter_rgb_array(parameter));
				daemon_set_parameter_rgb_array(copy,array);
			}
			break;
		case RAZER_PARAMETER_TYPE_POS_ARRAY:
			{
				struct razer_pos_array *array = razer_pos_array_copy(daemon_get_parameter_pos_array(parameter));
				daemon_set_parameter_pos_array(copy,array);
			}
			break;
	}
	
	return(copy);
}