void (*ewk_tile_unused_cache_max_set)(Ewk_Tile_Unused_Cache *, size_t);
size_t (*ewk_tile_unused_cache_max_get)(const Ewk_Tile_Unused_Cache *);
size_t (*ewk_tile_unused_cache_used_get)(const Ewk_Tile_Unused_Cache *);
+ size_t (*ewk_tile_unused_cache_flush)(Ewk_Tile_Unused_Cache *, size_t);
void (*ewk_tile_unused_cache_auto_flush)(Ewk_Tile_Unused_Cache *);
char * (*ewk_page_check_point_for_keyboard)(Evas_Object *, int, int, Eina_Bool *);
Eina_Bool (*ewk_page_check_point)(Evas_Object *, int, int, Evas_Event_Mouse_Down *, Eina_Bool *, Eina_Bool *, char **, char **, char **);
Eina_Bool back_handle_moving;
} text_selection;
void* touch_obj;
+
+ Ecore_Idler *flush_and_pre_render_idler;
};
/* local subsystem functions */
static void _smart_viewport_changed(void* data, Evas_Object* webview, void* arg);
static void _smart_input_method_changed(void* data, Evas_Object* webview, void* arg);
static void _smart_page_layout_info_set(Smart_Data *sd, float init_zoom_rate, float min_zoom_rate, float max_zoom_rate, Eina_Bool scalable);
-static void _smart_contents_size_changed(void* data, Evas_Object* frame, void* arg);
static void _smart_load_nonemptylayout_finished(void* data, Evas_Object* frame, void* arg);
static void _smart_cb_view_created(void* data, Evas_Object* webview, void* arg);
static void _smart_add(Evas_Object* obj);
eina_hash_add(sd->mime_func_hash, mime, func);
}
+int
+_flush_and_pre_render(void *data)
+{
+ Evas_Object *obj = (Evas_Object *)data;
+ API_ENTRY return ECORE_CALLBACK_CANCEL;
+
+ if (!sd->ewk_view_tiled_unused_cache_get)
+ sd->ewk_view_tiled_unused_cache_get = (Ewk_Tile_Unused_Cache *(*)(const Evas_Object *))dlsym(ewk_handle, "ewk_view_tiled_unused_cache_get");
+ if (!sd->ewk_tile_unused_cache_used_get)
+ sd->ewk_tile_unused_cache_used_get = (size_t (*)(const Ewk_Tile_Unused_Cache *))dlsym(ewk_handle, "ewk_tile_unused_cache_used_get");
+ if (!sd->ewk_tile_unused_cache_flush)
+ sd->ewk_tile_unused_cache_flush = (size_t (*)(Ewk_Tile_Unused_Cache *, size_t))dlsym(ewk_handle, "ewk_tile_unused_cache_flush");
+
+ Ewk_Tile_Unused_Cache *tuc = sd->ewk_view_tiled_unused_cache_get(obj);
+ sd->ewk_tile_unused_cache_flush(tuc, sd->ewk_tile_unused_cache_used_get(tuc));
+ _directional_pre_render(obj, 0, 0);
+
+ sd->flush_and_pre_render_idler = NULL;
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
/* local subsystem functions */
static void
_smart_show(Evas_Object* obj)
DBG("%s\n", __func__);
INTERNAL_ENTRY;
+ int object_w, object_h;
+ evas_object_geometry_get(obj, NULL, NULL, &object_w, &object_h);
+ object_w = (object_w % 10) ? (object_w / 10 * 10 + 10) : object_w;
+
+ if (sd->is_mobile_page)
+ {
+ sd->layout.w = object_w / sd->zoom.init_zoom_rate;
+ sd->layout.h = object_h / sd->zoom.init_zoom_rate;
+ if (!sd->ewk_view_fixed_layout_size_set)
+ sd->ewk_view_fixed_layout_size_set = (void (*)(Evas_Object *, Evas_Coord, Evas_Coord))dlsym(ewk_handle, "ewk_view_fixed_layout_size_set");
+ sd->ewk_view_fixed_layout_size_set(obj, sd->layout.w, sd->layout.h);
+ }
+ else
+ {
+ if (!sd->ewk_view_zoom_get)
+ sd->ewk_view_zoom_get = (float (*)(const Evas_Object *))dlsym(ewk_handle, "ewk_view_zoom_get");
+ if (!sd->ewk_view_zoom_set)
+ sd->ewk_view_zoom_set = (Eina_Bool (*)(Evas_Object *, float, Evas_Coord, Evas_Coord))dlsym(ewk_handle, "ewk_view_zoom_set");
+
+ // update min zoom rate
+ if (!sd->ewk_frame_contents_size_get)
+ sd->ewk_frame_contents_size_get = (Eina_Bool (*)(const Evas_Object *, Evas_Coord *, Evas_Coord *))dlsym(ewk_handle, "ewk_frame_contents_size_get");
+ int content_w;
+ sd->ewk_frame_contents_size_get(sd->ewk_view_frame_main_get(obj), &content_w, NULL);
+ if (content_w)
+ sd->zoom.min_zoom_rate = (float)object_w / (float)content_w;
+
+ // set zoom
+ if (sd->ewk_view_zoom_get(obj) < sd->zoom.min_zoom_rate)
+ sd->ewk_view_zoom_set(obj, sd->zoom.min_zoom_rate, 0, 0);
+ }
+
+ // call preRender by timer, because we can not get the correct visible_content of frame
+ // when call it directly.
+ if (!sd->ewk_view_uri_get)
+ sd->ewk_view_uri_get = (const char * (*)(const Evas_Object *))dlsym(ewk_handle, "ewk_view_uri_get");
+ const char *url = sd->ewk_view_uri_get(obj);
+ if (url && strcmp(url, "") != 0 && sd->flush_and_pre_render_idler == NULL)
+ {
+ sd->flush_and_pre_render_idler = ecore_idler_add(_flush_and_pre_render, obj);
+ }
+
_parent_sc.sc.resize(obj, w, h);
}
Smart_Data *sd = (Smart_Data *)data;
if (!sd) return;
- if (!sd->ewk_view_zoom_range_set)
- sd->ewk_view_zoom_range_set = (void (*)(Evas_Object *, float, float))dlsym(ewk_handle, "ewk_view_zoom_range_set");
if (!sd->ewk_view_user_scalable_set)
sd->ewk_view_user_scalable_set = (void (*)(Evas_Object *, Eina_Bool))dlsym(ewk_handle, "ewk_view_user_scalable_set");
// set default layout and zoom level
sd->is_mobile_page = EINA_FALSE;
- sd->layout.w = sd->layout.default_w;
+ sd->layout.w = -1;
+ sd->layout.h = -1;
sd->zoom.init_zoom_rate = 1.0f;
- sd->zoom.min_zoom_rate = MIN_ZOOM_RATIO;
- sd->zoom.max_zoom_rate = MAX_ZOOM_RATIO;
sd->zoom.scalable = EINA_TRUE;
- sd->ewk_view_zoom_range_set(webview, sd->zoom.min_zoom_rate, sd->zoom.max_zoom_rate);
sd->ewk_view_user_scalable_set(webview, EINA_TRUE);
}
sd->zoom.scalable = scalable;
if (scalable)
{
- sd->zoom.min_zoom_rate = (min_zoom_rate <= init_zoom_rate) ? init_zoom_rate : min_zoom_rate;
- sd->zoom.max_zoom_rate = (max_zoom_rate <= init_zoom_rate) ? init_zoom_rate : max_zoom_rate;
- if (max_zoom_rate < min_zoom_rate)
- max_zoom_rate = min_zoom_rate;
+ sd->zoom.min_zoom_rate = (min_zoom_rate <= sd->zoom.init_zoom_rate) ? sd->zoom.init_zoom_rate : min_zoom_rate;
+ sd->zoom.max_zoom_rate = (max_zoom_rate <= sd->zoom.init_zoom_rate) ? sd->zoom.init_zoom_rate : max_zoom_rate;
+ if (sd->zoom.max_zoom_rate < sd->zoom.min_zoom_rate)
+ sd->zoom.max_zoom_rate = sd->zoom.min_zoom_rate;
}
else
{
}
static void
-_smart_contents_size_changed(void* data, Evas_Object* frame, void* arg)
-{
- Smart_Data* sd = (Smart_Data *)data;
- if (!sd) return;
-
- Evas_Object* webview = sd->base.self;
-
- Evas_Coord* size = (Evas_Coord*)arg;
- if (!size || size[0] == 0)
- return;
-
- // update min zoom rate
- int w;
- evas_object_geometry_get(webview, NULL, NULL, &w, NULL);
- sd->zoom.min_zoom_rate = (float)w / (float)size[0];
- if (sd->zoom.min_zoom_rate < MIN_ZOOM_RATIO)
- sd->zoom.min_zoom_rate = MIN_ZOOM_RATIO;
-
- if (!sd->ewk_view_zoom_range_set)
- sd->ewk_view_zoom_range_set = (void (*)(Evas_Object *, float, float))dlsym(ewk_handle, "ewk_view_zoom_range_set");
- sd->ewk_view_zoom_range_set(webview, sd->zoom.min_zoom_rate, sd->zoom.max_zoom_rate);
-}
-
-static void
_smart_load_nonemptylayout_finished(void* data, Evas_Object* frame, void* arg)
{
DBG("%s is called\n", __func__);
sd->ewk_view_zoom_range_set = (void (*)(Evas_Object *, float, float))dlsym(ewk_handle, "ewk_view_zoom_range_set");
if (!sd->ewk_view_fixed_layout_size_set)
sd->ewk_view_fixed_layout_size_set = (void (*)(Evas_Object *, Evas_Coord, Evas_Coord))dlsym(ewk_handle, "ewk_view_fixed_layout_size_set");
+ sd->ewk_view_zoom_range_set(webview, MIN_ZOOM_RATIO, MAX_ZOOM_RATIO);
+
+ // set default layout size
+ int object_w, object_h;
+ evas_object_geometry_get(webview, NULL, NULL, &object_w, &object_h);
+ object_w = (object_w % 10) ? (object_w / 10 * 10 + 10) : object_w;
+ sd->ewk_view_fixed_layout_size_set(webview, object_w, object_h);
sd->ewk_view_user_scalable_set(webview, EINA_TRUE);
sd->ewk_frame_contents_size_get(frame, &content_w, NULL);
const char *url = sd->ewk_view_uri_get(webview);
- if (content_w > sd->layout.w && !strstr(url, "docs.google.com"))
+ if ((content_w > sd->layout.w && !strstr(url, "docs.google.com"))
+ || strstr(url, "maps.google.com/maps/m"))
{
// set page layout info, zoom and layout again
_smart_page_layout_info_set(sd, 1.0f, sd->zoom.min_zoom_rate, sd->zoom.max_zoom_rate, sd->zoom.scalable);
sd->ewk_view_zoom_set(webview, sd->zoom.init_zoom_rate, 0, 0);
sd->ewk_view_fixed_layout_size_set(webview, sd->layout.w, sd->layout.h);
}
+ sd->ewk_view_zoom_range_set(webview, sd->zoom.min_zoom_rate, sd->zoom.max_zoom_rate);
} else {
- evas_object_geometry_get(webview, NULL, NULL, NULL, &sd->layout.h);
+ sd->zoom.min_zoom_rate = MIN_ZOOM_RATIO;
+ sd->zoom.max_zoom_rate = MAX_ZOOM_RATIO;
+ sd->ewk_view_zoom_range_set(webview, sd->zoom.min_zoom_rate, sd->zoom.max_zoom_rate);
+ sd->layout.w = DEFAULT_LAYOUT_WIDTH;
+ sd->layout.h = object_h;
+
if (!sd->ewk_view_zoom_set)
sd->ewk_view_zoom_set = (Eina_Bool (*)(Evas_Object *, float, Evas_Coord, Evas_Coord))dlsym(ewk_handle, "ewk_view_zoom_set");
sd->ewk_view_zoom_set(webview, sd->zoom.init_zoom_rate, 0, 0);
sd->ewk_view_fixed_layout_size_set(webview, sd->layout.w, sd->layout.h);
+
+ // update min zoom rate
+ if (!sd->ewk_frame_contents_size_get)
+ sd->ewk_frame_contents_size_get = (Eina_Bool (*)(const Evas_Object *, Evas_Coord *, Evas_Coord *))dlsym(ewk_handle, "ewk_frame_contents_size_get");
+ int content_w;
+ sd->ewk_frame_contents_size_get(sd->ewk_view_frame_main_get(webview), &content_w, NULL);
+ if (content_w)
+ sd->zoom.min_zoom_rate = (float)object_w / (float)content_w;
}
- sd->ewk_view_zoom_range_set(webview, sd->zoom.min_zoom_rate, sd->zoom.max_zoom_rate);
sd->ewk_view_user_scalable_set(webview, sd->zoom.scalable);
}
sd->ewk_view_zoom_text_only_set(obj, EINA_FALSE);
sd->ewk_view_zoom_cairo_scaling_set = (Eina_Bool (*)(Evas_Object *, Eina_Bool))dlsym(ewk_handle, "ewk_view_zoom_cairo_scaling_set");
sd->ewk_view_zoom_cairo_scaling_set(obj, EINA_TRUE);
+ sd->flush_and_pre_render_idler = NULL;
#ifdef NEED_TO_REMOVE
// TODO: temporary add the mouse callbacks until the webkit engine can receive mouse events
if (!(sd->ewk_view_frame_main_get))
sd->ewk_view_frame_main_get = (Evas_Object *(*)(const Evas_Object *))dlsym(ewk_handle, "ewk_view_frame_main_get");
- evas_object_smart_callback_add(sd->ewk_view_frame_main_get(obj), "contents,size,changed",
- _smart_contents_size_changed, sd);
evas_object_smart_callback_add(sd->ewk_view_frame_main_get(obj), "load,nonemptylayout,finished",
_smart_load_nonemptylayout_finished, sd);