viking

webkit based web browser for Enlightenment
Log | Files | Refs | LICENSE

commit 6f77d2245a254618c4453a5bb40a289d8afaa2e2
parent d022232ca453f8a3546a41f77da184c796c9750f
Author: Kyle Milz <kmilz@ucalgary.ca>
Date:   Mon, 12 Nov 2012 15:57:13 -0700

buffer: switch to using a smart class, light MiniBrowser

Diffstat:
Msrc/buffer.c | 194+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/buffer.h | 1+
Msrc/main.c | 3+++
3 files changed, 198 insertions(+), 0 deletions(-)

diff --git a/src/buffer.c b/src/buffer.c @@ -18,6 +18,184 @@ typedef struct { Evas_Object *password_entry; } AuthData; +Ewk_View_Smart_Class* miniBrowserViewSmartClass(void) +{ + static Ewk_View_Smart_Class ewkViewClass = EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("MiniBrowser_View"); + return &ewkViewClass; +} + + static void +quit_event_loop(void *user_data, Evas_Object *obj, void *event_info) +{ + ecore_main_loop_quit(); +} + + static void +on_ok_clicked(void *user_data, Evas_Object *obj, void *event_info) +{ + Eina_Bool *confirmed = (Eina_Bool *)user_data; + *confirmed = EINA_TRUE; + + ecore_main_loop_quit(); +} + +/* +static Browser_Window *browser_view_find(Evas_Object *view) +{ + Eina_List *l; + void *data; + + if (!view) + return NULL; + + EINA_LIST_FOREACH(windows, l, data) { + Browser_Window *browser_window = (Browser_Window *)data; + if (browser_window->webview == view) + return browser_window; + } + return NULL; +} +*/ + +static void +on_javascript_alert(Ewk_View_Smart_Data *smartData, const char *message) +{ + // Browser_Window *window = browser_view_find(smartData->self); + Evas_Object *win = smartData->self; + + Evas_Object *alert_popup = elm_popup_add(win); + evas_object_size_hint_weight_set(alert_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(alert_popup, message); + elm_object_part_text_set(alert_popup, "title,text", "Alert"); + + /* Popup buttons */ + Evas_Object *button = elm_button_add(alert_popup); + elm_object_text_set(button, "OK"); + elm_object_part_content_set(alert_popup, "button1", button); + evas_object_smart_callback_add(button, "clicked", quit_event_loop, NULL); + elm_object_focus_set(button, EINA_TRUE); + evas_object_show(alert_popup); + + /* Make modal */ + ecore_main_loop_begin(); + + evas_object_del(alert_popup); +} + +static Eina_Bool +on_javascript_confirm(Ewk_View_Smart_Data *smartData, const char *message) +{ + // Browser_Window *window = browser_view_find(smartData->self); + Evas_Object *win = smartData->self; + + Eina_Bool ok = EINA_FALSE; + + Evas_Object *confirm_popup = elm_popup_add(win); + evas_object_size_hint_weight_set(confirm_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(confirm_popup, message); + elm_object_part_text_set(confirm_popup, "title,text", "Confirmation"); + + /* Popup buttons */ + Evas_Object *cancel_button = elm_button_add(confirm_popup); + elm_object_text_set(cancel_button, "Cancel"); + elm_object_part_content_set(confirm_popup, "button1", cancel_button); + evas_object_smart_callback_add(cancel_button, "clicked", quit_event_loop, NULL); + Evas_Object *ok_button = elm_button_add(confirm_popup); + elm_object_text_set(ok_button, "OK"); + elm_object_part_content_set(confirm_popup, "button2", ok_button); + evas_object_smart_callback_add(ok_button, "clicked", on_ok_clicked, &ok); + elm_object_focus_set(ok_button, EINA_TRUE); + evas_object_show(confirm_popup); + + /* Make modal */ + ecore_main_loop_begin(); + + evas_object_del(confirm_popup); + + return ok; +} + +static const char * +on_javascript_prompt(Ewk_View_Smart_Data *smartData, const char *message, const char *default_value) +{ + // Browser_Window *window = browser_view_find(smartData->self); + Evas_Object *win = smartData->self; + + Eina_Bool ok = EINA_FALSE; + + Evas_Object *prompt_popup = elm_popup_add(win); + evas_object_size_hint_weight_set(prompt_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_text_set(prompt_popup, "title,text", "Prompt"); + + /* Popup Content */ + Evas_Object *box = elm_box_add(win); + elm_box_padding_set(box, 0, 4); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + + Evas_Object *prompt = elm_label_add(win); + elm_object_text_set(prompt, message); + evas_object_size_hint_weight_set(prompt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(prompt, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(box, prompt); + evas_object_show(prompt); + + Evas_Object *entry = elm_entry_add(win); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_entry_single_line_set(entry, EINA_TRUE); + elm_entry_text_style_user_push(entry, "DEFAULT='font_size=18'"); + elm_entry_entry_set(entry, default_value ? default_value : ""); + elm_entry_select_all(entry); + evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(box, entry); + elm_object_focus_set(entry, EINA_TRUE); + evas_object_show(entry); + + elm_object_content_set(prompt_popup, box); + + /* Popup buttons */ + Evas_Object *cancel_button = elm_button_add(prompt_popup); + elm_object_text_set(cancel_button, "Cancel"); + elm_object_part_content_set(prompt_popup, "button1", cancel_button); + evas_object_smart_callback_add(cancel_button, "clicked", quit_event_loop, NULL); + Evas_Object *ok_button = elm_button_add(prompt_popup); + elm_object_text_set(ok_button, "OK"); + elm_object_part_content_set(prompt_popup, "button2", ok_button); + evas_object_smart_callback_add(ok_button, "clicked", on_ok_clicked, &ok); + evas_object_show(prompt_popup); + + /* Make modal */ + ecore_main_loop_begin(); + + /* The return string need to be stringshared */ + const char *prompt_text = ok ? eina_stringshare_add(elm_entry_entry_get(entry)) : NULL; + evas_object_del(prompt_popup); + + return prompt_text; +} + +static Eina_Bool on_window_geometry_get(Ewk_View_Smart_Data *sd, Evas_Coord *x, Evas_Coord *y, Evas_Coord *width, Evas_Coord *height) +{ + // Browser_Window *window = browser_view_find(sd->self); + Evas_Object *win = sd->self; + + evas_object_geometry_get(win, x, y, width, height); + + return EINA_TRUE; +} + +static Eina_Bool on_window_geometry_set(Ewk_View_Smart_Data *sd, Evas_Coord x, Evas_Coord y, Evas_Coord width, Evas_Coord height) +{ + // Browser_Window *window = browser_view_find(sd->self); + Evas_Object *win = sd->self; + + evas_object_move(win, x, y); + evas_object_resize(win, width, height); + + return EINA_TRUE; +} static void webprocess_crashed_cb(void *data, Evas_Object *obj, void *event_info) @@ -899,8 +1077,24 @@ buffer_add(const unsigned char flags, Window_Data *wd, const char *url, Session_ bd->window = wd; bd->buf_number = wd->buf_total; bd->inspector_enabled = EINA_FALSE; + +#if 1 + Ewk_View_Smart_Class *ewkViewClass = miniBrowserViewSmartClass(); + ewkViewClass->run_javascript_alert = on_javascript_alert; + ewkViewClass->run_javascript_confirm = on_javascript_confirm; + ewkViewClass->run_javascript_prompt = on_javascript_prompt; + ewkViewClass->window_geometry_get = on_window_geometry_get; + ewkViewClass->window_geometry_set = on_window_geometry_set; + + Evas *evas = evas_object_evas_get(wd->win); + Evas_Smart *smart = evas_smart_class_new(&ewkViewClass->sc); + bd->view = ewk_view_smart_add(evas, smart, ewk_context_default_get()); + // ewk_view_theme_set(bd->view, THEME_DIR "/default.edj"); + ewk_view_theme_set(bd->view, "/usr/share/ewebkit-0/themes/default.edj"); +#else bd->view = ewk_view_add(evas_object_evas_get(wd->win)); ewk_view_theme_set(bd->view, "/usr/share/ewebkit-0/themes/default.edj"); +#endif settings = ewk_view_settings_get(bd->view); ewk_settings_dns_prefetching_enabled_set(settings, EINA_TRUE); diff --git a/src/buffer.h b/src/buffer.h @@ -1,4 +1,5 @@ Buffer_Data* buffer_add(const unsigned char, Window_Data *, const char *, Session_Item *); void icon_changed_cb(void *data, Evas_Object *obj, void *event_info); +Ewk_View_Smart_Class* miniBrowserViewSmartClass(void); diff --git a/src/main.c b/src/main.c @@ -367,6 +367,9 @@ elm_main(int argc, char *argv[]) } ewk_init(); + + ewk_view_smart_class_set(miniBrowserViewSmartClass()); + eet_init(); viking_state_init();