diff --git a/legacy/elementary/src/lib/elm_web.c b/legacy/elementary/src/lib/elm_web.c index c0367cd6b3..31e0cb8a84 100644 --- a/legacy/elementary/src/lib/elm_web.c +++ b/legacy/elementary/src/lib/elm_web.c @@ -9,68 +9,105 @@ #include /* Similar to iPhone */ -// TODO: switch between iPhone, iPad or Chrome/Safari based on some elm setting? -#define ELM_WEB_USER_AGENT "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3 " PACKAGE_NAME "/" PACKAGE_VERSION +// TODO: switch between iPhone, iPad or Chrome/Safari based on some +// elm setting? -static Ewk_View_Smart_Class _parent_sc = EWK_VIEW_SMART_CLASS_INIT_NULL; +#define ELM_WEB_USER_AGENT \ + "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en)" \ + " AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a" \ + " Safari/419.3 " PACKAGE_NAME "/" PACKAGE_VERSION + +static const char WEB_SMART_NAME[] = "elm_web"; + +#define ELM_WEB_DATA_GET(o, sd) \ + Elm_Web_Smart_Data * sd = evas_object_smart_data_get(o) + +#define ELM_WEB_DATA_GET_OR_RETURN(o, ptr) \ + ELM_WEB_DATA_GET(o, ptr); \ + if (!ptr) \ + { \ + CRITICAL("No widget data for object %p (%s)", \ + o, evas_object_type_get(o)); \ + return; \ + } + +#define ELM_WEB_DATA_GET_OR_RETURN_VAL(o, ptr, val) \ + ELM_WEB_DATA_GET(o, ptr); \ + if (!ptr) \ + { \ + CRITICAL("No widget data for object %p (%s)", \ + o, evas_object_type_get(o)); \ + return val; \ + } + +#define ELM_WEB_CHECK(obj) \ + if (!obj || !elm_widget_type_check((obj), WEB_SMART_NAME, __func__)) \ + return + +static Ewk_View_Smart_Class _ewk_view_parent_sc = + EWK_VIEW_SMART_CLASS_INIT_NULL; typedef struct _View_Smart_Data View_Smart_Data; struct _View_Smart_Data { Ewk_View_Smart_Data base; struct - { - Evas_Event_Mouse_Down event; - Evas_Coord x, y; - unsigned int move_count; - Ecore_Timer *longpress_timer; - Ecore_Animator *pan_anim; - } mouse; + { + Evas_Event_Mouse_Down event; + Evas_Coord x, y; + unsigned int move_count; + Ecore_Timer *longpress_timer; + Ecore_Animator *pan_anim; + } mouse; }; #endif -typedef struct _Widget_Data Widget_Data; -struct _Widget_Data +typedef struct _Elm_Web_Smart_Data Elm_Web_Smart_Data; +struct _Elm_Web_Smart_Data { - Evas_Object *self; + Elm_Widget_Smart_Data base; /* base widget smart data as + * first member obligatory, as + * we're inheriting from it */ + #ifdef HAVE_ELEMENTARY_WEB - Evas_Object *ewk_view; struct - { - Elm_Web_Window_Open window_create; - void *window_create_data; - Elm_Web_Dialog_Alert alert; - void *alert_data; - Elm_Web_Dialog_Confirm confirm; - void *confirm_data; - Elm_Web_Dialog_Prompt prompt; - void *prompt_data; - Elm_Web_Dialog_File_Selector file_selector; - void *file_selector_data; - Elm_Web_Console_Message console_message; - void *console_message_data; - } hook; + { + Elm_Web_Window_Open window_create; + void *window_create_data; + Elm_Web_Dialog_Alert alert; + void *alert_data; + Elm_Web_Dialog_Confirm confirm; + void *confirm_data; + Elm_Web_Dialog_Prompt prompt; + void *prompt_data; + Elm_Web_Dialog_File_Selector file_selector; + void *file_selector_data; + Elm_Web_Console_Message console_message; + void *console_message_data; + } hook; + Elm_Win_Keyboard_Mode input_method; + struct - { - Elm_Web_Zoom_Mode mode; - float current; - float min, max; - Eina_Bool no_anim; - Ecore_Timer *timer; - } zoom; + { + Elm_Web_Zoom_Mode mode; + float current; + float min, max; + Eina_Bool no_anim; + Ecore_Timer *timer; + } zoom; + struct - { - struct - { - int x, y; - } start, end; - Ecore_Animator *animator; - } bring_in; + { + struct + { + int x, y; + } start, end; + Ecore_Animator *animator; + } bring_in; + Eina_Bool tab_propagate : 1; Eina_Bool inwin_mode : 1; -#else - Evas_Object *label; #endif }; @@ -86,26 +123,26 @@ typedef struct _Dialog_Data Dialog_Data; struct _Dialog_Data { enum Dialog_Type type; - Evas_Object *dialog; - Evas_Object *box; - Evas_Object *bt_ok, *bt_cancel; - Evas_Object *entry; - Evas_Object *file_sel; - Eina_Bool *response; - char **entry_value; - Eina_List **selected_files; + Evas_Object *dialog; + Evas_Object *box; + Evas_Object *bt_ok, *bt_cancel; + Evas_Object *entry; + Evas_Object *file_sel; + + Eina_Bool *response; + char **entry_value; + Eina_List **selected_files; }; struct _Elm_Web_Callback_Proxy_Context { - const char *name; + const char *name; Evas_Object *obj; }; typedef struct _Elm_Web_Callback_Proxy_Context Elm_Web_Callback_Proxy_Context; -static const char *widtype = NULL; -static const Evas_Smart_Cb_Description _elm_web_callback_names[] = { +static const Evas_Smart_Cb_Description _elm_web_smart_callbacks[] = { { "download,request", "p" }, { "editorclient,contents,changed", "" }, { "editorclient,selection,changed", "" }, @@ -143,6 +180,10 @@ static const Evas_Smart_Cb_Description _elm_web_callback_names[] = { { NULL, NULL } }; +EVAS_SMART_SUBCLASS_NEW + (WEB_SMART_NAME, _elm_web, Elm_Widget_Smart_Class, Elm_Widget_Smart_Class, + elm_widget_smart_class_get, _elm_web_smart_callbacks); + #ifdef HAVE_ELEMENTARY_WEB static char * _webkit_theme_find(const Eina_List *list) @@ -150,28 +191,35 @@ _webkit_theme_find(const Eina_List *list) const Eina_List *l; const char *th; - EINA_LIST_FOREACH(list, l, th) + EINA_LIST_FOREACH (list, l, th) { char *path = elm_theme_list_item_path_get(th, NULL); + if (!path) continue; - if (edje_file_group_exists(path, "webkit/base")) - return path; + + if (edje_file_group_exists(path, "webkit/base")) return path; + free(path); } return NULL; } + #endif -static void -_theme_hook(Evas_Object *obj) +static Eina_Bool +_elm_web_smart_theme(Evas_Object *obj) { #ifdef HAVE_ELEMENTARY_WEB - Elm_Theme *theme = elm_object_theme_get(obj); - Widget_Data *wd = elm_widget_data_get(obj); + Elm_Theme *theme; const Eina_List *themes; char *view_theme = NULL; + ELM_WEB_DATA_GET(obj, sd); + + if (!_elm_web_parent_sc->theme(obj)) return EINA_FALSE; + + theme = elm_object_theme_get(obj); themes = elm_theme_overlay_list_get(theme); view_theme = _webkit_theme_find(themes); if (view_theme) goto set; @@ -186,64 +234,71 @@ _theme_hook(Evas_Object *obj) set: if (view_theme) { - ewk_view_theme_set(wd->ewk_view, view_theme); + ewk_view_theme_set(ELM_WIDGET_DATA(sd)->resize_obj, view_theme); free(view_theme); } else - ewk_view_theme_set(wd->ewk_view, WEBKIT_DATADIR"/themes/default.edj"); -#else - (void)obj; + ewk_view_theme_set + (ELM_WIDGET_DATA(sd)->resize_obj, WEBKIT_DATADIR "/themes/default.edj"); #endif + + return EINA_TRUE; } -static void -_on_focus_hook(void *data __UNUSED__, Evas_Object *obj) +static Eina_Bool +_elm_web_smart_on_focus(Evas_Object *obj) { #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - Evas_Object *top = elm_widget_top_get(obj); + Evas_Object *top; - if (!wd) return; + ELM_WEB_DATA_GET(obj, sd); + + top = elm_widget_top_get(obj); if (elm_object_focus_get(obj)) { - evas_object_focus_set(wd->ewk_view, EINA_TRUE); - if (top) elm_win_keyboard_mode_set(top, wd->input_method); + evas_object_focus_set(ELM_WIDGET_DATA(sd)->resize_obj, EINA_TRUE); + if (top) elm_win_keyboard_mode_set(top, sd->input_method); } else { - evas_object_focus_set(wd->ewk_view, EINA_FALSE); + evas_object_focus_set(ELM_WIDGET_DATA(sd)->resize_obj, EINA_FALSE); if (top) elm_win_keyboard_mode_set(top, ELM_WIN_KEYBOARD_OFF); } #else (void)obj; #endif + + return EINA_TRUE; } static Eina_Bool -_event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info) +_elm_web_smart_event(Evas_Object *obj, + Evas_Object *src __UNUSED__, + Evas_Callback_Type type, + void *event_info) { #ifdef HAVE_ELEMENTARY_WEB Evas_Event_Key_Down *ev = event_info; - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return EINA_FALSE; + ELM_WEB_DATA_GET(obj, sd); + if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE; if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE; if (elm_widget_disabled_get(obj)) return EINA_FALSE; - if ((!strcmp(ev->keyname, "Tab")) && (!wd->tab_propagate)) + if ((!strcmp(ev->keyname, "Tab")) && (!sd->tab_propagate)) { ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; return EINA_TRUE; } - else - return EINA_FALSE; + else return EINA_FALSE; #else - return EINA_FALSE; (void)obj; (void)type; (void)event_info; + + return EINA_FALSE; #endif } @@ -267,7 +322,7 @@ _view_pan_animator(void *data) sd->mouse.x = x; sd->mouse.y = y; - end: +end: return EINA_TRUE; } @@ -279,10 +334,11 @@ _view_smart_add(Evas_Object *obj) sd = calloc(1, sizeof(View_Smart_Data)); evas_object_smart_data_set(obj, sd); - _parent_sc.sc.add(obj); + _ewk_view_parent_sc.sc.add(obj); ewk_view_history_enable_set(obj, EINA_TRUE); ewk_history_limit_set(ewk_view_history_get(obj), 100); + // TODO: auto toggle between smooth/nearest during bring-in animations //ewk_view_zoom_weak_smooth_scale_set(obj, EINA_TRUE); } @@ -297,7 +353,7 @@ _view_smart_del(Evas_Object *obj) if (sd->mouse.pan_anim) ecore_animator_del(sd->mouse.pan_anim); - _parent_sc.sc.del(obj); + _ewk_view_parent_sc.sc.del(obj); } static Eina_Bool @@ -307,21 +363,24 @@ _view_longpress_timer(void *data) sd->mouse.move_count = 0; sd->mouse.longpress_timer = NULL; + return ECORE_CALLBACK_CANCEL; } static Eina_Bool -_view_smart_mouse_down(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Down *event) +_view_smart_mouse_down(Ewk_View_Smart_Data *esd, + const Evas_Event_Mouse_Down *event) { // TODO: mimic elm_scroller and like // TODO-minor: offer hook? View_Smart_Data *sd = (View_Smart_Data *)esd; if (event->button != 1) - return _parent_sc.mouse_down(esd, event); + return _ewk_view_parent_sc.mouse_down(esd, event); sd->mouse.pan_anim = ecore_animator_add(_view_pan_animator, sd); - sd->mouse.longpress_timer = ecore_timer_add(_elm_config->longpress_timeout, _view_longpress_timer, sd); + sd->mouse.longpress_timer = ecore_timer_add + (_elm_config->longpress_timeout, _view_longpress_timer, sd); sd->mouse.move_count = 1; sd->mouse.x = event->canvas.x; sd->mouse.y = event->canvas.y; @@ -331,7 +390,8 @@ _view_smart_mouse_down(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Down *ev } static Eina_Bool -_view_smart_mouse_up(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Up *event) +_view_smart_mouse_up(Ewk_View_Smart_Data *esd, + const Evas_Event_Mouse_Up *event) { // TODO: mimic elm_scroller and like // TODO-minor: offer hook? @@ -343,7 +403,7 @@ _view_smart_mouse_up(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Up *event) sd->mouse.pan_anim = NULL; if (sd->mouse.longpress_timer) - _parent_sc.mouse_down(esd, &sd->mouse.event); + _ewk_view_parent_sc.mouse_down(esd, &sd->mouse.event); else return EINA_TRUE; } @@ -355,15 +415,17 @@ _view_smart_mouse_up(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Up *event) } sd->mouse.move_count = 0; - return _parent_sc.mouse_up(esd, event); + return _ewk_view_parent_sc.mouse_up(esd, event); } static Eina_Bool -_view_smart_mouse_move(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Move *event) +_view_smart_mouse_move(Ewk_View_Smart_Data *esd, + const Evas_Event_Mouse_Move *event) { // TODO: mimic elm_scroller and like // TODO-minor: offer hook? View_Smart_Data *sd = (View_Smart_Data *)esd; + sd->mouse.move_count++; if (sd->mouse.longpress_timer && @@ -379,19 +441,24 @@ _view_smart_mouse_move(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Move *ev return EINA_FALSE; } - return _parent_sc.mouse_move(esd, event); + return _ewk_view_parent_sc.mouse_move(esd, event); } static Evas_Object * -_view_smart_window_create(Ewk_View_Smart_Data *sd, Eina_Bool javascript, const Ewk_Window_Features *window_features) +_view_smart_window_create(Ewk_View_Smart_Data *vsd, + Eina_Bool javascript, + const Ewk_Window_Features *window_features) { Evas_Object *new; - Evas_Object *obj = evas_object_smart_parent_get(sd->self); - Widget_Data *wd = elm_widget_data_get(obj); + Evas_Object *obj = evas_object_smart_parent_get(vsd->self); - if (!wd->hook.window_create) return NULL; - new = wd->hook.window_create(wd->hook.window_create_data, obj, javascript, - (const Elm_Web_Window_Features *)window_features); + ELM_WEB_DATA_GET_OR_RETURN_VAL(obj, sd, NULL); + + if (!sd->hook.window_create) return NULL; + + new = sd->hook.window_create + (sd->hook.window_create_data, obj, javascript, + (const Elm_Web_Window_Features *)window_features); if (new) return elm_web_webkit_view_get(new); return NULL; @@ -401,31 +468,40 @@ static void _view_smart_window_close(Ewk_View_Smart_Data *sd) { Evas_Object *obj = evas_object_smart_parent_get(sd->self); + + ELM_WEB_CHECK(obj); + evas_object_smart_callback_call(obj, "windows,close,request", NULL); } static void -_bt_close(void *data, Evas_Object *obj, void *event_info __UNUSED__) +_bt_close(void *data, + Evas_Object *obj, + void *event_info __UNUSED__) { Dialog_Data *d = data; *d->response = (obj == d->bt_ok); if ((d->type == DIALOG_PROMPT) && (*d->response == EINA_TRUE)) *d->entry_value = strdup(elm_entry_entry_get(d->entry)); + evas_object_del(d->dialog); } static void -_file_sel_done(void *data, Evas_Object *obj __UNUSED__, void *event_info) +_file_sel_done(void *data, + Evas_Object *obj __UNUSED__, + void *event_info) { Dialog_Data *d = data; + if (event_info) { *d->selected_files = eina_list_append(NULL, strdup(event_info)); *d->response = EINA_TRUE; } - else - *d->response = EINA_FALSE; + else *d->response = EINA_FALSE; + evas_object_del(d->dialog); free(d); } @@ -434,42 +510,44 @@ static Dialog_Data * _dialog_new(Evas_Object *parent) { Dialog_Data *d; - Widget_Data *wd = elm_widget_data_get(parent); + + ELM_WEB_DATA_GET(parent, sd); d = calloc(1, sizeof(Dialog_Data)); if (!d) return NULL; - if (!parent || !wd->inwin_mode) + if (!parent || !sd->inwin_mode) { Evas_Object *bg; d->dialog = elm_win_add(NULL, "elm-web-popup", ELM_WIN_DIALOG_BASIC); - evas_object_smart_callback_add(d->dialog, "delete,request", - _bt_close, d); + evas_object_smart_callback_add + (d->dialog, "delete,request", _bt_close, d); bg = elm_bg_add(d->dialog); - evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set + (bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(d->dialog, bg); evas_object_show(bg); d->box = elm_box_add(d->dialog); - evas_object_size_hint_weight_set(d->box, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set + (d->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(d->dialog, d->box); evas_object_show(d->box); } else { Evas_Object *win = elm_widget_top_get(parent); + d->dialog = elm_win_inwin_add(win); elm_object_style_set(d->dialog, "minimal"); - evas_object_size_hint_weight_set(d->dialog, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set + (d->dialog, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); d->box = elm_box_add(win); - evas_object_size_hint_weight_set(d->box, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set + (d->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_inwin_content_set(d->dialog, d->box); evas_object_show(d->box); } @@ -478,13 +556,30 @@ _dialog_new(Evas_Object *parent) } static Evas_Object * -_run_dialog(Evas_Object *parent, enum Dialog_Type type, const char *message, const char *default_entry_value, char **entry_value, Eina_Bool allows_multiple_files __UNUSED__, Eina_List *accept_types __UNUSED__, Eina_List **selected_filenames, Eina_Bool *response) +_run_dialog(Evas_Object *parent, + enum Dialog_Type type, + const char *message, + const char *default_entry_value, + char **entry_value, + Eina_Bool allows_multiple_files __UNUSED__, + Eina_List *accept_types __UNUSED__, + Eina_List **selected_filenames, + Eina_Bool *response) { - EINA_SAFETY_ON_TRUE_RETURN_VAL((type != DIALOG_PROMPT) && (!!default_entry_value), EINA_FALSE); - EINA_SAFETY_ON_TRUE_RETURN_VAL((type != DIALOG_PROMPT) && (!!entry_value), EINA_FALSE); - - Dialog_Data *dialog_data = _dialog_new(evas_object_smart_parent_get(parent)); Evas_Object *lb; + Evas_Object *obj; + Dialog_Data *dialog_data; + + EINA_SAFETY_ON_TRUE_RETURN_VAL + ((type != DIALOG_PROMPT) && (!!default_entry_value), EINA_FALSE); + EINA_SAFETY_ON_TRUE_RETURN_VAL + ((type != DIALOG_PROMPT) && (!!entry_value), EINA_FALSE); + + obj = evas_object_smart_parent_get(parent); + + ELM_WEB_DATA_GET_OR_RETURN_VAL(obj, sd, NULL); + + dialog_data = _dialog_new(obj); if (type != DIALOG_FILE_SELECTOR) { @@ -504,8 +599,10 @@ _run_dialog(Evas_Object *parent, enum Dialog_Type type, const char *message, con dialog_data->bt_ok = elm_button_add(dialog_data->box); elm_object_text_set(dialog_data->bt_ok, "Close"); elm_box_pack_end(dialog_data->box, dialog_data->bt_ok); - evas_object_size_hint_align_set(dialog_data->bt_ok, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_smart_callback_add(dialog_data->bt_ok, "clicked", _bt_close, dialog_data); + evas_object_size_hint_align_set + (dialog_data->bt_ok, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add + (dialog_data->bt_ok, "clicked", _bt_close, dialog_data); evas_object_show(dialog_data->bt_ok); } else if (type == DIALOG_FILE_SELECTOR) @@ -537,8 +634,10 @@ _run_dialog(Evas_Object *parent, enum Dialog_Type type, const char *message, con elm_entry_single_line_set(dialog_data->entry, EINA_TRUE); elm_entry_scrollable_set(dialog_data->entry, EINA_TRUE); elm_entry_entry_set(dialog_data->entry, default_entry_value); - evas_object_size_hint_align_set(dialog_data->entry, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_weight_set(dialog_data->entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set + (dialog_data->entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set + (dialog_data->entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_box_pack_end(dialog_data->box, dialog_data->entry); evas_object_show(dialog_data->entry); } @@ -548,28 +647,35 @@ _run_dialog(Evas_Object *parent, enum Dialog_Type type, const char *message, con Evas_Object *bx_h = elm_box_add(dialog_data->box); elm_box_horizontal_set(bx_h, 1); elm_box_pack_end(dialog_data->box, bx_h); - evas_object_size_hint_weight_set(bx_h, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bx_h, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set + (bx_h, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set + (bx_h, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(bx_h); dialog_data->bt_cancel = elm_button_add(bx_h); elm_object_text_set(dialog_data->bt_cancel, "Cancel"); elm_box_pack_end(bx_h, dialog_data->bt_cancel); - evas_object_size_hint_weight_set(dialog_data->bt_cancel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(dialog_data->bt_cancel, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_smart_callback_add(dialog_data->bt_cancel, "clicked", _bt_close, dialog_data); + evas_object_size_hint_weight_set + (dialog_data->bt_cancel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set + (dialog_data->bt_cancel, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add + (dialog_data->bt_cancel, "clicked", _bt_close, dialog_data); evas_object_show(dialog_data->bt_cancel); dialog_data->bt_ok = elm_button_add(bx_h); elm_object_text_set(dialog_data->bt_ok, "Ok"); elm_box_pack_end(bx_h, dialog_data->bt_ok); - evas_object_size_hint_weight_set(dialog_data->bt_ok, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(dialog_data->bt_ok, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_smart_callback_add(dialog_data->bt_ok, "clicked", _bt_close, dialog_data); + evas_object_size_hint_weight_set + (dialog_data->bt_ok, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set + (dialog_data->bt_ok, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add + (dialog_data->bt_ok, "clicked", _bt_close, dialog_data); evas_object_show(dialog_data->bt_ok); } - else - return EINA_FALSE; + else return EINA_FALSE; } evas_object_show(dialog_data->dialog); @@ -578,7 +684,10 @@ _run_dialog(Evas_Object *parent, enum Dialog_Type type, const char *message, con } static void -_dialog_del_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +_dialog_del_cb(void *data __UNUSED__, + Evas *e __UNUSED__, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) { ecore_main_loop_quit(); } @@ -586,92 +695,108 @@ _dialog_del_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNU static void _exec_dialog(Evas_Object *dialog) { - evas_object_event_callback_add(dialog, EVAS_CALLBACK_DEL, _dialog_del_cb, - NULL); + evas_object_event_callback_add + (dialog, EVAS_CALLBACK_DEL, _dialog_del_cb, NULL); ecore_main_loop_begin(); } -/* called by ewk_view when javascript called alert() - * +/* + * called by ewk_view when javascript called alert() */ static void -_view_smart_run_javascript_alert(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, const char *message) +_view_smart_run_javascript_alert(Ewk_View_Smart_Data *esd, + Evas_Object *frame __UNUSED__, + const char *message) { - View_Smart_Data *sd = (View_Smart_Data *)esd; - Evas_Object *view = sd->base.self; + View_Smart_Data *vsd = (View_Smart_Data *)esd; + Evas_Object *view = vsd->base.self; Evas_Object *obj = evas_object_smart_parent_get(view); Evas_Object *diag = NULL; - Widget_Data *wd = elm_widget_data_get(obj); Eina_Bool response = EINA_FALSE; - if (wd->hook.alert) - diag = wd->hook.alert(wd->hook.alert_data, obj, message); + ELM_WEB_DATA_GET_OR_RETURN(obj, sd); + + if (sd->hook.alert) + diag = sd->hook.alert(sd->hook.alert_data, obj, message); else diag = _run_dialog(view, DIALOG_ALERT, message, NULL, NULL, EINA_FALSE, NULL, NULL, &response); if (diag) _exec_dialog(diag); } -/* called by ewk_view when javascript called confirm() - * +/* + * called by ewk_view when javascript called confirm() */ static Eina_Bool -_view_smart_run_javascript_confirm(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, const char *message) +_view_smart_run_javascript_confirm(Ewk_View_Smart_Data *esd, + Evas_Object *frame __UNUSED__, + const char *message) { - View_Smart_Data *sd = (View_Smart_Data *)esd; - Evas_Object *view = sd->base.self; + View_Smart_Data *vsd = (View_Smart_Data *)esd; + Evas_Object *view = vsd->base.self; Evas_Object *obj = evas_object_smart_parent_get(view); Evas_Object *diag = NULL; - Widget_Data *wd = elm_widget_data_get(obj); Eina_Bool response = EINA_FALSE; - if (wd->hook.confirm) - diag = wd->hook.confirm(wd->hook.confirm_data, obj, message, &response); + ELM_WEB_DATA_GET_OR_RETURN_VAL(obj, sd, EINA_FALSE); + + if (sd->hook.confirm) + diag = sd->hook.confirm(sd->hook.confirm_data, obj, message, &response); else - diag = _run_dialog(view, DIALOG_CONFIRM, message, NULL, NULL, EINA_FALSE, - NULL, NULL, &response); + diag = _run_dialog(view, DIALOG_CONFIRM, message, NULL, NULL, EINA_FALSE, + NULL, NULL, &response); if (diag) _exec_dialog(diag); return response; } -/* called by ewk_view when javascript called confirm() - * +/* + * called by ewk_view when javascript called confirm() */ static Eina_Bool -_view_smart_run_javascript_prompt(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, const char *message, const char *default_value, char **value) +_view_smart_run_javascript_prompt(Ewk_View_Smart_Data *esd, + Evas_Object *frame __UNUSED__, + const char *message, + const char *default_value, + char **value) { - View_Smart_Data *sd = (View_Smart_Data *)esd; - Evas_Object *view = sd->base.self; + View_Smart_Data *vsd = (View_Smart_Data *)esd; + Evas_Object *view = vsd->base.self; Evas_Object *obj = evas_object_smart_parent_get(view); Evas_Object *diag = NULL; - Widget_Data *wd = elm_widget_data_get(obj); Eina_Bool response = EINA_FALSE; - if (wd->hook.prompt) - diag = wd->hook.prompt(wd->hook.prompt_data, obj, message, default_value, + ELM_WEB_DATA_GET_OR_RETURN_VAL(obj, sd, EINA_FALSE); + + if (sd->hook.prompt) + diag = sd->hook.prompt(sd->hook.prompt_data, obj, message, default_value, value, &response); else diag = _run_dialog(view, DIALOG_PROMPT, message, default_value, value, EINA_FALSE, NULL, NULL, &response); if (diag) _exec_dialog(diag); if (!response) - *value = NULL; + *value = NULL; return EINA_TRUE; } static Eina_Bool -_view_smart_run_open_panel(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, Eina_Bool allows_multiple_files, Eina_List *accept_types, Eina_List **selected_filenames) +_view_smart_run_open_panel(Ewk_View_Smart_Data *esd, + Evas_Object *frame __UNUSED__, + Eina_Bool allows_multiple_files, + Eina_List *accept_types, + Eina_List **selected_filenames) { - View_Smart_Data *sd = (View_Smart_Data *)esd; - Evas_Object *view = sd->base.self; + View_Smart_Data *vsd = (View_Smart_Data *)esd; + Evas_Object *view = vsd->base.self; Evas_Object *obj = evas_object_smart_parent_get(view); Evas_Object *diag = NULL; - Widget_Data *wd = elm_widget_data_get(obj); Eina_Bool response = EINA_FALSE; - if (wd->hook.file_selector) - diag = wd->hook.file_selector(wd->hook.file_selector_data, obj, + ELM_WEB_DATA_GET_OR_RETURN_VAL(obj, sd, EINA_FALSE); + + if (sd->hook.file_selector) + diag = sd->hook.file_selector(sd->hook.file_selector_data, obj, allows_multiple_files, accept_types, selected_filenames, &response); else @@ -684,32 +809,42 @@ _view_smart_run_open_panel(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED } static void -_view_smart_add_console_message(Ewk_View_Smart_Data *esd, const char *message, unsigned int line_number, const char *source_id) +_view_smart_add_console_message(Ewk_View_Smart_Data *esd, + const char *message, + unsigned int line_number, + const char *source_id) { Evas_Object *obj = evas_object_smart_parent_get(esd->self); - Widget_Data *wd = elm_widget_data_get(obj); - if (wd->hook.console_message) - wd->hook.console_message(wd->hook.console_message_data, obj, message, + ELM_WEB_DATA_GET_OR_RETURN(obj, sd); + + if (sd->hook.console_message) + sd->hook.console_message(sd->hook.console_message_data, obj, message, line_number, source_id); } static Eina_Bool -_view_smart_focus_can_cycle(Ewk_View_Smart_Data *sd, Ewk_Focus_Direction direction) +_view_smart_focus_can_cycle(Ewk_View_Smart_Data *sd, + Ewk_Focus_Direction direction) { Evas_Object *obj = evas_object_smart_parent_get(sd->self); + + ELM_WEB_CHECK(obj) EINA_FALSE; + Elm_Focus_Direction dir; switch (direction) { case EWK_FOCUS_DIRECTION_FORWARD: - dir = ELM_FOCUS_NEXT; - break; + dir = ELM_FOCUS_NEXT; + break; + case EWK_FOCUS_DIRECTION_BACKWARD: - dir = ELM_FOCUS_PREVIOUS; - break; + dir = ELM_FOCUS_PREVIOUS; + break; + default: - return EINA_FALSE; + return EINA_FALSE; } elm_widget_focus_cycle(elm_widget_parent_get(obj), dir); @@ -727,13 +862,14 @@ _view_smart_focus_can_cycle(Ewk_View_Smart_Data *sd, Ewk_Focus_Direction directi Evas_Object * _view_add(Evas_Object *parent) { - static Evas_Smart *smart = NULL; Evas *canvas = evas_object_evas_get(parent); + static Evas_Smart *smart = NULL; Evas_Object *view; if (!smart) { - static Ewk_View_Smart_Class api = EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("EWK_View_Elementary"); + static Ewk_View_Smart_Class api = + EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("EWK_View_Elementary"); #ifndef TILED_BACKING_STORE ewk_view_single_smart_set(&api); @@ -741,7 +877,7 @@ _view_add(Evas_Object *parent) ewk_view_tiled_smart_set(&api); #endif - _parent_sc = api; + _ewk_view_parent_sc = api; // TODO: check every api method and provide overrides with hooks! // TODO: hooks should provide extension points @@ -783,83 +919,98 @@ _view_add(Evas_Object *parent) } static void -_ewk_view_inputmethod_change_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info) +_ewk_view_inputmethod_change_cb(void *data, + Evas_Object *obj __UNUSED__, + void *event_info) { - Widget_Data *wd = data; - Evas_Object *top = elm_widget_top_get(wd->self); + Elm_Web_Smart_Data *sd = data; + Evas_Object *top = elm_widget_top_get(ELM_WIDGET_DATA(sd)->obj); if (!top) return; if (event_info) - wd->input_method = ELM_WIN_KEYBOARD_ON; + sd->input_method = ELM_WIN_KEYBOARD_ON; else - wd->input_method = ELM_WIN_KEYBOARD_OFF; - elm_win_keyboard_mode_set(top, wd->input_method); + sd->input_method = ELM_WIN_KEYBOARD_OFF; + elm_win_keyboard_mode_set(top, sd->input_method); } static void -_ewk_view_load_started_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +_ewk_view_load_started_cb(void *data, + Evas_Object *obj, + void *event_info __UNUSED__) { _ewk_view_inputmethod_change_cb(data, obj, (void *)(long)EINA_FALSE); } static void -_ewk_view_load_finished_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info) +_ewk_view_load_finished_cb(void *data, + Evas_Object *obj __UNUSED__, + void *event_info) { - Widget_Data *wd = data; + Elm_Web_Smart_Data *sd = data; - if (event_info) - return; + if (event_info) return; - if (wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL) + if (sd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL) { - float tz = wd->zoom.current; - wd->zoom.current = 0.0; - elm_web_zoom_set(wd->self, tz); + float tz = sd->zoom.current; + sd->zoom.current = 0.0; + elm_web_zoom_set(ELM_WIDGET_DATA(sd)->obj, tz); } } static void -_ewk_view_viewport_changed_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +_ewk_view_viewport_changed_cb(void *data, + Evas_Object *obj, + void *event_info __UNUSED__) { - Widget_Data *wd = data; + Elm_Web_Smart_Data *sd = data; - if (wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL) + if (sd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL) { ewk_view_zoom_set(obj, 1.0, 0, 0); - wd->zoom.no_anim = EINA_TRUE; + sd->zoom.no_anim = EINA_TRUE; } } static Eina_Bool _restore_zoom_mode_timer_cb(void *data) { - Widget_Data *wd = data; - float tz = wd->zoom.current; - wd->zoom.timer = NULL; - wd->zoom.current = 0.0; - wd->zoom.no_anim = EINA_TRUE; - elm_web_zoom_set(wd->self, tz); + Elm_Web_Smart_Data *sd = data; + float tz = sd->zoom.current; + + sd->zoom.timer = NULL; + sd->zoom.current = 0.0; + sd->zoom.no_anim = EINA_TRUE; + elm_web_zoom_set(ELM_WIDGET_DATA(sd)->obj, tz); + return EINA_FALSE; } static Eina_Bool _reset_zoom_timer_cb(void *data) { - Widget_Data *wd = data; - wd->zoom.timer = ecore_timer_add(0.0, _restore_zoom_mode_timer_cb, wd); - ewk_view_zoom_set(wd->ewk_view, 1.0, 0, 0); + Elm_Web_Smart_Data *sd = data; + + sd->zoom.timer = ecore_timer_add(0.0, _restore_zoom_mode_timer_cb, sd); + ewk_view_zoom_set(ELM_WIDGET_DATA(sd)->resize_obj, 1.0, 0, 0); + return EINA_FALSE; } static void -_ewk_view_resized_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +_ewk_view_resized_cb(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) { - Widget_Data *wd = data; - if (!(wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL)) + Elm_Web_Smart_Data *sd = data; + + if (!(sd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL)) return; - if (wd->zoom.timer) - ecore_timer_del(wd->zoom.timer); - wd->zoom.timer = ecore_timer_add(0.5, _reset_zoom_timer_cb, wd); + + if (sd->zoom.timer) + ecore_timer_del(sd->zoom.timer); + sd->zoom.timer = ecore_timer_add(0.5, _reset_zoom_timer_cb, sd); } static void @@ -869,48 +1020,56 @@ _popup_del_job(void *data) } static void -_popup_will_delete(void *data, Evas_Object *obj, void *event_info __UNUSED__) +_popup_will_delete(void *data, + Evas_Object *obj, + void *event_info __UNUSED__) { ecore_job_add(_popup_del_job, data); evas_object_smart_callback_del(obj, "popup,willdelete", _popup_will_delete); } static void -_popup_item_selected(void *data, Evas_Object *obj, void *event_info __UNUSED__) +_popup_item_selected(void *data, + Evas_Object *obj, + void *event_info __UNUSED__) { - Evas_Object *view = data; Elm_Object_Item *list_it = elm_list_selected_item_get(obj); const Eina_List *itr, *list = elm_list_items_get(obj); - void *d; + Evas_Object *view = data; int i = 0; + void *d; - EINA_LIST_FOREACH(list, itr, d) - { - if (d == list_it) - break; + EINA_LIST_FOREACH (list, itr, d) + { + if (d == list_it) + break; - i++; - } + i++; + } ewk_view_popup_selected_set(view, i); ewk_view_popup_destroy(view); } static void -_popup_dismiss_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +_popup_dismiss_cb(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) { ewk_view_popup_destroy(data); } static void -_ewk_view_popup_create_cb(void *data, Evas_Object *obj, void *event_info) +_ewk_view_popup_create_cb(void *data, + Evas_Object *obj, + void *event_info) { - Widget_Data *wd = data; - Ewk_Menu *m = event_info; - Elm_Web_Menu m2; - Ewk_Menu_Item *it; - Eina_List *itr; + Elm_Web_Smart_Data *sd = data; Evas_Object *notify, *list; + Ewk_Menu *m = event_info; + Ewk_Menu_Item *it; + Elm_Web_Menu m2; + Eina_List *itr; m2.items = m->items; m2.x = m->x; @@ -918,9 +1077,9 @@ _ewk_view_popup_create_cb(void *data, Evas_Object *obj, void *event_info) m2.width = m->width; m2.height = m->height; m2.handled = EINA_FALSE; - evas_object_smart_callback_call(wd->self, "popup,create", &m2); - if (m2.handled) - return; + evas_object_smart_callback_call + (ELM_WIDGET_DATA(sd)->obj, "popup,create", &m2); + if (m2.handled) return; notify = elm_notify_add(obj); elm_notify_allow_events_set(notify, EINA_FALSE); @@ -935,27 +1094,32 @@ _ewk_view_popup_create_cb(void *data, Evas_Object *obj, void *event_info) elm_object_content_set(notify, list); evas_object_show(list); - EINA_LIST_FOREACH(m->items, itr, it) - elm_list_item_append(list, it->text, NULL, NULL, _popup_item_selected, - obj); + EINA_LIST_FOREACH (m->items, itr, it) + elm_list_item_append(list, it->text, NULL, NULL, _popup_item_selected, + obj); elm_list_go(list); evas_object_show(notify); - evas_object_smart_callback_add(obj, "popup,willdelete", _popup_will_delete, - notify); - evas_object_smart_callback_add(notify, "block,clicked", _popup_dismiss_cb, - obj); + evas_object_smart_callback_add + (obj, "popup,willdelete", _popup_will_delete, notify); + evas_object_smart_callback_add + (notify, "block,clicked", _popup_dismiss_cb, obj); } static void -_view_smart_callback_proxy_free_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +_view_smart_callback_proxy_free_cb(void *data, + Evas *e __UNUSED__, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) { free(data); } static void -_view_smart_callback_proxy_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info) +_view_smart_callback_proxy_cb(void *data, + Evas_Object *obj __UNUSED__, + void *event_info) { Elm_Web_Callback_Proxy_Context *ctxt = data; @@ -963,20 +1127,23 @@ _view_smart_callback_proxy_cb(void *data, Evas_Object *obj __UNUSED__, void *eve } static void -_view_smart_callback_proxy(Evas_Object *view, Evas_Object *parent) +_view_smart_callback_proxy(Evas_Object *view, + Evas_Object *parent) { const Evas_Smart_Cb_Description **cls_descs, **inst_descs; unsigned int cls_count, inst_count, total; Elm_Web_Callback_Proxy_Context *ctxt; - evas_object_smart_callbacks_descriptions_get(view, &cls_descs, &cls_count, - &inst_descs, &inst_count); + evas_object_smart_callbacks_descriptions_get + (view, &cls_descs, &cls_count, &inst_descs, &inst_count); total = cls_count + inst_count; if (!total) return; + ctxt = malloc(sizeof(Elm_Web_Callback_Proxy_Context) * total); if (!ctxt) return; - evas_object_event_callback_add(view, EVAS_CALLBACK_FREE, - _view_smart_callback_proxy_free_cb, ctxt); + + evas_object_event_callback_add + (view, EVAS_CALLBACK_FREE, _view_smart_callback_proxy_free_cb, ctxt); for (; cls_count > 0; cls_count--, cls_descs++, ctxt++) { @@ -985,8 +1152,8 @@ _view_smart_callback_proxy(Evas_Object *view, Evas_Object *parent) continue; ctxt->name = d->name; ctxt->obj = parent; - evas_object_smart_callback_add(view, d->name, - _view_smart_callback_proxy_cb, ctxt); + evas_object_smart_callback_add + (view, d->name, _view_smart_callback_proxy_cb, ctxt); } for (; inst_count > 0; inst_count--, inst_descs++, ctxt++) @@ -994,34 +1161,37 @@ _view_smart_callback_proxy(Evas_Object *view, Evas_Object *parent) const Evas_Smart_Cb_Description *d = *inst_descs; ctxt->name = d->name; ctxt->obj = parent; - evas_object_smart_callback_add(view, d->name, - _view_smart_callback_proxy_cb, ctxt); + evas_object_smart_callback_add + (view, d->name, _view_smart_callback_proxy_cb, ctxt); } } static Eina_Bool -_bring_in_anim_cb(void *data, double pos) +_bring_in_anim_cb(void *data, + double pos) { - Widget_Data *wd = data; - Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view); + Elm_Web_Smart_Data *sd = data; + Evas_Object *frame = + ewk_view_frame_main_get(ELM_WIDGET_DATA(sd)->resize_obj); int sx, sy, rx, ry; - sx = wd->bring_in.start.x; - sy = wd->bring_in.start.y; - rx = (wd->bring_in.end.x - sx) * pos; - ry = (wd->bring_in.end.y - sy) * pos; + sx = sd->bring_in.start.x; + sy = sd->bring_in.start.y; + rx = (sd->bring_in.end.x - sx) * pos; + ry = (sd->bring_in.end.y - sy) * pos; ewk_frame_scroll_set(frame, rx + sx, ry + sy); if (pos == 1.0) { - wd->bring_in.end.x = wd->bring_in.end.y = wd->bring_in.start.x = - wd->bring_in.start.y = 0; - wd->bring_in.animator = NULL; + sd->bring_in.end.x = sd->bring_in.end.y = sd->bring_in.start.x = + sd->bring_in.start.y = 0; + sd->bring_in.animator = NULL; } return EINA_TRUE; } + #endif #ifdef HAVE_ELEMENTARY_WEB @@ -1051,73 +1221,107 @@ elm_need_web(void) #endif } +static void +_elm_web_smart_add(Evas_Object *obj) +{ + EVAS_SMART_DATA_ALLOC(obj, Elm_Web_Smart_Data); + +#ifdef HAVE_ELEMENTARY_WEB + ELM_WIDGET_DATA(priv)->resize_obj = _view_add(obj); +#else + ELM_WIDGET_DATA(priv)->resize_obj = elm_label_add(obj); + elm_object_text_set + (ELM_WIDGET_DATA(priv)->resize_obj, "WebKit not supported!"); + evas_object_show(ELM_WIDGET_DATA(priv)->resize_obj); +#endif + + _elm_web_parent_sc->base.add(obj); + +#ifdef HAVE_ELEMENTARY_WEB + ewk_view_setting_user_agent_set + (ELM_WIDGET_DATA(priv)->resize_obj, ELM_WEB_USER_AGENT); + + priv->input_method = ELM_WIN_KEYBOARD_OFF; + evas_object_smart_callback_add + (ELM_WIDGET_DATA(priv)->resize_obj, "inputmethod,changed", + _ewk_view_inputmethod_change_cb, priv); + evas_object_smart_callback_add + (ELM_WIDGET_DATA(priv)->resize_obj, "load,started", + _ewk_view_load_started_cb, priv); + evas_object_smart_callback_add + (ELM_WIDGET_DATA(priv)->resize_obj, "popup,create", + _ewk_view_popup_create_cb, priv); + evas_object_smart_callback_add + (ELM_WIDGET_DATA(priv)->resize_obj, "load,finished", + _ewk_view_load_finished_cb, priv); + evas_object_smart_callback_add + (ELM_WIDGET_DATA(priv)->resize_obj, "viewport,changed", + _ewk_view_viewport_changed_cb, priv); + evas_object_smart_callback_add + (ELM_WIDGET_DATA(priv)->resize_obj, "view,resized", + _ewk_view_resized_cb, priv); + + priv->tab_propagate = EINA_FALSE; + priv->inwin_mode = _elm_config->inwin_dialogs_enable; + priv->zoom.min = + ewk_view_zoom_range_min_get(ELM_WIDGET_DATA(priv)->resize_obj); + priv->zoom.max = + ewk_view_zoom_range_max_get(ELM_WIDGET_DATA(priv)->resize_obj); + priv->zoom.current = 1.0; + + _view_smart_callback_proxy(ELM_WIDGET_DATA(priv)->resize_obj, obj); + _elm_web_smart_theme(obj); + + elm_widget_can_focus_set(obj, EINA_TRUE); +#endif +} + +static void +_elm_web_smart_del(Evas_Object *obj) +{ + ELM_WEB_DATA_GET(obj, sd); + + if (sd->zoom.timer) + { + ecore_timer_del(sd->zoom.timer); + sd->zoom.timer = NULL; + } + + if (sd->bring_in.animator) + { + ecore_animator_del(sd->bring_in.animator); + sd->bring_in.animator = NULL; + } + + _elm_web_parent_sc->base.del(obj); /* handles freeing sd */ +} + +static void +_elm_web_smart_set_user(Elm_Widget_Smart_Class *sc) +{ + sc->base.add = _elm_web_smart_add; + sc->base.del = _elm_web_smart_del; + + sc->on_focus = _elm_web_smart_on_focus; + sc->theme = _elm_web_smart_theme; + sc->event = _elm_web_smart_event; +} + EAPI Evas_Object * elm_web_add(Evas_Object *parent) { - Evas_Object *obj; - Widget_Data *wd; Evas *e; + Evas_Object *obj; EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL); - wd = calloc(1, sizeof(Widget_Data)); e = evas_object_evas_get(parent); - if (!e) - return NULL; - obj = elm_widget_add(e); - wd->self = obj; + if (!e) return NULL; - if (!widtype) - { - widtype = eina_stringshare_add("web"); - elm_widget_type_register(&widtype); - } + obj = evas_object_smart_add(e, _elm_web_smart_class_new()); - elm_widget_type_set(obj, widtype); - elm_widget_sub_object_add(parent, obj); - elm_widget_theme_hook_set(obj, _theme_hook); - elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL); - elm_widget_event_hook_set(obj, _event_hook); - elm_widget_data_set(obj, wd); - elm_widget_can_focus_set(obj, EINA_TRUE); - -#ifdef HAVE_ELEMENTARY_WEB - wd->ewk_view = _view_add(obj); - ewk_view_setting_user_agent_set(wd->ewk_view, ELM_WEB_USER_AGENT); - - wd->input_method = ELM_WIN_KEYBOARD_OFF; - evas_object_smart_callback_add(wd->ewk_view, "inputmethod,changed", - _ewk_view_inputmethod_change_cb, wd); - evas_object_smart_callback_add(wd->ewk_view, "load,started", - _ewk_view_load_started_cb, wd); - evas_object_smart_callback_add(wd->ewk_view, "popup,create", - _ewk_view_popup_create_cb, wd); - evas_object_smart_callback_add(wd->ewk_view, "load,finished", - _ewk_view_load_finished_cb, wd); - evas_object_smart_callback_add(wd->ewk_view, "viewport,changed", - _ewk_view_viewport_changed_cb, wd); - evas_object_smart_callback_add(wd->ewk_view, "view,resized", - _ewk_view_resized_cb, wd); - - elm_widget_resize_object_set(obj, wd->ewk_view); - - wd->tab_propagate = EINA_FALSE; - wd->inwin_mode = _elm_config->inwin_dialogs_enable; - wd->zoom.min = ewk_view_zoom_range_min_get(wd->ewk_view); - wd->zoom.max = ewk_view_zoom_range_max_get(wd->ewk_view); - wd->zoom.current = 1.0; - - _view_smart_callback_proxy(wd->ewk_view, wd->self); - evas_object_smart_callbacks_descriptions_set(obj, _elm_web_callback_names); - - _theme_hook(obj); - -#else - wd->label = elm_label_add(obj); - elm_object_text_set(wd->label, "WebKit not supported!"); - evas_object_show(wd->label); - elm_widget_resize_object_set(obj, wd->label); -#endif + if (!elm_widget_sub_object_add(parent, obj)) + ERR("could not add %p as sub object of %p", obj, parent); return obj; } @@ -1125,11 +1329,12 @@ elm_web_add(Evas_Object *parent) EAPI Evas_Object * elm_web_webkit_view_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) NULL; + ELM_WEB_CHECK(obj) NULL; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return NULL; - return wd->ewk_view; + ELM_WEB_DATA_GET(obj, sd); + + return ELM_WIDGET_DATA(sd)->resize_obj; #else ERR("Elementary not compiled with EWebKit support."); return NULL; @@ -1137,14 +1342,17 @@ elm_web_webkit_view_get(const Evas_Object *obj) } EAPI void -elm_web_window_create_hook_set(Evas_Object *obj, Elm_Web_Window_Open func, void *data) +elm_web_window_create_hook_set(Evas_Object *obj, + Elm_Web_Window_Open func, + void *data) { - ELM_CHECK_WIDTYPE(obj, widtype); + ELM_WEB_CHECK(obj); + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - wd->hook.window_create = func; - wd->hook.window_create_data = data; + ELM_WEB_DATA_GET(obj, sd); + + sd->hook.window_create = func; + sd->hook.window_create_data = data; #else (void)func; (void)data; @@ -1152,14 +1360,17 @@ elm_web_window_create_hook_set(Evas_Object *obj, Elm_Web_Window_Open func, void } EAPI void -elm_web_dialog_alert_hook_set(Evas_Object *obj, Elm_Web_Dialog_Alert func, void *data) +elm_web_dialog_alert_hook_set(Evas_Object *obj, + Elm_Web_Dialog_Alert func, + void *data) { - ELM_CHECK_WIDTYPE(obj, widtype); + ELM_WEB_CHECK(obj); + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - wd->hook.alert = func; - wd->hook.alert_data = data; + ELM_WEB_DATA_GET(obj, sd); + + sd->hook.alert = func; + sd->hook.alert_data = data; #else (void)func; (void)data; @@ -1167,14 +1378,17 @@ elm_web_dialog_alert_hook_set(Evas_Object *obj, Elm_Web_Dialog_Alert func, void } EAPI void -elm_web_dialog_confirm_hook_set(Evas_Object *obj, Elm_Web_Dialog_Confirm func, void *data) +elm_web_dialog_confirm_hook_set(Evas_Object *obj, + Elm_Web_Dialog_Confirm func, + void *data) { - ELM_CHECK_WIDTYPE(obj, widtype); + ELM_WEB_CHECK(obj); + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - wd->hook.confirm = func; - wd->hook.confirm_data = data; + ELM_WEB_DATA_GET(obj, sd); + + sd->hook.confirm = func; + sd->hook.confirm_data = data; #else (void)func; (void)data; @@ -1182,14 +1396,17 @@ elm_web_dialog_confirm_hook_set(Evas_Object *obj, Elm_Web_Dialog_Confirm func, v } EAPI void -elm_web_dialog_prompt_hook_set(Evas_Object *obj, Elm_Web_Dialog_Prompt func, void *data) +elm_web_dialog_prompt_hook_set(Evas_Object *obj, + Elm_Web_Dialog_Prompt func, + void *data) { - ELM_CHECK_WIDTYPE(obj, widtype); + ELM_WEB_CHECK(obj); + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - wd->hook.prompt = func; - wd->hook.prompt_data = data; + ELM_WEB_DATA_GET(obj, sd); + + sd->hook.prompt = func; + sd->hook.prompt_data = data; #else (void)func; (void)data; @@ -1197,14 +1414,17 @@ elm_web_dialog_prompt_hook_set(Evas_Object *obj, Elm_Web_Dialog_Prompt func, voi } EAPI void -elm_web_dialog_file_selector_hook_set(Evas_Object *obj, Elm_Web_Dialog_File_Selector func, void *data) +elm_web_dialog_file_selector_hook_set(Evas_Object *obj, + Elm_Web_Dialog_File_Selector func, + void *data) { - ELM_CHECK_WIDTYPE(obj, widtype); + ELM_WEB_CHECK(obj); + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - wd->hook.file_selector = func; - wd->hook.file_selector_data = data; + ELM_WEB_DATA_GET(obj, sd); + + sd->hook.file_selector = func; + sd->hook.file_selector_data = data; #else (void)func; (void)data; @@ -1212,14 +1432,17 @@ elm_web_dialog_file_selector_hook_set(Evas_Object *obj, Elm_Web_Dialog_File_Sele } EAPI void -elm_web_console_message_hook_set(Evas_Object *obj, Elm_Web_Console_Message func, void *data) +elm_web_console_message_hook_set(Evas_Object *obj, + Elm_Web_Console_Message func, + void *data) { - ELM_CHECK_WIDTYPE(obj, widtype); + ELM_WEB_CHECK(obj); + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - wd->hook.console_message = func; - wd->hook.console_message_data = data; + ELM_WEB_DATA_GET(obj, sd); + + sd->hook.console_message = func; + sd->hook.console_message_data = data; #else (void)func; (void)data; @@ -1227,26 +1450,30 @@ elm_web_console_message_hook_set(Evas_Object *obj, Elm_Web_Console_Message func, } EAPI void -elm_web_useragent_set(Evas_Object *obj, const char *user_agent) +elm_web_useragent_set(Evas_Object *obj, + const char *user_agent) { - ELM_CHECK_WIDTYPE(obj, widtype); + ELM_WEB_CHECK(obj); + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - ewk_view_setting_user_agent_set(wd->ewk_view, user_agent); + ELM_WEB_DATA_GET(obj, sd); + + ewk_view_setting_user_agent_set + (ELM_WIDGET_DATA(sd)->resize_obj, user_agent); #else (void)user_agent; #endif } -EAPI const char* +EAPI const char * elm_web_useragent_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) NULL; + ELM_WEB_CHECK(obj) NULL; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return NULL; - return ewk_view_setting_user_agent_get(wd->ewk_view); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_setting_user_agent_get(ELM_WIDGET_DATA(sd)->resize_obj); #else return NULL; #endif @@ -1255,37 +1482,42 @@ elm_web_useragent_get(const Evas_Object *obj) EAPI Eina_Bool elm_web_tab_propagate_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + ELM_WEB_CHECK(obj) EINA_FALSE; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return EINA_FALSE; - return wd->tab_propagate; + ELM_WEB_DATA_GET(obj, sd); + + return sd->tab_propagate; #else return EINA_FALSE; #endif } EAPI void -elm_web_tab_propagate_set(Evas_Object *obj, Eina_Bool propagate) +elm_web_tab_propagate_set(Evas_Object *obj, + Eina_Bool propagate) { - ELM_CHECK_WIDTYPE(obj, widtype); + ELM_WEB_CHECK(obj); + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - wd->tab_propagate = propagate; + ELM_WEB_DATA_GET(obj, sd); + + sd->tab_propagate = propagate; #else (void)propagate; #endif } EAPI Eina_Bool -elm_web_uri_set(Evas_Object *obj, const char *uri) +elm_web_uri_set(Evas_Object *obj, + const char *uri) { - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + ELM_WEB_CHECK(obj) EINA_FALSE; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return EINA_FALSE; - return ewk_view_uri_set(wd->ewk_view, uri); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_uri_set(ELM_WIDGET_DATA(sd)->resize_obj, uri); #else (void)uri; return EINA_FALSE; @@ -1295,11 +1527,12 @@ elm_web_uri_set(Evas_Object *obj, const char *uri) EAPI const char * elm_web_uri_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) NULL; + ELM_WEB_CHECK(obj) NULL; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return NULL; - return ewk_view_uri_get(wd->ewk_view); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_uri_get(ELM_WIDGET_DATA(sd)->resize_obj); #else return NULL; #endif @@ -1308,24 +1541,30 @@ elm_web_uri_get(const Evas_Object *obj) EAPI const char * elm_web_title_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) NULL; + ELM_WEB_CHECK(obj) NULL; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return NULL; - return ewk_view_title_get(wd->ewk_view); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_title_get(ELM_WIDGET_DATA(sd)->resize_obj); #else return NULL; #endif } EAPI void -elm_web_bg_color_set(Evas_Object *obj, int r, int g, int b, int a) +elm_web_bg_color_set(Evas_Object *obj, + int r, + int g, + int b, + int a) { - ELM_CHECK_WIDTYPE(obj, widtype); + ELM_WEB_CHECK(obj); + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - ewk_view_bg_color_set(wd->ewk_view, r, g, b, a); + ELM_WEB_DATA_GET(obj, sd); + + ewk_view_bg_color_set(ELM_WIDGET_DATA(sd)->resize_obj, r, g, b, a); #else (void)r; (void)g; @@ -1335,40 +1574,49 @@ elm_web_bg_color_set(Evas_Object *obj, int r, int g, int b, int a) } EAPI void -elm_web_bg_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a) +elm_web_bg_color_get(const Evas_Object *obj, + int *r, + int *g, + int *b, + int *a) { if (r) *r = 0; if (g) *g = 0; if (b) *b = 0; if (a) *a = 0; - ELM_CHECK_WIDTYPE(obj, widtype); + + ELM_WEB_CHECK(obj); + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - return ewk_view_bg_color_get(wd->ewk_view, r, g, b, a); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_bg_color_get(ELM_WIDGET_DATA(sd)->resize_obj, r, g, b, a); #endif } EAPI char * elm_web_selection_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) NULL; + ELM_WEB_CHECK(obj) NULL; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return NULL; - return ewk_view_selection_get(wd->ewk_view); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_selection_get(ELM_WIDGET_DATA(sd)->resize_obj); #else return NULL; #endif } EAPI void -elm_web_popup_selected_set(Evas_Object *obj, int idx) +elm_web_popup_selected_set(Evas_Object *obj, + int idx) { - ELM_CHECK_WIDTYPE(obj, widtype); + ELM_WEB_CHECK(obj); + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - ewk_view_popup_selected_set(wd->ewk_view, idx); + ELM_WEB_DATA_GET(obj, sd); + ewk_view_popup_selected_set(ELM_WIDGET_DATA(sd)->resize_obj, idx); #else (void)idx; #endif @@ -1377,24 +1625,31 @@ elm_web_popup_selected_set(Evas_Object *obj, int idx) EAPI Eina_Bool elm_web_popup_destroy(Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + ELM_WEB_CHECK(obj) EINA_FALSE; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - return ewk_view_popup_destroy(wd->ewk_view); + ELM_WEB_DATA_GET(obj, sd); + return ewk_view_popup_destroy(ELM_WIDGET_DATA(sd)->resize_obj); #else return EINA_FALSE; #endif } EAPI Eina_Bool -elm_web_text_search(const Evas_Object *obj, const char *string, Eina_Bool case_sensitive, Eina_Bool forward, Eina_Bool wrap) +elm_web_text_search(const Evas_Object *obj, + const char *string, + Eina_Bool case_sensitive, + Eina_Bool forward, + Eina_Bool wrap) { - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + ELM_WEB_CHECK(obj) EINA_FALSE; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return EINA_FALSE; + ELM_WEB_DATA_GET(obj, sd); + return ewk_view_text_search - (wd->ewk_view, string, case_sensitive, forward, wrap); + (ELM_WIDGET_DATA(sd)->resize_obj, string, + case_sensitive, forward, wrap); #else (void)string; (void)case_sensitive; @@ -1405,14 +1660,20 @@ elm_web_text_search(const Evas_Object *obj, const char *string, Eina_Bool case_s } EAPI unsigned int -elm_web_text_matches_mark(Evas_Object *obj, const char *string, Eina_Bool case_sensitive, Eina_Bool highlight, unsigned int limit) +elm_web_text_matches_mark(Evas_Object *obj, + const char *string, + Eina_Bool case_sensitive, + Eina_Bool highlight, + unsigned int limit) { - ELM_CHECK_WIDTYPE(obj, widtype) 0; + ELM_WEB_CHECK(obj) 0; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return 0; + ELM_WEB_DATA_GET(obj, sd); + if (!sd) return 0; return ewk_view_text_matches_mark - (wd->ewk_view, string, case_sensitive, highlight, limit); + (ELM_WIDGET_DATA(sd)->resize_obj, string, + case_sensitive, highlight, limit); #else (void)string; (void)case_sensitive; @@ -1425,24 +1686,28 @@ elm_web_text_matches_mark(Evas_Object *obj, const char *string, Eina_Bool case_s EAPI Eina_Bool elm_web_text_matches_unmark_all(Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + ELM_WEB_CHECK(obj) EINA_FALSE; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return EINA_FALSE; - return ewk_view_text_matches_unmark_all(wd->ewk_view); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_text_matches_unmark_all(ELM_WIDGET_DATA(sd)->resize_obj); #else return EINA_FALSE; #endif } EAPI Eina_Bool -elm_web_text_matches_highlight_set(Evas_Object *obj, Eina_Bool highlight) +elm_web_text_matches_highlight_set(Evas_Object *obj, + Eina_Bool highlight) { - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + ELM_WEB_CHECK(obj) EINA_FALSE; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return EINA_FALSE; - return ewk_view_text_matches_highlight_set(wd->ewk_view, highlight); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_text_matches_highlight_set + (ELM_WIDGET_DATA(sd)->resize_obj, highlight); #else (void)highlight; return EINA_FALSE; @@ -1452,11 +1717,12 @@ elm_web_text_matches_highlight_set(Evas_Object *obj, Eina_Bool highlight) EAPI Eina_Bool elm_web_text_matches_highlight_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + ELM_WEB_CHECK(obj) EINA_FALSE; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return EINA_FALSE; - return ewk_view_text_matches_highlight_get(wd->ewk_view); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_text_matches_highlight_get(ELM_WIDGET_DATA(sd)->resize_obj); #else return EINA_FALSE; #endif @@ -1465,11 +1731,12 @@ elm_web_text_matches_highlight_get(const Evas_Object *obj) EAPI double elm_web_load_progress_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) -1.0; + ELM_WEB_CHECK(obj) - 1.0; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return -1.0; - return ewk_view_load_progress_get(wd->ewk_view); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_load_progress_get(ELM_WIDGET_DATA(sd)->resize_obj); #else return EINA_FALSE; #endif @@ -1478,11 +1745,12 @@ elm_web_load_progress_get(const Evas_Object *obj) EAPI Eina_Bool elm_web_stop(Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + ELM_WEB_CHECK(obj) EINA_FALSE; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return EINA_FALSE; - return ewk_view_stop(wd->ewk_view); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_stop(ELM_WIDGET_DATA(sd)->resize_obj); #else return EINA_FALSE; #endif @@ -1491,11 +1759,12 @@ elm_web_stop(Evas_Object *obj) EAPI Eina_Bool elm_web_reload(Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + ELM_WEB_CHECK(obj) EINA_FALSE; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return EINA_FALSE; - return ewk_view_reload(wd->ewk_view); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_reload(ELM_WIDGET_DATA(sd)->resize_obj); #else return EINA_FALSE; #endif @@ -1504,25 +1773,26 @@ elm_web_reload(Evas_Object *obj) EAPI Eina_Bool elm_web_reload_full(Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + ELM_WEB_CHECK(obj) EINA_FALSE; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return EINA_FALSE; - return ewk_view_reload_full(wd->ewk_view); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_reload_full(ELM_WIDGET_DATA(sd)->resize_obj); #else return EINA_FALSE; #endif } - EAPI Eina_Bool elm_web_back(Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + ELM_WEB_CHECK(obj) EINA_FALSE; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return EINA_FALSE; - return ewk_view_back(wd->ewk_view); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_back(ELM_WIDGET_DATA(sd)->resize_obj); #else return EINA_FALSE; #endif @@ -1531,24 +1801,27 @@ elm_web_back(Evas_Object *obj) EAPI Eina_Bool elm_web_forward(Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + ELM_WEB_CHECK(obj) EINA_FALSE; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return EINA_FALSE; - return ewk_view_forward(wd->ewk_view); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_forward(ELM_WIDGET_DATA(sd)->resize_obj); #else return EINA_FALSE; #endif } EAPI Eina_Bool -elm_web_navigate(Evas_Object *obj, int steps) +elm_web_navigate(Evas_Object *obj, + int steps) { - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + ELM_WEB_CHECK(obj) EINA_FALSE; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return EINA_FALSE; - return ewk_view_navigate(wd->ewk_view, steps); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_navigate(ELM_WIDGET_DATA(sd)->resize_obj, steps); #else return EINA_FALSE; (void)steps; @@ -1564,11 +1837,12 @@ elm_web_back_possible(Evas_Object *obj) EAPI Eina_Bool elm_web_back_possible_get(Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + ELM_WEB_CHECK(obj) EINA_FALSE; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return EINA_FALSE; - return ewk_view_back_possible(wd->ewk_view); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_back_possible(ELM_WIDGET_DATA(sd)->resize_obj); #else return EINA_FALSE; #endif @@ -1577,24 +1851,27 @@ elm_web_back_possible_get(Evas_Object *obj) EAPI Eina_Bool elm_web_forward_possible_get(Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + ELM_WEB_CHECK(obj) EINA_FALSE; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return EINA_FALSE; - return ewk_view_forward_possible(wd->ewk_view); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_forward_possible(ELM_WIDGET_DATA(sd)->resize_obj); #else return EINA_FALSE; #endif } EAPI Eina_Bool -elm_web_navigate_possible_get(Evas_Object *obj, int steps) +elm_web_navigate_possible_get(Evas_Object *obj, + int steps) { - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + ELM_WEB_CHECK(obj) EINA_FALSE; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return EINA_FALSE; - return ewk_view_navigate_possible(wd->ewk_view, steps); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_navigate_possible(ELM_WIDGET_DATA(sd)->resize_obj, steps); #else return EINA_FALSE; (void)steps; @@ -1604,24 +1881,27 @@ elm_web_navigate_possible_get(Evas_Object *obj, int steps) EAPI Eina_Bool elm_web_history_enabled_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + ELM_WEB_CHECK(obj) EINA_FALSE; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return EINA_FALSE; - return ewk_view_history_enable_get(wd->ewk_view); + ELM_WEB_DATA_GET(obj, sd); + + return ewk_view_history_enable_get(ELM_WIDGET_DATA(sd)->resize_obj); #else return EINA_FALSE; #endif } EAPI void -elm_web_history_enabled_set(Evas_Object *obj, Eina_Bool enable) +elm_web_history_enabled_set(Evas_Object *obj, + Eina_Bool enable) { - ELM_CHECK_WIDTYPE(obj, widtype); + ELM_WEB_CHECK(obj); + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - ewk_view_history_enable_set(wd->ewk_view, enable); + ELM_WEB_DATA_GET(obj, sd); + + ewk_view_history_enable_set(ELM_WIDGET_DATA(sd)->resize_obj, enable); #else (void)enable; #endif @@ -1630,30 +1910,35 @@ elm_web_history_enabled_set(Evas_Object *obj, Eina_Bool enable) //EAPI Ewk_History *ewk_view_history_get(const Evas_Object *obj); // TODO: EAPI void -elm_web_zoom_set(Evas_Object *obj, double zoom) +elm_web_zoom_set(Evas_Object *obj, + double zoom) { - ELM_CHECK_WIDTYPE(obj, widtype); + ELM_WEB_CHECK(obj); + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); + ELM_WEB_DATA_GET(obj, sd); + int vw, vh, cx, cy; float z = 1.0; - evas_object_geometry_get(wd->ewk_view, NULL, NULL, &vw, &vh); + + evas_object_geometry_get + (ELM_WIDGET_DATA(sd)->resize_obj, NULL, NULL, &vw, &vh); cx = vw / 2; cy = vh / 2; - if (zoom > wd->zoom.max) - zoom = wd->zoom.max; - else if (zoom < wd->zoom.min) - zoom = wd->zoom.min; - if (zoom == wd->zoom.current) return; - wd->zoom.current = zoom; - if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_MANUAL) - z = zoom; - else if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_AUTO_FIT) + if (zoom > sd->zoom.max) zoom = sd->zoom.max; + else if (zoom < sd->zoom.min) + zoom = sd->zoom.min; + if (zoom == sd->zoom.current) return; + + sd->zoom.current = zoom; + if (sd->zoom.mode == ELM_WEB_ZOOM_MODE_MANUAL) z = zoom; + else if (sd->zoom.mode == ELM_WEB_ZOOM_MODE_AUTO_FIT) { - Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view); + Evas_Object *frame = + ewk_view_frame_main_get(ELM_WIDGET_DATA(sd)->resize_obj); Evas_Coord fw, fh, pw, ph; - if (!ewk_frame_contents_size_get(frame, &fw, &fh)) - return; + + if (!ewk_frame_contents_size_get(frame, &fw, &fh)) return; z = ewk_frame_page_zoom_get(frame); fw /= z; fh /= z; @@ -1673,12 +1958,13 @@ elm_web_zoom_set(Evas_Object *obj, double zoom) z = (float)ph / fh; } } - else if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_AUTO_FILL) + else if (sd->zoom.mode == ELM_WEB_ZOOM_MODE_AUTO_FILL) { - Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view); + Evas_Object *frame = + ewk_view_frame_main_get(ELM_WIDGET_DATA(sd)->resize_obj); Evas_Coord fw, fh, pw, ph; - if (!ewk_frame_contents_size_get(frame, &fw, &fh)) - return; + + if (!ewk_frame_contents_size_get(frame, &fw, &fh)) return; z = ewk_frame_page_zoom_get(frame); fw /= z; fh /= z; @@ -1698,12 +1984,13 @@ elm_web_zoom_set(Evas_Object *obj, double zoom) z = (float)ph / fh; } } - if (wd->zoom.no_anim) - ewk_view_zoom_set(wd->ewk_view, z, cx, cy); + if (sd->zoom.no_anim) + ewk_view_zoom_set(ELM_WIDGET_DATA(sd)->resize_obj, z, cx, cy); else - ewk_view_zoom_animated_set(wd->ewk_view, z, _elm_config->zoom_friction, - cx, cy); - wd->zoom.no_anim = EINA_FALSE; + ewk_view_zoom_animated_set + (ELM_WIDGET_DATA(sd)->resize_obj, z, + _elm_config->zoom_friction, cx, cy); + sd->zoom.no_anim = EINA_FALSE; #else (void)zoom; #endif @@ -1712,29 +1999,36 @@ elm_web_zoom_set(Evas_Object *obj, double zoom) EAPI double elm_web_zoom_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) -1.0; + ELM_WEB_CHECK(obj) - 1.0; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - return wd->zoom.current; + ELM_WEB_DATA_GET(obj, sd); + + return sd->zoom.current; #else return -1.0; #endif } EAPI void -elm_web_zoom_mode_set(Evas_Object *obj, Elm_Web_Zoom_Mode mode) +elm_web_zoom_mode_set(Evas_Object *obj, + Elm_Web_Zoom_Mode mode) { - ELM_CHECK_WIDTYPE(obj, widtype); + ELM_WEB_CHECK(obj); + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); + ELM_WEB_DATA_GET(obj, sd); + float tz; + if (mode >= ELM_WEB_ZOOM_MODE_LAST) return; - if (mode == wd->zoom.mode) + if (mode == sd->zoom.mode) return; - wd->zoom.mode = mode; - tz = wd->zoom.current; - wd->zoom.current = 0.0; + + sd->zoom.mode = mode; + tz = sd->zoom.current; + sd->zoom.current = 0.0; elm_web_zoom_set(obj, tz); #else (void)mode; @@ -1744,34 +2038,44 @@ elm_web_zoom_mode_set(Evas_Object *obj, Elm_Web_Zoom_Mode mode) EAPI Elm_Web_Zoom_Mode elm_web_zoom_mode_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) ELM_WEB_ZOOM_MODE_LAST; + ELM_WEB_CHECK(obj) ELM_WEB_ZOOM_MODE_LAST; + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - return wd->zoom.mode; + ELM_WEB_DATA_GET(obj, sd); + + return sd->zoom.mode; #else return ELM_WEB_ZOOM_MODE_LAST; #endif } EAPI void -elm_web_region_show(Evas_Object *obj, int x, int y, int w __UNUSED__, int h __UNUSED__) +elm_web_region_show(Evas_Object *obj, + int x, + int y, + int w __UNUSED__, + int h __UNUSED__) { - ELM_CHECK_WIDTYPE(obj, widtype); + ELM_WEB_CHECK(obj); + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view); + ELM_WEB_DATA_GET(obj, sd); + + Evas_Object *frame = + ewk_view_frame_main_get(ELM_WIDGET_DATA(sd)->resize_obj); int fw, fh, zw, zh, rx, ry; float zoom; + ewk_frame_contents_size_get(frame, &fw, &fh); zoom = ewk_frame_page_zoom_get(frame); zw = fw / zoom; zh = fh / zoom; rx = (x * fw) / zw; ry = (y * fh) / zh; - if (wd->bring_in.animator) + if (sd->bring_in.animator) { - ecore_animator_del(wd->bring_in.animator); - wd->bring_in.animator = NULL; + ecore_animator_del(sd->bring_in.animator); + sd->bring_in.animator = NULL; } ewk_frame_scroll_set(frame, rx, ry); #else @@ -1781,14 +2085,22 @@ elm_web_region_show(Evas_Object *obj, int x, int y, int w __UNUSED__, int h __UN } EAPI void -elm_web_region_bring_in(Evas_Object *obj, int x, int y, int w __UNUSED__, int h __UNUSED__) +elm_web_region_bring_in(Evas_Object *obj, + int x, + int y, + int w __UNUSED__, + int h __UNUSED__) { - ELM_CHECK_WIDTYPE(obj, widtype); + ELM_WEB_CHECK(obj); + #ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); - Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view); + ELM_WEB_DATA_GET(obj, sd); + + Evas_Object *frame = + ewk_view_frame_main_get(ELM_WIDGET_DATA(sd)->resize_obj); int fw, fh, zw, zh, rx, ry, sx, sy; float zoom; + ewk_frame_contents_size_get(frame, &fw, &fh); ewk_frame_scroll_pos_get(frame, &sx, &sy); zoom = ewk_frame_page_zoom_get(frame); @@ -1796,16 +2108,16 @@ elm_web_region_bring_in(Evas_Object *obj, int x, int y, int w __UNUSED__, int h zh = fh / zoom; rx = (x * fw) / zw; ry = (y * fh) / zh; - if ((wd->bring_in.end.x == rx) && (wd->bring_in.end.y == ry)) + if ((sd->bring_in.end.x == rx) && (sd->bring_in.end.y == ry)) return; - wd->bring_in.start.x = sx; - wd->bring_in.start.y = sy; - wd->bring_in.end.x = rx; - wd->bring_in.end.y = ry; - if (wd->bring_in.animator) - ecore_animator_del(wd->bring_in.animator); - wd->bring_in.animator = ecore_animator_timeline_add( - _elm_config->bring_in_scroll_friction, _bring_in_anim_cb, wd); + sd->bring_in.start.x = sx; + sd->bring_in.start.y = sy; + sd->bring_in.end.x = rx; + sd->bring_in.end.y = ry; + if (sd->bring_in.animator) + ecore_animator_del(sd->bring_in.animator); + sd->bring_in.animator = ecore_animator_timeline_add( + _elm_config->bring_in_scroll_friction, _bring_in_anim_cb, sd); #else (void)x; (void)y; @@ -1813,13 +2125,15 @@ elm_web_region_bring_in(Evas_Object *obj, int x, int y, int w __UNUSED__, int h } EAPI void -elm_web_inwin_mode_set(Evas_Object *obj, Eina_Bool value) +elm_web_inwin_mode_set(Evas_Object *obj, + Eina_Bool value) { - ELM_CHECK_WIDTYPE(obj, widtype); -#ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); + ELM_WEB_CHECK(obj); - wd->inwin_mode = value; +#ifdef HAVE_ELEMENTARY_WEB + ELM_WEB_DATA_GET(obj, sd); + + sd->inwin_mode = value; #else (void)value; #endif @@ -1828,11 +2142,12 @@ elm_web_inwin_mode_set(Evas_Object *obj, Eina_Bool value) EAPI Eina_Bool elm_web_inwin_mode_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; -#ifdef HAVE_ELEMENTARY_WEB - Widget_Data *wd = elm_widget_data_get(obj); + ELM_WEB_CHECK(obj) EINA_FALSE; - return wd->inwin_mode; +#ifdef HAVE_ELEMENTARY_WEB + ELM_WEB_DATA_GET(obj, sd); + + return sd->inwin_mode; #else return EINA_FALSE; #endif @@ -1859,86 +2174,93 @@ elm_web_window_features_unref(Elm_Web_Window_Features *wf) } EAPI Eina_Bool -elm_web_window_features_property_get(const Elm_Web_Window_Features *wf, Elm_Web_Window_Feature_Flag flag) +elm_web_window_features_property_get(const Elm_Web_Window_Features *wf, + Elm_Web_Window_Feature_Flag flag) { #ifdef HAVE_ELEMENTARY_WEB Eina_Bool toolbar_visible, statusbar_visible; Eina_Bool scrollbars_visible, menubar_visible; Eina_Bool locationbar_visible, fullscreen; - ewk_window_features_bool_property_get((const Ewk_Window_Features *)wf, - &toolbar_visible, &statusbar_visible, - &scrollbars_visible, &menubar_visible, - &locationbar_visible, &fullscreen); + ewk_window_features_bool_property_get + ((const Ewk_Window_Features *)wf, &toolbar_visible, &statusbar_visible, + &scrollbars_visible, &menubar_visible, &locationbar_visible, + &fullscreen); //TODO : Improve ewk API usage to get one value. - // - switch(flag) + switch (flag) { - case ELM_WEB_WINDOW_FEATURE_TOOLBAR: - return toolbar_visible; - break; - case ELM_WEB_WINDOW_FEATURE_STATUSBAR: - return statusbar_visible; - break; - case ELM_WEB_WINDOW_FEATURE_SCROLLBARS: - return scrollbars_visible; - break; - case ELM_WEB_WINDOW_FEATURE_MENUBAR: - return menubar_visible; - break; - case ELM_WEB_WINDOW_FEATURE_LOCATIONBAR: - return locationbar_visible; - break; - case ELM_WEB_WINDOW_FEATURE_FULLSCREEN: - return fullscreen; - break; + case ELM_WEB_WINDOW_FEATURE_TOOLBAR: + return toolbar_visible; + break; + + case ELM_WEB_WINDOW_FEATURE_STATUSBAR: + return statusbar_visible; + break; + + case ELM_WEB_WINDOW_FEATURE_SCROLLBARS: + return scrollbars_visible; + break; + + case ELM_WEB_WINDOW_FEATURE_MENUBAR: + return menubar_visible; + break; + + case ELM_WEB_WINDOW_FEATURE_LOCATIONBAR: + return locationbar_visible; + break; + + case ELM_WEB_WINDOW_FEATURE_FULLSCREEN: + return fullscreen; + break; } #else if (!wf) return EINA_FALSE; - if (flag==ELM_WEB_WINDOW_FEATURE_TOOLBAR) + if (flag == ELM_WEB_WINDOW_FEATURE_TOOLBAR) { //TODO Handle unused variable warnings when //ewk is not installed. } /* What to do with these ? - - (void)wf; - (void)toolbar_visible; - (void)statusbar_visible; - (void)scrollbars_visible; - (void)menubar_visible; - (void)locationbar_visible; - (void)fullscreen; - - */ + (void)wf; + (void)toolbar_visible; + (void)statusbar_visible; + (void)scrollbars_visible; + (void)menubar_visible; + (void)locationbar_visible; + (void)fullscreen; + */ #endif return EINA_FALSE; } EAPI void -elm_web_window_features_region_get(const Elm_Web_Window_Features *wf, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) +elm_web_window_features_region_get(const Elm_Web_Window_Features *wf, + Evas_Coord *x, + Evas_Coord *y, + Evas_Coord *w, + Evas_Coord *h) { #ifdef HAVE_ELEMENTARY_WEB - ewk_window_features_int_property_get((const Ewk_Window_Features *)wf, - x, y, w, h); + ewk_window_features_int_property_get + ((const Ewk_Window_Features *)wf, x, y, w, h); #else if (!wf || !x || !y || !w || !h) return; /* What to do with these ? - - (void)wf; - (void)x; - (void)y; - (void)w; - (void)h; - - */ + (void)wf; + (void)x; + (void)y; + (void)w; + (void)h; + */ #endif } -// TODO: use all ewk_view_zoom stuff to implement bring-in and animated zoom like elm_photocam. Should be simple to use, must not expose every single bit to users! +// TODO: use all ewk_view_zoom stuff to implement bring-in and +// animated zoom like elm_photocam. Should be simple to use, must not +// expose every single bit to users!