1 #include <Elementary.h>
5 // 1 - easy to use zoom like elm_photocam API
6 // 2 - review scrolling to match elm_scroller. Maybe in future use elm_scroller
8 #ifdef HAVE_ELEMENTARY_WEB
11 /* Similar to iPhone */
12 // TODO: switch between iPhone, iPad or Chrome/Safari based on some elm setting?
13 #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
15 static Ewk_View_Smart_Class _parent_sc = EWK_VIEW_SMART_CLASS_INIT_NULL;
17 typedef struct _View_Smart_Data View_Smart_Data;
18 struct _View_Smart_Data
20 Ewk_View_Smart_Data base;
22 Evas_Event_Mouse_Down event;
24 unsigned int move_count;
25 Ecore_Timer *longpress_timer;
26 Ecore_Animator *pan_anim;
31 typedef struct _Widget_Data Widget_Data;
35 #ifdef HAVE_ELEMENTARY_WEB
36 Evas_Object *ewk_view;
38 Elm_Web_Window_Open window_create;
39 void *window_create_data;
40 Elm_Web_Dialog_Alert alert;
42 Elm_Web_Dialog_Confirm confirm;
44 Elm_Web_Dialog_Prompt prompt;
46 Elm_Web_Dialog_File_Selector file_selector;
47 void *file_selector_data;
48 Elm_Web_Console_Message console_message;
49 void *console_message_data;
51 Elm_Win_Keyboard_Mode input_method;
53 Elm_Web_Zoom_Mode mode;
63 Ecore_Animator *animator;
65 Eina_Bool tab_propagate : 1;
66 Eina_Bool inwin_mode : 1;
80 typedef struct _Dialog_Data Dialog_Data;
83 enum Dialog_Type type;
86 Evas_Object *bt_ok, *bt_cancel;
88 Evas_Object *file_sel;
92 Eina_List **selected_files;
95 struct _Elm_Web_Callback_Proxy_Context
100 typedef struct _Elm_Web_Callback_Proxy_Context Elm_Web_Callback_Proxy_Context;
102 static const char *widtype = NULL;
103 static const Evas_Smart_Cb_Description _elm_web_callback_names[] = {
104 { "download,request", "p" },
105 { "editorclient,contents,changed", "" },
106 { "editorclient,selection,changed", "" },
107 { "frame,created", "p" },
108 { "icon,received", "" },
109 { "inputmethod,changed", "b" },
110 { "js,windowobject,clear", "" },
111 { "link,hover,in", "p" },
112 { "link,hover,out", "" },
113 { "load,document,finished", "p" },
114 { "load,error", "p" },
115 { "load,finished", "p" },
116 { "load,newwindow,show", "" },
117 { "load,progress", "d" },
118 { "load,provisional", "" },
119 { "load,started", "" },
120 { "menubar,visible,get", "b" },
121 { "menubar,visible,set", "b" },
122 { "popup,created", "p" },
123 { "popup,willdelete", "p" },
125 { "scrollbars,visible,get", "b" },
126 { "scrollbars,visible,set", "b" },
127 { "statusbar,text,set", "s" },
128 { "statusbar,visible,get", "b" },
129 { "statusbar,visible,set", "b" },
130 { "title,changed", "s" },
131 { "toolbars,visible,get", "b" },
132 { "toolbars,visible,set", "b" },
133 { "tooltip,text,set", "s" },
134 { "uri,changed", "s" },
135 { "view,resized", "" },
136 { "windows,close,request", ""},
137 { "zoom,animated,end", "" },
142 _webkit_theme_find(const Eina_List *list)
147 EINA_LIST_FOREACH(list, l, th)
149 char *path = elm_theme_list_item_path_get(th, NULL);
151 if (edje_file_group_exists(path, "webkit/base"))
160 _theme_hook(Evas_Object *obj)
162 #ifdef HAVE_ELEMENTARY_WEB
163 Elm_Theme *theme = elm_object_theme_get(obj);
164 Widget_Data *wd = elm_widget_data_get(obj);
165 const Eina_List *themes;
166 char *view_theme = NULL;
168 themes = elm_theme_overlay_list_get(theme);
169 view_theme = _webkit_theme_find(themes);
170 if (view_theme) goto set;
172 themes = elm_theme_list_get(theme);
173 view_theme = _webkit_theme_find(themes);
174 if (view_theme) goto set;
176 themes = elm_theme_extension_list_get(theme);
177 view_theme = _webkit_theme_find(themes);
182 ewk_view_theme_set(wd->ewk_view, view_theme);
186 ewk_view_theme_set(wd->ewk_view, WEBKIT_DATADIR"/themes/default.edj");
193 _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
195 #ifdef HAVE_ELEMENTARY_WEB
196 Widget_Data *wd = elm_widget_data_get(obj);
197 Evas_Object *top = elm_widget_top_get(obj);
201 if (elm_object_focus_get(obj))
203 evas_object_focus_set(wd->ewk_view, EINA_TRUE);
204 if (top) elm_win_keyboard_mode_set(top, wd->input_method);
208 evas_object_focus_set(wd->ewk_view, EINA_FALSE);
209 if (top) elm_win_keyboard_mode_set(top, ELM_WIN_KEYBOARD_OFF);
217 _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info)
219 #ifdef HAVE_ELEMENTARY_WEB
220 Evas_Event_Key_Down *ev = event_info;
221 Widget_Data *wd = elm_widget_data_get(obj);
223 if (!wd) return EINA_FALSE;
224 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
225 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
226 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
228 if ((!strcmp(ev->keyname, "Tab")) && (!wd->tab_propagate))
230 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
243 #ifdef HAVE_ELEMENTARY_WEB
245 _view_pan_animator(void *data)
247 View_Smart_Data *sd = data;
248 Evas_Coord x, y, dx, dy;
250 evas_pointer_canvas_xy_get(sd->base.base.evas, &x, &y);
252 dx = sd->mouse.x - x;
253 dy = sd->mouse.y - y;
255 if ((dx == 0) && (dy == 0))
258 ewk_frame_scroll_add(sd->base.main_frame, dx, dy);
268 _view_smart_add(Evas_Object *obj)
272 sd = calloc(1, sizeof(View_Smart_Data));
273 evas_object_smart_data_set(obj, sd);
275 _parent_sc.sc.add(obj);
277 ewk_view_history_enable_set(obj, EINA_TRUE);
278 ewk_history_limit_set(ewk_view_history_get(obj), 100);
279 // TODO: auto toggle between smooth/nearest during bring-in animations
280 //ewk_view_zoom_weak_smooth_scale_set(obj, EINA_TRUE);
284 _view_smart_del(Evas_Object *obj)
288 sd = evas_object_smart_data_get(obj);
290 if (sd->mouse.pan_anim)
291 ecore_animator_del(sd->mouse.pan_anim);
293 _parent_sc.sc.del(obj);
297 _view_longpress_timer(void *data)
299 View_Smart_Data *sd = data;
301 sd->mouse.move_count = 0;
302 sd->mouse.longpress_timer = NULL;
303 return ECORE_CALLBACK_CANCEL;
307 _view_smart_mouse_down(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Down *event)
309 // TODO: mimic elm_scroller and like
310 // TODO-minor: offer hook?
311 View_Smart_Data *sd = (View_Smart_Data *)esd;
313 if (event->button != 1)
314 return _parent_sc.mouse_down(esd, event);
316 sd->mouse.pan_anim = ecore_animator_add(_view_pan_animator, sd);
317 sd->mouse.longpress_timer = ecore_timer_add(_elm_config->longpress_timeout, _view_longpress_timer, sd);
318 sd->mouse.move_count = 1;
319 sd->mouse.x = event->canvas.x;
320 sd->mouse.y = event->canvas.y;
321 sd->mouse.event = *event;
327 _view_smart_mouse_up(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Up *event)
329 // TODO: mimic elm_scroller and like
330 // TODO-minor: offer hook?
331 View_Smart_Data *sd = (View_Smart_Data *)esd;
333 if (sd->mouse.pan_anim)
335 ecore_animator_del(sd->mouse.pan_anim);
336 sd->mouse.pan_anim = NULL;
338 if (sd->mouse.longpress_timer)
339 _parent_sc.mouse_down(esd, &sd->mouse.event);
344 if (sd->mouse.longpress_timer)
346 ecore_timer_del(sd->mouse.longpress_timer);
347 sd->mouse.longpress_timer = NULL;
350 sd->mouse.move_count = 0;
351 return _parent_sc.mouse_up(esd, event);
355 _view_smart_mouse_move(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Move *event)
357 // TODO: mimic elm_scroller and like
358 // TODO-minor: offer hook?
359 View_Smart_Data *sd = (View_Smart_Data *)esd;
360 sd->mouse.move_count++;
362 if (sd->mouse.longpress_timer &&
363 (((sd->mouse.x ^ sd->mouse.event.canvas.x) |
364 (sd->mouse.y ^ sd->mouse.event.canvas.y)) & (~0x07)))
366 ecore_timer_del(sd->mouse.longpress_timer);
367 sd->mouse.longpress_timer = NULL;
370 if (sd->mouse.pan_anim)
375 return _parent_sc.mouse_move(esd, event);
379 _view_smart_window_create(Ewk_View_Smart_Data *sd, Eina_Bool javascript, const Ewk_Window_Features *window_features)
382 Evas_Object *obj = evas_object_smart_parent_get(sd->self);
383 Widget_Data *wd = elm_widget_data_get(obj);
385 if (!wd->hook.window_create) return NULL;
386 new = wd->hook.window_create(wd->hook.window_create_data, obj, javascript,
387 (const Elm_Web_Window_Features *)window_features);
388 if (new) return elm_web_webkit_view_get(new);
394 _view_smart_window_close(Ewk_View_Smart_Data *sd)
396 Evas_Object *obj = evas_object_smart_parent_get(sd->self);
397 evas_object_smart_callback_call(obj, "windows,close,request", NULL);
401 _bt_close(void *data, Evas_Object *obj, void *event_info __UNUSED__)
403 Dialog_Data *d = data;
405 *d->response = (obj == d->bt_ok);
406 if ((d->type == DIALOG_PROMPT) && (*d->response == EINA_TRUE))
407 *d->entry_value = strdup(elm_entry_entry_get(d->entry));
408 evas_object_del(d->dialog);
412 _file_sel_done(void *data, Evas_Object *obj __UNUSED__, void *event_info)
414 Dialog_Data *d = data;
417 *d->selected_files = eina_list_append(NULL, strdup(event_info));
418 *d->response = EINA_TRUE;
421 *d->response = EINA_FALSE;
422 evas_object_del(d->dialog);
427 _dialog_new(Evas_Object *parent)
430 Widget_Data *wd = elm_widget_data_get(parent);
432 d = calloc(1, sizeof(Dialog_Data));
435 if (!parent || wd->inwin_mode)
439 d->dialog = elm_win_add(NULL, "elm-web-popup", ELM_WIN_DIALOG_BASIC);
440 evas_object_smart_callback_add(d->dialog, "delete,request",
443 bg = elm_bg_add(d->dialog);
444 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND,
446 elm_win_resize_object_add(d->dialog, bg);
447 evas_object_show(bg);
449 d->box = elm_box_add(d->dialog);
450 evas_object_size_hint_weight_set(d->box, EVAS_HINT_EXPAND,
452 elm_win_resize_object_add(d->dialog, d->box);
453 evas_object_show(d->box);
457 Evas_Object *win = elm_widget_top_get(parent);
458 d->dialog = elm_win_inwin_add(win);
459 elm_object_style_set(d->dialog, "minimal");
460 evas_object_size_hint_weight_set(d->dialog, EVAS_HINT_EXPAND,
463 d->box = elm_box_add(win);
464 evas_object_size_hint_weight_set(d->box, EVAS_HINT_EXPAND,
466 elm_win_inwin_content_set(d->dialog, d->box);
467 evas_object_show(d->box);
474 _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)
476 EINA_SAFETY_ON_TRUE_RETURN_VAL((type != DIALOG_PROMPT) && (!!default_entry_value), EINA_FALSE);
477 EINA_SAFETY_ON_TRUE_RETURN_VAL((type != DIALOG_PROMPT) && (!!entry_value), EINA_FALSE);
479 Dialog_Data *dialog_data = _dialog_new(evas_object_smart_parent_get(parent));
482 if (type != DIALOG_FILE_SELECTOR)
484 lb = elm_label_add(dialog_data->box);
485 elm_object_text_set(lb, message);
486 elm_box_pack_end(dialog_data->box, lb);
487 evas_object_show(lb);
490 dialog_data->type = type;
491 dialog_data->response = response;
492 dialog_data->entry_value = entry_value;
493 dialog_data->selected_files = selected_filenames;
495 if (type == DIALOG_ALERT)
497 dialog_data->bt_ok = elm_button_add(dialog_data->box);
498 elm_object_text_set(dialog_data->bt_ok, "Close");
499 elm_box_pack_end(dialog_data->box, dialog_data->bt_ok);
500 evas_object_size_hint_align_set(dialog_data->bt_ok, EVAS_HINT_FILL, EVAS_HINT_FILL);
501 evas_object_smart_callback_add(dialog_data->bt_ok, "clicked", _bt_close, dialog_data);
502 evas_object_show(dialog_data->bt_ok);
504 else if (type == DIALOG_FILE_SELECTOR)
506 dialog_data->file_sel = elm_fileselector_add(dialog_data->dialog);
507 evas_object_size_hint_weight_set(dialog_data->file_sel,
508 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
509 evas_object_size_hint_align_set(dialog_data->file_sel, EVAS_HINT_FILL,
511 elm_box_pack_end(dialog_data->box, dialog_data->file_sel);
512 evas_object_show(dialog_data->file_sel);
514 elm_fileselector_path_set(dialog_data->file_sel, ".");
515 elm_fileselector_is_save_set(dialog_data->file_sel, EINA_FALSE);
516 elm_fileselector_folder_only_set(dialog_data->file_sel, EINA_FALSE);
517 elm_fileselector_buttons_ok_cancel_set(dialog_data->file_sel,
519 elm_fileselector_expandable_set(dialog_data->file_sel, EINA_FALSE);
520 evas_object_smart_callback_add(dialog_data->file_sel, "done",
521 _file_sel_done, dialog_data);
522 // fileselector can't set it's minimum size correctly
523 evas_object_size_hint_min_set(dialog_data->file_sel, 300, 400);
527 if (type == DIALOG_PROMPT)
529 dialog_data->entry = elm_entry_add(dialog_data->box);
530 elm_entry_single_line_set(dialog_data->entry, EINA_TRUE);
531 elm_entry_scrollable_set(dialog_data->entry, EINA_TRUE);
532 elm_entry_entry_set(dialog_data->entry, default_entry_value);
533 evas_object_size_hint_align_set(dialog_data->entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
534 evas_object_size_hint_weight_set(dialog_data->entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
535 elm_box_pack_end(dialog_data->box, dialog_data->entry);
536 evas_object_show(dialog_data->entry);
539 if (type == DIALOG_PROMPT || type == DIALOG_CONFIRM)
541 Evas_Object *bx_h = elm_box_add(dialog_data->box);
542 elm_box_horizontal_set(bx_h, 1);
543 elm_box_pack_end(dialog_data->box, bx_h);
544 evas_object_size_hint_weight_set(bx_h, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
545 evas_object_size_hint_align_set(bx_h, EVAS_HINT_FILL, EVAS_HINT_FILL);
546 evas_object_show(bx_h);
548 dialog_data->bt_cancel = elm_button_add(bx_h);
549 elm_object_text_set(dialog_data->bt_cancel, "Cancel");
550 elm_box_pack_end(bx_h, dialog_data->bt_cancel);
551 evas_object_size_hint_weight_set(dialog_data->bt_cancel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
552 evas_object_size_hint_align_set(dialog_data->bt_cancel, EVAS_HINT_FILL, EVAS_HINT_FILL);
553 evas_object_smart_callback_add(dialog_data->bt_cancel, "clicked", _bt_close, dialog_data);
554 evas_object_show(dialog_data->bt_cancel);
556 dialog_data->bt_ok = elm_button_add(bx_h);
557 elm_object_text_set(dialog_data->bt_ok, "Ok");
558 elm_box_pack_end(bx_h, dialog_data->bt_ok);
559 evas_object_size_hint_weight_set(dialog_data->bt_ok, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
560 evas_object_size_hint_align_set(dialog_data->bt_ok, EVAS_HINT_FILL, EVAS_HINT_FILL);
561 evas_object_smart_callback_add(dialog_data->bt_ok, "clicked", _bt_close, dialog_data);
562 evas_object_show(dialog_data->bt_ok);
568 evas_object_show(dialog_data->dialog);
570 return dialog_data->dialog;
574 _dialog_del_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
576 ecore_main_loop_quit();
580 _exec_dialog(Evas_Object *dialog)
582 evas_object_event_callback_add(dialog, EVAS_CALLBACK_DEL, _dialog_del_cb,
584 ecore_main_loop_begin();
587 /* called by ewk_view when javascript called alert()
591 _view_smart_run_javascript_alert(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, const char *message)
593 View_Smart_Data *sd = (View_Smart_Data *)esd;
594 Evas_Object *view = sd->base.self;
595 Evas_Object *obj = evas_object_smart_parent_get(view);
596 Evas_Object *diag = NULL;
597 Widget_Data *wd = elm_widget_data_get(obj);
598 Eina_Bool response = EINA_FALSE;
601 diag = wd->hook.alert(wd->hook.alert_data, obj, message);
603 diag = _run_dialog(view, DIALOG_ALERT, message, NULL, NULL, EINA_FALSE,
604 NULL, NULL, &response);
605 if (diag) _exec_dialog(diag);
608 /* called by ewk_view when javascript called confirm()
612 _view_smart_run_javascript_confirm(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, const char *message)
614 View_Smart_Data *sd = (View_Smart_Data *)esd;
615 Evas_Object *view = sd->base.self;
616 Evas_Object *obj = evas_object_smart_parent_get(view);
617 Evas_Object *diag = NULL;
618 Widget_Data *wd = elm_widget_data_get(obj);
619 Eina_Bool response = EINA_FALSE;
621 if (wd->hook.confirm)
622 diag = wd->hook.confirm(wd->hook.confirm_data, obj, message, &response);
624 diag = _run_dialog(view, DIALOG_CONFIRM, message, NULL, NULL, EINA_FALSE,
625 NULL, NULL, &response);
626 if (diag) _exec_dialog(diag);
630 /* called by ewk_view when javascript called confirm()
634 _view_smart_run_javascript_prompt(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, const char *message, const char *default_value, char **value)
636 View_Smart_Data *sd = (View_Smart_Data *)esd;
637 Evas_Object *view = sd->base.self;
638 Evas_Object *obj = evas_object_smart_parent_get(view);
639 Evas_Object *diag = NULL;
640 Widget_Data *wd = elm_widget_data_get(obj);
641 Eina_Bool response = EINA_FALSE;
644 diag = wd->hook.prompt(wd->hook.prompt_data, obj, message, default_value,
647 diag = _run_dialog(view, DIALOG_PROMPT, message, default_value, value,
648 EINA_FALSE, NULL, NULL, &response);
649 if (diag) _exec_dialog(diag);
657 _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)
659 View_Smart_Data *sd = (View_Smart_Data *)esd;
660 Evas_Object *view = sd->base.self;
661 Evas_Object *obj = evas_object_smart_parent_get(view);
662 Evas_Object *diag = NULL;
663 Widget_Data *wd = elm_widget_data_get(obj);
664 Eina_Bool response = EINA_FALSE;
666 if (wd->hook.file_selector)
667 diag = wd->hook.file_selector(wd->hook.file_selector_data, obj,
668 allows_multiple_files, accept_types,
669 selected_filenames, &response);
671 diag = _run_dialog(view, DIALOG_FILE_SELECTOR, NULL, NULL, NULL,
672 allows_multiple_files, accept_types, selected_filenames,
674 if (diag) _exec_dialog(diag);
680 _view_smart_add_console_message(Ewk_View_Smart_Data *esd, const char *message, unsigned int line_number, const char *source_id)
682 Evas_Object *obj = evas_object_smart_parent_get(esd->self);
683 Widget_Data *wd = elm_widget_data_get(obj);
685 if (wd->hook.console_message)
686 wd->hook.console_message(wd->hook.console_message_data, obj, message,
687 line_number, source_id);
691 _view_smart_focus_can_cycle(Ewk_View_Smart_Data *sd, Ewk_Focus_Direction direction)
693 Evas_Object *obj = evas_object_smart_parent_get(sd->self);
694 Elm_Focus_Direction dir;
698 case EWK_FOCUS_DIRECTION_FORWARD:
699 dir = ELM_FOCUS_NEXT;
701 case EWK_FOCUS_DIRECTION_BACKWARD:
702 dir = ELM_FOCUS_PREVIOUS;
708 elm_widget_focus_cycle(elm_widget_parent_get(obj), dir);
714 * Creates a new view object given the parent.
716 * @param parent object to use as parent.
718 * @return newly added Evas_Object or @c NULL on errors.
721 _view_add(Evas_Object *parent)
723 static Evas_Smart *smart = NULL;
724 Evas *canvas = evas_object_evas_get(parent);
729 static Ewk_View_Smart_Class api = EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("EWK_View_Elementary");
731 #ifndef TILED_BACKING_STORE
732 ewk_view_single_smart_set(&api);
734 ewk_view_tiled_smart_set(&api);
739 // TODO: check every api method and provide overrides with hooks!
740 // TODO: hooks should provide extension points
741 // TODO: extension should have some kind of "default implementation",
742 // TODO: that can be replaced or controlled by hooks.
743 // TODO: ie: run_javascript_alert() should present an elm_win
744 // TODO: by default, but user could override it to show as inwin.
745 api.sc.add = _view_smart_add;
746 api.sc.del = _view_smart_del;
747 //api.sc.calculate = _view_smart_calculate;
748 api.mouse_down = _view_smart_mouse_down;
749 api.mouse_up = _view_smart_mouse_up;
750 api.mouse_move = _view_smart_mouse_move;
751 api.add_console_message = _view_smart_add_console_message;
752 api.window_create = _view_smart_window_create;
753 api.window_close = _view_smart_window_close;
754 api.run_javascript_alert = _view_smart_run_javascript_alert;
755 api.run_javascript_confirm = _view_smart_run_javascript_confirm;
756 api.run_javascript_prompt = _view_smart_run_javascript_prompt;
757 api.run_open_panel = _view_smart_run_open_panel;
758 api.focus_can_cycle = _view_smart_focus_can_cycle;
760 smart = evas_smart_class_new(&api.sc);
763 CRITICAL("Could not create smart class");
768 view = evas_object_smart_add(canvas, smart);
771 ERR("Could not create smart object object for view");
779 _ewk_view_inputmethod_change_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
781 Widget_Data *wd = data;
782 Evas_Object *top = elm_widget_top_get(wd->self);
786 wd->input_method = ELM_WIN_KEYBOARD_ON;
788 wd->input_method = ELM_WIN_KEYBOARD_OFF;
789 elm_win_keyboard_mode_set(top, wd->input_method);
793 _ewk_view_load_started_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
795 _ewk_view_inputmethod_change_cb(data, obj, (void *)(long)EINA_FALSE);
799 _ewk_view_load_finished_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
801 Widget_Data *wd = data;
806 if (wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL)
808 float tz = wd->zoom.current;
809 wd->zoom.current = 0.0;
810 elm_web_zoom_set(wd->self, tz);
815 _ewk_view_viewport_changed_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
817 Widget_Data *wd = data;
819 if (wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL)
821 ewk_view_zoom_set(obj, 1.0, 0, 0);
822 wd->zoom.no_anim = EINA_TRUE;
827 _restore_zoom_mode_timer_cb(void *data)
829 Widget_Data *wd = data;
830 float tz = wd->zoom.current;
831 wd->zoom.timer = NULL;
832 wd->zoom.current = 0.0;
833 wd->zoom.no_anim = EINA_TRUE;
834 elm_web_zoom_set(wd->self, tz);
839 _reset_zoom_timer_cb(void *data)
841 Widget_Data *wd = data;
842 wd->zoom.timer = ecore_timer_add(0.0, _restore_zoom_mode_timer_cb, wd);
843 ewk_view_zoom_set(wd->ewk_view, 1.0, 0, 0);
848 _ewk_view_resized_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
850 Widget_Data *wd = data;
851 if (!(wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL))
854 ecore_timer_del(wd->zoom.timer);
855 wd->zoom.timer = ecore_timer_add(0.5, _reset_zoom_timer_cb, wd);
859 _popup_del_job(void *data)
861 evas_object_del(data);
865 _popup_will_delete(void *data, Evas_Object *obj, void *event_info __UNUSED__)
867 ecore_job_add(_popup_del_job, data);
868 evas_object_smart_callback_del(obj, "popup,willdelete", _popup_will_delete);
872 _popup_item_selected(void *data, Evas_Object *obj, void *event_info __UNUSED__)
874 Evas_Object *view = data;
875 Elm_Object_Item *list_it = elm_list_selected_item_get(obj);
876 const Eina_List *itr, *list = elm_list_items_get(obj);
880 EINA_LIST_FOREACH(list, itr, d)
888 ewk_view_popup_selected_set(view, i);
889 ewk_view_popup_destroy(view);
893 _popup_dismiss_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
895 ewk_view_popup_destroy(data);
899 _ewk_view_popup_create_cb(void *data, Evas_Object *obj, void *event_info)
901 Widget_Data *wd = data;
902 Ewk_Menu *m = event_info;
906 Evas_Object *notify, *list;
912 m2.height = m->height;
913 m2.handled = EINA_FALSE;
914 evas_object_smart_callback_call(wd->self, "popup,create", &m2);
918 notify = elm_notify_add(obj);
919 elm_notify_repeat_events_set(notify, EINA_FALSE);
920 elm_notify_orient_set(notify, ELM_NOTIFY_ORIENT_BOTTOM);
922 list = elm_list_add(obj);
923 elm_list_always_select_mode_set(list, EINA_TRUE);
924 elm_list_bounce_set(list, EINA_FALSE, EINA_FALSE);
925 elm_list_mode_set(list, ELM_LIST_EXPAND);
926 evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
927 evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
928 elm_object_content_set(notify, list);
929 evas_object_show(list);
931 EINA_LIST_FOREACH(m->items, itr, it)
932 elm_list_item_append(list, it->text, NULL, NULL, _popup_item_selected,
936 evas_object_show(notify);
938 evas_object_smart_callback_add(obj, "popup,willdelete", _popup_will_delete,
940 evas_object_smart_callback_add(notify, "block,clicked", _popup_dismiss_cb,
945 _view_smart_callback_proxy_free_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
951 _view_smart_callback_proxy_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
953 Elm_Web_Callback_Proxy_Context *ctxt = data;
955 evas_object_smart_callback_call(ctxt->obj, ctxt->name, event_info);
959 _view_smart_callback_proxy(Evas_Object *view, Evas_Object *parent)
961 const Evas_Smart_Cb_Description **cls_descs, **inst_descs;
962 unsigned int cls_count, inst_count, total;
963 Elm_Web_Callback_Proxy_Context *ctxt;
965 evas_object_smart_callbacks_descriptions_get(view, &cls_descs, &cls_count,
966 &inst_descs, &inst_count);
967 total = cls_count + inst_count;
969 ctxt = malloc(sizeof(Elm_Web_Callback_Proxy_Context) * total);
971 evas_object_event_callback_add(view, EVAS_CALLBACK_FREE,
972 _view_smart_callback_proxy_free_cb, ctxt);
974 for (; cls_count > 0; cls_count--, cls_descs++, ctxt++)
976 const Evas_Smart_Cb_Description *d = *cls_descs;
977 if (!strcmp(d->name, "popup,create"))
979 ctxt->name = d->name;
981 evas_object_smart_callback_add(view, d->name,
982 _view_smart_callback_proxy_cb, ctxt);
985 for (; inst_count > 0; inst_count--, inst_descs++, ctxt++)
987 const Evas_Smart_Cb_Description *d = *inst_descs;
988 ctxt->name = d->name;
990 evas_object_smart_callback_add(view, d->name,
991 _view_smart_callback_proxy_cb, ctxt);
996 _bring_in_anim_cb(void *data, double pos)
998 Widget_Data *wd = data;
999 Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1002 sx = wd->bring_in.start.x;
1003 sy = wd->bring_in.start.y;
1004 rx = (wd->bring_in.end.x - sx) * pos;
1005 ry = (wd->bring_in.end.y - sy) * pos;
1007 ewk_frame_scroll_set(frame, rx + sx, ry + sy);
1011 wd->bring_in.end.x = wd->bring_in.end.y = wd->bring_in.start.x =
1012 wd->bring_in.start.y = 0;
1013 wd->bring_in.animator = NULL;
1020 #ifdef HAVE_ELEMENTARY_WEB
1021 static int _elm_need_web = 0;
1025 _elm_unneed_web(void)
1027 #ifdef HAVE_ELEMENTARY_WEB
1028 if (--_elm_need_web) return;
1038 #ifdef HAVE_ELEMENTARY_WEB
1039 if (_elm_need_web++) return EINA_TRUE;
1048 elm_web_add(Evas_Object *parent)
1054 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1056 wd = calloc(1, sizeof(Widget_Data));
1057 e = evas_object_evas_get(parent);
1060 obj = elm_widget_add(e);
1065 widtype = eina_stringshare_add("web");
1066 elm_widget_type_register(&widtype);
1069 elm_widget_type_set(obj, widtype);
1070 elm_widget_sub_object_add(parent, obj);
1071 elm_widget_theme_hook_set(obj, _theme_hook);
1072 elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
1073 elm_widget_event_hook_set(obj, _event_hook);
1074 elm_widget_data_set(obj, wd);
1075 elm_widget_can_focus_set(obj, EINA_TRUE);
1077 #ifdef HAVE_ELEMENTARY_WEB
1078 wd->ewk_view = _view_add(obj);
1079 ewk_view_setting_user_agent_set(wd->ewk_view, ELM_WEB_USER_AGENT);
1081 wd->input_method = ELM_WIN_KEYBOARD_OFF;
1082 evas_object_smart_callback_add(wd->ewk_view, "inputmethod,changed",
1083 _ewk_view_inputmethod_change_cb, wd);
1084 evas_object_smart_callback_add(wd->ewk_view, "load,started",
1085 _ewk_view_load_started_cb, wd);
1086 evas_object_smart_callback_add(wd->ewk_view, "popup,create",
1087 _ewk_view_popup_create_cb, wd);
1088 evas_object_smart_callback_add(wd->ewk_view, "load,finished",
1089 _ewk_view_load_finished_cb, wd);
1090 evas_object_smart_callback_add(wd->ewk_view, "viewport,changed",
1091 _ewk_view_viewport_changed_cb, wd);
1092 evas_object_smart_callback_add(wd->ewk_view, "view,resized",
1093 _ewk_view_resized_cb, wd);
1095 elm_widget_resize_object_set(obj, wd->ewk_view);
1097 wd->tab_propagate = EINA_FALSE;
1098 wd->inwin_mode = _elm_config->inwin_dialogs_enable;
1099 wd->zoom.min = ewk_view_zoom_range_min_get(wd->ewk_view);
1100 wd->zoom.max = ewk_view_zoom_range_max_get(wd->ewk_view);
1101 wd->zoom.current = 1.0;
1103 _view_smart_callback_proxy(wd->ewk_view, wd->self);
1104 evas_object_smart_callbacks_descriptions_set(obj, _elm_web_callback_names);
1109 wd->label = elm_label_add(obj);
1110 elm_object_text_set(wd->label, "WebKit not supported!");
1111 evas_object_show(wd->label);
1112 elm_widget_resize_object_set(obj, wd->label);
1119 elm_web_webkit_view_get(const Evas_Object *obj)
1121 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1122 #ifdef HAVE_ELEMENTARY_WEB
1123 Widget_Data *wd = elm_widget_data_get(obj);
1124 if (!wd) return NULL;
1125 return wd->ewk_view;
1127 ERR("Elementary not compiled with EWebKit support.");
1133 elm_web_window_create_hook_set(Evas_Object *obj, Elm_Web_Window_Open func, void *data)
1135 ELM_CHECK_WIDTYPE(obj, widtype);
1136 #ifdef HAVE_ELEMENTARY_WEB
1137 Widget_Data *wd = elm_widget_data_get(obj);
1139 wd->hook.window_create = func;
1140 wd->hook.window_create_data = data;
1148 elm_web_dialog_alert_hook_set(Evas_Object *obj, Elm_Web_Dialog_Alert func, void *data)
1150 ELM_CHECK_WIDTYPE(obj, widtype);
1151 #ifdef HAVE_ELEMENTARY_WEB
1152 Widget_Data *wd = elm_widget_data_get(obj);
1154 wd->hook.alert = func;
1155 wd->hook.alert_data = data;
1163 elm_web_dialog_confirm_hook_set(Evas_Object *obj, Elm_Web_Dialog_Confirm func, void *data)
1165 ELM_CHECK_WIDTYPE(obj, widtype);
1166 #ifdef HAVE_ELEMENTARY_WEB
1167 Widget_Data *wd = elm_widget_data_get(obj);
1169 wd->hook.confirm = func;
1170 wd->hook.confirm_data = data;
1178 elm_web_dialog_prompt_hook_set(Evas_Object *obj, Elm_Web_Dialog_Prompt func, void *data)
1180 ELM_CHECK_WIDTYPE(obj, widtype);
1181 #ifdef HAVE_ELEMENTARY_WEB
1182 Widget_Data *wd = elm_widget_data_get(obj);
1184 wd->hook.prompt = func;
1185 wd->hook.prompt_data = data;
1193 elm_web_dialog_file_selector_hook_set(Evas_Object *obj, Elm_Web_Dialog_File_Selector func, void *data)
1195 ELM_CHECK_WIDTYPE(obj, widtype);
1196 #ifdef HAVE_ELEMENTARY_WEB
1197 Widget_Data *wd = elm_widget_data_get(obj);
1199 wd->hook.file_selector = func;
1200 wd->hook.file_selector_data = data;
1208 elm_web_console_message_hook_set(Evas_Object *obj, Elm_Web_Console_Message func, void *data)
1210 ELM_CHECK_WIDTYPE(obj, widtype);
1211 #ifdef HAVE_ELEMENTARY_WEB
1212 Widget_Data *wd = elm_widget_data_get(obj);
1214 wd->hook.console_message = func;
1215 wd->hook.console_message_data = data;
1223 elm_web_useragent_set(Evas_Object *obj, const char *user_agent)
1225 ELM_CHECK_WIDTYPE(obj, widtype);
1226 #ifdef HAVE_ELEMENTARY_WEB
1227 Widget_Data *wd = elm_widget_data_get(obj);
1229 ewk_view_setting_user_agent_set(wd->ewk_view, user_agent);
1236 elm_web_useragent_get(const Evas_Object *obj)
1238 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1239 #ifdef HAVE_ELEMENTARY_WEB
1240 Widget_Data *wd = elm_widget_data_get(obj);
1241 if (!wd) return NULL;
1242 return ewk_view_setting_user_agent_get(wd->ewk_view);
1249 elm_web_tab_propagate_get(const Evas_Object *obj)
1251 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1252 #ifdef HAVE_ELEMENTARY_WEB
1253 Widget_Data *wd = elm_widget_data_get(obj);
1254 if (!wd) return EINA_FALSE;
1255 return wd->tab_propagate;
1262 elm_web_tab_propagate_set(Evas_Object *obj, Eina_Bool propagate)
1264 ELM_CHECK_WIDTYPE(obj, widtype);
1265 #ifdef HAVE_ELEMENTARY_WEB
1266 Widget_Data *wd = elm_widget_data_get(obj);
1268 wd->tab_propagate = propagate;
1275 elm_web_uri_set(Evas_Object *obj, const char *uri)
1277 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1278 #ifdef HAVE_ELEMENTARY_WEB
1279 Widget_Data *wd = elm_widget_data_get(obj);
1280 if (!wd) return EINA_FALSE;
1281 return ewk_view_uri_set(wd->ewk_view, uri);
1289 elm_web_uri_get(const Evas_Object *obj)
1291 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1292 #ifdef HAVE_ELEMENTARY_WEB
1293 Widget_Data *wd = elm_widget_data_get(obj);
1294 if (!wd) return NULL;
1295 return ewk_view_uri_get(wd->ewk_view);
1302 elm_web_title_get(const Evas_Object *obj)
1304 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1305 #ifdef HAVE_ELEMENTARY_WEB
1306 Widget_Data *wd = elm_widget_data_get(obj);
1307 if (!wd) return NULL;
1308 return ewk_view_title_get(wd->ewk_view);
1315 elm_web_bg_color_set(Evas_Object *obj, int r, int g, int b, int a)
1317 ELM_CHECK_WIDTYPE(obj, widtype);
1318 #ifdef HAVE_ELEMENTARY_WEB
1319 Widget_Data *wd = elm_widget_data_get(obj);
1321 ewk_view_bg_color_set(wd->ewk_view, r, g, b, a);
1331 elm_web_bg_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a)
1337 ELM_CHECK_WIDTYPE(obj, widtype);
1338 #ifdef HAVE_ELEMENTARY_WEB
1339 Widget_Data *wd = elm_widget_data_get(obj);
1341 return ewk_view_bg_color_get(wd->ewk_view, r, g, b, a);
1346 elm_web_selection_get(const Evas_Object *obj)
1348 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1349 #ifdef HAVE_ELEMENTARY_WEB
1350 Widget_Data *wd = elm_widget_data_get(obj);
1351 if (!wd) return NULL;
1352 return ewk_view_selection_get(wd->ewk_view);
1359 elm_web_popup_selected_set(Evas_Object *obj, int idx)
1361 ELM_CHECK_WIDTYPE(obj, widtype);
1362 #ifdef HAVE_ELEMENTARY_WEB
1363 Widget_Data *wd = elm_widget_data_get(obj);
1364 ewk_view_popup_selected_set(wd->ewk_view, idx);
1371 elm_web_popup_destroy(Evas_Object *obj)
1373 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1374 #ifdef HAVE_ELEMENTARY_WEB
1375 Widget_Data *wd = elm_widget_data_get(obj);
1376 return ewk_view_popup_destroy(wd->ewk_view);
1383 elm_web_text_search(const Evas_Object *obj, const char *string, Eina_Bool case_sensitive, Eina_Bool forward, Eina_Bool wrap)
1385 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1386 #ifdef HAVE_ELEMENTARY_WEB
1387 Widget_Data *wd = elm_widget_data_get(obj);
1388 if (!wd) return EINA_FALSE;
1389 return ewk_view_text_search
1390 (wd->ewk_view, string, case_sensitive, forward, wrap);
1393 (void)case_sensitive;
1401 elm_web_text_matches_mark(Evas_Object *obj, const char *string, Eina_Bool case_sensitive, Eina_Bool highlight, unsigned int limit)
1403 ELM_CHECK_WIDTYPE(obj, widtype) 0;
1404 #ifdef HAVE_ELEMENTARY_WEB
1405 Widget_Data *wd = elm_widget_data_get(obj);
1407 return ewk_view_text_matches_mark
1408 (wd->ewk_view, string, case_sensitive, highlight, limit);
1411 (void)case_sensitive;
1419 elm_web_text_matches_unmark_all(Evas_Object *obj)
1421 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1422 #ifdef HAVE_ELEMENTARY_WEB
1423 Widget_Data *wd = elm_widget_data_get(obj);
1424 if (!wd) return EINA_FALSE;
1425 return ewk_view_text_matches_unmark_all(wd->ewk_view);
1432 elm_web_text_matches_highlight_set(Evas_Object *obj, Eina_Bool highlight)
1434 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1435 #ifdef HAVE_ELEMENTARY_WEB
1436 Widget_Data *wd = elm_widget_data_get(obj);
1437 if (!wd) return EINA_FALSE;
1438 return ewk_view_text_matches_highlight_set(wd->ewk_view, highlight);
1446 elm_web_text_matches_highlight_get(const Evas_Object *obj)
1448 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1449 #ifdef HAVE_ELEMENTARY_WEB
1450 Widget_Data *wd = elm_widget_data_get(obj);
1451 if (!wd) return EINA_FALSE;
1452 return ewk_view_text_matches_highlight_get(wd->ewk_view);
1459 elm_web_load_progress_get(const Evas_Object *obj)
1461 ELM_CHECK_WIDTYPE(obj, widtype) -1.0;
1462 #ifdef HAVE_ELEMENTARY_WEB
1463 Widget_Data *wd = elm_widget_data_get(obj);
1464 if (!wd) return -1.0;
1465 return ewk_view_load_progress_get(wd->ewk_view);
1472 elm_web_stop(Evas_Object *obj)
1474 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1475 #ifdef HAVE_ELEMENTARY_WEB
1476 Widget_Data *wd = elm_widget_data_get(obj);
1477 if (!wd) return EINA_FALSE;
1478 return ewk_view_stop(wd->ewk_view);
1485 elm_web_reload(Evas_Object *obj)
1487 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1488 #ifdef HAVE_ELEMENTARY_WEB
1489 Widget_Data *wd = elm_widget_data_get(obj);
1490 if (!wd) return EINA_FALSE;
1491 return ewk_view_reload(wd->ewk_view);
1498 elm_web_reload_full(Evas_Object *obj)
1500 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1501 #ifdef HAVE_ELEMENTARY_WEB
1502 Widget_Data *wd = elm_widget_data_get(obj);
1503 if (!wd) return EINA_FALSE;
1504 return ewk_view_reload_full(wd->ewk_view);
1512 elm_web_back(Evas_Object *obj)
1514 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1515 #ifdef HAVE_ELEMENTARY_WEB
1516 Widget_Data *wd = elm_widget_data_get(obj);
1517 if (!wd) return EINA_FALSE;
1518 return ewk_view_back(wd->ewk_view);
1525 elm_web_forward(Evas_Object *obj)
1527 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1528 #ifdef HAVE_ELEMENTARY_WEB
1529 Widget_Data *wd = elm_widget_data_get(obj);
1530 if (!wd) return EINA_FALSE;
1531 return ewk_view_forward(wd->ewk_view);
1538 elm_web_navigate(Evas_Object *obj, int steps)
1540 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1541 #ifdef HAVE_ELEMENTARY_WEB
1542 Widget_Data *wd = elm_widget_data_get(obj);
1543 if (!wd) return EINA_FALSE;
1544 return ewk_view_navigate(wd->ewk_view, steps);
1552 elm_web_back_possible(Evas_Object *obj)
1554 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1555 #ifdef HAVE_ELEMENTARY_WEB
1556 Widget_Data *wd = elm_widget_data_get(obj);
1557 if (!wd) return EINA_FALSE;
1558 return ewk_view_back_possible(wd->ewk_view);
1565 elm_web_forward_possible(Evas_Object *obj)
1567 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1568 #ifdef HAVE_ELEMENTARY_WEB
1569 Widget_Data *wd = elm_widget_data_get(obj);
1570 if (!wd) return EINA_FALSE;
1571 return ewk_view_forward_possible(wd->ewk_view);
1578 elm_web_navigate_possible(Evas_Object *obj, int steps)
1580 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1581 #ifdef HAVE_ELEMENTARY_WEB
1582 Widget_Data *wd = elm_widget_data_get(obj);
1583 if (!wd) return EINA_FALSE;
1584 return ewk_view_navigate_possible(wd->ewk_view, steps);
1591 EINA_DEPRECATED EAPI Eina_Bool
1592 elm_web_history_enable_get(const Evas_Object *obj)
1594 return elm_web_history_enabled_get(obj);
1598 elm_web_history_enabled_get(const Evas_Object *obj)
1600 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1601 #ifdef HAVE_ELEMENTARY_WEB
1602 Widget_Data *wd = elm_widget_data_get(obj);
1603 if (!wd) return EINA_FALSE;
1604 return ewk_view_history_enable_get(wd->ewk_view);
1610 EINA_DEPRECATED EAPI void
1611 elm_web_history_enable_set(Evas_Object *obj, Eina_Bool enable)
1613 elm_web_history_enabled_set(obj, enable);
1617 elm_web_history_enabled_set(Evas_Object *obj, Eina_Bool enable)
1619 ELM_CHECK_WIDTYPE(obj, widtype);
1620 #ifdef HAVE_ELEMENTARY_WEB
1621 Widget_Data *wd = elm_widget_data_get(obj);
1623 ewk_view_history_enable_set(wd->ewk_view, enable);
1629 //EAPI Ewk_History *ewk_view_history_get(const Evas_Object *obj); // TODO:
1632 elm_web_zoom_set(Evas_Object *obj, double zoom)
1634 ELM_CHECK_WIDTYPE(obj, widtype);
1635 #ifdef HAVE_ELEMENTARY_WEB
1636 Widget_Data *wd = elm_widget_data_get(obj);
1639 evas_object_geometry_get(wd->ewk_view, NULL, NULL, &vw, &vh);
1642 if (zoom > wd->zoom.max)
1643 zoom = wd->zoom.max;
1644 else if (zoom < wd->zoom.min)
1645 zoom = wd->zoom.min;
1646 if (zoom == wd->zoom.current) return;
1647 wd->zoom.current = zoom;
1648 if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_MANUAL)
1650 else if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_AUTO_FIT)
1652 Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1653 Evas_Coord fw, fh, pw, ph;
1654 if (!ewk_frame_contents_size_get(frame, &fw, &fh))
1656 z = ewk_frame_page_zoom_get(frame);
1659 if ((fw > 0) && (fh > 0))
1661 ph = (fh * vw) / fw;
1664 pw = (fw * vh) / fh;
1675 else if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_AUTO_FILL)
1677 Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1678 Evas_Coord fw, fh, pw, ph;
1679 if (!ewk_frame_contents_size_get(frame, &fw, &fh))
1681 z = ewk_frame_page_zoom_get(frame);
1684 if ((fw > 0) && (fh > 0))
1686 ph = (fh * vw) / fw;
1689 pw = (fw * vh) / fh;
1700 if (wd->zoom.no_anim)
1701 ewk_view_zoom_set(wd->ewk_view, z, cx, cy);
1703 ewk_view_zoom_animated_set(wd->ewk_view, z, _elm_config->zoom_friction,
1705 wd->zoom.no_anim = EINA_FALSE;
1712 elm_web_zoom_get(const Evas_Object *obj)
1714 ELM_CHECK_WIDTYPE(obj, widtype) -1.0;
1715 #ifdef HAVE_ELEMENTARY_WEB
1716 Widget_Data *wd = elm_widget_data_get(obj);
1717 return wd->zoom.current;
1724 elm_web_zoom_mode_set(Evas_Object *obj, Elm_Web_Zoom_Mode mode)
1726 ELM_CHECK_WIDTYPE(obj, widtype);
1727 #ifdef HAVE_ELEMENTARY_WEB
1728 Widget_Data *wd = elm_widget_data_get(obj);
1730 if (mode >= ELM_WEB_ZOOM_MODE_LAST)
1732 if (mode == wd->zoom.mode)
1734 wd->zoom.mode = mode;
1735 tz = wd->zoom.current;
1736 wd->zoom.current = 0.0;
1737 elm_web_zoom_set(obj, tz);
1743 EAPI Elm_Web_Zoom_Mode
1744 elm_web_zoom_mode_get(const Evas_Object *obj)
1746 ELM_CHECK_WIDTYPE(obj, widtype) ELM_WEB_ZOOM_MODE_LAST;
1747 #ifdef HAVE_ELEMENTARY_WEB
1748 Widget_Data *wd = elm_widget_data_get(obj);
1749 return wd->zoom.mode;
1751 return ELM_WEB_ZOOM_MODE_LAST;
1756 elm_web_region_show(Evas_Object *obj, int x, int y, int w __UNUSED__, int h __UNUSED__)
1758 ELM_CHECK_WIDTYPE(obj, widtype);
1759 #ifdef HAVE_ELEMENTARY_WEB
1760 Widget_Data *wd = elm_widget_data_get(obj);
1761 Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1762 int fw, fh, zw, zh, rx, ry;
1764 ewk_frame_contents_size_get(frame, &fw, &fh);
1765 zoom = ewk_frame_page_zoom_get(frame);
1770 if (wd->bring_in.animator)
1772 ecore_animator_del(wd->bring_in.animator);
1773 wd->bring_in.animator = NULL;
1775 ewk_frame_scroll_set(frame, rx, ry);
1783 elm_web_region_bring_in(Evas_Object *obj, int x, int y, int w __UNUSED__, int h __UNUSED__)
1785 ELM_CHECK_WIDTYPE(obj, widtype);
1786 #ifdef HAVE_ELEMENTARY_WEB
1787 Widget_Data *wd = elm_widget_data_get(obj);
1788 Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1789 int fw, fh, zw, zh, rx, ry, sx, sy;
1791 ewk_frame_contents_size_get(frame, &fw, &fh);
1792 ewk_frame_scroll_pos_get(frame, &sx, &sy);
1793 zoom = ewk_frame_page_zoom_get(frame);
1798 if ((wd->bring_in.end.x == rx) && (wd->bring_in.end.y == ry))
1800 wd->bring_in.start.x = sx;
1801 wd->bring_in.start.y = sy;
1802 wd->bring_in.end.x = rx;
1803 wd->bring_in.end.y = ry;
1804 if (wd->bring_in.animator)
1805 ecore_animator_del(wd->bring_in.animator);
1806 wd->bring_in.animator = ecore_animator_timeline_add(
1807 _elm_config->bring_in_scroll_friction, _bring_in_anim_cb, wd);
1815 elm_web_inwin_mode_set(Evas_Object *obj, Eina_Bool value)
1817 ELM_CHECK_WIDTYPE(obj, widtype);
1818 #ifdef HAVE_ELEMENTARY_WEB
1819 Widget_Data *wd = elm_widget_data_get(obj);
1821 wd->inwin_mode = value;
1828 elm_web_inwin_mode_get(const Evas_Object *obj)
1830 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1831 #ifdef HAVE_ELEMENTARY_WEB
1832 Widget_Data *wd = elm_widget_data_get(obj);
1834 return wd->inwin_mode;
1841 elm_web_window_features_ref(Elm_Web_Window_Features *wf)
1843 #ifdef HAVE_ELEMENTARY_WEB
1844 ewk_window_features_ref((Ewk_Window_Features *)wf);
1851 elm_web_window_features_unref(Elm_Web_Window_Features *wf)
1853 #ifdef HAVE_ELEMENTARY_WEB
1854 ewk_window_features_unref((Ewk_Window_Features *)wf);
1861 elm_web_window_features_bool_property_get(const Elm_Web_Window_Features *wf, Eina_Bool *toolbar_visible, Eina_Bool *statusbar_visible, Eina_Bool *scrollbars_visible, Eina_Bool *menubar_visible, Eina_Bool *locationbar_visible, Eina_Bool *fullscreen)
1863 #ifdef HAVE_ELEMENTARY_WEB
1864 ewk_window_features_bool_property_get((const Ewk_Window_Features *)wf,
1865 toolbar_visible, statusbar_visible,
1866 scrollbars_visible, menubar_visible,
1867 locationbar_visible, fullscreen);
1870 (void)toolbar_visible;
1871 (void)statusbar_visible;
1872 (void)scrollbars_visible;
1873 (void)menubar_visible;
1874 (void)locationbar_visible;
1880 elm_web_window_features_int_property_get(const Elm_Web_Window_Features *wf, int *x, int *y, int *w, int *h)
1882 #ifdef HAVE_ELEMENTARY_WEB
1883 ewk_window_features_int_property_get((const Ewk_Window_Features *)wf,
1894 // 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!