#define MINIMAP_WIDTH 120
#define MINIMAP_HEIGHT 200
+
+#define USE_MAX_TUC_20MB
+
+#ifdef USE_MAX_TUC_20MB
+#define MAX_TUC 1024*1024*20
+#else
#define MAX_TUC 1024*1024*10
+#endif
#define MAX_URI 512
#define MOBILE_DEFAULT_ZOOM_RATIO 1.5f
Eina_Bool (*ewk_view_zoom_cairo_scaling_get)(const Evas_Object *);
Eina_Bool (*ewk_view_zoom_cairo_scaling_set)(Evas_Object *, Eina_Bool);
void (*ewk_view_viewport_get)(Evas_Object *, int *, int *, float *, float *, float *, Eina_Bool *);
- void (*ewk_view_zoom_range_set)(Evas_Object *, float, float);
+ Eina_Bool (*ewk_view_zoom_range_set)(Evas_Object *, float, float);
void (*ewk_view_user_scalable_set)(Evas_Object *, Eina_Bool);
Eina_Bool (*ewk_view_pre_render_region)(Evas_Object *, Evas_Coord, Evas_Coord, Evas_Coord, Evas_Coord, float);
void (*ewk_view_pre_render_cancel)(Evas_Object *);
Eina_Bool (*ewk_frame_scroll_add)(Evas_Object *, int, int);
unsigned int (*ewk_view_imh_get)(Evas_Object *);
Ecore_IMF_Context* (*ewk_view_core_imContext_get)(Evas_Object *);
+ void (*ewk_set_show_geolocation_permission_dialog_callback)(ewk_show_geolocation_permission_dialog_callback);
+ void (*ewk_set_geolocation_sharing_allowed)(void *, Eina_Bool);
/* cairo functions */
cairo_t * (*cairo_create)(cairo_surface_t *);
static void _coords_evas_to_ewk(Evas_Object* webview, int x, int y, int* ux, int* uy);
static void _coords_ewk_to_evas(Evas_Object* webview, int x, int y, int* ux, int* uy);
static void _update_min_zoom_rate(Evas_Object *obj);
+static void _geolocation_permission_callback(void *geolocation_obj, const char* url);
/* local subsystem globals */
static Evas_Smart *_smart = NULL;
static Ewk_Tile_Unused_Cache *ewk_tile_cache = NULL;
static ewk_tile_cache_ref_count = 0;
+static Evas_Object *obj = NULL;
+
/* externally accessible functions */
Evas_Object*
_elm_smart_webview_add(Evas *evas, Eina_Bool tiled)
ERR("could not create smart object for webview");
return NULL;
}
+ obj = webview;
// set tiled and unused cache
Smart_Data* sd = evas_object_smart_data_get(webview);
if (sd->events_feed)
{
+ _suspend_all(sd, EINA_FALSE);
sd->mouse_clicked = EINA_TRUE;
return _parent_sc.mouse_down(esd, ev);
}
if (sd->events_feed)
{
+ _resume_all(sd, EINA_FALSE);
//check if user hold touch
if (ev && (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD))
{
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");
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 = (Eina_Bool (*)(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");
- if (sd->use_zoom_bouncing)
- sd->ewk_view_zoom_range_set(webview, MIN_ZOOM_RATIO, MAX_ZOOM_RATIO + ZOOM_IN_BOUNCING);
- else
- sd->ewk_view_zoom_range_set(webview, MIN_ZOOM_RATIO, MAX_ZOOM_RATIO);
+ sd->ewk_view_zoom_range_set(webview, MIN_ZOOM_RATIO, MAX_ZOOM_RATIO);
// set default layout size
int object_w, object_h;
{
// 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_range_set(webview, MIN_ZOOM_RATIO, MAX_ZOOM_RATIO);
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_theme_set = (void (*)(Evas_Object *, const char *))dlsym(ewk_handle, "ewk_view_theme_set");
sd->ewk_view_theme_set(obj, WEBKIT_EDJ);
+ // set geolocation callback
+ sd->ewk_set_show_geolocation_permission_dialog_callback = (void (*)(ewk_show_geolocation_permission_dialog_callback))dlsym(ewk_handle, "ewk_set_show_geolocation_permission_dialog_callback");
+ sd->ewk_set_show_geolocation_permission_dialog_callback(_geolocation_permission_callback);
+
sd->ewk_view_zoom_text_only_set = (Eina_Bool (*)(Evas_Object *, Eina_Bool))dlsym(ewk_handle, "ewk_view_zoom_text_only_set");
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");
typedef enum { up, down, left, right, up_left, up_right, down_left, down_right, undefined } Directions;
Directions direction = undefined;
+#ifdef USE_MAX_TUC_20MB
+ if (!sd->ewk_view_zoom_get)
+ sd->ewk_view_zoom_get = (float (*)(const Evas_Object *))dlsym(ewk_handle, "ewk_view_zoom_get");
+ float zoom = sd->ewk_view_zoom_get(obj);
+#endif
+
if (dx == 0 && dy < 0) direction = down;
if (dx > 0 && dy < 0) direction = down_left;
if (dx > 0 && dy == 0) direction = left;
if (dx < 0 && dy == 0) direction = right;
if (dx < 0 && dy < 0) direction = down_right;
+#ifdef USE_MAX_TUC_20MB
+ const float DIRECTION_PLAIN_CX = 2.0/zoom;
+ const float DIRECTION_CROSS_CX = 1.0/zoom;
+ const float DIRECTION_UNDEFINED_CX_LEVEL_1 = 0.5/zoom;
+ const float DIRECTION_UNDEFINED_CX_LEVEL_2 = 0.8/zoom;
+#else
const float DIRECTION_PLAIN_CX = 1.5;
const float DIRECTION_CROSS_CX = 0.7;
const float DIRECTION_UNDEFINED_CX_LEVEL_1 = 0.3;
const float DIRECTION_UNDEFINED_CX_LEVEL_2 = 0.6;
const float DIRECTION_UNDEFINED_CX_LEVEL_3 = 0.8;
+#endif
+
int p_x = x, p_y = y, p_w = w, p_h = h;
switch (direction) {
DBG("Shouldn't happen!!");
}
+#ifndef USE_MAX_TUC_20MB
if (!sd->ewk_view_zoom_get)
sd->ewk_view_zoom_get = (float (*)(const Evas_Object *))dlsym(ewk_handle, "ewk_view_zoom_get");
float zoom = sd->ewk_view_zoom_get(obj);
+#endif
// cancel the previously scheduled pre-rendering
// This makes sense especilaly for zooming operation - when user
//dbg_draw_scaled_area(obj, 0, 0, 0, 0, 0);
}
+#ifdef USE_MAX_TUC_20MB
+ int content_w=0, content_h=0;
+ int center_x=0,center_y=0;
+ int tmp_h=0;
+
+ 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");
+ sd->ewk_frame_contents_size_get(sd->ewk_view_frame_main_get(obj), &content_w, &content_h);
+
+ p_w = content_w;
+ p_h = content_h;
+
+ size_t size = (size_t)roundf(p_w * zoom * p_h * zoom * 4);
+ Eina_Bool toggle = EINA_FALSE;
+
+ while(size > (MAX_TUC*0.8))
+ {
+ if(toggle)
+ {
+ p_h = p_h -32;
+ }
+ else
+ {
+ p_w = p_w - 32;
+ if(p_w < w)
+ {
+ p_w = w;
+ toggle = EINA_TRUE;
+ }
+ }
+ size = (size_t)roundf(p_w * zoom * p_h * zoom * 4);
+ }
+
+ center_x = (int)roundf(x + w/2);
+ center_y = (int)roundf(y + h/2);
+
+ tmp_h = p_h* DIRECTION_UNDEFINED_CX_LEVEL_1;
+ p_x = center_x - (int)roundf(p_w/2);
+ p_y = center_y - (int)roundf(tmp_h/2);
+ if(p_x < 0) p_x = 0;
+ if(p_y < 0) p_y = 0;
+ sd->ewk_view_pre_render_region(obj, p_x, p_y, p_w, tmp_h, zoom);
+
+ tmp_h = p_h* DIRECTION_UNDEFINED_CX_LEVEL_2;
+ p_x = center_x - (int)roundf(p_w/2);
+ p_y = center_y - (int)roundf(tmp_h/2);
+ if(p_x < 0) p_x = 0;
+ if(p_y < 0) p_y = 0;
+ sd->ewk_view_pre_render_region(obj, p_x, p_y, p_w, tmp_h, zoom);
+
+ p_x = center_x - (int)roundf(p_w/2);
+ p_y = center_y - (int)roundf(p_h/2);
+ if(p_x < 0) p_x = 0;
+ if(p_y < 0) p_y = 0;
+ sd->ewk_view_pre_render_region(obj, p_x, p_y, p_w, p_h, zoom);
+#else
/* Queue tiles in a small rectangle around the viewport */
p_x = x - w * DIRECTION_UNDEFINED_CX_LEVEL_1;
p_y = y - h * DIRECTION_UNDEFINED_CX_LEVEL_1;
DBG("pre rendering - large - content: (%d, %d, %d, %d), zoom %.3f", p_x, p_y, p_w, p_h, zoom);
sd->ewk_view_pre_render_region(obj, p_x, p_y, p_w, p_h, zoom);
//dbg_draw_scaled_area(obj, 3, p_x, p_y, p_w, p_h);
+#endif
/* Log some statistics */
/*
#endif
sd->mouse_clicked = EINA_TRUE;
- _parent_sc.mouse_down((Ewk_View_Smart_Data*)sd, &sd->mouse_down_copy);
+ Evas_Event_Mouse_Down mouse_down = sd->mouse_down_copy;
+ Evas_Point* point = (Evas_Point*)ev;
+ mouse_down.canvas.x = point->x;
+ mouse_down.canvas.y = point->y;
+ _parent_sc.mouse_down((Ewk_View_Smart_Data*)sd, &mouse_down);
#if 0 // comment out below code until it is completed
if (sd->bounce_horiz)
return;
}
- _parent_sc.mouse_up((Ewk_View_Smart_Data*)sd, &sd->mouse_up_copy);
+ Evas_Event_Mouse_Up mouse_up = sd->mouse_up_copy;
+ mouse_up.canvas.x = point->x;
+ mouse_up.canvas.y = point->y;
+ _parent_sc.mouse_up((Ewk_View_Smart_Data*)sd, &mouse_up);
sd->mouse_clicked = EINA_FALSE;
}
if (!sd) return;
Evas_Point* point = (Evas_Point*)ev;
- if (sd->events_feed == EINA_TRUE) return;
+ if (sd->events_feed == EINA_TRUE)
+ {
+ Evas* evas = evas_object_evas_get(webview);
+ Evas_Modifier *modifiers = (Evas_Modifier *)evas_key_modifier_get(evas);
+ Evas_Lock *locks = (Evas_Lock *)evas_key_lock_get(evas);
+
+ Evas_Event_Mouse_Move event_move;
+ event_move.buttons = 1;
+ event_move.cur.output.x = point->x;
+ event_move.cur.output.y = point->y;
+ event_move.cur.canvas.x = point->x;
+ event_move.cur.canvas.y = point->y;
+ event_move.data = NULL;
+ event_move.modifiers = modifiers;
+ event_move.locks = locks;
+ event_move.timestamp = ecore_loop_time_get();
+ event_move.event_flags = EVAS_EVENT_FLAG_NONE;
+ event_move.dev = NULL;
+
+ _parent_sc.mouse_move((Ewk_View_Smart_Data*)sd, &event_move);
+ return;
+ }
if (sd->on_panning == EINA_FALSE) return;
if (sd->use_text_selection == EINA_TRUE && sd->text_selection_on == EINA_TRUE)
Evas_Point* point = (Evas_Point*)ev;
sd->on_panning = EINA_FALSE;
- _resume_all(sd, EINA_FALSE);
-
if (sd->use_text_selection == EINA_TRUE && sd->text_selection_on == EINA_TRUE)
{
if (sd->text_selection.front_handle_moving == EINA_TRUE
sd->text_selection.back_handle_moving = EINA_FALSE;
}
+ _resume_all(sd, EINA_FALSE);
+
if (sd->tiled)
{
if (!sd->ewk_view_tiled_unused_cache_get)
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");
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 = (Eina_Bool (*)(Evas_Object *, float, float))dlsym(ewk_handle, "ewk_view_zoom_range_set");
int content_w, object_w;
evas_object_geometry_get(obj, NULL, NULL, &object_w, NULL);
sd->ewk_view_zoom_range_set(obj, sd->zoom.min_zoom_rate, sd->zoom.max_zoom_rate);
}
}
+static void
+_geolocation_permission_callback(void *geolocation_obj, const char* url)
+{
+ printf("\n\n<< %s >>\n\n", __func__);
+ INTERNAL_ENTRY;
+
+ Evas_Object *popup;
+ int length;
+ char msg1[] = "The page at ";
+ char msg2[] = "<br>wants to know where you are.<br>Do you want to share location?";
+ char *msg = NULL;
+ int result;
+
+ length = strlen(msg1) + strlen(url) + strlen(msg2);
+ msg = calloc(length + 1, sizeof(char));
+ strncpy(msg, msg1, strlen(msg1));
+ strncat(msg, url, strlen(url));
+ strncat(msg, msg2, strlen(msg2));
+ msg[length] = '\0';
+
+ popup = elm_popup_add(obj);
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_popup_desc_set(popup, msg);
+ elm_popup_buttons_add(popup, 2, "Share", ELM_POPUP_RESPONSE_OK,
+ "Don't Share", ELM_POPUP_RESPONSE_CANCEL, NULL);
+ result = elm_popup_run(popup); // modal dialog
+ switch (result)
+ {
+ case ELM_POPUP_RESPONSE_OK:
+ if (!sd->ewk_set_geolocation_sharing_allowed)
+ sd->ewk_set_geolocation_sharing_allowed = (void (*)(void *, Eina_Bool))dlsym(ewk_handle, "ewk_set_geolocation_sharing_allowed");
+ sd->ewk_set_geolocation_sharing_allowed(geolocation_obj, EINA_TRUE);
+ break;
+
+ case ELM_POPUP_RESPONSE_CANCEL:
+ if (!sd->ewk_set_geolocation_sharing_allowed)
+ sd->ewk_set_geolocation_sharing_allowed = (void (*)(void *, Eina_Bool))dlsym(ewk_handle, "ewk_set_geolocation_sharing_allowed");
+ sd->ewk_set_geolocation_sharing_allowed(geolocation_obj, EINA_FALSE);
+ break;
+
+ default:
+ break;
+ }
+ if (msg)
+ free(msg);
+}
#endif