EOM / src /

eom.c

/*
 * Samsung API
 * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the License);
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/license/
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an AS IS BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */



#include <Ecore.h>
#include <tizen.h>
#include <time.h>

#include "log.h"
#include "eom_sample.h"
#include "main.h"

extern eom_error_e _eom_mirror_cb(void *data)
{
	appdata_s *ad = NULL;
	viewdata_s *vd = NULL;

	retv_if(!data, EOM_ERROR_INVALID_PARAMETER);

	_D("Pressed mirror button");

	ad = data;
	vd = ad->vd;

	if (ad->support_external_display == EINA_FALSE)
		return EOM_ERROR_NONE;

	if (ad->mode == EOM_OUTPUT_MODE_PRESENTATION)
	{
		elm_object_text_set(vd->text3, "<font_size=40><color=#ffffff>Mode : mirror</color></font_size>");
		ad->mode = EOM_OUTPUT_MODE_MIRROR;
	}

	if (ad->connected == EINA_FALSE)
	{
		elm_object_text_set(vd->text2, "<font_size=40><color=#ffffff>Connect HDMI cable.</color></font_size>");
		return EOM_ERROR_NONE;
	}

	if (ad->external_win)
	{
		vd->box_external = NULL;
		evas_object_del (ad->external_win);
		ad->external_win = NULL;
	}

	return EOM_ERROR_NONE;
}

void _set_external_window (void *data)
{
	Evas_Object *box, *bg;
	appdata_s *ad = NULL;
	viewdata_s *vd = NULL;

	ret_if(!data);

	ad = (appdata_s*)data;
	vd = ad->vd;

//	elm_win_aux_hint_add(ad->external_win, "wm.policy.win.user.geometry", "1");

	box = elm_box_add (ad->external_win);
	evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
	elm_win_resize_object_add(ad->external_win, box);
	evas_object_show (box);

	bg = elm_bg_add(ad->external_win);
	evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
	evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
	elm_bg_color_set(bg, 0, 0, 0);
	evas_object_show(bg);

	evas_object_show (ad->external_win);

	vd->box_external = box;
}

static eom_error_e _eom_presentation_cb(void *data)
{
	appdata_s *ad = NULL;
	viewdata_s *vd = NULL;

	retv_if(!data, EOM_ERROR_INVALID_PARAMETER);

	_D("Pressed presentation button");

	ad = data;
	vd = ad->vd;

	if (ad->support_external_display == EINA_FALSE)
		return EOM_ERROR_NONE;

	if (ad->mode == EOM_OUTPUT_MODE_MIRROR)
	{
		elm_object_text_set(vd->text3, "<font_size=40><color=#ffffff>Mode : presentation</color></font_size>");
		ad->mode = EOM_OUTPUT_MODE_PRESENTATION;
	}

	if (ad->connected == EINA_FALSE)
	{
		elm_object_text_set(vd->text2, "<font_size=40><color=#ffffff>Connect HDMI cable.</color></font_size>");
		return EOM_ERROR_NONE;
	}

	if (!ad->external_win)
	{
		ad->external_win = elm_win_add(NULL, "external", ELM_WIN_BASIC);
		retv_if(!ad->external_win, EOM_ERROR_OUT_OF_MEMORY);
		if (eom_set_output_window(ad->output_id, ad->external_win) != EOM_ERROR_NONE)
		{
			vd->box_external = NULL;
			evas_object_del (ad->external_win);
			ad->external_win = NULL;
			_E("create external window fail\n");
		}
		else
		{
			_set_external_window(data);
			_D("create external window\n");
		}
	}

	return EOM_ERROR_NONE;
}

extern void eom_button_clicked(void *data, Evas_Object *obj, void *event_info)
{
	const char *str = NULL;
	appdata_s *ad = NULL;

	ret_if(!data);
	ret_if(!obj);

	ad = data;
	str = elm_object_text_get(obj);

	eom_error_e result = EOM_ERROR_NONE;

	if (str && !strcmp(str, "MIRROR")) {
		result = _eom_mirror_cb(ad);
		retm_if(EOM_ERROR_NONE != result, "Failed to eom mirror: %d", result);
	} else {
		result = _eom_presentation_cb(ad);
		retm_if(EOM_ERROR_NONE != result, "Failed to eom presentation: %d", result);
	}
}

static void sample_notify_cb_output_add (eom_output_id output_id, void *user_data)
{
	appdata_s *ad = NULL;
	viewdata_s *vd = NULL;

	ret_if(!user_data);

	ad = (appdata_s*)user_data;
	vd = ad->vd;

	if (ad->output_id != output_id)
	{
		_D("OUTPUT ADDED. SKIP. my output ID is %d\n", ad->output_id);
		return;
	}
	_D("output(%d) connected\n", output_id);
	elm_object_text_set(vd->text2, "<font_size=40><color=#ffffff>Connected.</color></font_size>");

	ad->connected = EINA_TRUE;

	if (ad->mode == EOM_OUTPUT_MODE_PRESENTATION)
	{
		if (!ad->external_win)
		{
			ad->external_win = elm_win_add(NULL, "external", ELM_WIN_BASIC);
			ret_if(!ad->external_win);
			if (eom_set_output_window(ad->output_id, ad->external_win) != EOM_ERROR_NONE)
			{
				vd->box_external = NULL;
				evas_object_del (ad->external_win);
				ad->external_win = NULL;
				_E("create external window fail\n");
			}
			else
			{
				_set_external_window(user_data);
				_D("create external window\n");
			}
		}
	}    
}


static void sample_notify_cb_output_remove (eom_output_id output_id, void *user_data)
{
	appdata_s *ad = NULL;
	viewdata_s *vd = NULL;

	ret_if(!user_data);

	ad = (appdata_s*)user_data;
	vd = ad->vd;

	if (ad->output_id != output_id)
	{
		_D("OUTPUT REMOVED. SKIP. my output ID is %d\n", ad->output_id);
		return;
	}
	_D("output(%d) disconnected\n", output_id);
	elm_object_text_set(vd->text2, "<font_size=40><color=#ffffff>Disconnected.</color></font_size>");

	ad->connected = EINA_FALSE;

	if (ad->external_win)
	{
		vd->box_external = NULL;
		evas_object_del (ad->external_win);
		ad->external_win = NULL;
		_D("destory external window\n");
	}
}

static void sample_notify_cb_mode_changed (eom_output_id output_id, void *user_data)
{
	appdata_s *ad = NULL;
	eom_output_mode_e mode = EOM_OUTPUT_MODE_NONE;

	ret_if(!user_data);

	ad = (appdata_s*)user_data;

	if (ad->output_id != output_id)
	{
		_D("MODE CHANGED. SKIP. my output ID is %d\n", ad->output_id);
		return;
	}

	eom_get_output_mode(output_id, &mode);
	_D("output(%d) mode changed(%d)\n", output_id, mode);
}

void _show_image (void *user_data)
{
	Evas_Object *box, *image;
	appdata_s *ad = NULL;
	viewdata_s *vd = NULL;

	ret_if(!user_data);

	ad = (appdata_s*)user_data;
	vd = ad->vd;

	if (!vd->box_external)
	{
		_E("no vd->box_external.\n");
		return;
	}

	box = vd->box_external;

	image = elm_image_add(ad->external_win);
	elm_image_file_set(image, BG_DIR, NULL);
	evas_object_size_hint_weight_set(image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
	evas_object_size_hint_align_set(image, EVAS_HINT_FILL, EVAS_HINT_FILL);
	elm_box_pack_end(box, image);
	evas_object_show(image);

	evas_object_data_set(ad->external_win, "image_external", image);

	evas_object_show(ad->external_win);
}

static void sample_notify_cb_attribute_changed (eom_output_id output_id, void *user_data)
{
	appdata_s *ad = NULL;
	viewdata_s *vd = NULL;
	eom_output_attribute_e attribute = EOM_OUTPUT_ATTRIBUTE_NONE;
	eom_output_attribute_state_e state = EOM_OUTPUT_ATTRIBUTE_STATE_NONE;

	ret_if(!user_data);

	ad = (appdata_s*)user_data;
	vd = ad->vd;

	if (ad->output_id != output_id)
	{
		_D("ATTR CHANGED. SKIP. my output ID is %d\n", ad->output_id);
		return;
	}

	eom_get_output_attribute(output_id, &attribute);
	eom_get_output_attribute_state(output_id, &state);

	_D("output(%d) attribute changed(%d, %d)\n", output_id, attribute, state);
	if (state == EOM_OUTPUT_ATTRIBUTE_STATE_ACTIVE)
	{
		_D("active : show image\n");
		_show_image(user_data);
	}
	else if (state == EOM_OUTPUT_ATTRIBUTE_STATE_INACTIVE)
	{
		_D("inactive : stop putimage & destroy external window\n");

		if (ad->external_win)
		{
			vd->box_external = NULL;
			evas_object_del(ad->external_win);
			ad->external_win = NULL;
		}
	}
    else if (state == EOM_OUTPUT_ATTRIBUTE_STATE_LOST)
    {
        _D("lost : stop putimage & destroy external window & remove callbacks\n");
		if (ad->external_win)
		{
			vd->box_external = NULL;
			evas_object_del(ad->external_win);
			ad->external_win = NULL;
		}

		eom_set_unset_cb(ad, EINA_FALSE);
    }
}

extern void eom_set_unset_cb(void *data, Eina_Bool set)
{
	appdata_s *ad = NULL;

	ret_if(!data);

	ad = data;

	if (set == EINA_TRUE)
	{
		eom_set_output_added_cb(sample_notify_cb_output_add, ad);
        eom_set_output_removed_cb(sample_notify_cb_output_remove, ad);
        eom_set_mode_changed_cb(sample_notify_cb_mode_changed, ad);
        eom_set_attribute_changed_cb(sample_notify_cb_attribute_changed, ad);
	}
	else
	{
		eom_unset_output_added_cb(sample_notify_cb_output_add);
        eom_unset_output_removed_cb(sample_notify_cb_output_remove);
        eom_unset_mode_changed_cb(sample_notify_cb_mode_changed);
        eom_unset_attribute_changed_cb(sample_notify_cb_attribute_changed);
	}

}

/* End of file */