Apply various patches
[apps/livebox/livebox-edje.git] / src / script_port.c
index 33fabbc..da52f0f 100644 (file)
@@ -1,11 +1,11 @@
 /*
  * 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,
@@ -29,6 +29,8 @@
 #include <Eet.h>
 #include <Ecore_X.h>
 
+#include <system_settings.h>
+
 #include <dlog.h>
 #include <debug.h>
 #include <vconf.h>
@@ -38,6 +40,7 @@
 #include "script_port.h"
 
 #define TEXT_CLASS     "tizen"
+#define DEFAULT_FONT_SIZE      -100
 #define BASE_WIDTH     720.0f
 
 #define PUBLIC __attribute__((visibility("default")))
@@ -79,6 +82,14 @@ struct obj_info {
        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;
@@ -173,6 +184,45 @@ PUBLIC int script_update_color(void *h, Evas *e, const char *id, const char *par
        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;
@@ -192,42 +242,60 @@ PUBLIC int script_update_text(void *h, Evas *e, const char *id, const char *part
                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;
 }
 
@@ -256,7 +324,7 @@ static void parse_orient(struct image_option *img_opt, const char *value, int le
                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)
@@ -453,8 +521,18 @@ PUBLIC int script_update_access(void *_h, Evas *e, const char *id, const char *p
                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");
@@ -464,6 +542,8 @@ PUBLIC int script_update_access(void *_h, Evas *e, const char *id, const char *p
                                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 {
@@ -521,8 +601,9 @@ PUBLIC int script_update_image(void *_h, Evas *e, const char *id, const char *pa
                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);
@@ -607,6 +688,39 @@ PUBLIC int script_update_image(void *_h, Evas *e, const char *id, const char *pa
                        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);
@@ -702,6 +816,7 @@ static void edje_del_cb(void *_info, Evas *e, Evas_Object *obj, void *event_info
                        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);
@@ -711,6 +826,7 @@ static void edje_del_cb(void *_info, Evas *e, Evas_Object *obj, void *event_info
        }
 
        EINA_LIST_FREE(obj_info->access_chain, ao) {
+               evas_object_data_del(ao, "edje");
                elm_access_object_unregister(ao);
        }
 
@@ -723,10 +839,10 @@ static void edje_del_cb(void *_info, Evas *e, Evas_Object *obj, void *event_info
        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;
@@ -750,88 +866,89 @@ PUBLIC int script_feed_event(void *h, Evas *e, int event_type, int x, int y, dou
        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;
                }
@@ -1192,12 +1309,99 @@ static void access_cb(keynode_t *node, void *user_data)
                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,
@@ -1211,12 +1415,29 @@ PUBLIC int script_init(void)
                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;
 }