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;
23 Evas_Event_Mouse_Down event;
25 unsigned int move_count;
26 Ecore_Timer *longpress_timer;
27 Ecore_Animator *pan_anim;
32 typedef struct _Widget_Data Widget_Data;
36 #ifdef HAVE_ELEMENTARY_WEB
37 Evas_Object *ewk_view;
40 Elm_Web_Window_Open window_create;
41 void *window_create_data;
42 Elm_Web_Dialog_Alert alert;
44 Elm_Web_Dialog_Confirm confirm;
46 Elm_Web_Dialog_Prompt prompt;
48 Elm_Web_Dialog_File_Selector file_selector;
49 void *file_selector_data;
50 Elm_Web_Console_Message console_message;
51 void *console_message_data;
53 Elm_Win_Keyboard_Mode input_method;
56 Elm_Web_Zoom_Mode mode;
68 Ecore_Animator *animator;
70 Eina_Bool tab_propagate : 1;
71 Eina_Bool inwin_mode : 1;
85 typedef struct _Dialog_Data Dialog_Data;
88 enum Dialog_Type type;
91 Evas_Object *bt_ok, *bt_cancel;
93 Evas_Object *file_sel;
97 Eina_List **selected_files;
100 struct _Elm_Web_Callback_Proxy_Context
105 typedef struct _Elm_Web_Callback_Proxy_Context Elm_Web_Callback_Proxy_Context;
107 static const char *widtype = NULL;
108 static const Evas_Smart_Cb_Description _elm_web_callback_names[] = {
109 { "download,request", "p" },
110 { "editorclient,contents,changed", "" },
111 { "editorclient,selection,changed", "" },
112 { "frame,created", "p" },
113 { "icon,received", "" },
114 { "inputmethod,changed", "b" },
115 { "js,windowobject,clear", "" },
116 { "link,hover,in", "p" },
117 { "link,hover,out", "" },
118 { "load,document,finished", "p" },
119 { "load,error", "p" },
120 { "load,finished", "p" },
121 { "load,newwindow,show", "" },
122 { "load,progress", "d" },
123 { "load,provisional", "" },
124 { "load,started", "" },
125 { "menubar,visible,get", "b" },
126 { "menubar,visible,set", "b" },
127 { "popup,created", "p" },
128 { "popup,willdelete", "p" },
130 { "scrollbars,visible,get", "b" },
131 { "scrollbars,visible,set", "b" },
132 { "statusbar,text,set", "s" },
133 { "statusbar,visible,get", "b" },
134 { "statusbar,visible,set", "b" },
135 { "title,changed", "s" },
136 { "toolbars,visible,get", "b" },
137 { "toolbars,visible,set", "b" },
138 { "tooltip,text,set", "s" },
139 { "uri,changed", "s" },
140 { "view,resized", "" },
141 { "windows,close,request", ""},
142 { "zoom,animated,end", "" },
146 #ifdef HAVE_ELEMENTARY_WEB
148 _webkit_theme_find(const Eina_List *list)
153 EINA_LIST_FOREACH(list, l, th)
155 char *path = elm_theme_list_item_path_get(th, NULL);
157 if (edje_file_group_exists(path, "webkit/base"))
167 _theme_hook(Evas_Object *obj)
169 #ifdef HAVE_ELEMENTARY_WEB
170 Elm_Theme *theme = elm_object_theme_get(obj);
171 Widget_Data *wd = elm_widget_data_get(obj);
172 const Eina_List *themes;
173 char *view_theme = NULL;
175 themes = elm_theme_overlay_list_get(theme);
176 view_theme = _webkit_theme_find(themes);
177 if (view_theme) goto set;
179 themes = elm_theme_list_get(theme);
180 view_theme = _webkit_theme_find(themes);
181 if (view_theme) goto set;
183 themes = elm_theme_extension_list_get(theme);
184 view_theme = _webkit_theme_find(themes);
189 ewk_view_theme_set(wd->ewk_view, view_theme);
193 ewk_view_theme_set(wd->ewk_view, WEBKIT_DATADIR"/themes/default.edj");
200 _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
202 #ifdef HAVE_ELEMENTARY_WEB
203 Widget_Data *wd = elm_widget_data_get(obj);
204 Evas_Object *top = elm_widget_top_get(obj);
208 if (elm_object_focus_get(obj))
210 evas_object_focus_set(wd->ewk_view, EINA_TRUE);
211 if (top) elm_win_keyboard_mode_set(top, wd->input_method);
215 evas_object_focus_set(wd->ewk_view, EINA_FALSE);
216 if (top) elm_win_keyboard_mode_set(top, ELM_WIN_KEYBOARD_OFF);
224 _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info)
226 #ifdef HAVE_ELEMENTARY_WEB
227 Evas_Event_Key_Down *ev = event_info;
228 Widget_Data *wd = elm_widget_data_get(obj);
230 if (!wd) return EINA_FALSE;
231 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
232 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
233 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
235 if ((!strcmp(ev->keyname, "Tab")) && (!wd->tab_propagate))
237 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
250 #ifdef HAVE_ELEMENTARY_WEB
252 _view_pan_animator(void *data)
254 View_Smart_Data *sd = data;
255 Evas_Coord x, y, dx, dy;
257 evas_pointer_canvas_xy_get(sd->base.base.evas, &x, &y);
259 dx = sd->mouse.x - x;
260 dy = sd->mouse.y - y;
262 if ((dx == 0) && (dy == 0))
265 ewk_frame_scroll_add(sd->base.main_frame, dx, dy);
275 _view_smart_add(Evas_Object *obj)
279 sd = calloc(1, sizeof(View_Smart_Data));
280 evas_object_smart_data_set(obj, sd);
282 _parent_sc.sc.add(obj);
284 ewk_view_history_enable_set(obj, EINA_TRUE);
285 ewk_history_limit_set(ewk_view_history_get(obj), 100);
286 // TODO: auto toggle between smooth/nearest during bring-in animations
287 //ewk_view_zoom_weak_smooth_scale_set(obj, EINA_TRUE);
291 _view_smart_del(Evas_Object *obj)
295 sd = evas_object_smart_data_get(obj);
297 if (sd->mouse.pan_anim)
298 ecore_animator_del(sd->mouse.pan_anim);
300 _parent_sc.sc.del(obj);
304 _view_longpress_timer(void *data)
306 View_Smart_Data *sd = data;
308 sd->mouse.move_count = 0;
309 sd->mouse.longpress_timer = NULL;
310 return ECORE_CALLBACK_CANCEL;
314 _view_smart_mouse_down(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Down *event)
316 // TODO: mimic elm_scroller and like
317 // TODO-minor: offer hook?
318 View_Smart_Data *sd = (View_Smart_Data *)esd;
320 if (event->button != 1)
321 return _parent_sc.mouse_down(esd, event);
323 sd->mouse.pan_anim = ecore_animator_add(_view_pan_animator, sd);
324 sd->mouse.longpress_timer = ecore_timer_add(_elm_config->longpress_timeout, _view_longpress_timer, sd);
325 sd->mouse.move_count = 1;
326 sd->mouse.x = event->canvas.x;
327 sd->mouse.y = event->canvas.y;
328 sd->mouse.event = *event;
334 _view_smart_mouse_up(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Up *event)
336 // TODO: mimic elm_scroller and like
337 // TODO-minor: offer hook?
338 View_Smart_Data *sd = (View_Smart_Data *)esd;
340 if (sd->mouse.pan_anim)
342 ecore_animator_del(sd->mouse.pan_anim);
343 sd->mouse.pan_anim = NULL;
345 if (sd->mouse.longpress_timer)
346 _parent_sc.mouse_down(esd, &sd->mouse.event);
351 if (sd->mouse.longpress_timer)
353 ecore_timer_del(sd->mouse.longpress_timer);
354 sd->mouse.longpress_timer = NULL;
357 sd->mouse.move_count = 0;
358 return _parent_sc.mouse_up(esd, event);
362 _view_smart_mouse_move(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Move *event)
364 // TODO: mimic elm_scroller and like
365 // TODO-minor: offer hook?
366 View_Smart_Data *sd = (View_Smart_Data *)esd;
367 sd->mouse.move_count++;
369 if (sd->mouse.longpress_timer &&
370 (((sd->mouse.x ^ sd->mouse.event.canvas.x) |
371 (sd->mouse.y ^ sd->mouse.event.canvas.y)) & (~0x07)))
373 ecore_timer_del(sd->mouse.longpress_timer);
374 sd->mouse.longpress_timer = NULL;
377 if (sd->mouse.pan_anim)
382 return _parent_sc.mouse_move(esd, event);
386 _view_smart_window_create(Ewk_View_Smart_Data *sd, Eina_Bool javascript, const Ewk_Window_Features *window_features)
389 Evas_Object *obj = evas_object_smart_parent_get(sd->self);
390 Widget_Data *wd = elm_widget_data_get(obj);
392 if (!wd->hook.window_create) return NULL;
393 new = wd->hook.window_create(wd->hook.window_create_data, obj, javascript,
394 (const Elm_Web_Window_Features *)window_features);
395 if (new) return elm_web_webkit_view_get(new);
401 _view_smart_window_close(Ewk_View_Smart_Data *sd)
403 Evas_Object *obj = evas_object_smart_parent_get(sd->self);
404 evas_object_smart_callback_call(obj, "windows,close,request", NULL);
408 _bt_close(void *data, Evas_Object *obj, void *event_info __UNUSED__)
410 Dialog_Data *d = data;
412 *d->response = (obj == d->bt_ok);
413 if ((d->type == DIALOG_PROMPT) && (*d->response == EINA_TRUE))
414 *d->entry_value = strdup(elm_entry_entry_get(d->entry));
415 evas_object_del(d->dialog);
419 _file_sel_done(void *data, Evas_Object *obj __UNUSED__, void *event_info)
421 Dialog_Data *d = data;
424 *d->selected_files = eina_list_append(NULL, strdup(event_info));
425 *d->response = EINA_TRUE;
428 *d->response = EINA_FALSE;
429 evas_object_del(d->dialog);
434 _dialog_new(Evas_Object *parent)
437 Widget_Data *wd = elm_widget_data_get(parent);
439 d = calloc(1, sizeof(Dialog_Data));
442 if (!parent || !wd->inwin_mode)
446 d->dialog = elm_win_add(NULL, "elm-web-popup", ELM_WIN_DIALOG_BASIC);
447 evas_object_smart_callback_add(d->dialog, "delete,request",
450 bg = elm_bg_add(d->dialog);
451 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND,
453 elm_win_resize_object_add(d->dialog, bg);
454 evas_object_show(bg);
456 d->box = elm_box_add(d->dialog);
457 evas_object_size_hint_weight_set(d->box, EVAS_HINT_EXPAND,
459 elm_win_resize_object_add(d->dialog, d->box);
460 evas_object_show(d->box);
464 Evas_Object *win = elm_widget_top_get(parent);
465 d->dialog = elm_win_inwin_add(win);
466 elm_object_style_set(d->dialog, "minimal");
467 evas_object_size_hint_weight_set(d->dialog, EVAS_HINT_EXPAND,
470 d->box = elm_box_add(win);
471 evas_object_size_hint_weight_set(d->box, EVAS_HINT_EXPAND,
473 elm_win_inwin_content_set(d->dialog, d->box);
474 evas_object_show(d->box);
481 _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)
483 EINA_SAFETY_ON_TRUE_RETURN_VAL((type != DIALOG_PROMPT) && (!!default_entry_value), EINA_FALSE);
484 EINA_SAFETY_ON_TRUE_RETURN_VAL((type != DIALOG_PROMPT) && (!!entry_value), EINA_FALSE);
486 Dialog_Data *dialog_data = _dialog_new(evas_object_smart_parent_get(parent));
489 if (type != DIALOG_FILE_SELECTOR)
491 lb = elm_label_add(dialog_data->box);
492 elm_object_text_set(lb, message);
493 elm_box_pack_end(dialog_data->box, lb);
494 evas_object_show(lb);
497 dialog_data->type = type;
498 dialog_data->response = response;
499 dialog_data->entry_value = entry_value;
500 dialog_data->selected_files = selected_filenames;
502 if (type == DIALOG_ALERT)
504 dialog_data->bt_ok = elm_button_add(dialog_data->box);
505 elm_object_text_set(dialog_data->bt_ok, "Close");
506 elm_box_pack_end(dialog_data->box, dialog_data->bt_ok);
507 evas_object_size_hint_align_set(dialog_data->bt_ok, EVAS_HINT_FILL, EVAS_HINT_FILL);
508 evas_object_smart_callback_add(dialog_data->bt_ok, "clicked", _bt_close, dialog_data);
509 evas_object_show(dialog_data->bt_ok);
511 else if (type == DIALOG_FILE_SELECTOR)
513 dialog_data->file_sel = elm_fileselector_add(dialog_data->dialog);
514 evas_object_size_hint_weight_set(dialog_data->file_sel,
515 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
516 evas_object_size_hint_align_set(dialog_data->file_sel, EVAS_HINT_FILL,
518 elm_box_pack_end(dialog_data->box, dialog_data->file_sel);
519 evas_object_show(dialog_data->file_sel);
521 elm_fileselector_path_set(dialog_data->file_sel, ".");
522 elm_fileselector_is_save_set(dialog_data->file_sel, EINA_FALSE);
523 elm_fileselector_folder_only_set(dialog_data->file_sel, EINA_FALSE);
524 elm_fileselector_buttons_ok_cancel_set(dialog_data->file_sel,
526 elm_fileselector_expandable_set(dialog_data->file_sel, EINA_FALSE);
527 evas_object_smart_callback_add(dialog_data->file_sel, "done",
528 _file_sel_done, dialog_data);
529 // fileselector can't set it's minimum size correctly
530 evas_object_size_hint_min_set(dialog_data->file_sel, 300, 400);
534 if (type == DIALOG_PROMPT)
536 dialog_data->entry = elm_entry_add(dialog_data->box);
537 elm_entry_single_line_set(dialog_data->entry, EINA_TRUE);
538 elm_entry_scrollable_set(dialog_data->entry, EINA_TRUE);
539 elm_entry_entry_set(dialog_data->entry, default_entry_value);
540 evas_object_size_hint_align_set(dialog_data->entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
541 evas_object_size_hint_weight_set(dialog_data->entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
542 elm_box_pack_end(dialog_data->box, dialog_data->entry);
543 evas_object_show(dialog_data->entry);
546 if (type == DIALOG_PROMPT || type == DIALOG_CONFIRM)
548 Evas_Object *bx_h = elm_box_add(dialog_data->box);
549 elm_box_horizontal_set(bx_h, 1);
550 elm_box_pack_end(dialog_data->box, bx_h);
551 evas_object_size_hint_weight_set(bx_h, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
552 evas_object_size_hint_align_set(bx_h, EVAS_HINT_FILL, EVAS_HINT_FILL);
553 evas_object_show(bx_h);
555 dialog_data->bt_cancel = elm_button_add(bx_h);
556 elm_object_text_set(dialog_data->bt_cancel, "Cancel");
557 elm_box_pack_end(bx_h, dialog_data->bt_cancel);
558 evas_object_size_hint_weight_set(dialog_data->bt_cancel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
559 evas_object_size_hint_align_set(dialog_data->bt_cancel, EVAS_HINT_FILL, EVAS_HINT_FILL);
560 evas_object_smart_callback_add(dialog_data->bt_cancel, "clicked", _bt_close, dialog_data);
561 evas_object_show(dialog_data->bt_cancel);
563 dialog_data->bt_ok = elm_button_add(bx_h);
564 elm_object_text_set(dialog_data->bt_ok, "Ok");
565 elm_box_pack_end(bx_h, dialog_data->bt_ok);
566 evas_object_size_hint_weight_set(dialog_data->bt_ok, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
567 evas_object_size_hint_align_set(dialog_data->bt_ok, EVAS_HINT_FILL, EVAS_HINT_FILL);
568 evas_object_smart_callback_add(dialog_data->bt_ok, "clicked", _bt_close, dialog_data);
569 evas_object_show(dialog_data->bt_ok);
575 evas_object_show(dialog_data->dialog);
577 return dialog_data->dialog;
581 _dialog_del_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
583 ecore_main_loop_quit();
587 _exec_dialog(Evas_Object *dialog)
589 evas_object_event_callback_add(dialog, EVAS_CALLBACK_DEL, _dialog_del_cb,
591 ecore_main_loop_begin();
594 /* called by ewk_view when javascript called alert()
598 _view_smart_run_javascript_alert(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, const char *message)
600 View_Smart_Data *sd = (View_Smart_Data *)esd;
601 Evas_Object *view = sd->base.self;
602 Evas_Object *obj = evas_object_smart_parent_get(view);
603 Evas_Object *diag = NULL;
604 Widget_Data *wd = elm_widget_data_get(obj);
605 Eina_Bool response = EINA_FALSE;
608 diag = wd->hook.alert(wd->hook.alert_data, obj, message);
610 diag = _run_dialog(view, DIALOG_ALERT, message, NULL, NULL, EINA_FALSE,
611 NULL, NULL, &response);
612 if (diag) _exec_dialog(diag);
615 /* called by ewk_view when javascript called confirm()
619 _view_smart_run_javascript_confirm(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, const char *message)
621 View_Smart_Data *sd = (View_Smart_Data *)esd;
622 Evas_Object *view = sd->base.self;
623 Evas_Object *obj = evas_object_smart_parent_get(view);
624 Evas_Object *diag = NULL;
625 Widget_Data *wd = elm_widget_data_get(obj);
626 Eina_Bool response = EINA_FALSE;
628 if (wd->hook.confirm)
629 diag = wd->hook.confirm(wd->hook.confirm_data, obj, message, &response);
631 diag = _run_dialog(view, DIALOG_CONFIRM, message, NULL, NULL, EINA_FALSE,
632 NULL, NULL, &response);
633 if (diag) _exec_dialog(diag);
637 /* called by ewk_view when javascript called confirm()
641 _view_smart_run_javascript_prompt(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, const char *message, const char *default_value, char **value)
643 View_Smart_Data *sd = (View_Smart_Data *)esd;
644 Evas_Object *view = sd->base.self;
645 Evas_Object *obj = evas_object_smart_parent_get(view);
646 Evas_Object *diag = NULL;
647 Widget_Data *wd = elm_widget_data_get(obj);
648 Eina_Bool response = EINA_FALSE;
651 diag = wd->hook.prompt(wd->hook.prompt_data, obj, message, default_value,
654 diag = _run_dialog(view, DIALOG_PROMPT, message, default_value, value,
655 EINA_FALSE, NULL, NULL, &response);
656 if (diag) _exec_dialog(diag);
664 _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)
666 View_Smart_Data *sd = (View_Smart_Data *)esd;
667 Evas_Object *view = sd->base.self;
668 Evas_Object *obj = evas_object_smart_parent_get(view);
669 Evas_Object *diag = NULL;
670 Widget_Data *wd = elm_widget_data_get(obj);
671 Eina_Bool response = EINA_FALSE;
673 if (wd->hook.file_selector)
674 diag = wd->hook.file_selector(wd->hook.file_selector_data, obj,
675 allows_multiple_files, accept_types,
676 selected_filenames, &response);
678 diag = _run_dialog(view, DIALOG_FILE_SELECTOR, NULL, NULL, NULL,
679 allows_multiple_files, accept_types, selected_filenames,
681 if (diag) _exec_dialog(diag);
687 _view_smart_add_console_message(Ewk_View_Smart_Data *esd, const char *message, unsigned int line_number, const char *source_id)
689 Evas_Object *obj = evas_object_smart_parent_get(esd->self);
690 Widget_Data *wd = elm_widget_data_get(obj);
692 if (wd->hook.console_message)
693 wd->hook.console_message(wd->hook.console_message_data, obj, message,
694 line_number, source_id);
698 _view_smart_focus_can_cycle(Ewk_View_Smart_Data *sd, Ewk_Focus_Direction direction)
700 Evas_Object *obj = evas_object_smart_parent_get(sd->self);
701 Elm_Focus_Direction dir;
705 case EWK_FOCUS_DIRECTION_FORWARD:
706 dir = ELM_FOCUS_NEXT;
708 case EWK_FOCUS_DIRECTION_BACKWARD:
709 dir = ELM_FOCUS_PREVIOUS;
715 elm_widget_focus_cycle(elm_widget_parent_get(obj), dir);
721 * Creates a new view object given the parent.
723 * @param parent object to use as parent.
725 * @return newly added Evas_Object or @c NULL on errors.
728 _view_add(Evas_Object *parent)
730 static Evas_Smart *smart = NULL;
731 Evas *canvas = evas_object_evas_get(parent);
736 static Ewk_View_Smart_Class api = EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("EWK_View_Elementary");
738 #ifndef TILED_BACKING_STORE
739 ewk_view_single_smart_set(&api);
741 ewk_view_tiled_smart_set(&api);
746 // TODO: check every api method and provide overrides with hooks!
747 // TODO: hooks should provide extension points
748 // TODO: extension should have some kind of "default implementation",
749 // TODO: that can be replaced or controlled by hooks.
750 // TODO: ie: run_javascript_alert() should present an elm_win
751 // TODO: by default, but user could override it to show as inwin.
752 api.sc.add = _view_smart_add;
753 api.sc.del = _view_smart_del;
754 //api.sc.calculate = _view_smart_calculate;
755 api.mouse_down = _view_smart_mouse_down;
756 api.mouse_up = _view_smart_mouse_up;
757 api.mouse_move = _view_smart_mouse_move;
758 api.add_console_message = _view_smart_add_console_message;
759 api.window_create = _view_smart_window_create;
760 api.window_close = _view_smart_window_close;
761 api.run_javascript_alert = _view_smart_run_javascript_alert;
762 api.run_javascript_confirm = _view_smart_run_javascript_confirm;
763 api.run_javascript_prompt = _view_smart_run_javascript_prompt;
764 api.run_open_panel = _view_smart_run_open_panel;
765 api.focus_can_cycle = _view_smart_focus_can_cycle;
767 smart = evas_smart_class_new(&api.sc);
770 CRITICAL("Could not create smart class");
775 view = evas_object_smart_add(canvas, smart);
778 ERR("Could not create smart object object for view");
786 _ewk_view_inputmethod_change_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
788 Widget_Data *wd = data;
789 Evas_Object *top = elm_widget_top_get(wd->self);
793 wd->input_method = ELM_WIN_KEYBOARD_ON;
795 wd->input_method = ELM_WIN_KEYBOARD_OFF;
796 elm_win_keyboard_mode_set(top, wd->input_method);
800 _ewk_view_load_started_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
802 _ewk_view_inputmethod_change_cb(data, obj, (void *)(long)EINA_FALSE);
806 _ewk_view_load_finished_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
808 Widget_Data *wd = data;
813 if (wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL)
815 float tz = wd->zoom.current;
816 wd->zoom.current = 0.0;
817 elm_web_zoom_set(wd->self, tz);
822 _ewk_view_viewport_changed_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
824 Widget_Data *wd = data;
826 if (wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL)
828 ewk_view_zoom_set(obj, 1.0, 0, 0);
829 wd->zoom.no_anim = EINA_TRUE;
834 _restore_zoom_mode_timer_cb(void *data)
836 Widget_Data *wd = data;
837 float tz = wd->zoom.current;
838 wd->zoom.timer = NULL;
839 wd->zoom.current = 0.0;
840 wd->zoom.no_anim = EINA_TRUE;
841 elm_web_zoom_set(wd->self, tz);
846 _reset_zoom_timer_cb(void *data)
848 Widget_Data *wd = data;
849 wd->zoom.timer = ecore_timer_add(0.0, _restore_zoom_mode_timer_cb, wd);
850 ewk_view_zoom_set(wd->ewk_view, 1.0, 0, 0);
855 _ewk_view_resized_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
857 Widget_Data *wd = data;
858 if (!(wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL))
861 ecore_timer_del(wd->zoom.timer);
862 wd->zoom.timer = ecore_timer_add(0.5, _reset_zoom_timer_cb, wd);
866 _popup_del_job(void *data)
868 evas_object_del(data);
872 _popup_will_delete(void *data, Evas_Object *obj, void *event_info __UNUSED__)
874 ecore_job_add(_popup_del_job, data);
875 evas_object_smart_callback_del(obj, "popup,willdelete", _popup_will_delete);
879 _popup_item_selected(void *data, Evas_Object *obj, void *event_info __UNUSED__)
881 Evas_Object *view = data;
882 Elm_Object_Item *list_it = elm_list_selected_item_get(obj);
883 const Eina_List *itr, *list = elm_list_items_get(obj);
887 EINA_LIST_FOREACH(list, itr, d)
895 ewk_view_popup_selected_set(view, i);
896 ewk_view_popup_destroy(view);
900 _popup_dismiss_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
902 ewk_view_popup_destroy(data);
906 _ewk_view_popup_create_cb(void *data, Evas_Object *obj, void *event_info)
908 Widget_Data *wd = data;
909 Ewk_Menu *m = event_info;
913 Evas_Object *notify, *list;
919 m2.height = m->height;
920 m2.handled = EINA_FALSE;
921 evas_object_smart_callback_call(wd->self, "popup,create", &m2);
925 notify = elm_notify_add(obj);
926 elm_notify_allow_events_set(notify, EINA_FALSE);
927 elm_notify_orient_set(notify, ELM_NOTIFY_ORIENT_BOTTOM);
929 list = elm_list_add(obj);
930 elm_list_select_mode_set(data, ELM_OBJECT_SELECT_MODE_ALWAYS);
931 elm_list_bounce_set(list, EINA_FALSE, EINA_FALSE);
932 elm_list_mode_set(list, ELM_LIST_EXPAND);
933 evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
934 evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
935 elm_object_content_set(notify, list);
936 evas_object_show(list);
938 EINA_LIST_FOREACH(m->items, itr, it)
939 elm_list_item_append(list, it->text, NULL, NULL, _popup_item_selected,
943 evas_object_show(notify);
945 evas_object_smart_callback_add(obj, "popup,willdelete", _popup_will_delete,
947 evas_object_smart_callback_add(notify, "block,clicked", _popup_dismiss_cb,
952 _view_smart_callback_proxy_free_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
958 _view_smart_callback_proxy_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
960 Elm_Web_Callback_Proxy_Context *ctxt = data;
962 evas_object_smart_callback_call(ctxt->obj, ctxt->name, event_info);
966 _view_smart_callback_proxy(Evas_Object *view, Evas_Object *parent)
968 const Evas_Smart_Cb_Description **cls_descs, **inst_descs;
969 unsigned int cls_count, inst_count, total;
970 Elm_Web_Callback_Proxy_Context *ctxt;
972 evas_object_smart_callbacks_descriptions_get(view, &cls_descs, &cls_count,
973 &inst_descs, &inst_count);
974 total = cls_count + inst_count;
976 ctxt = malloc(sizeof(Elm_Web_Callback_Proxy_Context) * total);
978 evas_object_event_callback_add(view, EVAS_CALLBACK_FREE,
979 _view_smart_callback_proxy_free_cb, ctxt);
981 for (; cls_count > 0; cls_count--, cls_descs++, ctxt++)
983 const Evas_Smart_Cb_Description *d = *cls_descs;
984 if (!strcmp(d->name, "popup,create"))
986 ctxt->name = d->name;
988 evas_object_smart_callback_add(view, d->name,
989 _view_smart_callback_proxy_cb, ctxt);
992 for (; inst_count > 0; inst_count--, inst_descs++, ctxt++)
994 const Evas_Smart_Cb_Description *d = *inst_descs;
995 ctxt->name = d->name;
997 evas_object_smart_callback_add(view, d->name,
998 _view_smart_callback_proxy_cb, ctxt);
1003 _bring_in_anim_cb(void *data, double pos)
1005 Widget_Data *wd = data;
1006 Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1009 sx = wd->bring_in.start.x;
1010 sy = wd->bring_in.start.y;
1011 rx = (wd->bring_in.end.x - sx) * pos;
1012 ry = (wd->bring_in.end.y - sy) * pos;
1014 ewk_frame_scroll_set(frame, rx + sx, ry + sy);
1018 wd->bring_in.end.x = wd->bring_in.end.y = wd->bring_in.start.x =
1019 wd->bring_in.start.y = 0;
1020 wd->bring_in.animator = NULL;
1027 #ifdef HAVE_ELEMENTARY_WEB
1028 static int _elm_need_web = 0;
1032 _elm_unneed_web(void)
1034 #ifdef HAVE_ELEMENTARY_WEB
1035 if (--_elm_need_web) return;
1045 #ifdef HAVE_ELEMENTARY_WEB
1046 if (_elm_need_web++) return EINA_TRUE;
1055 elm_web_add(Evas_Object *parent)
1061 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1063 wd = calloc(1, sizeof(Widget_Data));
1064 e = evas_object_evas_get(parent);
1067 obj = elm_widget_add(e);
1072 widtype = eina_stringshare_add("web");
1073 elm_widget_type_register(&widtype);
1076 elm_widget_type_set(obj, widtype);
1077 elm_widget_sub_object_add(parent, obj);
1078 elm_widget_theme_hook_set(obj, _theme_hook);
1079 elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
1080 elm_widget_event_hook_set(obj, _event_hook);
1081 elm_widget_data_set(obj, wd);
1082 elm_widget_can_focus_set(obj, EINA_TRUE);
1084 #ifdef HAVE_ELEMENTARY_WEB
1085 wd->ewk_view = _view_add(obj);
1086 ewk_view_setting_user_agent_set(wd->ewk_view, ELM_WEB_USER_AGENT);
1088 wd->input_method = ELM_WIN_KEYBOARD_OFF;
1089 evas_object_smart_callback_add(wd->ewk_view, "inputmethod,changed",
1090 _ewk_view_inputmethod_change_cb, wd);
1091 evas_object_smart_callback_add(wd->ewk_view, "load,started",
1092 _ewk_view_load_started_cb, wd);
1093 evas_object_smart_callback_add(wd->ewk_view, "popup,create",
1094 _ewk_view_popup_create_cb, wd);
1095 evas_object_smart_callback_add(wd->ewk_view, "load,finished",
1096 _ewk_view_load_finished_cb, wd);
1097 evas_object_smart_callback_add(wd->ewk_view, "viewport,changed",
1098 _ewk_view_viewport_changed_cb, wd);
1099 evas_object_smart_callback_add(wd->ewk_view, "view,resized",
1100 _ewk_view_resized_cb, wd);
1102 elm_widget_resize_object_set(obj, wd->ewk_view);
1104 wd->tab_propagate = EINA_FALSE;
1105 wd->inwin_mode = _elm_config->inwin_dialogs_enable;
1106 wd->zoom.min = ewk_view_zoom_range_min_get(wd->ewk_view);
1107 wd->zoom.max = ewk_view_zoom_range_max_get(wd->ewk_view);
1108 wd->zoom.current = 1.0;
1110 _view_smart_callback_proxy(wd->ewk_view, wd->self);
1111 evas_object_smart_callbacks_descriptions_set(obj, _elm_web_callback_names);
1116 wd->label = elm_label_add(obj);
1117 elm_object_text_set(wd->label, "WebKit not supported!");
1118 evas_object_show(wd->label);
1119 elm_widget_resize_object_set(obj, wd->label);
1126 elm_web_webkit_view_get(const Evas_Object *obj)
1128 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1129 #ifdef HAVE_ELEMENTARY_WEB
1130 Widget_Data *wd = elm_widget_data_get(obj);
1131 if (!wd) return NULL;
1132 return wd->ewk_view;
1134 ERR("Elementary not compiled with EWebKit support.");
1140 elm_web_window_create_hook_set(Evas_Object *obj, Elm_Web_Window_Open func, void *data)
1142 ELM_CHECK_WIDTYPE(obj, widtype);
1143 #ifdef HAVE_ELEMENTARY_WEB
1144 Widget_Data *wd = elm_widget_data_get(obj);
1146 wd->hook.window_create = func;
1147 wd->hook.window_create_data = data;
1155 elm_web_dialog_alert_hook_set(Evas_Object *obj, Elm_Web_Dialog_Alert func, void *data)
1157 ELM_CHECK_WIDTYPE(obj, widtype);
1158 #ifdef HAVE_ELEMENTARY_WEB
1159 Widget_Data *wd = elm_widget_data_get(obj);
1161 wd->hook.alert = func;
1162 wd->hook.alert_data = data;
1170 elm_web_dialog_confirm_hook_set(Evas_Object *obj, Elm_Web_Dialog_Confirm func, void *data)
1172 ELM_CHECK_WIDTYPE(obj, widtype);
1173 #ifdef HAVE_ELEMENTARY_WEB
1174 Widget_Data *wd = elm_widget_data_get(obj);
1176 wd->hook.confirm = func;
1177 wd->hook.confirm_data = data;
1185 elm_web_dialog_prompt_hook_set(Evas_Object *obj, Elm_Web_Dialog_Prompt func, void *data)
1187 ELM_CHECK_WIDTYPE(obj, widtype);
1188 #ifdef HAVE_ELEMENTARY_WEB
1189 Widget_Data *wd = elm_widget_data_get(obj);
1191 wd->hook.prompt = func;
1192 wd->hook.prompt_data = data;
1200 elm_web_dialog_file_selector_hook_set(Evas_Object *obj, Elm_Web_Dialog_File_Selector func, void *data)
1202 ELM_CHECK_WIDTYPE(obj, widtype);
1203 #ifdef HAVE_ELEMENTARY_WEB
1204 Widget_Data *wd = elm_widget_data_get(obj);
1206 wd->hook.file_selector = func;
1207 wd->hook.file_selector_data = data;
1215 elm_web_console_message_hook_set(Evas_Object *obj, Elm_Web_Console_Message func, void *data)
1217 ELM_CHECK_WIDTYPE(obj, widtype);
1218 #ifdef HAVE_ELEMENTARY_WEB
1219 Widget_Data *wd = elm_widget_data_get(obj);
1221 wd->hook.console_message = func;
1222 wd->hook.console_message_data = data;
1230 elm_web_useragent_set(Evas_Object *obj, const char *user_agent)
1232 ELM_CHECK_WIDTYPE(obj, widtype);
1233 #ifdef HAVE_ELEMENTARY_WEB
1234 Widget_Data *wd = elm_widget_data_get(obj);
1236 ewk_view_setting_user_agent_set(wd->ewk_view, user_agent);
1243 elm_web_useragent_get(const Evas_Object *obj)
1245 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1246 #ifdef HAVE_ELEMENTARY_WEB
1247 Widget_Data *wd = elm_widget_data_get(obj);
1248 if (!wd) return NULL;
1249 return ewk_view_setting_user_agent_get(wd->ewk_view);
1256 elm_web_tab_propagate_get(const Evas_Object *obj)
1258 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1259 #ifdef HAVE_ELEMENTARY_WEB
1260 Widget_Data *wd = elm_widget_data_get(obj);
1261 if (!wd) return EINA_FALSE;
1262 return wd->tab_propagate;
1269 elm_web_tab_propagate_set(Evas_Object *obj, Eina_Bool propagate)
1271 ELM_CHECK_WIDTYPE(obj, widtype);
1272 #ifdef HAVE_ELEMENTARY_WEB
1273 Widget_Data *wd = elm_widget_data_get(obj);
1275 wd->tab_propagate = propagate;
1282 elm_web_uri_set(Evas_Object *obj, const char *uri)
1284 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1285 #ifdef HAVE_ELEMENTARY_WEB
1286 Widget_Data *wd = elm_widget_data_get(obj);
1287 if (!wd) return EINA_FALSE;
1288 return ewk_view_uri_set(wd->ewk_view, uri);
1296 elm_web_uri_get(const Evas_Object *obj)
1298 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1299 #ifdef HAVE_ELEMENTARY_WEB
1300 Widget_Data *wd = elm_widget_data_get(obj);
1301 if (!wd) return NULL;
1302 return ewk_view_uri_get(wd->ewk_view);
1309 elm_web_title_get(const Evas_Object *obj)
1311 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1312 #ifdef HAVE_ELEMENTARY_WEB
1313 Widget_Data *wd = elm_widget_data_get(obj);
1314 if (!wd) return NULL;
1315 return ewk_view_title_get(wd->ewk_view);
1322 elm_web_bg_color_set(Evas_Object *obj, int r, int g, int b, int a)
1324 ELM_CHECK_WIDTYPE(obj, widtype);
1325 #ifdef HAVE_ELEMENTARY_WEB
1326 Widget_Data *wd = elm_widget_data_get(obj);
1328 ewk_view_bg_color_set(wd->ewk_view, r, g, b, a);
1338 elm_web_bg_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a)
1344 ELM_CHECK_WIDTYPE(obj, widtype);
1345 #ifdef HAVE_ELEMENTARY_WEB
1346 Widget_Data *wd = elm_widget_data_get(obj);
1348 return ewk_view_bg_color_get(wd->ewk_view, r, g, b, a);
1353 elm_web_selection_get(const Evas_Object *obj)
1355 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1356 #ifdef HAVE_ELEMENTARY_WEB
1357 Widget_Data *wd = elm_widget_data_get(obj);
1358 if (!wd) return NULL;
1359 return ewk_view_selection_get(wd->ewk_view);
1366 elm_web_popup_selected_set(Evas_Object *obj, int idx)
1368 ELM_CHECK_WIDTYPE(obj, widtype);
1369 #ifdef HAVE_ELEMENTARY_WEB
1370 Widget_Data *wd = elm_widget_data_get(obj);
1371 ewk_view_popup_selected_set(wd->ewk_view, idx);
1378 elm_web_popup_destroy(Evas_Object *obj)
1380 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1381 #ifdef HAVE_ELEMENTARY_WEB
1382 Widget_Data *wd = elm_widget_data_get(obj);
1383 return ewk_view_popup_destroy(wd->ewk_view);
1390 elm_web_text_search(const Evas_Object *obj, const char *string, Eina_Bool case_sensitive, Eina_Bool forward, Eina_Bool wrap)
1392 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1393 #ifdef HAVE_ELEMENTARY_WEB
1394 Widget_Data *wd = elm_widget_data_get(obj);
1395 if (!wd) return EINA_FALSE;
1396 return ewk_view_text_search
1397 (wd->ewk_view, string, case_sensitive, forward, wrap);
1400 (void)case_sensitive;
1408 elm_web_text_matches_mark(Evas_Object *obj, const char *string, Eina_Bool case_sensitive, Eina_Bool highlight, unsigned int limit)
1410 ELM_CHECK_WIDTYPE(obj, widtype) 0;
1411 #ifdef HAVE_ELEMENTARY_WEB
1412 Widget_Data *wd = elm_widget_data_get(obj);
1414 return ewk_view_text_matches_mark
1415 (wd->ewk_view, string, case_sensitive, highlight, limit);
1418 (void)case_sensitive;
1426 elm_web_text_matches_unmark_all(Evas_Object *obj)
1428 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1429 #ifdef HAVE_ELEMENTARY_WEB
1430 Widget_Data *wd = elm_widget_data_get(obj);
1431 if (!wd) return EINA_FALSE;
1432 return ewk_view_text_matches_unmark_all(wd->ewk_view);
1439 elm_web_text_matches_highlight_set(Evas_Object *obj, Eina_Bool highlight)
1441 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1442 #ifdef HAVE_ELEMENTARY_WEB
1443 Widget_Data *wd = elm_widget_data_get(obj);
1444 if (!wd) return EINA_FALSE;
1445 return ewk_view_text_matches_highlight_set(wd->ewk_view, highlight);
1453 elm_web_text_matches_highlight_get(const Evas_Object *obj)
1455 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1456 #ifdef HAVE_ELEMENTARY_WEB
1457 Widget_Data *wd = elm_widget_data_get(obj);
1458 if (!wd) return EINA_FALSE;
1459 return ewk_view_text_matches_highlight_get(wd->ewk_view);
1466 elm_web_load_progress_get(const Evas_Object *obj)
1468 ELM_CHECK_WIDTYPE(obj, widtype) -1.0;
1469 #ifdef HAVE_ELEMENTARY_WEB
1470 Widget_Data *wd = elm_widget_data_get(obj);
1471 if (!wd) return -1.0;
1472 return ewk_view_load_progress_get(wd->ewk_view);
1479 elm_web_stop(Evas_Object *obj)
1481 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1482 #ifdef HAVE_ELEMENTARY_WEB
1483 Widget_Data *wd = elm_widget_data_get(obj);
1484 if (!wd) return EINA_FALSE;
1485 return ewk_view_stop(wd->ewk_view);
1492 elm_web_reload(Evas_Object *obj)
1494 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1495 #ifdef HAVE_ELEMENTARY_WEB
1496 Widget_Data *wd = elm_widget_data_get(obj);
1497 if (!wd) return EINA_FALSE;
1498 return ewk_view_reload(wd->ewk_view);
1505 elm_web_reload_full(Evas_Object *obj)
1507 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1508 #ifdef HAVE_ELEMENTARY_WEB
1509 Widget_Data *wd = elm_widget_data_get(obj);
1510 if (!wd) return EINA_FALSE;
1511 return ewk_view_reload_full(wd->ewk_view);
1519 elm_web_back(Evas_Object *obj)
1521 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1522 #ifdef HAVE_ELEMENTARY_WEB
1523 Widget_Data *wd = elm_widget_data_get(obj);
1524 if (!wd) return EINA_FALSE;
1525 return ewk_view_back(wd->ewk_view);
1532 elm_web_forward(Evas_Object *obj)
1534 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1535 #ifdef HAVE_ELEMENTARY_WEB
1536 Widget_Data *wd = elm_widget_data_get(obj);
1537 if (!wd) return EINA_FALSE;
1538 return ewk_view_forward(wd->ewk_view);
1545 elm_web_navigate(Evas_Object *obj, int steps)
1547 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1548 #ifdef HAVE_ELEMENTARY_WEB
1549 Widget_Data *wd = elm_widget_data_get(obj);
1550 if (!wd) return EINA_FALSE;
1551 return ewk_view_navigate(wd->ewk_view, steps);
1558 EINA_DEPRECATED EAPI Eina_Bool
1559 elm_web_back_possible(Evas_Object *obj)
1561 return elm_web_back_possible_get(obj);
1565 elm_web_back_possible_get(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_back_possible(wd->ewk_view);
1578 elm_web_forward_possible_get(Evas_Object *obj)
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_forward_possible(wd->ewk_view);
1591 elm_web_navigate_possible_get(Evas_Object *obj, int steps)
1593 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1594 #ifdef HAVE_ELEMENTARY_WEB
1595 Widget_Data *wd = elm_widget_data_get(obj);
1596 if (!wd) return EINA_FALSE;
1597 return ewk_view_navigate_possible(wd->ewk_view, steps);
1605 elm_web_history_enabled_get(const Evas_Object *obj)
1607 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1608 #ifdef HAVE_ELEMENTARY_WEB
1609 Widget_Data *wd = elm_widget_data_get(obj);
1610 if (!wd) return EINA_FALSE;
1611 return ewk_view_history_enable_get(wd->ewk_view);
1618 elm_web_history_enabled_set(Evas_Object *obj, Eina_Bool enable)
1620 ELM_CHECK_WIDTYPE(obj, widtype);
1621 #ifdef HAVE_ELEMENTARY_WEB
1622 Widget_Data *wd = elm_widget_data_get(obj);
1624 ewk_view_history_enable_set(wd->ewk_view, enable);
1630 //EAPI Ewk_History *ewk_view_history_get(const Evas_Object *obj); // TODO:
1633 elm_web_zoom_set(Evas_Object *obj, double zoom)
1635 ELM_CHECK_WIDTYPE(obj, widtype);
1636 #ifdef HAVE_ELEMENTARY_WEB
1637 Widget_Data *wd = elm_widget_data_get(obj);
1640 evas_object_geometry_get(wd->ewk_view, NULL, NULL, &vw, &vh);
1643 if (zoom > wd->zoom.max)
1644 zoom = wd->zoom.max;
1645 else if (zoom < wd->zoom.min)
1646 zoom = wd->zoom.min;
1647 if (zoom == wd->zoom.current) return;
1648 wd->zoom.current = zoom;
1649 if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_MANUAL)
1651 else if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_AUTO_FIT)
1653 Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1654 Evas_Coord fw, fh, pw, ph;
1655 if (!ewk_frame_contents_size_get(frame, &fw, &fh))
1657 z = ewk_frame_page_zoom_get(frame);
1660 if ((fw > 0) && (fh > 0))
1662 ph = (fh * vw) / fw;
1665 pw = (fw * vh) / fh;
1676 else if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_AUTO_FILL)
1678 Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1679 Evas_Coord fw, fh, pw, ph;
1680 if (!ewk_frame_contents_size_get(frame, &fw, &fh))
1682 z = ewk_frame_page_zoom_get(frame);
1685 if ((fw > 0) && (fh > 0))
1687 ph = (fh * vw) / fw;
1690 pw = (fw * vh) / fh;
1701 if (wd->zoom.no_anim)
1702 ewk_view_zoom_set(wd->ewk_view, z, cx, cy);
1704 ewk_view_zoom_animated_set(wd->ewk_view, z, _elm_config->zoom_friction,
1706 wd->zoom.no_anim = EINA_FALSE;
1713 elm_web_zoom_get(const Evas_Object *obj)
1715 ELM_CHECK_WIDTYPE(obj, widtype) -1.0;
1716 #ifdef HAVE_ELEMENTARY_WEB
1717 Widget_Data *wd = elm_widget_data_get(obj);
1718 return wd->zoom.current;
1725 elm_web_zoom_mode_set(Evas_Object *obj, Elm_Web_Zoom_Mode mode)
1727 ELM_CHECK_WIDTYPE(obj, widtype);
1728 #ifdef HAVE_ELEMENTARY_WEB
1729 Widget_Data *wd = elm_widget_data_get(obj);
1731 if (mode >= ELM_WEB_ZOOM_MODE_LAST)
1733 if (mode == wd->zoom.mode)
1735 wd->zoom.mode = mode;
1736 tz = wd->zoom.current;
1737 wd->zoom.current = 0.0;
1738 elm_web_zoom_set(obj, tz);
1744 EAPI Elm_Web_Zoom_Mode
1745 elm_web_zoom_mode_get(const Evas_Object *obj)
1747 ELM_CHECK_WIDTYPE(obj, widtype) ELM_WEB_ZOOM_MODE_LAST;
1748 #ifdef HAVE_ELEMENTARY_WEB
1749 Widget_Data *wd = elm_widget_data_get(obj);
1750 return wd->zoom.mode;
1752 return ELM_WEB_ZOOM_MODE_LAST;
1757 elm_web_region_show(Evas_Object *obj, int x, int y, int w __UNUSED__, int h __UNUSED__)
1759 ELM_CHECK_WIDTYPE(obj, widtype);
1760 #ifdef HAVE_ELEMENTARY_WEB
1761 Widget_Data *wd = elm_widget_data_get(obj);
1762 Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1763 int fw, fh, zw, zh, rx, ry;
1765 ewk_frame_contents_size_get(frame, &fw, &fh);
1766 zoom = ewk_frame_page_zoom_get(frame);
1771 if (wd->bring_in.animator)
1773 ecore_animator_del(wd->bring_in.animator);
1774 wd->bring_in.animator = NULL;
1776 ewk_frame_scroll_set(frame, rx, ry);
1784 elm_web_region_bring_in(Evas_Object *obj, int x, int y, int w __UNUSED__, int h __UNUSED__)
1786 ELM_CHECK_WIDTYPE(obj, widtype);
1787 #ifdef HAVE_ELEMENTARY_WEB
1788 Widget_Data *wd = elm_widget_data_get(obj);
1789 Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1790 int fw, fh, zw, zh, rx, ry, sx, sy;
1792 ewk_frame_contents_size_get(frame, &fw, &fh);
1793 ewk_frame_scroll_pos_get(frame, &sx, &sy);
1794 zoom = ewk_frame_page_zoom_get(frame);
1799 if ((wd->bring_in.end.x == rx) && (wd->bring_in.end.y == ry))
1801 wd->bring_in.start.x = sx;
1802 wd->bring_in.start.y = sy;
1803 wd->bring_in.end.x = rx;
1804 wd->bring_in.end.y = ry;
1805 if (wd->bring_in.animator)
1806 ecore_animator_del(wd->bring_in.animator);
1807 wd->bring_in.animator = ecore_animator_timeline_add(
1808 _elm_config->bring_in_scroll_friction, _bring_in_anim_cb, wd);
1816 elm_web_inwin_mode_set(Evas_Object *obj, Eina_Bool value)
1818 ELM_CHECK_WIDTYPE(obj, widtype);
1819 #ifdef HAVE_ELEMENTARY_WEB
1820 Widget_Data *wd = elm_widget_data_get(obj);
1822 wd->inwin_mode = value;
1829 elm_web_inwin_mode_get(const Evas_Object *obj)
1831 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1832 #ifdef HAVE_ELEMENTARY_WEB
1833 Widget_Data *wd = elm_widget_data_get(obj);
1835 return wd->inwin_mode;
1842 elm_web_window_features_ref(Elm_Web_Window_Features *wf)
1844 #ifdef HAVE_ELEMENTARY_WEB
1845 ewk_window_features_ref((Ewk_Window_Features *)wf);
1852 elm_web_window_features_unref(Elm_Web_Window_Features *wf)
1854 #ifdef HAVE_ELEMENTARY_WEB
1855 ewk_window_features_unref((Ewk_Window_Features *)wf);
1862 elm_web_window_features_property_get(const Elm_Web_Window_Features *wf, Elm_Web_Window_Feature_Flag flag)
1864 #ifdef HAVE_ELEMENTARY_WEB
1865 Eina_Bool toolbar_visible, statusbar_visible;
1866 Eina_Bool scrollbars_visible, menubar_visible;
1867 Eina_Bool locationbar_visible, fullscreen;
1869 ewk_window_features_bool_property_get((const Ewk_Window_Features *)wf,
1870 &toolbar_visible, &statusbar_visible,
1871 &scrollbars_visible, &menubar_visible,
1872 &locationbar_visible, &fullscreen);
1874 //TODO : Improve ewk API usage to get one value.
1878 case ELM_WEB_WINDOW_FEATURE_TOOLBAR:
1879 return toolbar_visible;
1881 case ELM_WEB_WINDOW_FEATURE_STATUSBAR:
1882 return statusbar_visible;
1884 case ELM_WEB_WINDOW_FEATURE_SCROLLBARS:
1885 return scrollbars_visible;
1887 case ELM_WEB_WINDOW_FEATURE_MENUBAR:
1888 return menubar_visible;
1890 case ELM_WEB_WINDOW_FEATURE_LOCATIONBAR:
1891 return locationbar_visible;
1893 case ELM_WEB_WINDOW_FEATURE_FULLSCREEN:
1899 if (!wf) return EINA_FALSE;
1900 if (flag==ELM_WEB_WINDOW_FEATURE_TOOLBAR)
1902 //TODO Handle unused variable warnings when
1903 //ewk is not installed.
1906 /* What to do with these ?
1909 (void)toolbar_visible;
1910 (void)statusbar_visible;
1911 (void)scrollbars_visible;
1912 (void)menubar_visible;
1913 (void)locationbar_visible;
1923 elm_web_window_features_region_get(const Elm_Web_Window_Features *wf, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
1925 #ifdef HAVE_ELEMENTARY_WEB
1926 ewk_window_features_int_property_get((const Ewk_Window_Features *)wf,
1930 if (!wf || !x || !y || !w || !h) return;
1931 /* What to do with these ?
1944 // 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!