Merge branch 'tizen_2.4' of ssh://spin:29418/apps/widget/widget into tizen
[apps/native/widget/widget.git] / src / virtual_window.c
index b818deb..e1b4ca1 100644 (file)
@@ -1,37 +1,54 @@
+/*
+ * Copyright 2013  Samsung Electronics Co., Ltd
+ *
+ * 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://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,
+ * 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.
+ */
+
+#define _GNU_SOURCE
+
 #include <Elementary.h>
 #include <string.h>
 #include <Ecore_Evas.h>
 #include <Ecore_X.h>
 #include <Evas.h>
+#include <dlfcn.h>
+#include <Eina.h>
+#include <math.h>
 
 #include <X11/Xlib.h>
 
 #include <dlog.h>
-#include <livebox-errno.h>
-#include <livebox-service.h>
-
-#include "livebox.h"
+#include <widget_errno.h>
+#include <widget_service.h>
+#include <widget_service_internal.h>
+#include <widget_conf.h>
+#include <widget_buffer.h>
+#include <widget_provider.h>
+#include <widget_util.h>
+
+#include "widget.h"
+#include "widget_internal.h"
 #include "debug.h"
+#include "binder.h"
 
-#define IS_PD 1
+#define IS_GBAR 1
 
 #define PUBLIC __attribute__((visibility("default")))
+#define WIDGET_WIN_TAG "dynamic,box,win"
+#define WIN_INFO_TAG "dynamic,box,info"
 
-/*!
- * \brief
- * Abstracted Data Type of Virtual Window
- */
-struct info {
-       char *id; /*!< Identification */
-       struct livebox_buffer *handle; /*!< Livebox buffer handle */
-       int is_hw; /*!< 1 if a buffer is created on the H/W accelerated place or 0 */
-       Ecore_Evas *ee;
-       Evas *e;
-       int is_pd;
-       int deleted;
-       int w;
-       int h;
-};
+#define WIDGET_DEFAULT_WIDTH 1
+#define WIDGET_DEFAULT_HEIGHT 1
 
 static inline Evas_Object *get_highlighted_object(Evas_Object *obj)
 {
@@ -44,221 +61,428 @@ static inline Evas_Object *get_highlighted_object(Evas_Object *obj)
        return ho;
 }
 
-/*!
- * \note
+static inline void apply_orientation(int degree, int *x, int *y, int width, int height, input_event_source_e source)
+{
+       int _x;
+       int _y;
+       int _angle;
+
+       if (source == INPUT_EVENT_SOURCE_VIEWER) {
+               /* Already rotated */
+               return;
+       }
+
+       _x = *x;
+       _y = *y;
+
+       switch (degree) {
+       case 0:
+               return;
+       case 90:
+               *x = _y;
+               *y = width - _x;
+               return;
+       case 180:
+               *x = width - _x;
+               *y = height - _y;
+               return;
+       case 270:
+               *x = height - _y;
+               *y = _x;
+               return;
+       default:
+               /**
+                * @FIXME
+                * This rotation formular is not work correctly.
+                * The pointer should be rotated by other way.
+                * This is not what we want.
+                */
+               _angle = degree;
+
+               *x = (double)_x * cos((double)_angle) - (double)_y * sin((double)_angle);
+               *y = (double)_x * sin((double)_angle) + (double)_y * cos((double)_angle);
+               return;
+       }
+}
+
+/**
+ * @note
  * Every user event (mouse) on the buffer will be passed via this event callback
  */
-static int event_handler_cb(struct livebox_buffer *handler, struct buffer_event_data *event_info, void *data)
+static int event_handler_cb(widget_buffer_h handler, struct widget_buffer_event_data *event_info, void *data)
 {
-       struct info *info = data;
+       vwin_info_t info = data;
        Elm_Access_Action_Info action_info;
        Elm_Access_Action_Type action_type;
        int ret = 0;
        Evas_Object *parent_elm;
        KeySym *key_symbol;
        unsigned int flags = 0;
+       double timestamp;
 
-       if (!info->handle) {
+       if (!info || info->state != VWIN_INFO_CREATED || !info->handle) {
                /* Just ignore this event */
                return 0;
        }
 
-       /*!
-        * \note
+       if (WIDGET_CONF_USE_GETTIMEOFDAY) {
+               if (WIDGET_CONF_EVENT_FILTER > 0.0f && (info->pressed == 0 || event_info->type == WIDGET_BUFFER_EVENT_MOVE)) {
+                       struct timeval tv;
+
+                       if (gettimeofday(&tv, NULL) < 0) {
+                               ErrPrint("gettimeofday: %d\n", errno);
+                       } else {
+                               timestamp = (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0f;
+                               timestamp -= event_info->timestamp;
+
+                               if (timestamp > WIDGET_CONF_EVENT_FILTER) {
+                                       DbgPrint("Dropped %lf\n", timestamp);
+                                       return 0;
+                               }
+                       }
+               }
+
+               /**
+                * If the device doesn't use the clock monotic time, we have to emulate it for EVAS
+                * Evas only use the monotic time for animating objects
+                */
+               timestamp = ecore_time_get() * 1000.0f;
+       } else {
+               if (WIDGET_CONF_EVENT_FILTER > 0.0f && (info->pressed == 0 || event_info->type == WIDGET_BUFFER_EVENT_MOVE)) {
+                       timestamp = ecore_time_get();
+
+                       timestamp -= event_info->timestamp;
+                       if (timestamp > WIDGET_CONF_EVENT_FILTER) {
+                               DbgPrint("Dropped %lf\n", timestamp);
+                               return 0;
+                       }
+               }
+
+               timestamp = event_info->timestamp * 1000.0f;
+       }
+
+       /**
+        * @note
         * Feed up events
         */
        switch (event_info->type) {
-       case BUFFER_EVENT_ON_HOLD:
+       case WIDGET_BUFFER_EVENT_ON_HOLD:
                flags = evas_event_default_flags_get(info->e);
                flags |= EVAS_EVENT_FLAG_ON_HOLD;
                evas_event_default_flags_set(info->e, flags);
+               ErrPrint("ON_HOLD[%s] %dx%d - %lf\n", info->id, event_info->info.pointer.x, event_info->info.pointer.y, timestamp);
                break;
-       case BUFFER_EVENT_OFF_HOLD:
+       case WIDGET_BUFFER_EVENT_OFF_HOLD:
                flags = evas_event_default_flags_get(info->e);
                flags &= ~EVAS_EVENT_FLAG_ON_HOLD;
                evas_event_default_flags_set(info->e, flags);
                break;
-       case BUFFER_EVENT_ON_SCROLL:
+       case WIDGET_BUFFER_EVENT_ON_SCROLL:
                flags = evas_event_default_flags_get(info->e);
                flags |= EVAS_EVENT_FLAG_ON_SCROLL;
                evas_event_default_flags_set(info->e, flags);
                break;
-       case BUFFER_EVENT_OFF_SCROLL:
+       case WIDGET_BUFFER_EVENT_OFF_SCROLL:
                flags = evas_event_default_flags_get(info->e);
                flags &= ~EVAS_EVENT_FLAG_ON_SCROLL;
                evas_event_default_flags_set(info->e, flags);
                break;
-       case BUFFER_EVENT_ENTER:
-               evas_event_feed_mouse_in(info->e, event_info->timestamp * 1000, NULL);
+       case WIDGET_BUFFER_EVENT_ENTER:
+               evas_event_feed_mouse_in(info->e, timestamp, NULL);
                break;
-       case BUFFER_EVENT_LEAVE:
-               evas_event_feed_mouse_out(info->e, event_info->timestamp * 1000, NULL);
+       case WIDGET_BUFFER_EVENT_LEAVE:
+               evas_event_feed_mouse_out(info->e, timestamp, NULL);
                break;
-       case BUFFER_EVENT_DOWN:
-               /*!
-                * \note
+       case WIDGET_BUFFER_EVENT_DOWN:
+               apply_orientation(info->orientation, &event_info->info.pointer.x, &event_info->info.pointer.y, info->w, info->h, event_info->info.pointer.source);
+
+               if (info->pressed) {
+                       ErrPrint("MOUSE UP is not called\n");
+                       ErrPrint("UP[%s] %dx%d - %lf\n", info->id, event_info->info.pointer.x, event_info->info.pointer.y, timestamp);
+                       evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, timestamp, NULL);
+                       evas_event_feed_mouse_up(info->e, 1, EVAS_BUTTON_NONE, timestamp, NULL);
+               }
+
+               /**
+                * @note
+                * Before processing the DOWN event,
+                * Reset the evas event flags regarding ON_HOLD option.
+                * It can be re-enabled while processing down-move-up events.
+                */
+               flags = evas_event_default_flags_get(info->e);
+               flags &= ~EVAS_EVENT_FLAG_ON_SCROLL;
+               flags &= ~EVAS_EVENT_FLAG_ON_HOLD;
+               evas_event_default_flags_set(info->e, flags);
+               /**
+                * @note
                 * Calculate the event occurred X & Y on the buffer
                 */
-               evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, event_info->timestamp * 1000, NULL); /* + 0.1f just for fake event */
-               evas_event_feed_mouse_down(info->e, 1, EVAS_BUTTON_NONE, event_info->timestamp * 1000, NULL); /* + 0.2f just for fake event */
+               evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, timestamp, NULL);
+               evas_event_feed_mouse_down(info->e, 1, EVAS_BUTTON_NONE, timestamp, NULL); /* + 0.2f just for fake event */
+               info->pressed = 1;
+               ErrPrint("DOWN[%s] %dx%d - %lf\n", info->id, event_info->info.pointer.x, event_info->info.pointer.y, timestamp);
                break;
-       case BUFFER_EVENT_MOVE:
-               /*!
-                * \note
+       case WIDGET_BUFFER_EVENT_MOVE:
+               apply_orientation(info->orientation, &event_info->info.pointer.x, &event_info->info.pointer.y, info->w, info->h, event_info->info.pointer.source);
+               /**
+                * @note
                 * Calculate the event occurred X & Y on the buffer
                 */
-               evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, event_info->timestamp * 1000, NULL);
+               evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, timestamp, NULL);
                break;
-       case BUFFER_EVENT_UP:
-               evas_event_feed_mouse_up(info->e, 1, EVAS_BUTTON_NONE, event_info->timestamp * 1000, NULL);
-
-               flags = evas_event_default_flags_get(info->e);
-               flags &= ~EVAS_EVENT_FLAG_ON_SCROLL;
-               flags &= ~EVAS_EVENT_FLAG_ON_HOLD;
-               evas_event_default_flags_set(info->e, flags);
+       case WIDGET_BUFFER_EVENT_UP:
+               apply_orientation(info->orientation, &event_info->info.pointer.x, &event_info->info.pointer.y, info->w, info->h, event_info->info.pointer.source);
+               evas_event_feed_mouse_move(info->e, event_info->info.pointer.x, event_info->info.pointer.y, timestamp, NULL);
+               evas_event_feed_mouse_up(info->e, 1, EVAS_BUTTON_NONE, timestamp, NULL);
+               info->pressed = 0;
+               /**
+                * @note
+                * We have to keep the event flags, so we should not clear them from here.
+                * Sometimes, asynchronously callable Callbacks can refer the evas event flags after up event.
+                * so if we reset them from here, those kind of callbacks will fails to do their job properly.
+                */
+               ErrPrint("UP[%s] %dx%d - %lf\n", info->id, event_info->info.pointer.x, event_info->info.pointer.y, timestamp);
                break;
-       case BUFFER_EVENT_HIGHLIGHT:
-               parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win");
+       case WIDGET_BUFFER_EVENT_ACCESS_HIGHLIGHT:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
                if (!parent_elm) {
-                       ret = LB_ACCESS_STATUS_ERROR;
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
                        break;
                }
                memset(&action_info, 0, sizeof(action_info));
-               action_type = ELM_ACCESS_ACTION_HIGHLIGHT;
-               /*!
-                * \note
+               action_type = 0; //ELM_ACCESS_ACTION_HIGHLIGHT;
+               /**
+                * @note
                 * Calculate the event occurred X & Y on the buffer
                 */
-               action_info.x = event_info->info.pointer.x;
-               action_info.y = event_info->info.pointer.y;
+               action_info.x = event_info->info.access.x;
+               action_info.y = event_info->info.access.y;
                ret = elm_access_action(parent_elm, action_type, &action_info);
                if (ret == EINA_TRUE) {
                        if (!get_highlighted_object(parent_elm)) {
-                               LOGE("Highlighted object is not found\n");
-                               ret = LB_ACCESS_STATUS_ERROR;
+                               ErrPrint("Highlighted object is not found\n");
+                               ret = WIDGET_ACCESS_STATUS_ERROR;
                        } else {
-                               LOGD("Highlighted object is found\n");
-                               ret = LB_ACCESS_STATUS_DONE;
+                               DbgPrint("Highlighted object is found\n");
+                               ret = WIDGET_ACCESS_STATUS_DONE;
                        }
                } else {
-                       LOGE("Action error\n");
-                       ret = LB_ACCESS_STATUS_ERROR;
+                       ErrPrint("Action error\n");
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
                }
                break;
-       case BUFFER_EVENT_HIGHLIGHT_NEXT:
-               parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win");
+       case WIDGET_BUFFER_EVENT_ACCESS_HIGHLIGHT_NEXT:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
                if (!parent_elm) {
-                       ret = LB_ACCESS_STATUS_ERROR;
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
                        break;
                }
                memset(&action_info, 0, sizeof(action_info));
-               action_type = ELM_ACCESS_ACTION_HIGHLIGHT_NEXT;
+               action_type = 0; //ELM_ACCESS_ACTION_HIGHLIGHT_NEXT;
                action_info.highlight_cycle = EINA_FALSE;
                ret = elm_access_action(parent_elm, action_type, &action_info);
-               ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_LAST : LB_ACCESS_STATUS_DONE;
+               ret = (ret == EINA_FALSE) ? WIDGET_ACCESS_STATUS_LAST : WIDGET_ACCESS_STATUS_DONE;
                break;
-       case BUFFER_EVENT_HIGHLIGHT_PREV:
-               parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win");
+       case WIDGET_BUFFER_EVENT_ACCESS_HIGHLIGHT_PREV:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
                if (!parent_elm) {
-                       ret = LB_ACCESS_STATUS_ERROR;
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
                        break;
                }
                memset(&action_info, 0, sizeof(action_info));
-               action_type = ELM_ACCESS_ACTION_HIGHLIGHT_PREV;
+               action_type = 0; //ELM_ACCESS_ACTION_HIGHLIGHT_PREV;
                action_info.highlight_cycle = EINA_FALSE;
                ret = elm_access_action(parent_elm, action_type, &action_info);
-               ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_FIRST : LB_ACCESS_STATUS_DONE;
+               ret = (ret == EINA_FALSE) ? WIDGET_ACCESS_STATUS_FIRST : WIDGET_ACCESS_STATUS_DONE;
+               break;
+       case WIDGET_BUFFER_EVENT_ACCESS_ACTIVATE:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
+               if (!parent_elm) {
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
+                       break;
+               }
+               memset(&action_info, 0, sizeof(action_info));
+               action_type = 0; //ELM_ACCESS_ACTION_ACTIVATE;
+               ret = elm_access_action(parent_elm, action_type, &action_info);
+               ret = (ret == EINA_FALSE) ? WIDGET_ACCESS_STATUS_ERROR : WIDGET_ACCESS_STATUS_DONE;
+               break;
+       case WIDGET_BUFFER_EVENT_ACCESS_ACTION_UP:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
+               if (!parent_elm) {
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
+                       break;
+               }
+               memset(&action_info, 0, sizeof(action_info));
+               action_type = 0; //ELM_ACCESS_ACTION_UP;
+               ret = elm_access_action(parent_elm, action_type, &action_info);
+               ret = (ret == EINA_FALSE) ? WIDGET_ACCESS_STATUS_ERROR : WIDGET_ACCESS_STATUS_DONE;
+               break;
+       case WIDGET_BUFFER_EVENT_ACCESS_ACTION_DOWN:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
+               if (!parent_elm) {
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
+                       break;
+               }
+               memset(&action_info, 0, sizeof(action_info));
+               action_type = 0; //ELM_ACCESS_ACTION_DOWN;
+               ret = elm_access_action(parent_elm, action_type, &action_info);
+               ret = (ret == EINA_FALSE) ? WIDGET_ACCESS_STATUS_ERROR : WIDGET_ACCESS_STATUS_DONE;
+               break;
+       case WIDGET_BUFFER_EVENT_ACCESS_SCROLL_UP:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
+               if (!parent_elm) {
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
+                       break;
+               }
+               memset(&action_info, 0, sizeof(action_info));
+               action_type = 0; //ELM_ACCESS_ACTION_SCROLL;
+               action_info.x = event_info->info.access.x;
+               action_info.y = event_info->info.access.y;
+               action_info.mouse_type = event_info->info.access.mouse_type;
+               ret = elm_access_action(parent_elm, action_type, &action_info);
+               ret = (ret == EINA_FALSE) ? WIDGET_ACCESS_STATUS_ERROR : WIDGET_ACCESS_STATUS_DONE;
+               break;
+       case WIDGET_BUFFER_EVENT_ACCESS_SCROLL_MOVE:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
+               if (!parent_elm) {
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
+                       break;
+               }
+               memset(&action_info, 0, sizeof(action_info));
+               action_type = 0; //ELM_ACCESS_ACTION_SCROLL;
+               action_info.x = event_info->info.access.x;
+               action_info.y = event_info->info.access.y;
+               action_info.mouse_type = event_info->info.access.mouse_type;
+               ret = elm_access_action(parent_elm, action_type, &action_info);
+               ret = (ret == EINA_FALSE) ? WIDGET_ACCESS_STATUS_ERROR : WIDGET_ACCESS_STATUS_DONE;
+               break;
+       case WIDGET_BUFFER_EVENT_ACCESS_SCROLL_DOWN:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
+               if (!parent_elm) {
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
+                       break;
+               }
+               memset(&action_info, 0, sizeof(action_info));
+               action_type = 0; //ELM_ACCESS_ACTION_SCROLL;
+               action_info.x = event_info->info.access.x;
+               action_info.y = event_info->info.access.y;
+               action_info.mouse_type = event_info->info.access.mouse_type;
+               ret = elm_access_action(parent_elm, action_type, &action_info);
+               ret = (ret == EINA_FALSE) ? WIDGET_ACCESS_STATUS_ERROR : WIDGET_ACCESS_STATUS_DONE;
+               break;
+       case WIDGET_BUFFER_EVENT_ACCESS_UNHIGHLIGHT:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
+               if (!parent_elm) {
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
+                       break;
+               }
+               memset(&action_info, 0, sizeof(action_info));
+               action_type = 0; //ELM_ACCESS_ACTION_UNHIGHLIGHT;
+               ret = elm_access_action(parent_elm, action_type, &action_info);
+               ret = (ret == EINA_FALSE) ? WIDGET_ACCESS_STATUS_ERROR : WIDGET_ACCESS_STATUS_DONE;
                break;
-       case BUFFER_EVENT_ACTIVATE:
-               parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win");
+       case WIDGET_BUFFER_EVENT_ACCESS_VALUE_CHANGE:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
                if (!parent_elm) {
-                       ret = LB_ACCESS_STATUS_ERROR;
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
                        break;
                }
                memset(&action_info, 0, sizeof(action_info));
-               action_type = ELM_ACCESS_ACTION_ACTIVATE;
+               action_type = 0; //ELM_ACCESS_ACTION_VALUE_CHANGE;
+               action_info.x = event_info->info.access.x;
+               action_info.y = event_info->info.access.y;
+               action_info.mouse_type = event_info->info.access.mouse_type;
                ret = elm_access_action(parent_elm, action_type, &action_info);
-               ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE;
+               ret = (ret == EINA_FALSE) ? WIDGET_ACCESS_STATUS_ERROR : WIDGET_ACCESS_STATUS_DONE;
                break;
-       case BUFFER_EVENT_ACTION_UP:
-               parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win");
+       case WIDGET_BUFFER_EVENT_ACCESS_MOUSE:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
                if (!parent_elm) {
-                       ret = LB_ACCESS_STATUS_ERROR;
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
                        break;
                }
                memset(&action_info, 0, sizeof(action_info));
-               action_type = ELM_ACCESS_ACTION_UP;
+               action_type = 0; //ELM_ACCESS_ACTION_MOUSE;
+               action_info.x = event_info->info.access.x;
+               action_info.y = event_info->info.access.y;
+               action_info.mouse_type = event_info->info.access.mouse_type;
                ret = elm_access_action(parent_elm, action_type, &action_info);
-               ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE;
+               ret = (ret == EINA_FALSE) ? WIDGET_ACCESS_STATUS_ERROR : WIDGET_ACCESS_STATUS_DONE;
                break;
-       case BUFFER_EVENT_ACTION_DOWN:
-               parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win");
+       case WIDGET_BUFFER_EVENT_ACCESS_BACK:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
                if (!parent_elm) {
-                       ret = LB_ACCESS_STATUS_ERROR;
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
                        break;
                }
                memset(&action_info, 0, sizeof(action_info));
-               action_type = ELM_ACCESS_ACTION_DOWN;
+               action_type = 0; //ELM_ACCESS_ACTION_BACK;
+               action_info.x = event_info->info.access.x;
+               action_info.y = event_info->info.access.y;
+               action_info.mouse_type = event_info->info.access.mouse_type;
                ret = elm_access_action(parent_elm, action_type, &action_info);
-               ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE;
+               ret = (ret == EINA_FALSE) ? WIDGET_ACCESS_STATUS_ERROR : WIDGET_ACCESS_STATUS_DONE;
                break;
-       case BUFFER_EVENT_SCROLL_UP:
-               parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win");
+       case WIDGET_BUFFER_EVENT_ACCESS_OVER:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
                if (!parent_elm) {
-                       ret = LB_ACCESS_STATUS_ERROR;
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
                        break;
                }
                memset(&action_info, 0, sizeof(action_info));
-               action_type = ELM_ACCESS_ACTION_SCROLL;
-               action_info.x = event_info->info.pointer.x;
-               action_info.y = event_info->info.pointer.y;
-               action_info.mouse_type = 2;
+               action_type = 0; //ELM_ACCESS_ACTION_OVER;
+               action_info.x = event_info->info.access.x;
+               action_info.y = event_info->info.access.y;
+               action_info.mouse_type = event_info->info.access.mouse_type;
                ret = elm_access_action(parent_elm, action_type, &action_info);
-               ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE;
+               ret = (ret == EINA_FALSE) ? WIDGET_ACCESS_STATUS_ERROR : WIDGET_ACCESS_STATUS_DONE;
                break;
-       case BUFFER_EVENT_SCROLL_MOVE:
-               parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win");
+       case WIDGET_BUFFER_EVENT_ACCESS_READ:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
                if (!parent_elm) {
-                       ret = LB_ACCESS_STATUS_ERROR;
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
                        break;
                }
                memset(&action_info, 0, sizeof(action_info));
-               action_type = ELM_ACCESS_ACTION_SCROLL;
-               action_info.x = event_info->info.pointer.x;
-               action_info.y = event_info->info.pointer.y;
-               action_info.mouse_type = 1;
+               action_type = 0; //ELM_ACCESS_ACTION_READ;
+               action_info.x = event_info->info.access.x;
+               action_info.y = event_info->info.access.y;
+               action_info.mouse_type = event_info->info.access.mouse_type;
                ret = elm_access_action(parent_elm, action_type, &action_info);
-               ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE;
+               ret = (ret == EINA_FALSE) ? WIDGET_ACCESS_STATUS_ERROR : WIDGET_ACCESS_STATUS_DONE;
                break;
-       case BUFFER_EVENT_SCROLL_DOWN:
-               parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win");
+       case WIDGET_BUFFER_EVENT_ACCESS_ENABLE:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
                if (!parent_elm) {
-                       ret = LB_ACCESS_STATUS_ERROR;
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
                        break;
                }
                memset(&action_info, 0, sizeof(action_info));
-               action_type = ELM_ACCESS_ACTION_SCROLL;
-               action_info.x = event_info->info.pointer.x;
-               action_info.y = event_info->info.pointer.y;
-               action_info.mouse_type = 0;
+               action_type = 0; //ELM_ACCESS_ACTION_ENABLE;
+               action_info.x = event_info->info.access.x;
+               action_info.y = event_info->info.access.y;
+               action_info.mouse_type = event_info->info.access.mouse_type;
                ret = elm_access_action(parent_elm, action_type, &action_info);
-               ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE;
+               ret = (ret == EINA_FALSE) ? WIDGET_ACCESS_STATUS_ERROR : WIDGET_ACCESS_STATUS_DONE;
                break;
-       case BUFFER_EVENT_UNHIGHLIGHT:
-               parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win");
+       case WIDGET_BUFFER_EVENT_ACCESS_DISABLE:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
                if (!parent_elm) {
-                       ret = LB_ACCESS_STATUS_ERROR;
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
                        break;
                }
                memset(&action_info, 0, sizeof(action_info));
-               action_type = ELM_ACCESS_ACTION_UNHIGHLIGHT;
+               action_type = 0; //ELM_ACCESS_ACTION_DISABLE;
+               action_info.x = event_info->info.access.x;
+               action_info.y = event_info->info.access.y;
+               action_info.mouse_type = event_info->info.access.mouse_type;
                ret = elm_access_action(parent_elm, action_type, &action_info);
-               ret = (ret == EINA_FALSE) ? LB_ACCESS_STATUS_ERROR : LB_ACCESS_STATUS_DONE;
+               ret = (ret == EINA_FALSE) ? WIDGET_ACCESS_STATUS_ERROR : WIDGET_ACCESS_STATUS_DONE;
                break;
-       case BUFFER_EVENT_KEY_DOWN:
-               parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win");
+       case WIDGET_BUFFER_EVENT_KEY_DOWN:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
                if (!parent_elm) {
-                       ret = LB_ACCESS_STATUS_ERROR;
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
                        break;
                }
 
@@ -272,13 +496,14 @@ static int event_handler_cb(struct livebox_buffer *handler, struct buffer_event_
                        DbgPrint("Key symbol: %s, name: %s\n", key_string, key_name);
                        XFree(key_symbol);
                        XFree(key_name);
+                       XFree(key_string);
                }
-               ret = LB_KEY_STATUS_ERROR;
+               ret = WIDGET_KEY_STATUS_ERROR;
                break;
-       case BUFFER_EVENT_KEY_UP:
-               parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win");
+       case WIDGET_BUFFER_EVENT_KEY_UP:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
                if (!parent_elm) {
-                       ret = LB_ACCESS_STATUS_ERROR;
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
                        break;
                }
 
@@ -292,13 +517,14 @@ static int event_handler_cb(struct livebox_buffer *handler, struct buffer_event_
                        DbgPrint("Key symbol: %s, name: %s\n", key_string, key_name);
                        XFree(key_symbol);
                        XFree(key_name);
+                       XFree(key_string);
                }
-               ret = LB_KEY_STATUS_ERROR;
+               ret = WIDGET_KEY_STATUS_ERROR;
                break;
-       case BUFFER_EVENT_KEY_FOCUS_IN:
-               parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win");
+       case WIDGET_BUFFER_EVENT_KEY_FOCUS_IN:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
                if (!parent_elm) {
-                       ret = LB_ACCESS_STATUS_ERROR;
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
                        break;
                }
 
@@ -312,13 +538,14 @@ static int event_handler_cb(struct livebox_buffer *handler, struct buffer_event_
                        DbgPrint("Key symbol: %s, name: %s\n", key_string, key_name);
                        XFree(key_symbol);
                        XFree(key_name);
+                       XFree(key_string);
                }
-               ret = LB_KEY_STATUS_ERROR;
+               ret = WIDGET_KEY_STATUS_ERROR;
                break;
-       case BUFFER_EVENT_KEY_FOCUS_OUT:
-               parent_elm = ecore_evas_data_get(info->ee, "dynamic,box,win");
+       case WIDGET_BUFFER_EVENT_KEY_FOCUS_OUT:
+               parent_elm = ecore_evas_data_get(info->ee, WIDGET_WIN_TAG);
                if (!parent_elm) {
-                       ret = LB_ACCESS_STATUS_ERROR;
+                       ret = WIDGET_ACCESS_STATUS_ERROR;
                        break;
                }
 
@@ -332,149 +559,168 @@ static int event_handler_cb(struct livebox_buffer *handler, struct buffer_event_
                        DbgPrint("Key symbol: %s, name: %s\n", key_string, key_name);
                        XFree(key_symbol);
                        XFree(key_name);
+                       XFree(key_string);
                }
-               ret = LB_KEY_STATUS_ERROR;
+               ret = WIDGET_KEY_STATUS_ERROR;
                break;
        default:
-               LOGD("Unhandled buffer event (%d)\n", event_info->type);
+               DbgPrint("Unhandled buffer event (%d)\n", event_info->type);
                break;
        }
 
        return ret;
 }
 
-static void *alloc_fb(void *data, int size)
+static void pre_render_cb(void *data, Evas *e, void *event_info)
 {
-       struct info *info = data;
-       void *buffer;
+       vwin_info_t info = data;
 
-       if (info->ee) {
-               ecore_evas_geometry_get(info->ee, NULL, NULL, &info->w, &info->h);
-               LOGD("Size of ee is updated: %dx%d (info: %p)\n", info->w, info->h, info);
+       if (!info || info->state != VWIN_INFO_CREATED || !info->handle) {
+               return;
        }
 
-       /*!
-        * Acquire a buffer for canvas.
-        */
-       info->handle = livebox_acquire_buffer_NEW(info->id, info->is_pd,
-                                       info->w, info->h, sizeof(int),
-                                       event_handler_cb, info);
-
-       /*!
-        * If it supports the H/W accelerated buffer,
-        * Use it.
-        */
-       if (livebox_support_hw_buffer(info->handle)) {
-               if (livebox_create_hw_buffer(info->handle) == 0) {
-                       buffer = livebox_buffer_hw_buffer(info->handle);
-                       if (buffer) {
-                               LOGD("HW Accelerated buffer is created %p, (%dx%d)\n", info, info->w, info->h);
-                               info->is_hw = 1;
-                               return buffer;
-                       }
-               }
+       if (widget_conf_premultiplied_alpha()) {
+               Evas_Coord w;
+               Evas_Coord h;
 
-               LOGE("Failed to allocate HW Accelerated buffer\n");
+               ecore_evas_geometry_get(info->ee, NULL, NULL, &w, &h);
+               evas_damage_rectangle_add(e, 0, 0, w, h);
        }
 
-       /*!
-        * Or use the buffer of a S/W backend.
-        */
-       buffer = livebox_ref_buffer(info->handle);
-       LOGD("SW buffer is created (%dx%d)\n", info->w, info->h);
-       info->is_hw = 0;
-       return buffer;
+       if (info->type == VWIN_GEM) {
+               widget_buffer_pre_render(info->handle);
+       } else if (info->type == VWIN_PIXMAP) {
+               /**
+                * Only the pixmap type Ecore_Evas uses this variable
+                */
+       } else if (info->type == VWIN_SW_BUF) {
+               /* Do nothing */
+       }
 }
 
-static void free_fb(void *data, void *ptr)
+static void post_render_cb(void *data, Evas *e, void *event_info)
 {
-       struct info *info = data;
+       vwin_info_t info = data;
 
-       if (!info->handle) {
+       if (!info || info->state != VWIN_INFO_CREATED || !info->handle) {
                return;
        }
 
-       if (info->is_hw) {
-               if (livebox_destroy_hw_buffer(info->handle) == 0) {
-                       LOGD("HW Accelerated buffer is destroyed\n");
+       if (widget_conf_premultiplied_alpha()) {
+               void *canvas;
+               int x, y, w, h;
+
+               // Get a pointer of a buffer of the virtual canvas
+               canvas = (void *)ecore_evas_buffer_pixels_get(info->ee);
+               if (!canvas) {
+                       ErrPrint("Failed to get pixel canvas\n");
+                       return;
                }
-       } else {
-               LOGD("SW buffer is destroyed, %p\n", info);
-               livebox_unref_buffer(ptr);
+
+               ecore_evas_geometry_get(info->ee, &x, &y, &w, &h);
+               evas_data_argb_unpremul(canvas, w * h);
        }
 
-       livebox_release_buffer_NEW(info->handle);
-       info->handle = NULL;
+       if (info->type == VWIN_GEM) {
+               widget_buffer_post_render(info->handle);
+       } else if (info->type == VWIN_PIXMAP) {
+               int idx;
+               unsigned int front_resource_id;
 
-       if (info->deleted) {
-               free(info->id);
-               info->id = NULL;
+               front_resource_id = ecore_evas_gl_x11_pixmap_get(info->ee);
 
-               free(info);
+               for (idx = 0; idx < WIDGET_CONF_EXTRA_BUFFER_COUNT; idx++) {
+                       if (front_resource_id == info->resource_array[idx]) {
+                               /**
+                                */
+                               widget_send_updated_by_idx(info->handle, idx);
+                               break;
+                       }
+               }
+
+               if (idx == WIDGET_CONF_EXTRA_BUFFER_COUNT) {
+                       /* Send updated event for PRIMARY BUFFER */
+                       if (front_resource_id == widget_viewer_get_resource_id(info->handle, WIDGET_PRIMARY_BUFFER)) {
+                               widget_send_updated_by_idx(info->handle, WIDGET_PRIMARY_BUFFER);
+                       } else {
+                               DbgPrint("Unable to send updated: %u (%u)\n", front_resource_id, widget_viewer_get_resource_id(info->handle, WIDGET_PRIMARY_BUFFER));
+                       }
+               }
+       } else if (info->type == VWIN_SW_BUF) {
+               widget_viewer_sync_buffer(info->handle);
        }
 }
 
-static void pre_render_cb(void *data, Evas *e, void *event_info)
+static int pre_orientation_cb(const char *id, void *data)
 {
-       struct info *info = data;
+       vwin_info_t info = data;
+       const char *path;
+       int orientation;
 
-       if (!info->handle) {
-               return;
+       /* Try provider_app first */
+       if (!info || info->state != VWIN_INFO_CREATED || !id || !info->id) {
+               return WIDGET_ERROR_INVALID_PARAMETER;
        }
 
-       if (livebox_conf_premultiplied_alpha()) {
-               Evas_Coord w;
-               Evas_Coord h;
-
-               ecore_evas_geometry_get(info->ee, NULL, NULL, &w, &h);
-               evas_damage_rectangle_add(e, 0, 0, w, h);
+       path = widget_util_uri_to_path(id);
+       if (path && strcmp(info->id, path)) {
+               /* Skip */
+               DbgPrint("SKIP: Pre orientation event callback is called [%s], %s\n", id, info->id);
+               return WIDGET_ERROR_INVALID_PARAMETER;
        }
 
-       if (info->is_hw) {
-               livebox_buffer_pre_render(info->handle);
+       DbgPrint("Pre orientation event callback is called [%s]\n", id);
+       orientation = widget_get_orientation(path);
+       if (orientation < 0) {
+               ErrPrint("Failed to get orientation: %X\n", orientation);
+       } else {
+               info->orientation = orientation;
        }
+
+       return WIDGET_ERROR_NONE;
 }
 
-static void post_render_cb(void *data, Evas *e, void *event_info)
+static int pre_destroy_cb(const char *id, void *data)
 {
-       struct info *info = data;
+       vwin_info_t info = data;
+       const char *path = NULL;
 
-       if (!info->handle) {
-               return;
+       if (!info || info->state != VWIN_INFO_CREATED) {
+               return WIDGET_ERROR_INVALID_PARAMETER;
        }
 
-       if (livebox_conf_premultiplied_alpha()) {
-               void *canvas;
-               int x, y, w, h;
+       if (id) {
+               path = widget_util_uri_to_path(id);
 
-               // Get a pointer of a buffer of the virtual canvas
-               canvas = (void *)ecore_evas_buffer_pixels_get(info->ee);
-               if (!canvas) {
-                       ErrPrint("Failed to get pixel canvas\n");
-                       return;
+               if (path && strcmp(info->id, path)) {
+                       /* Skip */
+                       DbgPrint("SKIP: Pre destroy event callback is called [%s], %s\n", id, info->id);
+                       return WIDGET_ERROR_INVALID_PARAMETER;
                }
-
-               ecore_evas_geometry_get(info->ee, &x, &y, &w, &h);
-               evas_data_argb_unpremul(canvas, w * h);
        }
 
-       if (info->is_hw) {
-               livebox_buffer_post_render(info->handle);
-       } else {
-               livebox_sync_buffer(info->handle);
+       DbgPrint("Pre destroy event callback is called [%s]\n", id);
+
+       if (info->ee) {
+               DbgPrint("Toggle manual render mode to prevent from unwanted rendering");
+               ecore_evas_manual_render_set(info->ee, EINA_TRUE);
        }
+
+       return WIDGET_ERROR_NONE;
 }
 
 static void ecore_evas_free_cb(Ecore_Evas *ee)
 {
-       struct info *info;
+       vwin_info_t info;
 
-       info = ecore_evas_data_get(ee, "dynamic,box,info");
+       info = ecore_evas_data_get(ee, WIN_INFO_TAG);
        if (!info) {
-               LOGD("Info is not valid\n");
+               DbgPrint("Info is not valid\n");
                return;
        }
 
+       widget_del_pre_callback(WIDGET_PRE_DESTROY_CALLBACK, pre_destroy_cb, info);
+
        if (info->e) {
                evas_event_callback_del(info->e, EVAS_CALLBACK_RENDER_POST, post_render_cb);
                evas_event_callback_del(info->e, EVAS_CALLBACK_RENDER_PRE, pre_render_cb);
@@ -484,10 +730,20 @@ static void ecore_evas_free_cb(Ecore_Evas *ee)
        info->ee = NULL;
 }
 
-PUBLIC Evas_Object *livebox_get_evas_object(const char *id, int is_pd)
+#ifdef WIDGET_FEATURE_GBAR_SUPPORTED
+PUBLIC Evas *widget_get_evas(const char *id, int is_gbar)
+#else /* WIDGET_FEATURE_GBAR_SUPPORTED */
+PUBLIC Evas *widget_get_evas(const char *id)
+#endif /* WIDGET_FEATURE_GBAR_SUPPORTED */
 {
-       struct info *info;
-       Evas_Object *rect;
+       vwin_info_t info;
+       int orientation;
+
+       /**
+        * @TODO
+        * If the evas object is already created,
+        * this function should returns ERROR.
+        */
 
        if (!id) {
                ErrPrint("Invalid parameter\n");
@@ -496,33 +752,65 @@ PUBLIC Evas_Object *livebox_get_evas_object(const char *id, int is_pd)
 
        info = calloc(1, sizeof(*info));
        if (!info) {
-               ErrPrint("Heap: %s\n", strerror(errno));
+               ErrPrint("Heap: %d\n", errno);
                return NULL;
        }
 
+       info->state = VWIN_INFO_CREATED;
+
        info->id = strdup(id);
        if (!info->id) {
-               ErrPrint("Heap: %s\n", strerror(errno));
+               ErrPrint("Heap: %d\n", errno);
+               info->state = VWIN_INFO_DESTROYED;
                free(info);
                return NULL;
        }
 
-       info->is_pd = is_pd;
+#ifdef WIDGET_FEATURE_GBAR_SUPPORTED
+       info->is_gbar = is_gbar;
+#else
+       info->is_gbar = 0;
+#endif /* WIDGET_FEATURE_GBAR_SUPPORTED */
+
+       /**
+        * Acquire a buffer for canvas.
+        */
+       info->handle = widget_create_buffer(info->id, info->is_gbar,
+                       binder_widget_auto_align(),
+                       event_handler_cb, info);
+
+       if (!info->handle) {
+               ErrPrint("Failed to create a widget buffer\n");
+               info->state = VWIN_INFO_DESTROYED;
+               free(info->id);
+               free(info);
+               return NULL;
+       }
 
-       /*!
+       /**
         * Size information must be initialized before call the ecore_evas_buffer_new.
         */
-       info->w = 1;
-       info->h = 1;
+       info->w = WIDGET_DEFAULT_WIDTH;
+       info->h = WIDGET_DEFAULT_HEIGHT;
 
-       info->ee = ecore_evas_buffer_allocfunc_new(1, 1, alloc_fb, free_fb, info);
+       info->ee = binder_ecore_evas_new(info);
        if (!info->ee) {
-               ErrPrint("Failed to create ecore_evas (%dx%d)\n", 1, 1);
+               ErrPrint("Failed to create ecore_evas (%dx%d)\n", info->w, info->h);
+               widget_destroy_buffer(info->handle);
+               info->state = VWIN_INFO_DESTROYED;
                free(info->id);
                free(info);
                return NULL;
        }
 
+       ecore_evas_data_set(info->ee, WIN_INFO_TAG, info);
+
+       /**
+        * @note
+        * Free callback must be prepared before use the ecore_evas_free()
+        */
+       ecore_evas_callback_pre_free_set(info->ee, ecore_evas_free_cb);
+
        info->e = ecore_evas_get(info->ee);
        if (!info->e) {
                ErrPrint("Failed to get evas\n");
@@ -530,29 +818,27 @@ PUBLIC Evas_Object *livebox_get_evas_object(const char *id, int is_pd)
                return NULL;
        }
 
-       ecore_evas_data_set(info->ee, "dynamic,box,info", info);
-
        pre_render_cb(info, NULL, NULL);
        ecore_evas_alpha_set(info->ee, EINA_TRUE);
        post_render_cb(info, NULL, NULL);
 
        ecore_evas_manual_render_set(info->ee, EINA_FALSE);
-       ecore_evas_resize(info->ee, 1, 1);
+       ecore_evas_resize(info->ee, info->w, info->h);
 
-       ecore_evas_callback_pre_free_set(info->ee, ecore_evas_free_cb);
        evas_event_callback_add(info->e, EVAS_CALLBACK_RENDER_POST, post_render_cb, info);
        evas_event_callback_add(info->e, EVAS_CALLBACK_RENDER_PRE, pre_render_cb, info);
 
-       rect = evas_object_rectangle_add(info->e);
-       if (!rect) {
-               ErrPrint("Failed to create evas_object\n");
-               ecore_evas_free(info->ee);
-               return NULL;
+       widget_add_pre_callback(WIDGET_PRE_DESTROY_CALLBACK, pre_destroy_cb, info);
+       widget_add_pre_callback(WIDGET_PRE_ORIENTATION_CALLBACK, pre_orientation_cb, info);
+
+       orientation = widget_get_orientation(info->id);
+       if (orientation < 0) {
+               ErrPrint("Failed to get orientation[%s]: %X\n", info->id, orientation);
+       } else {
+               info->orientation = orientation;
        }
 
-       evas_object_resize(rect, 1, 1);
-       evas_object_color_set(rect, 0, 0, 0, 0);
-       return rect;
+       return info->e;
 }
 
 /* End of a file */