void *console_message_data;
} hook;
Elm_Win_Keyboard_Mode input_method;
+ struct {
+ Elm_Web_Zoom_Mode mode;
+ float current;
+ float min, max;
+ Eina_Bool no_anim;
+ Ecore_Timer *timer;
+ } zoom;
+ struct {
+ struct {
+ int x, y;
+ } start, end;
+ Ecore_Animator *animator;
+ } bring_in;
Eina_Bool tab_propagate : 1;
Eina_Bool inwin_mode : 1;
#else
{ NULL, NULL }
};
-static void
-_theme_hook(Evas_Object *obj)
-{
#ifdef HAVE_ELEMENTARY_WEB
- Elm_Theme *theme = elm_object_theme_get(obj);
- Widget_Data *wd = elm_widget_data_get(obj);
- const Eina_List *themes, *l;
+static char *
+_webkit_theme_find(const Eina_List *list)
+{
+ const Eina_List *l;
const char *th;
- char *view_theme = NULL;
- themes = elm_theme_list_get(theme);
- EINA_LIST_FOREACH(themes, l, th)
+ EINA_LIST_FOREACH(list, l, th)
{
char *path = elm_theme_list_item_path_get(th, NULL);
if (!path) continue;
if (edje_file_group_exists(path, "webkit/base"))
- {
- view_theme = path;
- break;
- }
+ return path;
free(path);
}
+ return NULL;
+}
+#endif
+
+static void
+_theme_hook(Evas_Object *obj)
+{
+#ifdef HAVE_ELEMENTARY_WEB
+ Elm_Theme *theme = elm_object_theme_get(obj);
+ Widget_Data *wd = elm_widget_data_get(obj);
+ const Eina_List *themes;
+ char *view_theme = NULL;
+
+ themes = elm_theme_overlay_list_get(theme);
+ view_theme = _webkit_theme_find(themes);
+ if (view_theme) goto set;
+
+ themes = elm_theme_list_get(theme);
+ view_theme = _webkit_theme_find(themes);
+ if (view_theme) goto set;
+
+ themes = elm_theme_extension_list_get(theme);
+ view_theme = _webkit_theme_find(themes);
+
+set:
if (view_theme)
{
ewk_view_theme_set(wd->ewk_view, view_theme);
return _parent_sc.mouse_down(esd, event);
sd->mouse.pan_anim = ecore_animator_add(_view_pan_animator, sd);
- sd->mouse.longpress_timer = ecore_timer_add(1.0, _view_longpress_timer, sd);
+ sd->mouse.longpress_timer = ecore_timer_add(_elm_config->longpress_timeout, _view_longpress_timer, sd);
sd->mouse.move_count = 1;
sd->mouse.x = event->canvas.x;
sd->mouse.y = event->canvas.y;
}
static Evas_Object *
-_run_dialog(Evas_Object *parent, enum Dialog_Type type, const char *message, const char *default_entry_value, char **entry_value, Eina_Bool allows_multiple_files __UNUSED__, const char *accept_types __UNUSED__, Eina_List **selected_filenames, Eina_Bool *response)
+_run_dialog(Evas_Object *parent, enum Dialog_Type type, const char *message, const char *default_entry_value, char **entry_value, Eina_Bool allows_multiple_files __UNUSED__, Eina_List *accept_types __UNUSED__, Eina_List **selected_filenames, Eina_Bool *response)
{
EINA_SAFETY_ON_TRUE_RETURN_VAL((type != DIALOG_PROMPT) && (!!default_entry_value), EINA_FALSE);
EINA_SAFETY_ON_TRUE_RETURN_VAL((type != DIALOG_PROMPT) && (!!entry_value), EINA_FALSE);
}
static Eina_Bool
-_view_smart_run_open_panel(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, Eina_Bool allows_multiple_files, const char *accept_types, Eina_List **selected_filenames)
+_view_smart_run_open_panel(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, Eina_Bool allows_multiple_files, Eina_List *accept_types, Eina_List **selected_filenames)
{
View_Smart_Data *sd = (View_Smart_Data *)esd;
Evas_Object *view = sd->base.self;
}
static void
+_ewk_view_load_finished_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
+{
+ Widget_Data *wd = data;
+
+ if (event_info)
+ return;
+
+ if (wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL)
+ {
+ float tz = wd->zoom.current;
+ wd->zoom.current = 0.0;
+ elm_web_zoom_set(wd->self, tz);
+ }
+}
+
+static void
+_ewk_view_viewport_changed_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
+{
+ Widget_Data *wd = data;
+
+ if (wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL)
+ {
+ ewk_view_zoom_set(obj, 1.0, 0, 0);
+ wd->zoom.no_anim = EINA_TRUE;
+ }
+}
+
+static Eina_Bool
+_restore_zoom_mode_timer_cb(void *data)
+{
+ Widget_Data *wd = data;
+ float tz = wd->zoom.current;
+ wd->zoom.timer = NULL;
+ wd->zoom.current = 0.0;
+ wd->zoom.no_anim = EINA_TRUE;
+ elm_web_zoom_set(wd->self, tz);
+ return EINA_FALSE;
+}
+
+static Eina_Bool
+_reset_zoom_timer_cb(void *data)
+{
+ Widget_Data *wd = data;
+ wd->zoom.timer = ecore_timer_add(0.0, _restore_zoom_mode_timer_cb, wd);
+ ewk_view_zoom_set(wd->ewk_view, 1.0, 0, 0);
+ return EINA_FALSE;
+}
+
+static void
+_ewk_view_resized_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+ Widget_Data *wd = data;
+ if (!(wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL))
+ return;
+ if (wd->zoom.timer)
+ ecore_timer_del(wd->zoom.timer);
+ wd->zoom.timer = ecore_timer_add(0.5, _reset_zoom_timer_cb, wd);
+}
+
+static void
_popup_del_job(void *data)
{
evas_object_del(data);
_popup_item_selected(void *data, Evas_Object *obj, void *event_info __UNUSED__)
{
Evas_Object *view = data;
- Elm_List_Item *it = elm_list_selected_item_get(obj);
+ Elm_Object_Item *list_it = elm_list_selected_item_get(obj);
const Eina_List *itr, *list = elm_list_items_get(obj);
void *d;
int i = 0;
EINA_LIST_FOREACH(list, itr, d)
{
- if (d == it)
+ if (d == list_it)
break;
i++;
return;
notify = elm_notify_add(obj);
- elm_notify_repeat_events_set(notify, EINA_FALSE);
+ elm_notify_allow_events_set(notify, EINA_FALSE);
elm_notify_orient_set(notify, ELM_NOTIFY_ORIENT_BOTTOM);
list = elm_list_add(obj);
- elm_list_always_select_mode_set(list, EINA_TRUE);
+ elm_list_select_mode_set(data, ELM_OBJECT_SELECT_MODE_ALWAYS);
elm_list_bounce_set(list, EINA_FALSE, EINA_FALSE);
elm_list_mode_set(list, ELM_LIST_EXPAND);
evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
- elm_notify_content_set(notify, list);
+ elm_object_content_set(notify, list);
evas_object_show(list);
EINA_LIST_FOREACH(m->items, itr, it)
_view_smart_callback_proxy_cb, ctxt);
}
}
+
+static Eina_Bool
+_bring_in_anim_cb(void *data, double pos)
+{
+ Widget_Data *wd = data;
+ Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
+ int sx, sy, rx, ry;
+
+ sx = wd->bring_in.start.x;
+ sy = wd->bring_in.start.y;
+ rx = (wd->bring_in.end.x - sx) * pos;
+ ry = (wd->bring_in.end.y - sy) * pos;
+
+ ewk_frame_scroll_set(frame, rx + sx, ry + sy);
+
+ if (pos == 1.0)
+ {
+ wd->bring_in.end.x = wd->bring_in.end.y = wd->bring_in.start.x =
+ wd->bring_in.start.y = 0;
+ wd->bring_in.animator = NULL;
+ }
+
+ return EINA_TRUE;
+}
#endif
#ifdef HAVE_ELEMENTARY_WEB
_ewk_view_load_started_cb, wd);
evas_object_smart_callback_add(wd->ewk_view, "popup,create",
_ewk_view_popup_create_cb, wd);
+ evas_object_smart_callback_add(wd->ewk_view, "load,finished",
+ _ewk_view_load_finished_cb, wd);
+ evas_object_smart_callback_add(wd->ewk_view, "viewport,changed",
+ _ewk_view_viewport_changed_cb, wd);
+ evas_object_smart_callback_add(wd->ewk_view, "view,resized",
+ _ewk_view_resized_cb, wd);
elm_widget_resize_object_set(obj, wd->ewk_view);
wd->tab_propagate = EINA_FALSE;
wd->inwin_mode = _elm_config->inwin_dialogs_enable;
+ wd->zoom.min = ewk_view_zoom_range_min_get(wd->ewk_view);
+ wd->zoom.max = ewk_view_zoom_range_max_get(wd->ewk_view);
+ wd->zoom.current = 1.0;
_view_smart_callback_proxy(wd->ewk_view, wd->self);
evas_object_smart_callbacks_descriptions_set(obj, _elm_web_callback_names);
#endif
}
+EAPI void
+elm_web_useragent_set(Evas_Object *obj, const char *user_agent)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype);
+#ifdef HAVE_ELEMENTARY_WEB
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+ ewk_view_setting_user_agent_set(wd->ewk_view, user_agent);
+#else
+ (void)user_agent;
+#endif
+}
+
+EAPI const char*
+elm_web_useragent_get(const Evas_Object *obj)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+#ifdef HAVE_ELEMENTARY_WEB
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return NULL;
+ return ewk_view_setting_user_agent_get(wd->ewk_view);
+#else
+ return NULL;
+#endif
+}
+
EAPI Eina_Bool
elm_web_tab_propagate_get(const Evas_Object *obj)
{
}
EAPI void
-elm_web_popup_selected_set(Evas_Object *obj, int index)
+elm_web_popup_selected_set(Evas_Object *obj, int idx)
{
ELM_CHECK_WIDTYPE(obj, widtype);
#ifdef HAVE_ELEMENTARY_WEB
Widget_Data *wd = elm_widget_data_get(obj);
- ewk_view_popup_selected_set(wd->ewk_view, index);
+ ewk_view_popup_selected_set(wd->ewk_view, idx);
#else
- (void)index;
+ (void)idx;
#endif
}
#endif
}
-EAPI Eina_Bool
+EINA_DEPRECATED EAPI Eina_Bool
elm_web_back_possible(Evas_Object *obj)
{
+ return elm_web_back_possible_get(obj);
+}
+
+EAPI Eina_Bool
+elm_web_back_possible_get(Evas_Object *obj)
+{
ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
#ifdef HAVE_ELEMENTARY_WEB
Widget_Data *wd = elm_widget_data_get(obj);
#endif
}
-EAPI Eina_Bool
+EINA_DEPRECATED EAPI Eina_Bool
elm_web_forward_possible(Evas_Object *obj)
{
+ return elm_web_forward_possible_get(obj);
+}
+
+EAPI Eina_Bool
+elm_web_forward_possible_get(Evas_Object *obj)
+{
ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
#ifdef HAVE_ELEMENTARY_WEB
Widget_Data *wd = elm_widget_data_get(obj);
}
EAPI Eina_Bool
-elm_web_navigate_possible(Evas_Object *obj, int steps)
+elm_web_navigate_possible_get(Evas_Object *obj, int steps)
{
ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
#ifdef HAVE_ELEMENTARY_WEB
#endif
}
-EAPI Eina_Bool
+EINA_DEPRECATED EAPI Eina_Bool
elm_web_history_enable_get(const Evas_Object *obj)
{
+ return elm_web_history_enabled_get(obj);
+}
+
+EAPI Eina_Bool
+elm_web_history_enabled_get(const Evas_Object *obj)
+{
ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
#ifdef HAVE_ELEMENTARY_WEB
Widget_Data *wd = elm_widget_data_get(obj);
#endif
}
-EAPI void
+EINA_DEPRECATED EAPI void
elm_web_history_enable_set(Evas_Object *obj, Eina_Bool enable)
{
+ elm_web_history_enabled_set(obj, enable);
+}
+
+EAPI void
+elm_web_history_enabled_set(Evas_Object *obj, Eina_Bool enable)
+{
ELM_CHECK_WIDTYPE(obj, widtype);
#ifdef HAVE_ELEMENTARY_WEB
Widget_Data *wd = elm_widget_data_get(obj);
//EAPI Ewk_History *ewk_view_history_get(const Evas_Object *obj); // TODO:
-EAPI Eina_Bool
-elm_web_zoom_text_only_get(const Evas_Object *obj)
+EAPI void
+elm_web_zoom_set(Evas_Object *obj, double zoom)
{
- ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+ ELM_CHECK_WIDTYPE(obj, widtype);
#ifdef HAVE_ELEMENTARY_WEB
Widget_Data *wd = elm_widget_data_get(obj);
- if (!wd) return EINA_FALSE;
- return ewk_view_zoom_text_only_get(wd->ewk_view);
+ int vw, vh, cx, cy;
+ float z = 1.0;
+ evas_object_geometry_get(wd->ewk_view, NULL, NULL, &vw, &vh);
+ cx = vw / 2;
+ cy = vh / 2;
+ if (zoom > wd->zoom.max)
+ zoom = wd->zoom.max;
+ else if (zoom < wd->zoom.min)
+ zoom = wd->zoom.min;
+ if (zoom == wd->zoom.current) return;
+ wd->zoom.current = zoom;
+ if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_MANUAL)
+ z = zoom;
+ else if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_AUTO_FIT)
+ {
+ Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
+ Evas_Coord fw, fh, pw, ph;
+ if (!ewk_frame_contents_size_get(frame, &fw, &fh))
+ return;
+ z = ewk_frame_page_zoom_get(frame);
+ fw /= z;
+ fh /= z;
+ if ((fw > 0) && (fh > 0))
+ {
+ ph = (fh * vw) / fw;
+ if (ph > vh)
+ {
+ pw = (fw * vh) / fh;
+ ph = vh;
+ }
+ else
+ pw = vw;
+ if (fw > fh)
+ z = (float)pw / fw;
+ else
+ z = (float)ph / fh;
+ }
+ }
+ else if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_AUTO_FILL)
+ {
+ Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
+ Evas_Coord fw, fh, pw, ph;
+ if (!ewk_frame_contents_size_get(frame, &fw, &fh))
+ return;
+ z = ewk_frame_page_zoom_get(frame);
+ fw /= z;
+ fh /= z;
+ if ((fw > 0) && (fh > 0))
+ {
+ ph = (fh * vw) / fw;
+ if (ph < vh)
+ {
+ pw = (fw * vh) / fh;
+ ph = vh;
+ }
+ else
+ pw = vw;
+ if (fw > fh)
+ z = (float)pw / fw;
+ else
+ z = (float)ph / fh;
+ }
+ }
+ if (wd->zoom.no_anim)
+ ewk_view_zoom_set(wd->ewk_view, z, cx, cy);
+ else
+ ewk_view_zoom_animated_set(wd->ewk_view, z, _elm_config->zoom_friction,
+ cx, cy);
+ wd->zoom.no_anim = EINA_FALSE;
#else
- return EINA_FALSE;
+ (void)zoom;
+#endif
+}
+
+EAPI double
+elm_web_zoom_get(const Evas_Object *obj)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype) -1.0;
+#ifdef HAVE_ELEMENTARY_WEB
+ Widget_Data *wd = elm_widget_data_get(obj);
+ return wd->zoom.current;
+#else
+ return -1.0;
#endif
}
EAPI void
-elm_web_zoom_text_only_set(Evas_Object *obj, Eina_Bool setting)
+elm_web_zoom_mode_set(Evas_Object *obj, Elm_Web_Zoom_Mode mode)
{
ELM_CHECK_WIDTYPE(obj, widtype);
#ifdef HAVE_ELEMENTARY_WEB
Widget_Data *wd = elm_widget_data_get(obj);
- if (!wd) return;
- ewk_view_zoom_text_only_set(wd->ewk_view, setting);
+ float tz;
+ if (mode >= ELM_WEB_ZOOM_MODE_LAST)
+ return;
+ if (mode == wd->zoom.mode)
+ return;
+ wd->zoom.mode = mode;
+ tz = wd->zoom.current;
+ wd->zoom.current = 0.0;
+ elm_web_zoom_set(obj, tz);
#else
- (void)setting;
+ (void)mode;
+#endif
+}
+
+EAPI Elm_Web_Zoom_Mode
+elm_web_zoom_mode_get(const Evas_Object *obj)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype) ELM_WEB_ZOOM_MODE_LAST;
+#ifdef HAVE_ELEMENTARY_WEB
+ Widget_Data *wd = elm_widget_data_get(obj);
+ return wd->zoom.mode;
+#else
+ return ELM_WEB_ZOOM_MODE_LAST;
+#endif
+}
+
+EAPI void
+elm_web_region_show(Evas_Object *obj, int x, int y, int w __UNUSED__, int h __UNUSED__)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype);
+#ifdef HAVE_ELEMENTARY_WEB
+ Widget_Data *wd = elm_widget_data_get(obj);
+ Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
+ int fw, fh, zw, zh, rx, ry;
+ float zoom;
+ ewk_frame_contents_size_get(frame, &fw, &fh);
+ zoom = ewk_frame_page_zoom_get(frame);
+ zw = fw / zoom;
+ zh = fh / zoom;
+ rx = (x * fw) / zw;
+ ry = (y * fh) / zh;
+ if (wd->bring_in.animator)
+ {
+ ecore_animator_del(wd->bring_in.animator);
+ wd->bring_in.animator = NULL;
+ }
+ ewk_frame_scroll_set(frame, rx, ry);
+#else
+ (void)x;
+ (void)y;
+#endif
+}
+
+EAPI void
+elm_web_region_bring_in(Evas_Object *obj, int x, int y, int w __UNUSED__, int h __UNUSED__)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype);
+#ifdef HAVE_ELEMENTARY_WEB
+ Widget_Data *wd = elm_widget_data_get(obj);
+ Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
+ int fw, fh, zw, zh, rx, ry, sx, sy;
+ float zoom;
+ ewk_frame_contents_size_get(frame, &fw, &fh);
+ ewk_frame_scroll_pos_get(frame, &sx, &sy);
+ zoom = ewk_frame_page_zoom_get(frame);
+ zw = fw / zoom;
+ zh = fh / zoom;
+ rx = (x * fw) / zw;
+ ry = (y * fh) / zh;
+ if ((wd->bring_in.end.x == rx) && (wd->bring_in.end.y == ry))
+ return;
+ wd->bring_in.start.x = sx;
+ wd->bring_in.start.y = sy;
+ wd->bring_in.end.x = rx;
+ wd->bring_in.end.y = ry;
+ if (wd->bring_in.animator)
+ ecore_animator_del(wd->bring_in.animator);
+ wd->bring_in.animator = ecore_animator_timeline_add(
+ _elm_config->bring_in_scroll_friction, _bring_in_anim_cb, wd);
+#else
+ (void)x;
+ (void)y;
#endif
}
#endif
}
-EAPI void
-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)
+EAPI Eina_Bool
+elm_web_window_features_property_get(const Elm_Web_Window_Features *wf, Elm_Web_Window_Feature_Flag flag)
{
#ifdef HAVE_ELEMENTARY_WEB
+ Eina_Bool toolbar_visible, statusbar_visible;
+ Eina_Bool scrollbars_visible, menubar_visible;
+ Eina_Bool locationbar_visible, fullscreen;
+
ewk_window_features_bool_property_get((const Ewk_Window_Features *)wf,
- toolbar_visible, statusbar_visible,
- scrollbars_visible, menubar_visible,
- locationbar_visible, fullscreen);
+ &toolbar_visible, &statusbar_visible,
+ &scrollbars_visible, &menubar_visible,
+ &locationbar_visible, &fullscreen);
+
+ //TODO : Improve ewk API usage to get one value.
+ //
+ switch(flag)
+ {
+ case ELM_WEB_WINDOW_FEATURE_TOOLBAR:
+ return toolbar_visible;
+ break;
+ case ELM_WEB_WINDOW_FEATURE_STATUSBAR:
+ return statusbar_visible;
+ break;
+ case ELM_WEB_WINDOW_FEATURE_SCROLLBARS:
+ return scrollbars_visible;
+ break;
+ case ELM_WEB_WINDOW_FEATURE_MENUBAR:
+ return menubar_visible;
+ break;
+ case ELM_WEB_WINDOW_FEATURE_LOCATIONBAR:
+ return locationbar_visible;
+ break;
+ case ELM_WEB_WINDOW_FEATURE_FULLSCREEN:
+ return fullscreen;
+ break;
+ }
#else
+
+ if (!wf) return EINA_FALSE;
+ if (flag==ELM_WEB_WINDOW_FEATURE_TOOLBAR)
+ {
+ //TODO Handle unused variable warnings when
+ //ewk is not installed.
+ }
+
+ /* What to do with these ?
+
(void)wf;
(void)toolbar_visible;
(void)statusbar_visible;
(void)menubar_visible;
(void)locationbar_visible;
(void)fullscreen;
+
+ */
+
#endif
+ return EINA_FALSE;
}
EAPI void
-elm_web_window_features_int_property_get(const Elm_Web_Window_Features *wf, int *x, int *y, int *w, int *h)
+elm_web_window_features_region_get(const Elm_Web_Window_Features *wf, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
{
#ifdef HAVE_ELEMENTARY_WEB
ewk_window_features_int_property_get((const Ewk_Window_Features *)wf,
x, y, w, h);
#else
+
+ if (!wf || !x || !y || !w || !h) return;
+ /* What to do with these ?
+
(void)wf;
(void)x;
(void)y;
(void)w;
(void)h;
+
+ */
+
#endif
}