WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
108934_minibrowser_popup_menu.patch (text/plain), 6.54 KB, created by
Chris Dumez
on 2013-02-19 04:43:14 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Chris Dumez
Created:
2013-02-19 04:43:14 PST
Size:
6.54 KB
patch
obsolete
>diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index ab201a6..85403f1 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,26 @@ >+2013-02-19 Christophe Dumez <ch.dumez@sisa.samsung.com> >+ >+ [EFL][WK2] Add popup menu support to MiniBrowser >+ https://bugs.webkit.org/show_bug.cgi?id=108934 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Implement popup menu support in MiniBrowser by handling popup_menu_show >+ and popup_menu_hide smart functions on the view and using the Ewk popup >+ menu API. >+ >+ * MiniBrowser/efl/main.c: >+ (_Browser_Window): >+ (destroy_elm_menu): >+ (on_menu_discarded): >+ (on_popup_item_clicked): >+ (populate_elm_menu): >+ (on_popup_menu_show): >+ (on_popup_menu_hide): >+ (window_create): Use calloc() instead of malloc() to allocate memory for >+ Browser_Window. This makes sure all the structs members are initialized >+ to 0 (such as the new elm_popup_menu pointer). >+ > 2013-02-18 Ilya Tikhonovsky <loislo@chromium.org> > > Unreviewed. Adjust expectations. >diff --git a/Tools/MiniBrowser/efl/main.c b/Tools/MiniBrowser/efl/main.c >index ce816ee..7474499 100644 >--- a/Tools/MiniBrowser/efl/main.c >+++ b/Tools/MiniBrowser/efl/main.c >@@ -56,6 +56,10 @@ static Eina_Bool legacy_behavior_enabled = EINA_FALSE; > // The zoom values are chosen to be like in Mozilla Firefox 3. > const static float zoomLevels[] = {0.3, 0.5, 0.67, 0.8, 0.9, 1.0, 1.1, 1.2, 1.33, 1.5, 1.7, 2.0, 2.4, 3.0}; > >+// Type conversion macros. >+#define INT_TO_PTR(i) ((void *) (intptr_t) (i)) >+#define PTR_TO_INT(p) ((int) (intptr_t) (p)) >+ > static Eina_Bool > zoom_level_set(Evas_Object *webview, int level) > { >@@ -91,6 +95,7 @@ typedef struct _Browser_Window { > Evas_Object *url_bar; > Evas_Object *back_button; > Evas_Object *forward_button; >+ Evas_Object *elm_popup_menu; > int current_zoom_level; > Tooltip_Information tooltip; > } Browser_Window; >@@ -781,6 +786,94 @@ on_javascript_prompt(Ewk_View_Smart_Data *smartData, const char *message, const > return prompt_text; > } > >+static void >+destroy_elm_menu(Browser_Window *window) >+{ >+ if (!window->elm_popup_menu) >+ return; >+ >+ elm_menu_close(window->elm_popup_menu); >+ evas_object_del(window->elm_popup_menu); >+ window->elm_popup_menu = NULL; >+} >+ >+static void >+on_menu_discarded(void *user_data, Evas_Object *obj, void *event_info) >+{ >+ // The user clicked outside the menu to discard it. >+ info("Popup menu was discarded.\n"); >+ Browser_Window *window = (Browser_Window *)user_data; >+ Ewk_Popup_Menu *ewk_popup_menu = (Ewk_Popup_Menu *)evas_object_data_get(obj, "ewk_menu"); >+ ewk_popup_menu_close(ewk_popup_menu); >+ destroy_elm_menu(window); >+} >+ >+static void >+on_popup_item_clicked(void *user_data, Evas_Object *obj, void *event_info) >+{ >+ int selected_index = PTR_TO_INT(user_data); >+ Ewk_Popup_Menu *ewk_popup_menu = (Ewk_Popup_Menu *)evas_object_data_get(obj, "ewk_menu"); >+ info("Selected popup menu index: %u\n", selected_index); >+ ewk_popup_menu_selected_index_set(ewk_popup_menu, selected_index); >+ >+ // Close popup menu. >+ ewk_popup_menu_close(ewk_popup_menu); >+ destroy_elm_menu((Browser_Window *)evas_object_data_get(obj, "window")); >+} >+ >+static void >+populate_elm_menu(Evas_Object *elm_menu, Ewk_Popup_Menu *ewk_menu) >+{ >+ const Eina_List* ewk_items = ewk_popup_menu_items_get(ewk_menu); >+ >+ void *data; >+ const Eina_List *l; >+ int index = 0; >+ EINA_LIST_FOREACH(ewk_items, l, data) { >+ Ewk_Popup_Menu_Item *ewk_item = (Ewk_Popup_Menu_Item *)data; >+ if (ewk_popup_menu_item_type_get(ewk_item) == EWK_POPUP_MENU_SEPARATOR) >+ elm_menu_item_separator_add(elm_menu, NULL); >+ else { >+ if (ewk_popup_menu_item_is_label_get(ewk_item)) { >+ Elm_Object_Item* item = elm_menu_item_add(elm_menu, NULL, NULL, ewk_popup_menu_item_text_get(ewk_item), NULL, NULL); >+ elm_object_item_disabled_set(item, EINA_TRUE); >+ } else { >+ Elm_Object_Item* item = elm_menu_item_add(elm_menu, NULL, NULL, ewk_popup_menu_item_text_get(ewk_item), on_popup_item_clicked, INT_TO_PTR(index)); >+ elm_object_item_tooltip_text_set(item, ewk_popup_menu_item_tooltip_get(ewk_item)); >+ elm_object_item_disabled_set(item, !ewk_popup_menu_item_enabled_get(ewk_item)); >+ elm_menu_item_selected_set(item, ewk_popup_menu_item_selected_get(ewk_item)); >+ } >+ } >+ ++index; >+ } >+} >+ >+static Eina_Bool >+on_popup_menu_show(Ewk_View_Smart_Data *smartData, Eina_Rectangle rect, Ewk_Text_Direction text_direction, double page_scale_factor, Ewk_Popup_Menu *ewk_menu) >+{ >+ Browser_Window *window = window_find_with_ewk_view(smartData->self); >+ window->elm_popup_menu = elm_menu_add(window->elm_window); >+ evas_object_data_set(window->elm_popup_menu, "ewk_menu", ewk_menu); >+ evas_object_data_set(window->elm_popup_menu, "window", window); >+ evas_object_smart_callback_add(window->elm_popup_menu, "clicked", on_menu_discarded, window); >+ >+ populate_elm_menu(window->elm_popup_menu, ewk_menu); >+ >+ info("Showing popup menu at (%d, %d)\n", rect.x, rect.y); >+ elm_menu_move(window->elm_popup_menu, rect.x, rect.y); >+ evas_object_show(window->elm_popup_menu); >+ >+ return EINA_TRUE; >+} >+ >+static Eina_Bool >+on_popup_menu_hide(Ewk_View_Smart_Data *smartData) >+{ >+ destroy_elm_menu(window_find_with_ewk_view(smartData->self)); >+ >+ return EINA_TRUE; >+} >+ > 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 = window_find_with_ewk_view(sd->self); >@@ -1082,7 +1175,7 @@ create_toolbar_button(Evas_Object *elm_window, const char *icon_name) > > static Browser_Window *window_create(Evas_Object *opener, const char *url, int width, int height, Eina_Bool view_mode) > { >- Browser_Window *window = malloc(sizeof(Browser_Window)); >+ Browser_Window *window = calloc(1, sizeof(Browser_Window)); > if (!window) { > info("ERROR: could not create browser window.\n"); > return NULL; >@@ -1180,6 +1273,8 @@ static Browser_Window *window_create(Evas_Object *opener, const char *url, int w > ewkViewClass->fullscreen_exit = on_fullscreen_exit; > ewkViewClass->window_create = on_window_create; > ewkViewClass->window_close = on_window_close; >+ ewkViewClass->popup_menu_show = on_popup_menu_show; >+ ewkViewClass->popup_menu_hide = on_popup_menu_hide; > > Evas *evas = evas_object_evas_get(window->elm_window); > if (legacy_behavior_enabled) {
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 108934
:
189058
|
189103
|
192663