/*
* Copyright 2013 Samsung Electronics Co., Ltd
*
- * Licensed under the Flora License, Version 1.0 (the "License");
+ * Licensed under the Flora License, Version 1.1 (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.tizenopensource.org/license
+ * http://floralicense.org/license/
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
#include <Eet.h>
#include <Ecore_X.h>
+#include <system_settings.h>
+
#include <dlog.h>
#include <debug.h>
#include <vconf.h>
#include "script_port.h"
#define TEXT_CLASS "tizen"
+#define DEFAULT_FONT_SIZE -100
#define BASE_WIDTH 720.0f
#define PUBLIC __attribute__((visibility("default")))
Eina_List *access_chain;
};
+static struct {
+ char *font_name;
+ int font_size;
+} s_info = {
+ .font_name = NULL,
+ .font_size = -100,
+};
+
static inline double scale_get(void)
{
int width;
return LB_STATUS_SUCCESS;
}
+static void activate_cb(void *data, Evas_Object *part_obj, Elm_Object_Item *item)
+{
+ Evas_Object *ao;
+ Evas_Object *edje;
+ Evas *e;
+ int x;
+ int y;
+ int w;
+ int h;
+ struct timeval tv;
+ double timestamp;
+
+ ao = evas_object_data_get(part_obj, "ao");
+ if (!ao)
+ return;
+
+ edje = evas_object_data_get(ao, "edje");
+ if (!edje)
+ return;
+
+ e = evas_object_evas_get(part_obj);
+ evas_object_geometry_get(part_obj, &x, &y, &w, &h);
+ x += w / 2;
+ y += h / 2;
+
+ if (gettimeofday(&tv, NULL) < 0) {
+ ErrPrint("Failed to get time\n");
+ timestamp = 0.0f;
+ } else {
+ timestamp = (double)tv.tv_sec + ((double)tv.tv_usec / 1000000.0f);
+ }
+
+ DbgPrint("Cursor is on %dx%d\n", x, y);
+ evas_event_feed_mouse_move(e, x, y, timestamp, NULL);
+ evas_event_feed_mouse_down(e, 1, EVAS_BUTTON_NONE, timestamp + 0.01f, NULL);
+ evas_event_feed_mouse_move(e, x, y, timestamp + 0.02f, NULL);
+ evas_event_feed_mouse_up(e, 1, EVAS_BUTTON_NONE, timestamp + 0.03f, NULL);
+}
+
PUBLIC int script_update_text(void *h, Evas *e, const char *id, const char *part, const char *text)
{
struct obj_info *obj_info;
return LB_STATUS_ERROR_FAULT;
}
- elm_object_part_text_set(edje, part, text);
+ elm_object_part_text_set(edje, part, text ? text : "");
to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(edje), part);
if (to) {
Evas_Object *ao;
+ char *utf8;
ao = evas_object_data_get(to, "ao");
- if (ao) {
- /* Update Access Info */
- elm_access_info_set(ao, ELM_ACCESS_INFO, text);
- DbgPrint("[%s] Update access info: (%s)\n", part, text);
- } else {
+ if (!ao) {
ao = elm_access_object_register(to, edje);
if (!ao) {
- ErrPrint("Failed to add access object\n");
- } else {
- char *utf8;
- utf8 = elm_entry_markup_to_utf8(text);
- if (utf8) {
- DbgPrint("[%s] Text is converted to [%s]\n", part, utf8);
- elm_access_info_set(ao, ELM_ACCESS_INFO, utf8);
- free(utf8);
- } else {
- DbgPrint("[%s] Unable to convert text to utf8: [%s]\n", part, text);
- elm_access_info_set(ao, ELM_ACCESS_INFO, text);
- }
-
- obj_info->access_chain = eina_list_append(obj_info->access_chain, ao);
- evas_object_data_set(to, "ao", ao);
- elm_object_focus_custom_chain_append(edje, ao, NULL);
+ ErrPrint("Unable to add ao: %s\n", part);
+ goto out;
}
+ obj_info->access_chain = eina_list_append(obj_info->access_chain, ao);
+ evas_object_data_set(to, "ao", ao);
+ evas_object_data_set(ao, "edje", edje);
+ elm_access_activate_cb_set(ao, activate_cb, NULL);
+ elm_object_focus_custom_chain_append(edje, ao, NULL);
+ }
+
+ if (!text || !strlen(text)) {
+ obj_info->access_chain = eina_list_remove(obj_info->access_chain, ao);
+ evas_object_data_del(to, "ao");
+ evas_object_data_del(ao, "edje");
+ elm_access_object_unregister(ao);
+ DbgPrint("[%s] Remove access object\n", part);
+
+ rebuild_focus_chain(edje);
+ goto out;
+ }
+
+ utf8 = elm_entry_markup_to_utf8(text);
+ if ((!utf8 || !strlen(utf8))) {
+ free(utf8);
+
+ obj_info->access_chain = eina_list_remove(obj_info->access_chain, ao);
+ evas_object_data_del(to, "ao");
+ evas_object_data_del(ao, "edje");
+ elm_access_object_unregister(ao);
+ DbgPrint("[%s] Remove access object\n", part);
+
+ rebuild_focus_chain(edje);
+ goto out;
}
+
+ elm_access_info_set(ao, ELM_ACCESS_INFO, utf8);
+ DbgPrint("[%s] Update access object (%s)\n", part, utf8);
+ free(utf8);
} else {
ErrPrint("Unable to get text part[%s]\n", part);
}
+out:
return LB_STATUS_SUCCESS;
}
return;
img_opt->orient = !strncasecmp(value, "true", 4);
- DbgPrint("Parsed ORIENT: %d (%s)\n", img_opt->aspect, value);
+ DbgPrint("Parsed ORIENT: %d (%s)\n", img_opt->orient, value);
}
static void parse_size(struct image_option *img_opt, const char *value, int len)
ao = evas_object_data_get(to, "ao");
if (ao) {
DbgPrint("[%s] Update access object (%s)\n", part, text);
- elm_access_info_set(ao, ELM_ACCESS_INFO, text);
- } else {
+ if (text && strlen(text)) {
+ elm_access_info_set(ao, ELM_ACCESS_INFO, text);
+ } else {
+ obj_info->access_chain = eina_list_remove(obj_info->access_chain, ao);
+ evas_object_data_del(to, "ao");
+ evas_object_data_del(ao, "edje");
+ elm_access_object_unregister(ao);
+ DbgPrint("Successfully unregistered\n");
+
+ rebuild_focus_chain(edje);
+ }
+ } else if (text && strlen(text)) {
ao = elm_access_object_register(to, edje);
if (!ao) {
ErrPrint("Unable to register access object\n");
evas_object_data_set(to, "ao", ao);
elm_object_focus_custom_chain_append(edje, ao, NULL);
DbgPrint("[%s] Register access info: (%s)\n", part, text);
+ evas_object_data_set(ao, "edje", edje);
+ elm_access_activate_cb_set(ao, activate_cb, NULL);
}
}
} else {
DbgPrint("delete object %s %p\n", part, img);
ao = evas_object_data_del(img, "ao");
if (ao) {
- elm_access_object_unregister(ao);
obj_info->access_chain = eina_list_remove(obj_info->access_chain, ao);
+ evas_object_data_del(ao, "edje");
+ elm_access_object_unregister(ao);
DbgPrint("Successfully unregistered\n");
}
evas_object_del(img);
evas_object_image_load_region_set(img, (w - part_w) / 2, (h - part_h) / 2, part_w, part_h);
evas_object_image_fill_set(img, 0, 0, part_w, part_h);
evas_object_image_reload(img);
+ } else if (img_opt.fill == FILL_IN_SIZE) {
+ Evas_Coord part_w;
+ Evas_Coord part_h;
+
+ if (img_opt.width >= 0 && img_opt.height >= 0) {
+ part_w = img_opt.width * scale_get();
+ part_h = img_opt.height * scale_get();
+ } else {
+ part_w = 0;
+ part_h = 0;
+ edje_object_part_geometry_get(elm_layout_edje_get(edje), part, NULL, NULL, &part_w, &part_h);
+ }
+ DbgPrint("Original %dx%d (part: %dx%d)\n", w, h, part_w, part_h);
+
+ if (part_w > w || part_h > h) {
+ double fw;
+ double fh;
+
+ fw = (double)part_w / (double)w;
+ fh = (double)part_h / (double)h;
+
+ if (fw > fh) {
+ w = part_w;
+ h = (double)h * fw;
+ } else {
+ h = part_h;
+ w = (double)w * fh;
+ }
+ }
+ DbgPrint("Size: %dx%d\n", w, h);
+ evas_object_image_fill_set(img, 0, 0, part_w, part_h);
+ evas_object_size_hint_fill_set(img, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(img, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
} else {
evas_object_image_fill_set(img, 0, 0, w, h);
evas_object_size_hint_fill_set(img, EVAS_HINT_FILL, EVAS_HINT_FILL);
ao = evas_object_data_del(child->obj, "ao");
if (ao) {
obj_info->access_chain = eina_list_remove(obj_info->access_chain, ao);
+ evas_object_data_del(ao, "edje");
elm_access_object_unregister(ao);
}
evas_object_del(child->obj);
}
EINA_LIST_FREE(obj_info->access_chain, ao) {
+ evas_object_data_del(ao, "edje");
elm_access_object_unregister(ao);
}
LB_ACCESS_HIGHLIGHT_NEXT 1
LB_ACCESS_HIGHLIGHT_PREV 2
LB_ACCESS_ACTIVATE 3
- LB_ACCESS_VALUE_CHANGE 4
+ LB_ACCESS_ACTION 4
LB_ACCESS_SCROLL 5
*/
-PUBLIC int script_feed_event(void *h, Evas *e, int event_type, int x, int y, double timestamp)
+PUBLIC int script_feed_event(void *h, Evas *e, int event_type, int x, int y, int down, double timestamp)
{
struct info *handle = h;
Evas_Object *edje;
if (event_type & LB_SCRIPT_ACCESS_EVENT) {
Elm_Access_Action_Info *info;
Elm_Access_Action_Type action;
+ const Eina_List *chain;
- info = malloc(sizeof(*info));
+ info = calloc(1, sizeof(*info));
if (!info) {
ErrPrint("Error: %s\n", strerror(errno));
return LB_STATUS_ERROR_MEMORY;
}
- {
- const Eina_List *chain;
- chain = elm_object_focus_custom_chain_get(edje);
- DbgPrint("Focus chain : %d\n", eina_list_count(chain));
- }
+ chain = elm_object_focus_custom_chain_get(edje);
+ DbgPrint("Focus chain : %d\n", eina_list_count(chain));
- switch (event_type) {
- case LB_SCRIPT_ACCESS_HIGHLIGHT: /*!< LB_ACCESS_HIGHLIGHT */
+ if ((event_type & LB_SCRIPT_ACCESS_HIGHLIGHT) == LB_SCRIPT_ACCESS_HIGHLIGHT) {
action = ELM_ACCESS_ACTION_HIGHLIGHT;
info->x = x;
info->y = y;
ret = elm_access_action(edje, action, info);
DbgPrint("ACCESS_HIGHLIGHT: %dx%d returns %d\n", x, y, ret);
- if (ret == EINA_FALSE)
- ret = LB_ACCESS_STATUS_ERROR;
- else
- ret = LB_ACCESS_STATUS_DONE;
- break;
- case LB_SCRIPT_ACCESS_HIGHLIGHT_NEXT: /*!< LB_ACCESS_HIGHLIGHT_NEXT */
+ ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE;
+ } else if ((event_type & LB_SCRIPT_ACCESS_HIGHLIGHT_NEXT) == LB_SCRIPT_ACCESS_HIGHLIGHT_NEXT) {
action = ELM_ACCESS_ACTION_HIGHLIGHT_NEXT;
info->highlight_cycle = EINA_FALSE;
ret = elm_access_action(edje, action, info);
DbgPrint("ACCESS_HIGHLIGHT_NEXT, returns %d\n", ret);
- if (ret == EINA_FALSE)
- ret = LB_ACCESS_STATUS_LAST;
- else
- ret = LB_ACCESS_STATUS_DONE;
- break;
- case LB_SCRIPT_ACCESS_HIGHLIGHT_PREV: /*!< LB_ACCESS_HIGHLIGHT_PREV */
+ ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_LAST : LB_ACCESS_STATUS_DONE;
+ } else if ((event_type & LB_SCRIPT_ACCESS_HIGHLIGHT_PREV) == LB_SCRIPT_ACCESS_HIGHLIGHT_PREV) {
action = ELM_ACCESS_ACTION_HIGHLIGHT_PREV;
info->highlight_cycle = EINA_FALSE;
ret = elm_access_action(edje, action, info);
DbgPrint("ACCESS_HIGHLIGHT_PREV, returns %d\n", ret);
- if (ret == EINA_FALSE)
- ret = LB_ACCESS_STATUS_FIRST;
- else
- ret = LB_ACCESS_STATUS_DONE;
- break;
- case LB_SCRIPT_ACCESS_ACTIVATE: /*!< LB_ACCESS_ACTIVATE */
+ ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_FIRST : LB_ACCESS_STATUS_DONE;
+ } else if ((event_type & LB_SCRIPT_ACCESS_ACTIVATE) == LB_SCRIPT_ACCESS_ACTIVATE) {
action = ELM_ACCESS_ACTION_ACTIVATE;
ret = elm_access_action(edje, action, info);
- DbgPrint("ACCESS_HIGHLIGHT_ACTIVATE, returns %d\n", ret);
- if (ret == EINA_FALSE)
- ret = LB_ACCESS_STATUS_ERROR;
- else
- ret = LB_ACCESS_STATUS_DONE;
- break;
- case LB_SCRIPT_ACCESS_VALUE_CHANGE: /*!< LB_ACCESS_VALUE_CHANGE */
- action = ELM_ACCESS_ACTION_VALUE_CHANGE;
- ret = elm_access_action(edje, action, info);
- DbgPrint("ACCESS_HIGHLIGHT_VALUE_CHANGE, returns %d\n", ret);
- if (ret == EINA_FALSE)
+ DbgPrint("ACCESS_ACTIVATE, returns %d\n", ret);
+ ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE;
+ } else if ((event_type & LB_SCRIPT_ACCESS_ACTION) == LB_SCRIPT_ACCESS_ACTION) {
+ if (down == 0) {
+ action = ELM_ACCESS_ACTION_UP;
+ ret = elm_access_action(edje, action, info);
+ DbgPrint("ACCESS_ACTION(%d), returns %d\n", down, ret);
+ ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE;
+ } else if (down == 1) {
+ action = ELM_ACCESS_ACTION_DOWN;
+ ret = elm_access_action(edje, action, info);
+ DbgPrint("ACCESS_ACTION(%d), returns %d\n", down, ret);
+ ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE;
+ } else {
+ ErrPrint("Invalid access event\n");
ret = LB_ACCESS_STATUS_ERROR;
- else
- ret = LB_ACCESS_STATUS_DONE;
- break;
- case LB_SCRIPT_ACCESS_SCROLL: /*!< LB_ACCESS_SCROLL */
+ }
+ } else if ((event_type & LB_SCRIPT_ACCESS_SCROLL) == LB_SCRIPT_ACCESS_SCROLL) {
action = ELM_ACCESS_ACTION_SCROLL;
- ret = elm_access_action(edje, action, info);
- DbgPrint("ACCESS_HIGHLIGHT_SCROLL, returns %d\n", ret);
- if (ret == EINA_FALSE)
+ info->x = x;
+ info->y = y;
+ switch (down) {
+ case 0:
+ info->mouse_type = 0;
+ ret = elm_access_action(edje, action, info);
+ DbgPrint("ACCESS_HIGHLIGHT_SCROLL, returns %d\n", ret);
+ ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE;
+ break;
+ case -1:
+ info->mouse_type = 1;
+ ret = elm_access_action(edje, action, info);
+ DbgPrint("ACCESS_HIGHLIGHT_SCROLL, returns %d\n", ret);
+ ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE;
+ break;
+ case 1:
+ info->mouse_type = 2;
+ ret = elm_access_action(edje, action, info);
+ DbgPrint("ACCESS_HIGHLIGHT_SCROLL, returns %d\n", ret);
+ ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE;
+ break;
+ default:
ret = LB_ACCESS_STATUS_ERROR;
- else
- ret = LB_ACCESS_STATUS_DONE;
- break;
- case LB_SCRIPT_ACCESS_UNHIGHLIGHT:
+ break;
+ }
+ } else if ((event_type & LB_SCRIPT_ACCESS_UNHIGHLIGHT) == LB_SCRIPT_ACCESS_UNHIGHLIGHT) {
action = ELM_ACCESS_ACTION_UNHIGHLIGHT;
ret = elm_access_action(edje, action, info);
DbgPrint("ACCESS_UNHIGHLIGHT, returns %d\n", ret);
- if (ret == EINA_FALSE)
- ret = LB_ACCESS_STATUS_ERROR;
- else
- ret = LB_ACCESS_STATUS_DONE;
- break;
- default:
+ ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE;
+ } else {
DbgPrint("Invalid event\n");
ret = LB_ACCESS_STATUS_ERROR;
}
state = vconf_keynode_get_bool(node);
}
+ DbgPrint("ELM CONFIG ACCESS: %d\n", state);
elm_config_access_set(state);
}
+static void update_font_cb(void *data)
+{
+ elm_config_font_overlay_set(TEXT_CLASS, s_info.font_name, DEFAULT_FONT_SIZE);
+ DbgPrint("Update text class %s (%s, %d)\n", TEXT_CLASS, s_info.font_name, DEFAULT_FONT_SIZE);
+}
+
+static void font_changed_cb(keynode_t *node, void *user_data)
+{
+ char *font_name;
+
+ font_name = vconf_get_str("db/setting/accessibility/font_name");
+ if (!font_name) {
+ ErrPrint("Invalid font name (NULL)\n");
+ return;
+ }
+
+ if (s_info.font_name && !strcmp(s_info.font_name, font_name)) {
+ DbgPrint("Font is not changed (Old: %s(%p) <> New: %s(%p))\n", s_info.font_name, s_info.font_name, font_name, font_name);
+ free(font_name);
+ return;
+ }
+
+ if (s_info.font_name) {
+ DbgPrint("Release old font name: %s(%p)\n", s_info.font_name, s_info.font_name);
+ free(s_info.font_name);
+ s_info.font_name = NULL;
+ }
+
+ s_info.font_name = font_name;
+ DbgPrint("Font name is changed to %s(%p)\n", s_info.font_name, s_info.font_name);
+
+ /*!
+ * \NOTE
+ * Try to update all liveboxes
+ */
+ update_font_cb(NULL);
+}
+
+static inline int convert_font_size(int size)
+{
+ switch (size) {
+ case SYSTEM_SETTINGS_FONT_SIZE_SMALL:
+ size = -80;
+ break;
+ case SYSTEM_SETTINGS_FONT_SIZE_NORMAL:
+ size = -100;
+ break;
+ case SYSTEM_SETTINGS_FONT_SIZE_LARGE:
+ size = -150;
+ break;
+ case SYSTEM_SETTINGS_FONT_SIZE_HUGE:
+ size = -190;
+ break;
+ case SYSTEM_SETTINGS_FONT_SIZE_GIANT:
+ size = -250;
+ break;
+ default:
+ size = -100;
+ break;
+ }
+
+ DbgPrint("Return size: %d\n", size);
+ return size;
+}
+
+static void font_size_cb(system_settings_key_e key, void *user_data)
+{
+ int size;
+
+ if (system_settings_get_value_int(SYSTEM_SETTINGS_KEY_FONT_SIZE, &size) != SYSTEM_SETTINGS_ERROR_NONE)
+ return;
+
+ size = convert_font_size(size);
+
+ if (size == s_info.font_size) {
+ DbgPrint("Font size is not changed\n");
+ return;
+ }
+
+ s_info.font_size = size;
+ DbgPrint("Font size is changed to %d\n", size);
+
+ update_font_cb(NULL);
+}
+
PUBLIC int script_init(void)
{
int ret;
+ int size = DEFAULT_FONT_SIZE;
char *argv[] = {
"livebox.edje",
NULL,
ErrPrint("Failed to access cb\n");
access_cb(NULL, NULL);
+
+ ret = vconf_notify_key_changed("db/setting/accessibility/font_name", font_changed_cb, NULL);
+ DbgPrint("System font is changed: %d\n", ret);
+
+ ret = system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_FONT_SIZE, font_size_cb, NULL);
+ DbgPrint("System font size is changed: %d\n", ret);
+
+ s_info.font_name = vconf_get_str("db/setting/accessibility/font_name");
+ DbgPrint("Current font: %s\n", s_info.font_name);
+
+ ret = system_settings_get_value_int(SYSTEM_SETTINGS_KEY_FONT_SIZE, &size);
+ s_info.font_size = convert_font_size(size);
+ DbgPrint("Current size: %d\n", s_info.font_size);
+
return LB_STATUS_SUCCESS;
}
PUBLIC int script_fini(void)
{
- vconf_ignore_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, access_cb);
+ int ret;
+ ret = system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_FONT_SIZE);
+ ret = system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_FONT_TYPE);
+ ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, access_cb);
elm_shutdown();
return LB_STATUS_SUCCESS;
}