SET(CMAKE_BUILD_TYPE "Release")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -g -fprofile-arcs -ftest-coverage -D_GNU_SOURCE")
-IF (LIBDIR MATCHES "/usr/lib64")
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLIB64")
-ENDIF (LIBDIR)
+ADD_DEFINITIONS("-DVOICE_LIBDIR=\"${LIBDIR}\"")
# CMake settings
MESSAGE(STATUS "========================================")
MESSAGE(STATUS "========================================")
# Warning flags
-#ADD_DEFINITIONS("-Werror") # Generate all warnings as errors
+ADD_DEFINITIONS("-Werror") # Generate all warnings as errors
ADD_DEFINITIONS("-Wall") # Generate all warnings
ADD_DEFINITIONS("-Wextra") # Generate even more extra warnings
-ADD_DEFINITIONS("-pedantic") # Accept only pedantic code
+#ADD_DEFINITIONS("-pedantic") # Accept only pedantic code
ADD_DEFINITIONS("-Wwrite-strings") # Do not accept writing to constant string memory
ADD_DEFINITIONS("-Winit-self") # Do not accept initializing variable with itself
ADD_DEFINITIONS("-Wcast-align") # Do not accept misaligning with casting
-vc-widget-elm (0.2.0) -- Thu, 29 May 2014
+voice-control-elm (0.2.1) -- Wed, 17 June 2015
+
+ * modify unused smack label (Wonnam Jang <wn.jang@samsung.com>)
+ * updates codes according to coding rule (Wonnam Jang <wn.jang@samsung.com>)
+
+voice-control-elm (0.2.0) -- Thu, 29 May 2015
* Update version 0.2.0 (Kwangyoun Kim <ky85.kim@samsung.com>)
-vc-widget-elm (0.0.1)
+voice-control-elm (0.0.1)
* Release version 0.1.0 (Lukasz Wrzosek <l.wrzosek@samsung.com>)
Name: voice-control-elm
Summary: voice-control-elm library
-Version: 0.2.0
+Version: 0.2.1
Release: 1
Group: Graphics & UI Framework/Voice Framework
License: Apache-2.0
BuildRequires: edje-tools
BuildRequires: pkgconfig(appcore-efl)
BuildRequires: pkgconfig(capi-base-common)
-BuildRequires: pkgconfig(evas)
-BuildRequires: pkgconfig(eina)
-BuildRequires: pkgconfig(ecore)
-BuildRequires: pkgconfig(elementary)
-BuildRequires: pkgconfig(voice-control-widget)
+BuildRequires: pkgconfig(capi-system-info)
BuildRequires: pkgconfig(dlog)
+BuildRequires: pkgconfig(ecore)
+BuildRequires: pkgconfig(eina)
BuildRequires: pkgconfig(edje)
-BuildRequires: pkgconfig(efl-assist)
+BuildRequires: pkgconfig(elementary)
+BuildRequires: pkgconfig(evas)
BuildRequires: pkgconfig(libxml-2.0)
+BuildRequires: pkgconfig(voice-control-widget)
BuildRequires: gettext-tools
%description
%{?SRPOL_DEBUG:
(cd objdir && cmake .. -DVERSION=%{version} \
-DCMAKE_INSTALL_PREFIX=%{_prefix} \
- -DLIBDIR=%{_libdir} \
- -DINCLUDEDIR=%{_includedir} \
+ -DLIBDIR=%{_libdir} \
+ -DINCLUDEDIR=%{_includedir} \
-DCMAKE_BUILD_TYPE=Debug \
-DSRPOL_DEBUG="1")
}
%{!?SRPOL_DEBUG:
(cd objdir && cmake .. -DVERSION=%{version} \
-DCMAKE_INSTALL_PREFIX=%{_prefix} \
- -DLIBDIR=%{_libdir} \
- -DINCLUDEDIR=%{_includedir} \
+ -DLIBDIR=%{_libdir} \
+ -DINCLUDEDIR=%{_includedir} \
-DCMAKE_BUILD_TYPE=Debug \
-DSRPOL_DEBUG="0")
}
SET(VC_ELM_PKGS
capi-base-common
+ capi-system-info
evas
eina
ecore
* limitations under the License.
*/
-
+#include <system_info.h>
#include "vc_elm_main.h"
#include <voice_control_elm.h>
typedef struct __vc_elm_widget_cb_data_s vc_elm_widget_cb_data_s;
+static int g_feature_enabled = -1;
+
+static int __vc_elm_get_feature_enabled()
+{
+ if (0 == g_feature_enabled) {
+ VC_ELM_LOG_DBG("[ERROR] Voice control feature NOT supported");
+ return VC_ELM_ERROR_NOT_SUPPORTED;
+ } else if (-1 == g_feature_enabled) {
+ bool vc_supported = false;
+ bool mic_supported = false;
+ if (0 == system_info_get_platform_bool(VC_ELM_FEATURE_PATH, &vc_supported)) {
+ if (0 == system_info_get_platform_bool(VC_ELM_MIC_FEATURE_PATH, &mic_supported)) {
+ if (false == vc_supported || false == mic_supported) {
+ VC_ELM_LOG_DBG("[ERROR] Voice control feature NOT supported");
+ g_feature_enabled = 0;
+ return VC_ELM_ERROR_NOT_SUPPORTED;
+ }
+
+ g_feature_enabled = 1;
+ } else {
+ VC_ELM_LOG_DBG("[ERROR] Fail to get feature value");
+ return VC_ELM_ERROR_NOT_SUPPORTED;
+ }
+ } else {
+ VC_ELM_LOG_DBG("[ERROR] Fail to get feature value");
+ return VC_ELM_ERROR_NOT_SUPPORTED;
+ }
+ }
+ return 0;
+}
+
int vc_elm_initialize()
{
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
+
if (true == is_vc_elm_initialized) {
VC_ELM_LOG_DBG("vc elm is already initialized");
return VC_ELM_ERROR_INVALID_STATE;
Eina_List *l;
vc_elm_h handler = NULL;
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
+
if (false == is_vc_elm_initialized) {
VC_ELM_LOG_DBG("vc elm is already deinitialized");
return VC_ELM_ERROR_INVALID_STATE;
}
if (NULL != g_handlers_list) {
- EINA_LIST_FOREACH(g_handlers_list, l, handler)
- {
+ EINA_LIST_FOREACH(g_handlers_list, l, handler) {
vc_elm_unset_command(handler);
vc_elm_unset_command_hint(handler);
vc_elm_destroy(handler);
int vc_elm_foreach_supported_languages(vc_elm_supported_language_cb callback, void *user_data)
{
- int ret = vc_widget_foreach_supported_languages(callback, user_data);
+ int ret;
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
+
+ ret = vc_widget_foreach_supported_languages(callback, user_data);
switch (ret) {
case VC_ERROR_NONE:
ret = VC_ELM_ERROR_NONE;
int vc_elm_get_current_language(char **language)
{
- int ret = vc_widget_get_current_language(language);
+ int ret;
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
+
+ ret = vc_widget_get_current_language(language);
switch (ret) {
case VC_ERROR_NONE:
ret = VC_ELM_ERROR_NONE;
{
vc_elm_widget_cb_data_s data;
const Eina_Hash *hash = NULL;
+
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
if (NULL == callback) {
VC_ELM_LOG_ERR("Invalid parameters detected!");
return VC_ELM_ERROR_INVALID_PARAMETER;
Eina_List *l = NULL;
const char *action_tag = NULL;
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
if ((NULL == widget) || (NULL == callback)) {
VC_ELM_LOG_ERR("Invalid parameters detected!");
return VC_ELM_ERROR_INVALID_PARAMETER;
VC_ELM_LOG_ERR("Action list is NULL!");
return VC_ELM_ERROR_OPERATION_FAILED;
}
- EINA_LIST_FOREACH(actions_list, l, action_tag)
- {
+ EINA_LIST_FOREACH(actions_list, l, action_tag) {
if (NULL != action_tag) {
callback(action_tag, user_data);
}
const Eina_Hash *hash = NULL;
const char *command_name = NULL;
size_t len = 0;
+
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
if ((NULL == action) || (NULL == command)) {
VC_ELM_LOG_ERR("Invalid parameters detected!");
return VC_ELM_ERROR_INVALID_PARAMETER;
int vc_elm_create_object(Evas_Object *object, vc_elm_h *vc_elm)
{
vc_elm_s *handler = NULL;
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
if (NULL == vc_elm) {
VC_ELM_LOG_ERR("Invalid parameters detected! (vc_elm_h *) poiter is NULL");
handler->data = (void *)object;
g_handlers_list = eina_list_append(g_handlers_list, handler);
*vc_elm = (vc_elm_h)handler;
+ _vc_elm_core_set_view_changed();
return VC_ELM_ERROR_NONE;
}
int vc_elm_create_item(Elm_Object_Item *item, vc_elm_h *vc_elm)
{
vc_elm_s *handler = NULL;
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
+
if (NULL == vc_elm) {
VC_ELM_LOG_ERR("Invalid parameters detected! (vc_elm_h *) poiter is NULL");
return VC_ELM_ERROR_INVALID_PARAMETER;
handler->data = (void *)item;
g_handlers_list = eina_list_append(g_handlers_list, handler);
*vc_elm = (vc_elm_h)handler;
+ _vc_elm_core_set_view_changed();
return VC_ELM_ERROR_NONE;
}
vc_elm_s *handler = NULL;
Eina_List *list = NULL;
int type = 0;
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
if (NULL == vc_elm) {
VC_ELM_LOG_ERR("Invalid vc_elm parameter detected!");
return VC_ELM_ERROR_INVALID_PARAMETER;
g_handlers_list = eina_list_remove_list(g_handlers_list, list);
free(handler);
handler = NULL;
+ _vc_elm_core_set_view_changed();
return VC_ELM_ERROR_NONE;
}
{
vc_elm_s *handler = (vc_elm_s *)vc_elm;
int type = 0;
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
if (NULL == vc_elm) {
VC_ELM_LOG_ERR("Invalid vc_elm parameter detected!");
return VC_ELM_ERROR_INVALID_PARAMETER;
Elm_Object_Item *it = (Elm_Object_Item *)handler->data;
return _vc_elm_set_item_object_command(it, command);
}
+ _vc_elm_core_set_view_changed();
return VC_ELM_ERROR_INVALID_PARAMETER;
}
{
vc_elm_s *handler = (vc_elm_s *)vc_elm;
int type = 0;
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
if (NULL == vc_elm) {
VC_ELM_LOG_ERR("Invalid vc_elm parameter detected!");
return VC_ELM_ERROR_INVALID_PARAMETER;
Elm_Object_Item *it = (Elm_Object_Item *)handler->data;
return _vc_elm_unset_item_object_command(it);
}
+ _vc_elm_core_set_view_changed();
return VC_ELM_ERROR_INVALID_PARAMETER;
}
{
vc_elm_s *handler = (vc_elm_s *)vc_elm;
int type = 0;
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
if (NULL == vc_elm) {
VC_ELM_LOG_ERR("Invalid vc_elm parameter detected!");
return VC_ELM_ERROR_INVALID_PARAMETER;
Elm_Object_Item *it = (Elm_Object_Item *)handler->data;
return _vc_elm_set_item_object_hint(it, hint);
}
+ _vc_elm_core_set_view_changed();
return VC_ELM_ERROR_INVALID_PARAMETER;
}
{
vc_elm_s *handler = (vc_elm_s *)vc_elm;
int type = 0;
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
if (NULL == vc_elm) {
VC_ELM_LOG_ERR("Invalid vc_elm parameter detected!");
return VC_ELM_ERROR_INVALID_PARAMETER;
Elm_Object_Item *it = (Elm_Object_Item *)handler->data;
return _vc_elm_unset_item_object_hint(it);
}
+ _vc_elm_core_set_view_changed();
return VC_ELM_ERROR_INVALID_PARAMETER;
}
{
vc_elm_s *handler = (vc_elm_s *)vc_elm;
int type = 0;
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
if (NULL == vc_elm) {
VC_ELM_LOG_ERR("Invalid vc_elm parameter detected!");
return VC_ELM_ERROR_INVALID_PARAMETER;
Evas_Object *parent = elm_object_item_widget_get(it);
return _vc_elm_set_sub_item_hint_direction(parent, direction);
}
+ _vc_elm_core_set_view_changed();
return VC_ELM_ERROR_INVALID_PARAMETER;
}
{
vc_elm_s *handler = (vc_elm_s *)vc_elm;
int type = 0;
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
if (NULL == vc_elm) {
VC_ELM_LOG_ERR("Invalid vc_elm parameter detected!");
return VC_ELM_ERROR_INVALID_PARAMETER;
{
vc_elm_s *handler = (vc_elm_s *)vc_elm;
int type = 0;
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
if (NULL == vc_elm) {
VC_ELM_LOG_ERR("Invalid vc_elm parameter detected!");
return VC_ELM_ERROR_INVALID_PARAMETER;
Elm_Object_Item *it = (Elm_Object_Item *)handler->data;
return _vc_elm_set_item_object_custom_hint(it, NULL, pos_x, pos_y);
}
+ _vc_elm_core_set_view_changed();
return VC_ELM_ERROR_INVALID_PARAMETER;
}
vc_elm_s *handler = (vc_elm_s *)vc_elm;
const char *path = NULL;
int type = 0;
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
if (NULL == vc_elm) {
VC_ELM_LOG_ERR("Invalid vc_elm parameter detected!");
return VC_ELM_ERROR_INVALID_PARAMETER;
{
int ret = VC_ELM_ERROR_NONE;
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
if (false == is_vc_elm_initialized) {
VC_ELM_LOG_ERR("Invalid state detected! Library not initialized!");
return VC_ELM_ERROR_INVALID_STATE;
}
- ret = vc_elm_widget_wrapper_set_current_language_changed_callback(callback, user_data);
+ ret = _vc_elm_widget_wrapper_set_current_language_changed_callback(callback, user_data);
if (0 != ret) {
return VC_ELM_ERROR_OPERATION_FAILED;
}
return VC_ELM_ERROR_NONE;
}
-int vc_elm_unset_current_language_changed_cb()
+int vc_elm_unset_current_language_changed_cb(void)
{
int ret = VC_ELM_ERROR_NONE;
+ if (0 != __vc_elm_get_feature_enabled()) {
+ return VC_ERROR_NOT_SUPPORTED;
+ }
if (false == is_vc_elm_initialized) {
VC_ELM_LOG_ERR("Invalid state detected! Library not initialized!");
return VC_ELM_ERROR_INVALID_STATE;
}
- ret = vc_elm_widget_wrapper_unset_current_language_changed_callback();
+ ret = _vc_elm_widget_wrapper_unset_current_language_changed_callback();
if (0 != ret) {
return VC_ELM_ERROR_OPERATION_FAILED;
}
static char *g_tooltips_default_direction = NULL;
static char *g_tooltips_show = NULL;
+static Ecore_Timer *g_animation_view_idler = NULL;
+static Eina_Bool g_view_changed = EINA_FALSE;
+
#define HIDE 0xa
#define X_VISIBILITY_TOLERANCE 32.0
#define Y_VISIBILITY_TOLERANCE 54.0
+static void __idle_changed(Ecore_Evas *ee);
const Eina_Hash *_vc_elm_core_get_config_action_map()
{
return g_config_action_map;
g_config_widget_map = eina_hash_string_superfast_new(__hash_entry_eina_list_free_cb);
ret = _vc_elm_core_read_xml_data();
+ g_view_changed = EINA_FALSE;
VC_ELM_LOG_DBG("XML RETURNED %d", ret);
}
eina_hash_add(registered_item_map, name, strdup("1"));
}
VC_ELM_LOG_DBG("have a visible item %d %d %d %d", x_1, y_1, w_1, h_1);
- if (NULL == name)
+ if ((NULL == name) || (!strcmp("Elm_Layout", name)))
evas_object_data_set(obj, "special_item", item);
ret = eina_list_append(ret, obj);
} while ((item = get_next(item)) != NULL);
if (obj_name) {
if ((!strcmp("Elm_Inwin", obj_name)) || (!strcmp("Elm_Popup", obj_name)) || (!strcmp("Elm_Ctxpopup", obj_name))) {
- if (list && (*list)) {
- eina_list_free(*list);
- *list = NULL;
+ if (*list) {
+ *list = eina_list_free(*list);
}
} else if ((!strcmp("Elm_Icon", obj_name))) {
if ((NULL != parent_obj_name && !strcmp(parent_obj_name, "Elm_Genlist")) && (NULL != parents_parent_obj_name && !strcmp(parents_parent_obj_name, "Elm_Fileselector")))
obj_name = _get_ui_object_name(obj);
parent_obj_name = _get_ui_object_name(parent);
- if (!obj_name && evas_object_data_get(obj, "special_item"))
+ if ((!obj_name && evas_object_data_get(obj, "special_item")) || (!strcmp(obj_name, "Elm_Layout") && evas_object_data_get(obj, "special_item")))
obj_name = eina_stringshare_add("evc-item");
if (!obj_name) {
}
_vc_elm_relayout_and_show_tooltips();
+ g_view_changed = EINA_FALSE;
}
struct vc_elm_core_widget_info *_vc_elm_core_register_widget(const char *widget_name, vc_elm_get_subobjects_cb get_subobjects_func, vc_elm_command_filter_cb is_filtered_func, void *user_data)
registered = 0;
if (obj_name)
VC_ELM_LOG_DBG("Adding command for %s", obj_name);
- if (!obj_name && evas_object_data_get(obj, "special_item"))
+ if ((!obj_name && evas_object_data_get(obj, "special_item")) || (!strcmp(obj_name, "Elm_Layout") && evas_object_data_get(obj, "special_item")))
obj_name = eina_stringshare_add("evc-item");
if (!obj_name) {
VC_ELM_LOG_DBG("Widget '%p' has no type specified", obj_name);
return EINA_FALSE;
}
evas_object_data_set(obj, _vc_elm_get_data_key(VC_ELM_HINT_IMAGE_PATH), (const void *)image_path);
- evas_object_data_set(obj, _vc_elm_get_data_key(VC_ELM_POSITION_X), (void *)pos_x);
- evas_object_data_set(obj, _vc_elm_get_data_key(VC_ELM_POSITION_Y), (void *)pos_y);
+
+ if (pos_x >= 0)
+ evas_object_data_set(obj, _vc_elm_get_data_key(VC_ELM_POSITION_X), (void *)(pos_x + 1));
+ else
+ evas_object_data_set(obj, _vc_elm_get_data_key(VC_ELM_POSITION_X), (void *)(pos_x - 1));
+
+ if (pos_y >= 0)
+ evas_object_data_set(obj, _vc_elm_get_data_key(VC_ELM_POSITION_Y), (void *)(pos_y + 1));
+ else
+ evas_object_data_set(obj, _vc_elm_get_data_key(VC_ELM_POSITION_Y), (void *)(pos_y - 1));
return EINA_TRUE;
}
Eina_Bool _vc_elm_core_get_object_custom_hint(Evas_Object *obj, const char **image_path, int *pos_x, int *pos_y)
{
+ int acc;
if (NULL == obj) {
VC_ELM_LOG_ERR("Invalid Evas_Object parameter detected!");
return EINA_FALSE;
}
*image_path = (const char *)evas_object_data_get(obj, _vc_elm_get_data_key(VC_ELM_HINT_IMAGE_PATH));
- *pos_x = (int)(evas_object_data_get(obj, _vc_elm_get_data_key(VC_ELM_POSITION_X)));
- *pos_y = (int)evas_object_data_get(obj, _vc_elm_get_data_key(VC_ELM_POSITION_Y));
+
+ acc = (int)(evas_object_data_get(obj, _vc_elm_get_data_key(VC_ELM_POSITION_X)));
+ if (acc > 0)
+ *pos_x = acc - 1;
+ else
+ *pos_x = acc + 1;
+
+ acc = (int)evas_object_data_get(obj, _vc_elm_get_data_key(VC_ELM_POSITION_Y));
+ if (acc > 0)
+ *pos_y = acc - 1;
+ else
+ *pos_y = acc + 1;
return EINA_TRUE;
}
Eina_Bool _vc_elm_core_set_sub_item_hint_direction(Evas_Object *obj, vc_elm_direction_e direction)
{
- evas_object_data_set(obj, VC_ELM_SUB_ITEM_DIRECTION, (void *)direction);
+ evas_object_data_set(obj, VC_ELM_SUB_ITEM_DIRECTION, (void *)(direction + 1));
return EINA_TRUE;
}
Eina_Bool _vc_elm_core_get_sub_item_hint_direction(Evas_Object *obj, vc_elm_direction_e *direction)
{
- *direction = (vc_elm_direction_e)evas_object_data_get(obj, VC_ELM_SUB_ITEM_DIRECTION);
+ *direction = ((vc_elm_direction_e)evas_object_data_get(obj, VC_ELM_SUB_ITEM_DIRECTION)) - 1;
return EINA_TRUE;
}
_hide_tooltips();
}
-/*static void __idle_changed(Ecore_Evas *ee) {
+static Eina_Bool on_idle(void *data)
+{
+ int ret = -1;
+ (void)data;
+ VC_ELM_LOG_DBG("End Of View Transformation, tooltip displayed (%d), changed (%d)", g_tooltips_displayed, g_view_changed);
+
+ if (g_animation_view_idler) {
+ ecore_timer_del(g_animation_view_idler);
+ g_animation_view_idler = NULL;
+ }
+
+ if (g_tooltips_displayed) {
+
+ if (g_view_changed){
+ _vc_elm_widget_wrapper_clear_commands();
+ /*_show_tooltips();*/
+ ret = _vc_elm_widget_wrapper_cancel();
+ if (0 != ret) {
+ VC_ELM_LOG_ERR("Error to cancel widget");
+ }
+ g_view_changed = EINA_FALSE;
+ } else if (_vc_elm_relayout_changed()) {
+ _hide_tooltips();
+ ecore_main_loop_iterate();
+ _vc_elm_widget_wrapper_clear_commands();
+ _show_tooltips();
+ }
+ }
+ return EINA_FALSE;
+}
+
+static void __idle_changed(Ecore_Evas *ee)
+{
(void)ee;
- VC_ELM_LOG_DBG("Evas has changed");
-}*/
+ VC_ELM_LOG_DBG("View changed");
+ if (g_tooltips_displayed && g_view_changed){
+ _hide_tooltips();
+ }
+ if (g_animation_view_idler) {
+ ecore_timer_del(g_animation_view_idler);
+ g_animation_view_idler = NULL;
+ }
+ g_animation_view_idler = ecore_timer_add(0.5, on_idle, ee);
+}
/**
* @brief Internal callback that sets the vc_widget's foreground option to true.
VC_ELM_LOG_DBG("Focus in");
}
-/**
+/*
* @brief Internal callback that sets the vc_widget's foreground option to false
*/
static void __vc_elm_event_window_focus_out(void *data, Evas_Object *obj, void *event_info)
VC_ELM_LOG_DBG("Focus out");
}
+void _vc_elm_core_register_view_change_detection()
+{
+ Ecore_Evas *ecevas = NULL;
+ ecevas = ecore_evas_ecore_evas_get(evas_object_evas_get(g_default_window));
+ ecore_evas_callback_post_render_set(ecevas, __idle_changed);
+}
+
+void _vc_elm_core_unregister_view_change_detection()
+{
+ Ecore_Evas *ecevas = NULL;
+ ecevas = ecore_evas_ecore_evas_get(evas_object_evas_get(g_default_window));
+ ecore_evas_callback_post_render_set(ecevas, NULL);
+}
+
static Eina_Bool __idle_enter(void *data)
{
Eina_List *l;
evas_object_smart_callback_del(g_default_window, "unfocused", __vc_elm_event_window_focus_out);
}
-#if 0
- VC_ELM_LOG_DBG("Focused %ud", focused);
VC_ELM_LOG_DBG("Focused g_default %ud", elm_win_xwindow_get(g_default_window));
- if (!is_focused || focused != elm_win_xwindow_get(g_default_window)) {
-#else
if (!is_focused) {
-#endif
/* window changed, we need to get new one */
VC_ELM_LOG_DBG("list count %d", eina_list_count(ui_objects_list));
EINA_LIST_FOREACH(ui_objects_list, l, obj) {
VC_ELM_LOG_DBG("foreach obj %p", (void*)obj);
window = elm_object_top_widget_get(obj);
if (window && elm_win_focus_get(window) == EINA_TRUE) {
- /*Ecore_Evas *ecevas = NULL;*/
-#if 0
VC_ELM_LOG_DBG("NEW Focused g_default %ud", elm_win_xwindow_get(window));
-#endif
g_default_window = window;
- /*ecevas = ecore_evas_ecore_evas_get(evas_object_evas_get(g_default_window));
- ecore_evas_callback_post_render_set(ecevas, __idle_changed);*/
break;
}
}
evas_object_smart_callback_add(g_default_window, "focused", __vc_elm_event_window_focus_in, NULL);
evas_object_smart_callback_add(g_default_window, "unfocused", __vc_elm_event_window_focus_out, NULL);
+
/* OK, window set properly now */
_vc_elm_set_tooltips_window(g_default_window);
-#if 0
VC_ELM_LOG_DBG("elm_win_xwindow_get = %p", (void*)elm_win_xwindow_get(g_default_window));
-#endif
if (elm_win_wm_rotation_supported_get(g_default_window)) {
int rots[4] = {0, 90, 180, 270};
(void)event_info;
if (!g_tooltips_displayed)
return;
- __show_or_hide_tooltips_callback(false);
+ /*__show_or_hide_tooltips_callback(false);
ecore_main_loop_iterate();
__show_or_hide_tooltips_callback(true);
- ecore_main_loop_iterate();
+ ecore_main_loop_iterate();*/
}
const char *_vc_elm_get_custom_widget_name()
if (0 == xmlStrcmp(child->name, XML_CAST VC_ELM_TAG_HINT_SHOW)) {
key = xmlNodeGetContent(child);
VC_ELM_LOG_DBG("hint show %s", (char*)key);
+ if (g_tooltips_show)
+ free(g_tooltips_show);
g_tooltips_show = strdup((char*)key);
xmlFree(key);
} else if (0 == xmlStrcmp(child->name, XML_CAST VC_ELM_TAG_HINT_DIRECTION)) {
key = xmlNodeGetContent(child);
VC_ELM_LOG_DBG("hint direction %s", (char*)key);
+ if (g_tooltips_default_direction)
+ free(g_tooltips_default_direction);
g_tooltips_default_direction = strdup((char*)key);
xmlFree(key);
} else if (0 == xmlStrcmp(child->name, XML_CAST VC_ELM_TAG_HINT_IMAGE)) {
key = xmlNodeGetContent(child);
VC_ELM_LOG_DBG("hint image %s", (char*)key);
+ if (g_tooltips_image_path)
+ free(g_tooltips_image_path);
g_tooltips_image_path = strdup((char*)key);
xmlFree(key);
}
int _vc_elm_core_destroy_xml_data()
{
- if (g_tooltips_show)
+ if (g_tooltips_show) {
free(g_tooltips_show);
- if (g_tooltips_default_direction)
+ g_tooltips_show = NULL;
+ }
+ if (g_tooltips_default_direction) {
free(g_tooltips_default_direction);
- if (g_tooltips_image_path)
+ g_tooltips_default_direction = NULL;
+ }
+ if (g_tooltips_image_path) {
free(g_tooltips_image_path);
+ g_tooltips_image_path = NULL;
+ }
return VC_ELM_ERROR_NONE;
}
return EINA_FALSE;
}
+
+void _vc_elm_core_set_view_changed()
+{
+ g_view_changed = EINA_TRUE;
+ __idle_changed(NULL);
+}
* @brief This file contains core functions, that define the behaviour of library
*/
-#ifdef LIB64
-#define VC_ELM_CONFIG_XML "/usr/lib64/voice/vc-elm/1.0/voice-control-elm-config.xml"
-#else
-#define VC_ELM_CONFIG_XML "/usr/lib/voice/vc-elm/1.0/voice-control-elm-config.xml"
-#endif
+#define VC_ELM_CONFIG_XML VOICE_LIBDIR"/voice/vc-elm/1.0/voice-control-elm-config.xml"
#define VC_ELM_TAG_BASE_NAME "voice-control-elm-config"
#define VC_ELM_TAG_ACTION_LIST "action-list"
#define VC_ELM_DIRECTION "vc_elm_direction"
#define VC_ELM_SUB_ITEM_DIRECTION "vc_elm_sub_item_direction"
+#define VC_ELM_FEATURE_PATH "tizen.org/feature/speech.control"
+#define VC_ELM_MIC_FEATURE_PATH "tizen.org/feature/microphone"
+
/**
* @brief This array holds names for autogenerated tooltips
*/
-static const char *const autogen_names[] =
- {"IDS_ALPHA", "IDS_BRAVO", "IDS_CHARLIE", "IDS_DELTA", "IDS_ECHO",
+static const char *const autogen_names[] = {
+ "IDS_ALPHA", "IDS_BRAVO", "IDS_CHARLIE", "IDS_DELTA", "IDS_ECHO",
"IDS_FOXTROT", "IDS_GOLF", "IDS_HOTEL", "IDS_INDIA", "IDS_JULIET",
"IDS_KILO", "IDS_LIMA", "IDS_MIKE", /*"IDS_NOVEMBER",*/"IDS_OSCAR",
"IDS_PAPA", "IDS_QUEBEC", "IDS_ROMEO", "IDS_SIERRA", "IDS_TANGO",
"IDS_UNIFORM", "IDS_VICTOR", "IDS_WHISKEY", "IDS_X_RAY", "IDS_YANKEE",
"IDS_ZULU", "IDS_ZORRO", "IDS_CASTLE", "IDS_ONE", "IDS_TWO",
"IDS_THREE", "IDS_FOUR", "IDS_FIVE", "IDS_SIX", "IDS_SEVEN",
- "IDS_EIGHT", "IDS_NINE", "IDS_TEN", "IDS_ELEVEN", "IDS_TWELVE"};
+ "IDS_EIGHT", "IDS_NINE", "IDS_TEN", "IDS_ELEVEN", "IDS_TWELVE"
+};
/**
* @brief A handle to the dynamic action info structure
*/
const Eina_Hash *_vc_elm_core_get_config_widget_map();
+void _vc_elm_core_register_view_change_detection();
+
+void _vc_elm_core_unregister_view_change_detection();
+
+void _vc_elm_core_set_view_changed();
#ifdef __cplusplus
}
TO_END
};
-static void __set_toooltips_position_on_visible_items(Evas_Object *parent, Elm_Object_Item *(*get_first)(const Evas_Object *obj, void *user_data), Elm_Object_Item *(*get_next)(const Elm_Object_Item *item, void *user_data), void *user_data);
+static void __set_tooltips_position_on_visible_items(Evas_Object *parent, Elm_Object_Item *(*get_first)(const Evas_Object *obj, void *user_data), Elm_Object_Item *(*get_next)(const Elm_Object_Item *item, void *user_data), void *user_data);
/**
* @brief Function for scrolling elementary object
(void)action;
(void)user_data;
- __set_toooltips_position_on_visible_items(obj, __genlist_filter_first_item_get, __genlist_filter_item_next_get, NULL);
+ __set_tooltips_position_on_visible_items(obj, __genlist_filter_first_item_get, __genlist_filter_item_next_get, NULL);
first = __genlist_filter_first_item_get(obj, NULL);
last = __genlist_filter_last_item_get(obj, NULL);
/**
* @brief Function found and set voice tooltips on list
*/
-static void __set_toooltips_position_on_visible_items(Evas_Object *parent, Elm_Object_Item *(*get_first)(const Evas_Object *obj, void *user_data), Elm_Object_Item *(*get_next)(const Elm_Object_Item *item, void *user_data), void *user_data)
+static void __set_tooltips_position_on_visible_items(Evas_Object *parent, Elm_Object_Item *(*get_first)(const Evas_Object *obj, void *user_data), Elm_Object_Item *(*get_next)(const Elm_Object_Item *item, void *user_data), void *user_data)
{
Elm_Object_Item *item = get_first(parent, user_data);
vc_elm_direction_e direction = VC_ELM_DIRECTION_CENTER;
(void)action;
(void)user_data;
- __set_toooltips_position_on_visible_items(obj, __list_filter_first_item_get, list_filter_item_next_get, NULL);
+ __set_tooltips_position_on_visible_items(obj, __list_filter_first_item_get, list_filter_item_next_get, NULL);
first = __list_filter_first_item_get(obj, NULL);
last = list_filter_last_item_get(obj, NULL);
first_visible = _vc_elm_core_get_visible_item(obj, __list_filter_first_item_get, list_filter_item_next_get, NULL);
int y;
int w;
int h;
- int *tx;
- int *ty;
+ int tx;
+ int ty;
intptr_t ptx;
intptr_t pty;
evas_object_geometry_get(obj, &x, &y, &w, &h);
ptx = (intptr_t)evas_object_data_get(obj, VC_ELM_FIXED_X);
pty = (intptr_t)evas_object_data_get(obj, VC_ELM_FIXED_Y);
+
tx = *((int *)(&ptx));
ty = *((int *)(&pty));
if (tx != 0 && ty != 0) {
- x = (int)tx;
- y = (int)ty;
+ x = tx;
+ y = ty;
}
p->x = x;
p->y = y;
/**
* @brief Structure that contains Evas_Object dimensions
*/
- struct _R {
+struct _R {
int x;
int y;
int w;
int position_x = (int)(evas_object_data_get(obj, _vc_elm_get_data_key(VC_ELM_POSITION_X)));
int position_y = (int)(evas_object_data_get(obj, _vc_elm_get_data_key(VC_ELM_POSITION_Y)));
+ if (position_x > 0)
+ --position_x;
+ else
+ ++position_x;
+
+ if (position_y > 0)
+ --position_y;
+ else
+ ++position_y;
+
t.x = position_x + o.x;
t.y = position_y + o.y;
}
free(recs);
}
+int _vc_elm_relayout_changed()
+{
+ Eina_List *l;
+ Evas_Object *obj;
+ int inserted = 0;
+ int mw;
+ int mh;
+ int mx;
+ int my;
+ size_t length = eina_list_count(obj_list);
+ R *recs = (R *)malloc(sizeof(R) * length);
+ int nx;
+ int ny;
+ int nw;
+ int nh;
+
+ evas_object_geometry_get(g_grid, &mx, &my, &mw, &mh);
+
+ EINA_LIST_FOREACH(obj_list, l, obj) {
+ int p;
+ int direction;
+ R o;
+ R t;
+ R i;
+ Evas_Object *tip = evas_object_data_get(obj, "MyTooltipHandle");
+ int x;
+ int y;
+ int w;
+ int h;
+ _R_set_from_efl(&o, obj);
+
+ elm_grid_pack_get(tip, &x, &y, &w, &h);
+ t.x = ((x * mw) / SCALE) - mx;
+ t.y = ((y * mh) / SCALE) - my;
+ t.w = ((w * mw) / SCALE);
+ t.h = ((h * mh) / SCALE);
+
+ t.x = o.x - t.w + o.w / 2;
+ t.x = t.x < 0 ? 0 : t.x;
+ t.y = o.y - t.h + o.h / 2;
+ t.y = t.y < 0 ? 0 : t.y;
+
+ for (p = 0; p < inserted; ++p) {
+ if (1 == _R_intersection(&t, &recs[p], &i)) {
+ t.y += i.h + 1;
+ if (1 == _R_intersection(&t, &recs[p], &i)) {
+ t.y -= i.h + 1;
+ t.x += i.w + 1;
+ if (1 == _R_intersection(&t, &recs[p], &i))
+ t.y += i.h + 1;
+ }
+
+ }
+ }
+
+ if (evas_object_data_get(obj, VC_ELM_DIRECTION) != NULL) {
+ direction = (int)evas_object_data_get(obj, VC_ELM_DIRECTION);
+ direction--;
+ } else if (evas_object_data_get(obj, VC_ELM_SUB_ITEM_DIRECTION) != NULL) {
+ direction = (int)evas_object_data_get(obj, VC_ELM_SUB_ITEM_DIRECTION);
+ direction--;
+ } else {
+ direction = _vc_elm_core_get_tooltip_default_direction();
+ }
+ if (direction == VC_ELM_DIRECTION_CENTER) {
+ t.x = o.x + o.w / 2 - t.w / 2;
+ t.y = o.y + o.h / 2 - t.h / 2;
+ } else if (direction == VC_ELM_DIRECTION_LEFT) {
+ t.x = o.x + o.w / 5 - t.w;
+ t.y = o.y + o.h / 2 - t.h / 2;
+ } else if (direction == VC_ELM_DIRECTION_RIGHT) {
+ t.x = o.x + o.w - o.w / 5;
+ t.y = o.y + o.h / 2 - t.h / 2;
+ } else if (direction == VC_ELM_DIRECTION_TOP) {
+ t.x = o.x + o.w / 2 - t.w / 2;
+ t.y = o.y + o.h / 5 - t.h;
+ } else if (direction == VC_ELM_DIRECTION_BOTTOM) {
+ t.x = o.x + o.w / 2 - t.w / 2;
+ t.y = o.y + o.h - o.h / 5;
+ } else if (direction == VC_ELM_DIRECTION_LEFT_TOP) {
+ t.x = o.x + o.w / 5 - t.w;
+ t.y = o.y + o.h / 5 - t.h;
+ } else if (direction == VC_ELM_DIRECTION_LEFT_BOTTOM) {
+ t.x = o.x + o.w / 5 - t.w;
+ t.y = o.y + o.h - o.h / 5;
+ } else if (direction == VC_ELM_DIRECTION_RIGHT_TOP) {
+ t.x = o.x + o.w - o.w / 5;
+ t.y = o.y + o.h / 5 - t.h;
+ } else if (direction == VC_ELM_DIRECTION_RIGHT_BOTTOM) {
+ t.x = o.x + o.w - o.w / 5;
+ t.y = o.y + o.h - o.h / 5;
+ }
+
+ if (recs != NULL) {
+ recs[inserted].x = t.x;
+ recs[inserted].y = t.y;
+ recs[inserted].w = t.w;
+ recs[inserted].h = t.h;
+ ++inserted;
+ }
+
+ if (evas_object_data_get(obj, _vc_elm_get_data_key(VC_ELM_POSITION_X)) != NULL && evas_object_data_get(obj, _vc_elm_get_data_key(VC_ELM_POSITION_Y)) != NULL) {
+ int position_x = (int)(evas_object_data_get(obj, _vc_elm_get_data_key(VC_ELM_POSITION_X)));
+ int position_y = (int)(evas_object_data_get(obj, _vc_elm_get_data_key(VC_ELM_POSITION_Y)));
+
+ t.x = position_x + o.x;
+ t.y = position_y + o.y;
+ }
+
+ nx = ((t.x - mx) * SCALE) / mw;
+ ny = ((t.y - my) * SCALE) / mh;
+ nw = (t.w * SCALE) / mw;
+ nh = (t.h * SCALE) / mh;
+
+ /*elm_grid_pack_set(tip, nx, ny, nw, nh);*/
+ VC_ELM_LOG_DBG("View changes detected: %d %d %d %d", abs(x - nx), abs(y - ny), abs(h - nh), abs(w - nw));
+ if((abs(x - nx) > 5) || (abs(y - ny) > 5) || (abs(h - nh) > 5) || (abs(w - nw) > 5)) {
+ free(recs);
+ return 1;
+ }
+ }
+ free(recs);
+ return 0;
+}
+
void _vc_elm_tooltips_show_tooltip(Evas_Object *obj, const char *text)
{
if (domain_initialized == 0) {
*/
void _vc_elm_relayout_and_show_tooltips();
+int _vc_elm_relayout_changed();
+
const char *_vc_elm_get_data_key(vc_elm_data_key key);
#ifdef __cplusplus
#define VC_ERROR_CHECK(args) do { \
int err = args; \
const char *msg = # args; \
- switch (err) { \
- VC_CMD_ERROR_CHECK_CASE(VC_ERROR_OUT_OF_MEMORY); \
- VC_CMD_ERROR_CHECK_CASE(VC_ERROR_IO_ERROR); \
- VC_CMD_ERROR_CHECK_CASE(VC_ERROR_INVALID_PARAMETER); \
- VC_CMD_ERROR_CHECK_CASE(VC_ERROR_TIMED_OUT); \
- VC_CMD_ERROR_CHECK_CASE(VC_ERROR_RECORDER_BUSY); \
- VC_CMD_ERROR_CHECK_CASE(VC_ERROR_PERMISSION_DENIED); \
- VC_CMD_ERROR_CHECK_CASE(VC_ERROR_NOT_SUPPORTED); \
- VC_CMD_ERROR_CHECK_CASE(VC_ERROR_INVALID_STATE); \
- VC_CMD_ERROR_CHECK_CASE(VC_ERROR_INVALID_LANGUAGE); \
- VC_CMD_ERROR_CHECK_CASE(VC_ERROR_ENGINE_NOT_FOUND); \
- VC_CMD_ERROR_CHECK_CASE(VC_ERROR_OPERATION_FAILED); \
- VC_CMD_ERROR_CHECK_CASE(VC_ERROR_OPERATION_REJECTED); \
- VC_CMD_ERROR_CHECK_CASE(VC_ERROR_ITERATION_END); \
- VC_CMD_ERROR_CHECK_CASE(VC_ERROR_EMPTY); \
- case VC_ERROR_NONE: \
- VC_ELM_LOG_DBG("NO error in (%s)", msg); \
- break; \
- default: \
- VC_ELM_LOG_ERR("Unkown error in (%s)", msg); \
- } \
+ switch (err) { \
+ VC_CMD_ERROR_CHECK_CASE(VC_ERROR_OUT_OF_MEMORY); \
+ VC_CMD_ERROR_CHECK_CASE(VC_ERROR_IO_ERROR); \
+ VC_CMD_ERROR_CHECK_CASE(VC_ERROR_INVALID_PARAMETER); \
+ VC_CMD_ERROR_CHECK_CASE(VC_ERROR_TIMED_OUT); \
+ VC_CMD_ERROR_CHECK_CASE(VC_ERROR_RECORDER_BUSY); \
+ VC_CMD_ERROR_CHECK_CASE(VC_ERROR_PERMISSION_DENIED); \
+ VC_CMD_ERROR_CHECK_CASE(VC_ERROR_NOT_SUPPORTED); \
+ VC_CMD_ERROR_CHECK_CASE(VC_ERROR_INVALID_STATE); \
+ VC_CMD_ERROR_CHECK_CASE(VC_ERROR_INVALID_LANGUAGE); \
+ VC_CMD_ERROR_CHECK_CASE(VC_ERROR_ENGINE_NOT_FOUND); \
+ VC_CMD_ERROR_CHECK_CASE(VC_ERROR_OPERATION_FAILED); \
+ VC_CMD_ERROR_CHECK_CASE(VC_ERROR_OPERATION_REJECTED); \
+ VC_CMD_ERROR_CHECK_CASE(VC_ERROR_ITERATION_END); \
+ VC_CMD_ERROR_CHECK_CASE(VC_ERROR_EMPTY); \
+ case VC_ERROR_NONE: \
+ VC_ELM_LOG_DBG("NO error in (%s)", msg); \
+ break; \
+ default: \
+ VC_ELM_LOG_ERR("Unkown error in (%s)", msg); \
+ } \
} while (0)
static void __vc_widget_send_current_command_group_cb(vc_cmd_list_h *vc_group, void *user_data)
{
(void)user_data;
+ if (previous == VC_SERVICE_STATE_RECORDING)
+ _vc_elm_core_unregister_view_change_detection();
+ else if (current == VC_SERVICE_STATE_RECORDING)
+ _vc_elm_core_register_view_change_detection();
+
+
if ((VC_SERVICE_STATE_PROCESSING == previous && VC_SERVICE_STATE_READY == current) || (VC_SERVICE_STATE_RECORDING == previous && VC_SERVICE_STATE_READY == current)) {
VC_ELM_LOG_DBG("VC Service processing ends, clear commands");
if (NULL != vcw.group) {
return;
}
-int vc_elm_widget_wrapper_set_current_language_changed_callback(vc_elm_widget_wrapper_language_changed_callback callback, void *data)
+int _vc_elm_widget_wrapper_set_current_language_changed_callback(vc_elm_widget_wrapper_language_changed_callback callback, void *data)
{
if (NULL == callback) {
VC_ELM_LOG_ERR("Null parameter");
}
-int vc_elm_widget_wrapper_unset_current_language_changed_callback()
+int _vc_elm_widget_wrapper_unset_current_language_changed_callback()
{
if (NULL == vcw.language_changed_cb) {
VC_ELM_LOG_ERR("No registered cb");
vcw.lang_user_data = NULL;
return 0;
}
+
+void _vc_elm_widget_wrapper_clear_commands()
+{
+ if (NULL != vcw.group) {
+ vc_cmd_list_destroy(vcw.group, true);
+ vcw.group = NULL;
+ }
+}
+
+int _vc_elm_widget_wrapper_cancel()
+{
+ int ret = VC_ELM_ERROR_NONE;
+ VC_ELM_LOG_DBG("===========");
+
+ ret = vc_widget_cancel();
+ if (VC_ELM_ERROR_NONE != ret) {
+ VC_ELM_LOG_ERR("Error while widget cancel (%d)", ret);
+ }
+ return ret;
+}
+
*/
void _vc_elm_widget_wrapper_set_show_tooltips_callback(vc_elm_widget_wrapper_show_tooltips_callback callback);
-int vc_elm_widget_wrapper_set_current_language_changed_callback(vc_elm_widget_wrapper_language_changed_callback callback, void *user_data);
+int _vc_elm_widget_wrapper_set_current_language_changed_callback(vc_elm_widget_wrapper_language_changed_callback callback, void *user_data);
-int vc_elm_widget_wrapper_unset_current_language_changed_callback();
+int _vc_elm_widget_wrapper_unset_current_language_changed_callback();
+void _vc_elm_widget_wrapper_clear_commands();
+
+int _vc_elm_widget_wrapper_cancel();
#ifdef __cplusplus
}