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", "" },
141 #ifdef HAVE_ELEMENTARY_WEB
143 _webkit_theme_find(const Eina_List *list)
148 EINA_LIST_FOREACH(list, l, th)
150 char *path = elm_theme_list_item_path_get(th, NULL);
152 if (edje_file_group_exists(path, "webkit/base"))
162 _theme_hook(Evas_Object *obj)
164 #ifdef HAVE_ELEMENTARY_WEB
165 Elm_Theme *theme = elm_object_theme_get(obj);
166 Widget_Data *wd = elm_widget_data_get(obj);
167 const Eina_List *themes;
168 char *view_theme = NULL;
170 themes = elm_theme_overlay_list_get(theme);
171 view_theme = _webkit_theme_find(themes);
172 if (view_theme) goto set;
174 themes = elm_theme_list_get(theme);
175 view_theme = _webkit_theme_find(themes);
176 if (view_theme) goto set;
178 themes = elm_theme_extension_list_get(theme);
179 view_theme = _webkit_theme_find(themes);
184 ewk_view_theme_set(wd->ewk_view, view_theme);
188 ewk_view_theme_set(wd->ewk_view, WEBKIT_DATADIR"/themes/default.edj");
195 _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
197 #ifdef HAVE_ELEMENTARY_WEB
198 Widget_Data *wd = elm_widget_data_get(obj);
199 Evas_Object *top = elm_widget_top_get(obj);
203 if (elm_object_focus_get(obj))
205 evas_object_focus_set(wd->ewk_view, EINA_TRUE);
206 if (top) elm_win_keyboard_mode_set(top, wd->input_method);
210 evas_object_focus_set(wd->ewk_view, EINA_FALSE);
211 if (top) elm_win_keyboard_mode_set(top, ELM_WIN_KEYBOARD_OFF);
219 _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info)
221 #ifdef HAVE_ELEMENTARY_WEB
222 Evas_Event_Key_Down *ev = event_info;
223 Widget_Data *wd = elm_widget_data_get(obj);
225 if (!wd) return EINA_FALSE;
226 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
227 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
228 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
230 if ((!strcmp(ev->keyname, "Tab")) && (!wd->tab_propagate))
232 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
245 #ifdef HAVE_ELEMENTARY_WEB
247 _view_pan_animator(void *data)
249 View_Smart_Data *sd = data;
250 Evas_Coord x, y, dx, dy;
252 evas_pointer_canvas_xy_get(sd->base.base.evas, &x, &y);
254 dx = sd->mouse.x - x;
255 dy = sd->mouse.y - y;
257 if ((dx == 0) && (dy == 0))
260 ewk_frame_scroll_add(sd->base.main_frame, dx, dy);
270 _view_smart_add(Evas_Object *obj)
274 sd = calloc(1, sizeof(View_Smart_Data));
275 evas_object_smart_data_set(obj, sd);
277 _parent_sc.sc.add(obj);
279 ewk_view_history_enable_set(obj, EINA_TRUE);
280 ewk_history_limit_set(ewk_view_history_get(obj), 100);
281 // TODO: auto toggle between smooth/nearest during bring-in animations
282 //ewk_view_zoom_weak_smooth_scale_set(obj, EINA_TRUE);
286 _view_smart_del(Evas_Object *obj)
290 sd = evas_object_smart_data_get(obj);
292 if (sd->mouse.pan_anim)
293 ecore_animator_del(sd->mouse.pan_anim);
295 _parent_sc.sc.del(obj);
299 _view_longpress_timer(void *data)
301 View_Smart_Data *sd = data;
303 sd->mouse.move_count = 0;
304 sd->mouse.longpress_timer = NULL;
305 return ECORE_CALLBACK_CANCEL;
309 _view_smart_mouse_down(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Down *event)
311 // TODO: mimic elm_scroller and like
312 // TODO-minor: offer hook?
313 View_Smart_Data *sd = (View_Smart_Data *)esd;
315 if (event->button != 1)
316 return _parent_sc.mouse_down(esd, event);
318 sd->mouse.pan_anim = ecore_animator_add(_view_pan_animator, sd);
319 sd->mouse.longpress_timer = ecore_timer_add(_elm_config->longpress_timeout, _view_longpress_timer, sd);
320 sd->mouse.move_count = 1;
321 sd->mouse.x = event->canvas.x;
322 sd->mouse.y = event->canvas.y;
323 sd->mouse.event = *event;
329 _view_smart_mouse_up(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Up *event)
331 // TODO: mimic elm_scroller and like
332 // TODO-minor: offer hook?
333 View_Smart_Data *sd = (View_Smart_Data *)esd;
335 if (sd->mouse.pan_anim)
337 ecore_animator_del(sd->mouse.pan_anim);
338 sd->mouse.pan_anim = NULL;
340 if (sd->mouse.longpress_timer)
341 _parent_sc.mouse_down(esd, &sd->mouse.event);
346 if (sd->mouse.longpress_timer)
348 ecore_timer_del(sd->mouse.longpress_timer);
349 sd->mouse.longpress_timer = NULL;
352 sd->mouse.move_count = 0;
353 return _parent_sc.mouse_up(esd, event);
357 _view_smart_mouse_move(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Move *event)
359 // TODO: mimic elm_scroller and like
360 // TODO-minor: offer hook?
361 View_Smart_Data *sd = (View_Smart_Data *)esd;
362 sd->mouse.move_count++;
364 if (sd->mouse.longpress_timer &&
365 (((sd->mouse.x ^ sd->mouse.event.canvas.x) |
366 (sd->mouse.y ^ sd->mouse.event.canvas.y)) & (~0x07)))
368 ecore_timer_del(sd->mouse.longpress_timer);
369 sd->mouse.longpress_timer = NULL;
372 if (sd->mouse.pan_anim)
377 return _parent_sc.mouse_move(esd, event);
381 _view_smart_window_create(Ewk_View_Smart_Data *sd, Eina_Bool javascript, const Ewk_Window_Features *window_features)
384 Evas_Object *obj = evas_object_smart_parent_get(sd->self);
385 Widget_Data *wd = elm_widget_data_get(obj);
387 if (!wd->hook.window_create) return NULL;
388 new = wd->hook.window_create(wd->hook.window_create_data, obj, javascript,
389 (const Elm_Web_Window_Features *)window_features);
390 if (new) return elm_web_webkit_view_get(new);
396 _view_smart_window_close(Ewk_View_Smart_Data *sd)
398 Evas_Object *obj = evas_object_smart_parent_get(sd->self);
399 evas_object_smart_callback_call(obj, "windows,close,request", NULL);
403 _bt_close(void *data, Evas_Object *obj, void *event_info __UNUSED__)
405 Dialog_Data *d = data;
407 *d->response = (obj == d->bt_ok);
408 if ((d->type == DIALOG_PROMPT) && (*d->response == EINA_TRUE))
409 *d->entry_value = strdup(elm_entry_entry_get(d->entry));
410 evas_object_del(d->dialog);
414 _file_sel_done(void *data, Evas_Object *obj __UNUSED__, void *event_info)
416 Dialog_Data *d = data;
419 *d->selected_files = eina_list_append(NULL, strdup(event_info));
420 *d->response = EINA_TRUE;
423 *d->response = EINA_FALSE;
424 evas_object_del(d->dialog);
429 _dialog_new(Evas_Object *parent)
432 Widget_Data *wd = elm_widget_data_get(parent);
434 d = calloc(1, sizeof(Dialog_Data));
437 if (!parent || wd->inwin_mode)
441 d->dialog = elm_win_add(NULL, "elm-web-popup", ELM_WIN_DIALOG_BASIC);
442 evas_object_smart_callback_add(d->dialog, "delete,request",
445 bg = elm_bg_add(d->dialog);
446 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND,
448 elm_win_resize_object_add(d->dialog, bg);
449 evas_object_show(bg);
451 d->box = elm_box_add(d->dialog);
452 evas_object_size_hint_weight_set(d->box, EVAS_HINT_EXPAND,
454 elm_win_resize_object_add(d->dialog, d->box);
455 evas_object_show(d->box);
459 Evas_Object *win = elm_widget_top_get(parent);
460 d->dialog = elm_win_inwin_add(win);
461 elm_object_style_set(d->dialog, "minimal");
462 evas_object_size_hint_weight_set(d->dialog, EVAS_HINT_EXPAND,
465 d->box = elm_box_add(win);
466 evas_object_size_hint_weight_set(d->box, EVAS_HINT_EXPAND,
468 elm_win_inwin_content_set(d->dialog, d->box);
469 evas_object_show(d->box);
476 _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)
478 EINA_SAFETY_ON_TRUE_RETURN_VAL((type != DIALOG_PROMPT) && (!!default_entry_value), EINA_FALSE);
479 EINA_SAFETY_ON_TRUE_RETURN_VAL((type != DIALOG_PROMPT) && (!!entry_value), EINA_FALSE);
481 Dialog_Data *dialog_data = _dialog_new(evas_object_smart_parent_get(parent));
484 if (type != DIALOG_FILE_SELECTOR)
486 lb = elm_label_add(dialog_data->box);
487 elm_object_text_set(lb, message);
488 elm_box_pack_end(dialog_data->box, lb);
489 evas_object_show(lb);
492 dialog_data->type = type;
493 dialog_data->response = response;
494 dialog_data->entry_value = entry_value;
495 dialog_data->selected_files = selected_filenames;
497 if (type == DIALOG_ALERT)
499 dialog_data->bt_ok = elm_button_add(dialog_data->box);
500 elm_object_text_set(dialog_data->bt_ok, "Close");
501 elm_box_pack_end(dialog_data->box, dialog_data->bt_ok);
502 evas_object_size_hint_align_set(dialog_data->bt_ok, EVAS_HINT_FILL, EVAS_HINT_FILL);
503 evas_object_smart_callback_add(dialog_data->bt_ok, "clicked", _bt_close, dialog_data);
504 evas_object_show(dialog_data->bt_ok);
506 else if (type == DIALOG_FILE_SELECTOR)
508 dialog_data->file_sel = elm_fileselector_add(dialog_data->dialog);
509 evas_object_size_hint_weight_set(dialog_data->file_sel,
510 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
511 evas_object_size_hint_align_set(dialog_data->file_sel, EVAS_HINT_FILL,
513 elm_box_pack_end(dialog_data->box, dialog_data->file_sel);
514 evas_object_show(dialog_data->file_sel);
516 elm_fileselector_path_set(dialog_data->file_sel, ".");
517 elm_fileselector_is_save_set(dialog_data->file_sel, EINA_FALSE);
518 elm_fileselector_folder_only_set(dialog_data->file_sel, EINA_FALSE);
519 elm_fileselector_buttons_ok_cancel_set(dialog_data->file_sel,
521 elm_fileselector_expandable_set(dialog_data->file_sel, EINA_FALSE);
522 evas_object_smart_callback_add(dialog_data->file_sel, "done",
523 _file_sel_done, dialog_data);
524 // fileselector can't set it's minimum size correctly
525 evas_object_size_hint_min_set(dialog_data->file_sel, 300, 400);
529 if (type == DIALOG_PROMPT)
531 dialog_data->entry = elm_entry_add(dialog_data->box);
532 elm_entry_single_line_set(dialog_data->entry, EINA_TRUE);
533 elm_entry_scrollable_set(dialog_data->entry, EINA_TRUE);
534 elm_entry_entry_set(dialog_data->entry, default_entry_value);
535 evas_object_size_hint_align_set(dialog_data->entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
536 evas_object_size_hint_weight_set(dialog_data->entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
537 elm_box_pack_end(dialog_data->box, dialog_data->entry);
538 evas_object_show(dialog_data->entry);
541 if (type == DIALOG_PROMPT || type == DIALOG_CONFIRM)
543 Evas_Object *bx_h = elm_box_add(dialog_data->box);
544 elm_box_horizontal_set(bx_h, 1);
545 elm_box_pack_end(dialog_data->box, bx_h);
546 evas_object_size_hint_weight_set(bx_h, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
547 evas_object_size_hint_align_set(bx_h, EVAS_HINT_FILL, EVAS_HINT_FILL);
548 evas_object_show(bx_h);
550 dialog_data->bt_cancel = elm_button_add(bx_h);
551 elm_object_text_set(dialog_data->bt_cancel, "Cancel");
552 elm_box_pack_end(bx_h, dialog_data->bt_cancel);
553 evas_object_size_hint_weight_set(dialog_data->bt_cancel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
554 evas_object_size_hint_align_set(dialog_data->bt_cancel, EVAS_HINT_FILL, EVAS_HINT_FILL);
555 evas_object_smart_callback_add(dialog_data->bt_cancel, "clicked", _bt_close, dialog_data);
556 evas_object_show(dialog_data->bt_cancel);
558 dialog_data->bt_ok = elm_button_add(bx_h);
559 elm_object_text_set(dialog_data->bt_ok, "Ok");
560 elm_box_pack_end(bx_h, dialog_data->bt_ok);
561 evas_object_size_hint_weight_set(dialog_data->bt_ok, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
562 evas_object_size_hint_align_set(dialog_data->bt_ok, EVAS_HINT_FILL, EVAS_HINT_FILL);
563 evas_object_smart_callback_add(dialog_data->bt_ok, "clicked", _bt_close, dialog_data);
564 evas_object_show(dialog_data->bt_ok);
570 evas_object_show(dialog_data->dialog);
572 return dialog_data->dialog;
576 _dialog_del_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
578 ecore_main_loop_quit();
582 _exec_dialog(Evas_Object *dialog)
584 evas_object_event_callback_add(dialog, EVAS_CALLBACK_DEL, _dialog_del_cb,
586 ecore_main_loop_begin();
589 /* called by ewk_view when javascript called alert()
593 _view_smart_run_javascript_alert(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, const char *message)
595 View_Smart_Data *sd = (View_Smart_Data *)esd;
596 Evas_Object *view = sd->base.self;
597 Evas_Object *obj = evas_object_smart_parent_get(view);
598 Evas_Object *diag = NULL;
599 Widget_Data *wd = elm_widget_data_get(obj);
600 Eina_Bool response = EINA_FALSE;
603 diag = wd->hook.alert(wd->hook.alert_data, obj, message);
605 diag = _run_dialog(view, DIALOG_ALERT, message, NULL, NULL, EINA_FALSE,
606 NULL, NULL, &response);
607 if (diag) _exec_dialog(diag);
610 /* called by ewk_view when javascript called confirm()
614 _view_smart_run_javascript_confirm(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, const char *message)
616 View_Smart_Data *sd = (View_Smart_Data *)esd;
617 Evas_Object *view = sd->base.self;
618 Evas_Object *obj = evas_object_smart_parent_get(view);
619 Evas_Object *diag = NULL;
620 Widget_Data *wd = elm_widget_data_get(obj);
621 Eina_Bool response = EINA_FALSE;
623 if (wd->hook.confirm)
624 diag = wd->hook.confirm(wd->hook.confirm_data, obj, message, &response);
626 diag = _run_dialog(view, DIALOG_CONFIRM, message, NULL, NULL, EINA_FALSE,
627 NULL, NULL, &response);
628 if (diag) _exec_dialog(diag);
632 /* called by ewk_view when javascript called confirm()
636 _view_smart_run_javascript_prompt(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, const char *message, const char *default_value, char **value)
638 View_Smart_Data *sd = (View_Smart_Data *)esd;
639 Evas_Object *view = sd->base.self;
640 Evas_Object *obj = evas_object_smart_parent_get(view);
641 Evas_Object *diag = NULL;
642 Widget_Data *wd = elm_widget_data_get(obj);
643 Eina_Bool response = EINA_FALSE;
646 diag = wd->hook.prompt(wd->hook.prompt_data, obj, message, default_value,
649 diag = _run_dialog(view, DIALOG_PROMPT, message, default_value, value,
650 EINA_FALSE, NULL, NULL, &response);
651 if (diag) _exec_dialog(diag);
659 _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)
661 View_Smart_Data *sd = (View_Smart_Data *)esd;
662 Evas_Object *view = sd->base.self;
663 Evas_Object *obj = evas_object_smart_parent_get(view);
664 Evas_Object *diag = NULL;
665 Widget_Data *wd = elm_widget_data_get(obj);
666 Eina_Bool response = EINA_FALSE;
668 if (wd->hook.file_selector)
669 diag = wd->hook.file_selector(wd->hook.file_selector_data, obj,
670 allows_multiple_files, accept_types,
671 selected_filenames, &response);
673 diag = _run_dialog(view, DIALOG_FILE_SELECTOR, NULL, NULL, NULL,
674 allows_multiple_files, accept_types, selected_filenames,
676 if (diag) _exec_dialog(diag);
682 _view_smart_add_console_message(Ewk_View_Smart_Data *esd, const char *message, unsigned int line_number, const char *source_id)
684 Evas_Object *obj = evas_object_smart_parent_get(esd->self);
685 Widget_Data *wd = elm_widget_data_get(obj);
687 if (wd->hook.console_message)
688 wd->hook.console_message(wd->hook.console_message_data, obj, message,
689 line_number, source_id);
693 _view_smart_focus_can_cycle(Ewk_View_Smart_Data *sd, Ewk_Focus_Direction direction)
695 Evas_Object *obj = evas_object_smart_parent_get(sd->self);
696 Elm_Focus_Direction dir;
700 case EWK_FOCUS_DIRECTION_FORWARD:
701 dir = ELM_FOCUS_NEXT;
703 case EWK_FOCUS_DIRECTION_BACKWARD:
704 dir = ELM_FOCUS_PREVIOUS;
710 elm_widget_focus_cycle(elm_widget_parent_get(obj), dir);
716 * Creates a new view object given the parent.
718 * @param parent object to use as parent.
720 * @return newly added Evas_Object or @c NULL on errors.
723 _view_add(Evas_Object *parent)
725 static Evas_Smart *smart = NULL;
726 Evas *canvas = evas_object_evas_get(parent);
731 static Ewk_View_Smart_Class api = EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("EWK_View_Elementary");
733 #ifndef TILED_BACKING_STORE
734 ewk_view_single_smart_set(&api);
736 ewk_view_tiled_smart_set(&api);
741 // TODO: check every api method and provide overrides with hooks!
742 // TODO: hooks should provide extension points
743 // TODO: extension should have some kind of "default implementation",
744 // TODO: that can be replaced or controlled by hooks.
745 // TODO: ie: run_javascript_alert() should present an elm_win
746 // TODO: by default, but user could override it to show as inwin.
747 api.sc.add = _view_smart_add;
748 api.sc.del = _view_smart_del;
749 //api.sc.calculate = _view_smart_calculate;
750 api.mouse_down = _view_smart_mouse_down;
751 api.mouse_up = _view_smart_mouse_up;
752 api.mouse_move = _view_smart_mouse_move;
753 api.add_console_message = _view_smart_add_console_message;
754 api.window_create = _view_smart_window_create;
755 api.window_close = _view_smart_window_close;
756 api.run_javascript_alert = _view_smart_run_javascript_alert;
757 api.run_javascript_confirm = _view_smart_run_javascript_confirm;
758 api.run_javascript_prompt = _view_smart_run_javascript_prompt;
759 api.run_open_panel = _view_smart_run_open_panel;
760 api.focus_can_cycle = _view_smart_focus_can_cycle;
762 smart = evas_smart_class_new(&api.sc);
765 CRITICAL("Could not create smart class");
770 view = evas_object_smart_add(canvas, smart);
773 ERR("Could not create smart object object for view");
781 _ewk_view_inputmethod_change_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
783 Widget_Data *wd = data;
784 Evas_Object *top = elm_widget_top_get(wd->self);
788 wd->input_method = ELM_WIN_KEYBOARD_ON;
790 wd->input_method = ELM_WIN_KEYBOARD_OFF;
791 elm_win_keyboard_mode_set(top, wd->input_method);
795 _ewk_view_load_started_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
797 _ewk_view_inputmethod_change_cb(data, obj, (void *)(long)EINA_FALSE);
801 _ewk_view_load_finished_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
803 Widget_Data *wd = data;
808 if (wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL)
810 float tz = wd->zoom.current;
811 wd->zoom.current = 0.0;
812 elm_web_zoom_set(wd->self, tz);
817 _ewk_view_viewport_changed_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
819 Widget_Data *wd = data;
821 if (wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL)
823 ewk_view_zoom_set(obj, 1.0, 0, 0);
824 wd->zoom.no_anim = EINA_TRUE;
829 _restore_zoom_mode_timer_cb(void *data)
831 Widget_Data *wd = data;
832 float tz = wd->zoom.current;
833 wd->zoom.timer = NULL;
834 wd->zoom.current = 0.0;
835 wd->zoom.no_anim = EINA_TRUE;
836 elm_web_zoom_set(wd->self, tz);
841 _reset_zoom_timer_cb(void *data)
843 Widget_Data *wd = data;
844 wd->zoom.timer = ecore_timer_add(0.0, _restore_zoom_mode_timer_cb, wd);
845 ewk_view_zoom_set(wd->ewk_view, 1.0, 0, 0);
850 _ewk_view_resized_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
852 Widget_Data *wd = data;
853 if (!(wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL))
856 ecore_timer_del(wd->zoom.timer);
857 wd->zoom.timer = ecore_timer_add(0.5, _reset_zoom_timer_cb, wd);
861 _popup_del_job(void *data)
863 evas_object_del(data);
867 _popup_will_delete(void *data, Evas_Object *obj, void *event_info __UNUSED__)
869 ecore_job_add(_popup_del_job, data);
870 evas_object_smart_callback_del(obj, "popup,willdelete", _popup_will_delete);
874 _popup_item_selected(void *data, Evas_Object *obj, void *event_info __UNUSED__)
876 Evas_Object *view = data;
877 Elm_Object_Item *list_it = elm_list_selected_item_get(obj);
878 const Eina_List *itr, *list = elm_list_items_get(obj);
882 EINA_LIST_FOREACH(list, itr, d)
890 ewk_view_popup_selected_set(view, i);
891 ewk_view_popup_destroy(view);
895 _popup_dismiss_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
897 ewk_view_popup_destroy(data);
901 _ewk_view_popup_create_cb(void *data, Evas_Object *obj, void *event_info)
903 Widget_Data *wd = data;
904 Ewk_Menu *m = event_info;
908 Evas_Object *notify, *list;
914 m2.height = m->height;
915 m2.handled = EINA_FALSE;
916 evas_object_smart_callback_call(wd->self, "popup,create", &m2);
920 notify = elm_notify_add(obj);
921 elm_notify_allow_events_set(notify, EINA_FALSE);
922 elm_notify_orient_set(notify, ELM_NOTIFY_ORIENT_BOTTOM);
924 list = elm_list_add(obj);
925 elm_list_always_select_mode_set(list, EINA_TRUE);
926 elm_list_bounce_set(list, EINA_FALSE, EINA_FALSE);
927 elm_list_mode_set(list, ELM_LIST_EXPAND);
928 evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
929 evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
930 elm_object_content_set(notify, list);
931 evas_object_show(list);
933 EINA_LIST_FOREACH(m->items, itr, it)
934 elm_list_item_append(list, it->text, NULL, NULL, _popup_item_selected,
938 evas_object_show(notify);
940 evas_object_smart_callback_add(obj, "popup,willdelete", _popup_will_delete,
942 evas_object_smart_callback_add(notify, "block,clicked", _popup_dismiss_cb,
947 _view_smart_callback_proxy_free_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
953 _view_smart_callback_proxy_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
955 Elm_Web_Callback_Proxy_Context *ctxt = data;
957 evas_object_smart_callback_call(ctxt->obj, ctxt->name, event_info);
961 _view_smart_callback_proxy(Evas_Object *view, Evas_Object *parent)
963 const Evas_Smart_Cb_Description **cls_descs, **inst_descs;
964 unsigned int cls_count, inst_count, total;
965 Elm_Web_Callback_Proxy_Context *ctxt;
967 evas_object_smart_callbacks_descriptions_get(view, &cls_descs, &cls_count,
968 &inst_descs, &inst_count);
969 total = cls_count + inst_count;
971 ctxt = malloc(sizeof(Elm_Web_Callback_Proxy_Context) * total);
973 evas_object_event_callback_add(view, EVAS_CALLBACK_FREE,
974 _view_smart_callback_proxy_free_cb, ctxt);
976 for (; cls_count > 0; cls_count--, cls_descs++, ctxt++)
978 const Evas_Smart_Cb_Description *d = *cls_descs;
979 if (!strcmp(d->name, "popup,create"))
981 ctxt->name = d->name;
983 evas_object_smart_callback_add(view, d->name,
984 _view_smart_callback_proxy_cb, ctxt);
987 for (; inst_count > 0; inst_count--, inst_descs++, ctxt++)
989 const Evas_Smart_Cb_Description *d = *inst_descs;
990 ctxt->name = d->name;
992 evas_object_smart_callback_add(view, d->name,
993 _view_smart_callback_proxy_cb, ctxt);
998 _bring_in_anim_cb(void *data, double pos)
1000 Widget_Data *wd = data;
1001 Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1004 sx = wd->bring_in.start.x;
1005 sy = wd->bring_in.start.y;
1006 rx = (wd->bring_in.end.x - sx) * pos;
1007 ry = (wd->bring_in.end.y - sy) * pos;
1009 ewk_frame_scroll_set(frame, rx + sx, ry + sy);
1013 wd->bring_in.end.x = wd->bring_in.end.y = wd->bring_in.start.x =
1014 wd->bring_in.start.y = 0;
1015 wd->bring_in.animator = NULL;
1022 #ifdef HAVE_ELEMENTARY_WEB
1023 static int _elm_need_web = 0;
1027 _elm_unneed_web(void)
1029 #ifdef HAVE_ELEMENTARY_WEB
1030 if (--_elm_need_web) return;
1040 #ifdef HAVE_ELEMENTARY_WEB
1041 if (_elm_need_web++) return EINA_TRUE;
1050 elm_web_add(Evas_Object *parent)
1056 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1058 wd = calloc(1, sizeof(Widget_Data));
1059 e = evas_object_evas_get(parent);
1062 obj = elm_widget_add(e);
1067 widtype = eina_stringshare_add("web");
1068 elm_widget_type_register(&widtype);
1071 elm_widget_type_set(obj, widtype);
1072 elm_widget_sub_object_add(parent, obj);
1073 elm_widget_theme_hook_set(obj, _theme_hook);
1074 elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
1075 elm_widget_event_hook_set(obj, _event_hook);
1076 elm_widget_data_set(obj, wd);
1077 elm_widget_can_focus_set(obj, EINA_TRUE);
1079 #ifdef HAVE_ELEMENTARY_WEB
1080 wd->ewk_view = _view_add(obj);
1081 ewk_view_setting_user_agent_set(wd->ewk_view, ELM_WEB_USER_AGENT);
1083 wd->input_method = ELM_WIN_KEYBOARD_OFF;
1084 evas_object_smart_callback_add(wd->ewk_view, "inputmethod,changed",
1085 _ewk_view_inputmethod_change_cb, wd);
1086 evas_object_smart_callback_add(wd->ewk_view, "load,started",
1087 _ewk_view_load_started_cb, wd);
1088 evas_object_smart_callback_add(wd->ewk_view, "popup,create",
1089 _ewk_view_popup_create_cb, wd);
1090 evas_object_smart_callback_add(wd->ewk_view, "load,finished",
1091 _ewk_view_load_finished_cb, wd);
1092 evas_object_smart_callback_add(wd->ewk_view, "viewport,changed",
1093 _ewk_view_viewport_changed_cb, wd);
1094 evas_object_smart_callback_add(wd->ewk_view, "view,resized",
1095 _ewk_view_resized_cb, wd);
1097 elm_widget_resize_object_set(obj, wd->ewk_view);
1099 wd->tab_propagate = EINA_FALSE;
1100 wd->inwin_mode = _elm_config->inwin_dialogs_enable;
1101 wd->zoom.min = ewk_view_zoom_range_min_get(wd->ewk_view);
1102 wd->zoom.max = ewk_view_zoom_range_max_get(wd->ewk_view);
1103 wd->zoom.current = 1.0;
1105 _view_smart_callback_proxy(wd->ewk_view, wd->self);
1106 evas_object_smart_callbacks_descriptions_set(obj, _elm_web_callback_names);
1111 wd->label = elm_label_add(obj);
1112 elm_object_text_set(wd->label, "WebKit not supported!");
1113 evas_object_show(wd->label);
1114 elm_widget_resize_object_set(obj, wd->label);
1121 elm_web_webkit_view_get(const Evas_Object *obj)
1123 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1124 #ifdef HAVE_ELEMENTARY_WEB
1125 Widget_Data *wd = elm_widget_data_get(obj);
1126 if (!wd) return NULL;
1127 return wd->ewk_view;
1129 ERR("Elementary not compiled with EWebKit support.");
1135 elm_web_window_create_hook_set(Evas_Object *obj, Elm_Web_Window_Open func, void *data)
1137 ELM_CHECK_WIDTYPE(obj, widtype);
1138 #ifdef HAVE_ELEMENTARY_WEB
1139 Widget_Data *wd = elm_widget_data_get(obj);
1141 wd->hook.window_create = func;
1142 wd->hook.window_create_data = data;
1150 elm_web_dialog_alert_hook_set(Evas_Object *obj, Elm_Web_Dialog_Alert func, void *data)
1152 ELM_CHECK_WIDTYPE(obj, widtype);
1153 #ifdef HAVE_ELEMENTARY_WEB
1154 Widget_Data *wd = elm_widget_data_get(obj);
1156 wd->hook.alert = func;
1157 wd->hook.alert_data = data;
1165 elm_web_dialog_confirm_hook_set(Evas_Object *obj, Elm_Web_Dialog_Confirm func, void *data)
1167 ELM_CHECK_WIDTYPE(obj, widtype);
1168 #ifdef HAVE_ELEMENTARY_WEB
1169 Widget_Data *wd = elm_widget_data_get(obj);
1171 wd->hook.confirm = func;
1172 wd->hook.confirm_data = data;
1180 elm_web_dialog_prompt_hook_set(Evas_Object *obj, Elm_Web_Dialog_Prompt func, void *data)
1182 ELM_CHECK_WIDTYPE(obj, widtype);
1183 #ifdef HAVE_ELEMENTARY_WEB
1184 Widget_Data *wd = elm_widget_data_get(obj);
1186 wd->hook.prompt = func;
1187 wd->hook.prompt_data = data;
1195 elm_web_dialog_file_selector_hook_set(Evas_Object *obj, Elm_Web_Dialog_File_Selector func, void *data)
1197 ELM_CHECK_WIDTYPE(obj, widtype);
1198 #ifdef HAVE_ELEMENTARY_WEB
1199 Widget_Data *wd = elm_widget_data_get(obj);
1201 wd->hook.file_selector = func;
1202 wd->hook.file_selector_data = data;
1210 elm_web_console_message_hook_set(Evas_Object *obj, Elm_Web_Console_Message func, void *data)
1212 ELM_CHECK_WIDTYPE(obj, widtype);
1213 #ifdef HAVE_ELEMENTARY_WEB
1214 Widget_Data *wd = elm_widget_data_get(obj);
1216 wd->hook.console_message = func;
1217 wd->hook.console_message_data = data;
1225 elm_web_useragent_set(Evas_Object *obj, const char *user_agent)
1227 ELM_CHECK_WIDTYPE(obj, widtype);
1228 #ifdef HAVE_ELEMENTARY_WEB
1229 Widget_Data *wd = elm_widget_data_get(obj);
1231 ewk_view_setting_user_agent_set(wd->ewk_view, user_agent);
1238 elm_web_useragent_get(const Evas_Object *obj)
1240 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1241 #ifdef HAVE_ELEMENTARY_WEB
1242 Widget_Data *wd = elm_widget_data_get(obj);
1243 if (!wd) return NULL;
1244 return ewk_view_setting_user_agent_get(wd->ewk_view);
1251 elm_web_tab_propagate_get(const Evas_Object *obj)
1253 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1254 #ifdef HAVE_ELEMENTARY_WEB
1255 Widget_Data *wd = elm_widget_data_get(obj);
1256 if (!wd) return EINA_FALSE;
1257 return wd->tab_propagate;
1264 elm_web_tab_propagate_set(Evas_Object *obj, Eina_Bool propagate)
1266 ELM_CHECK_WIDTYPE(obj, widtype);
1267 #ifdef HAVE_ELEMENTARY_WEB
1268 Widget_Data *wd = elm_widget_data_get(obj);
1270 wd->tab_propagate = propagate;
1277 elm_web_uri_set(Evas_Object *obj, const char *uri)
1279 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1280 #ifdef HAVE_ELEMENTARY_WEB
1281 Widget_Data *wd = elm_widget_data_get(obj);
1282 if (!wd) return EINA_FALSE;
1283 return ewk_view_uri_set(wd->ewk_view, uri);
1291 elm_web_uri_get(const Evas_Object *obj)
1293 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1294 #ifdef HAVE_ELEMENTARY_WEB
1295 Widget_Data *wd = elm_widget_data_get(obj);
1296 if (!wd) return NULL;
1297 return ewk_view_uri_get(wd->ewk_view);
1304 elm_web_title_get(const Evas_Object *obj)
1306 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1307 #ifdef HAVE_ELEMENTARY_WEB
1308 Widget_Data *wd = elm_widget_data_get(obj);
1309 if (!wd) return NULL;
1310 return ewk_view_title_get(wd->ewk_view);
1317 elm_web_bg_color_set(Evas_Object *obj, int r, int g, int b, int a)
1319 ELM_CHECK_WIDTYPE(obj, widtype);
1320 #ifdef HAVE_ELEMENTARY_WEB
1321 Widget_Data *wd = elm_widget_data_get(obj);
1323 ewk_view_bg_color_set(wd->ewk_view, r, g, b, a);
1333 elm_web_bg_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a)
1339 ELM_CHECK_WIDTYPE(obj, widtype);
1340 #ifdef HAVE_ELEMENTARY_WEB
1341 Widget_Data *wd = elm_widget_data_get(obj);
1343 return ewk_view_bg_color_get(wd->ewk_view, r, g, b, a);
1348 elm_web_selection_get(const Evas_Object *obj)
1350 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1351 #ifdef HAVE_ELEMENTARY_WEB
1352 Widget_Data *wd = elm_widget_data_get(obj);
1353 if (!wd) return NULL;
1354 return ewk_view_selection_get(wd->ewk_view);
1361 elm_web_popup_selected_set(Evas_Object *obj, int idx)
1363 ELM_CHECK_WIDTYPE(obj, widtype);
1364 #ifdef HAVE_ELEMENTARY_WEB
1365 Widget_Data *wd = elm_widget_data_get(obj);
1366 ewk_view_popup_selected_set(wd->ewk_view, idx);
1373 elm_web_popup_destroy(Evas_Object *obj)
1375 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1376 #ifdef HAVE_ELEMENTARY_WEB
1377 Widget_Data *wd = elm_widget_data_get(obj);
1378 return ewk_view_popup_destroy(wd->ewk_view);
1385 elm_web_text_search(const Evas_Object *obj, const char *string, Eina_Bool case_sensitive, Eina_Bool forward, Eina_Bool wrap)
1387 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1388 #ifdef HAVE_ELEMENTARY_WEB
1389 Widget_Data *wd = elm_widget_data_get(obj);
1390 if (!wd) return EINA_FALSE;
1391 return ewk_view_text_search
1392 (wd->ewk_view, string, case_sensitive, forward, wrap);
1395 (void)case_sensitive;
1403 elm_web_text_matches_mark(Evas_Object *obj, const char *string, Eina_Bool case_sensitive, Eina_Bool highlight, unsigned int limit)
1405 ELM_CHECK_WIDTYPE(obj, widtype) 0;
1406 #ifdef HAVE_ELEMENTARY_WEB
1407 Widget_Data *wd = elm_widget_data_get(obj);
1409 return ewk_view_text_matches_mark
1410 (wd->ewk_view, string, case_sensitive, highlight, limit);
1413 (void)case_sensitive;
1421 elm_web_text_matches_unmark_all(Evas_Object *obj)
1423 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1424 #ifdef HAVE_ELEMENTARY_WEB
1425 Widget_Data *wd = elm_widget_data_get(obj);
1426 if (!wd) return EINA_FALSE;
1427 return ewk_view_text_matches_unmark_all(wd->ewk_view);
1434 elm_web_text_matches_highlight_set(Evas_Object *obj, Eina_Bool highlight)
1436 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1437 #ifdef HAVE_ELEMENTARY_WEB
1438 Widget_Data *wd = elm_widget_data_get(obj);
1439 if (!wd) return EINA_FALSE;
1440 return ewk_view_text_matches_highlight_set(wd->ewk_view, highlight);
1448 elm_web_text_matches_highlight_get(const Evas_Object *obj)
1450 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1451 #ifdef HAVE_ELEMENTARY_WEB
1452 Widget_Data *wd = elm_widget_data_get(obj);
1453 if (!wd) return EINA_FALSE;
1454 return ewk_view_text_matches_highlight_get(wd->ewk_view);
1461 elm_web_load_progress_get(const Evas_Object *obj)
1463 ELM_CHECK_WIDTYPE(obj, widtype) -1.0;
1464 #ifdef HAVE_ELEMENTARY_WEB
1465 Widget_Data *wd = elm_widget_data_get(obj);
1466 if (!wd) return -1.0;
1467 return ewk_view_load_progress_get(wd->ewk_view);
1474 elm_web_stop(Evas_Object *obj)
1476 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1477 #ifdef HAVE_ELEMENTARY_WEB
1478 Widget_Data *wd = elm_widget_data_get(obj);
1479 if (!wd) return EINA_FALSE;
1480 return ewk_view_stop(wd->ewk_view);
1487 elm_web_reload(Evas_Object *obj)
1489 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1490 #ifdef HAVE_ELEMENTARY_WEB
1491 Widget_Data *wd = elm_widget_data_get(obj);
1492 if (!wd) return EINA_FALSE;
1493 return ewk_view_reload(wd->ewk_view);
1500 elm_web_reload_full(Evas_Object *obj)
1502 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1503 #ifdef HAVE_ELEMENTARY_WEB
1504 Widget_Data *wd = elm_widget_data_get(obj);
1505 if (!wd) return EINA_FALSE;
1506 return ewk_view_reload_full(wd->ewk_view);
1514 elm_web_back(Evas_Object *obj)
1516 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1517 #ifdef HAVE_ELEMENTARY_WEB
1518 Widget_Data *wd = elm_widget_data_get(obj);
1519 if (!wd) return EINA_FALSE;
1520 return ewk_view_back(wd->ewk_view);
1527 elm_web_forward(Evas_Object *obj)
1529 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1530 #ifdef HAVE_ELEMENTARY_WEB
1531 Widget_Data *wd = elm_widget_data_get(obj);
1532 if (!wd) return EINA_FALSE;
1533 return ewk_view_forward(wd->ewk_view);
1540 elm_web_navigate(Evas_Object *obj, int steps)
1542 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1543 #ifdef HAVE_ELEMENTARY_WEB
1544 Widget_Data *wd = elm_widget_data_get(obj);
1545 if (!wd) return EINA_FALSE;
1546 return ewk_view_navigate(wd->ewk_view, steps);
1553 EINA_DEPRECATED EAPI Eina_Bool
1554 elm_web_back_possible(Evas_Object *obj)
1556 return elm_web_back_possible_get(obj);
1560 elm_web_back_possible_get(Evas_Object *obj)
1562 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1563 #ifdef HAVE_ELEMENTARY_WEB
1564 Widget_Data *wd = elm_widget_data_get(obj);
1565 if (!wd) return EINA_FALSE;
1566 return ewk_view_back_possible(wd->ewk_view);
1572 EINA_DEPRECATED EAPI Eina_Bool
1573 elm_web_forward_possible(Evas_Object *obj)
1575 return elm_web_forward_possible_get(obj);
1579 elm_web_forward_possible_get(const Evas_Object *obj)
1581 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1582 #ifdef HAVE_ELEMENTARY_WEB
1583 Widget_Data *wd = elm_widget_data_get(obj);
1584 if (!wd) return EINA_FALSE;
1585 return ewk_view_forward_possible(wd->ewk_view);
1592 elm_web_navigate_possible(Evas_Object *obj, int steps)
1594 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1595 #ifdef HAVE_ELEMENTARY_WEB
1596 Widget_Data *wd = elm_widget_data_get(obj);
1597 if (!wd) return EINA_FALSE;
1598 return ewk_view_navigate_possible(wd->ewk_view, steps);
1605 EINA_DEPRECATED EAPI Eina_Bool
1606 elm_web_history_enable_get(const Evas_Object *obj)
1608 return elm_web_history_enabled_get(obj);
1612 elm_web_history_enabled_get(const Evas_Object *obj)
1614 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1615 #ifdef HAVE_ELEMENTARY_WEB
1616 Widget_Data *wd = elm_widget_data_get(obj);
1617 if (!wd) return EINA_FALSE;
1618 return ewk_view_history_enable_get(wd->ewk_view);
1624 EINA_DEPRECATED EAPI void
1625 elm_web_history_enable_set(Evas_Object *obj, Eina_Bool enable)
1627 elm_web_history_enabled_set(obj, enable);
1631 elm_web_history_enabled_set(Evas_Object *obj, Eina_Bool enable)
1633 ELM_CHECK_WIDTYPE(obj, widtype);
1634 #ifdef HAVE_ELEMENTARY_WEB
1635 Widget_Data *wd = elm_widget_data_get(obj);
1637 ewk_view_history_enable_set(wd->ewk_view, enable);
1643 //EAPI Ewk_History *ewk_view_history_get(const Evas_Object *obj); // TODO:
1646 elm_web_zoom_set(Evas_Object *obj, double zoom)
1648 ELM_CHECK_WIDTYPE(obj, widtype);
1649 #ifdef HAVE_ELEMENTARY_WEB
1650 Widget_Data *wd = elm_widget_data_get(obj);
1653 evas_object_geometry_get(wd->ewk_view, NULL, NULL, &vw, &vh);
1656 if (zoom > wd->zoom.max)
1657 zoom = wd->zoom.max;
1658 else if (zoom < wd->zoom.min)
1659 zoom = wd->zoom.min;
1660 if (zoom == wd->zoom.current) return;
1661 wd->zoom.current = zoom;
1662 if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_MANUAL)
1664 else if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_AUTO_FIT)
1666 Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1667 Evas_Coord fw, fh, pw, ph;
1668 if (!ewk_frame_contents_size_get(frame, &fw, &fh))
1670 z = ewk_frame_page_zoom_get(frame);
1673 if ((fw > 0) && (fh > 0))
1675 ph = (fh * vw) / fw;
1678 pw = (fw * vh) / fh;
1689 else if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_AUTO_FILL)
1691 Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1692 Evas_Coord fw, fh, pw, ph;
1693 if (!ewk_frame_contents_size_get(frame, &fw, &fh))
1695 z = ewk_frame_page_zoom_get(frame);
1698 if ((fw > 0) && (fh > 0))
1700 ph = (fh * vw) / fw;
1703 pw = (fw * vh) / fh;
1714 if (wd->zoom.no_anim)
1715 ewk_view_zoom_set(wd->ewk_view, z, cx, cy);
1717 ewk_view_zoom_animated_set(wd->ewk_view, z, _elm_config->zoom_friction,
1719 wd->zoom.no_anim = EINA_FALSE;
1726 elm_web_zoom_get(const Evas_Object *obj)
1728 ELM_CHECK_WIDTYPE(obj, widtype) -1.0;
1729 #ifdef HAVE_ELEMENTARY_WEB
1730 Widget_Data *wd = elm_widget_data_get(obj);
1731 return wd->zoom.current;
1738 elm_web_zoom_mode_set(Evas_Object *obj, Elm_Web_Zoom_Mode mode)
1740 ELM_CHECK_WIDTYPE(obj, widtype);
1741 #ifdef HAVE_ELEMENTARY_WEB
1742 Widget_Data *wd = elm_widget_data_get(obj);
1744 if (mode >= ELM_WEB_ZOOM_MODE_LAST)
1746 if (mode == wd->zoom.mode)
1748 wd->zoom.mode = mode;
1749 tz = wd->zoom.current;
1750 wd->zoom.current = 0.0;
1751 elm_web_zoom_set(obj, tz);
1757 EAPI Elm_Web_Zoom_Mode
1758 elm_web_zoom_mode_get(const Evas_Object *obj)
1760 ELM_CHECK_WIDTYPE(obj, widtype) ELM_WEB_ZOOM_MODE_LAST;
1761 #ifdef HAVE_ELEMENTARY_WEB
1762 Widget_Data *wd = elm_widget_data_get(obj);
1763 return wd->zoom.mode;
1765 return ELM_WEB_ZOOM_MODE_LAST;
1770 elm_web_region_show(Evas_Object *obj, int x, int y, int w __UNUSED__, int h __UNUSED__)
1772 ELM_CHECK_WIDTYPE(obj, widtype);
1773 #ifdef HAVE_ELEMENTARY_WEB
1774 Widget_Data *wd = elm_widget_data_get(obj);
1775 Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1776 int fw, fh, zw, zh, rx, ry;
1778 ewk_frame_contents_size_get(frame, &fw, &fh);
1779 zoom = ewk_frame_page_zoom_get(frame);
1784 if (wd->bring_in.animator)
1786 ecore_animator_del(wd->bring_in.animator);
1787 wd->bring_in.animator = NULL;
1789 ewk_frame_scroll_set(frame, rx, ry);
1797 elm_web_region_bring_in(Evas_Object *obj, int x, int y, int w __UNUSED__, int h __UNUSED__)
1799 ELM_CHECK_WIDTYPE(obj, widtype);
1800 #ifdef HAVE_ELEMENTARY_WEB
1801 Widget_Data *wd = elm_widget_data_get(obj);
1802 Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1803 int fw, fh, zw, zh, rx, ry, sx, sy;
1805 ewk_frame_contents_size_get(frame, &fw, &fh);
1806 ewk_frame_scroll_pos_get(frame, &sx, &sy);
1807 zoom = ewk_frame_page_zoom_get(frame);
1812 if ((wd->bring_in.end.x == rx) && (wd->bring_in.end.y == ry))
1814 wd->bring_in.start.x = sx;
1815 wd->bring_in.start.y = sy;
1816 wd->bring_in.end.x = rx;
1817 wd->bring_in.end.y = ry;
1818 if (wd->bring_in.animator)
1819 ecore_animator_del(wd->bring_in.animator);
1820 wd->bring_in.animator = ecore_animator_timeline_add(
1821 _elm_config->bring_in_scroll_friction, _bring_in_anim_cb, wd);
1829 elm_web_inwin_mode_set(Evas_Object *obj, Eina_Bool value)
1831 ELM_CHECK_WIDTYPE(obj, widtype);
1832 #ifdef HAVE_ELEMENTARY_WEB
1833 Widget_Data *wd = elm_widget_data_get(obj);
1835 wd->inwin_mode = value;
1842 elm_web_inwin_mode_get(const Evas_Object *obj)
1844 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1845 #ifdef HAVE_ELEMENTARY_WEB
1846 Widget_Data *wd = elm_widget_data_get(obj);
1848 return wd->inwin_mode;
1855 elm_web_window_features_ref(Elm_Web_Window_Features *wf)
1857 #ifdef HAVE_ELEMENTARY_WEB
1858 ewk_window_features_ref((Ewk_Window_Features *)wf);
1865 elm_web_window_features_unref(Elm_Web_Window_Features *wf)
1867 #ifdef HAVE_ELEMENTARY_WEB
1868 ewk_window_features_unref((Ewk_Window_Features *)wf);
1875 elm_web_window_features_bool_property_get(const Elm_Web_Window_Features *wf, Elm_Web_Window_Feature_Flag flag)
1877 #ifdef HAVE_ELEMENTARY_WEB
1878 Eina_Bool toolbar_visible, statusbar_visible;
1879 Eina_Bool scrollbars_visible, menubar_visible;
1880 Eina_Bool locationbar_visible, fullscreen;
1882 ewk_window_features_bool_property_get((const Ewk_Window_Features *)wf,
1883 &toolbar_visible, &statusbar_visible,
1884 &scrollbars_visible, &menubar_visible,
1885 &locationbar_visible, &fullscreen);
1887 //TODO : Improve ewk API usage to get one value.
1891 case ELM_WEB_WINDOW_FEATURE_TOOLBAR:
1892 return toolbar_visible;
1894 case ELM_WEB_WINDOW_FEATURE_STATUSBAR:
1895 return statusbar_visible;
1897 case ELM_WEB_WINDOW_FEATURE_SCROLLBARS:
1898 return scrollbars_visible;
1900 case ELM_WEB_WINDOW_FEATURE_MENUBAR:
1901 return menubar_visible;
1903 case ELM_WEB_WINDOW_FEATURE_LOCATIONBAR:
1904 return locationbar_visible;
1906 case ELM_WEB_WINDOW_FEATURE_FULLSCREEN:
1910 /* What to do with these ?
1913 (void)toolbar_visible;
1914 (void)statusbar_visible;
1915 (void)scrollbars_visible;
1916 (void)menubar_visible;
1917 (void)locationbar_visible;
1926 elm_web_window_features_region_get(const Elm_Web_Window_Features *wf, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
1928 #ifdef HAVE_ELEMENTARY_WEB
1929 ewk_window_features_int_property_get((const Ewk_Window_Features *)wf,
1933 /* What to do with these ?
1946 // 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!