Changeset 145564 in webkit


Ignore:
Timestamp:
Mar 12, 2013 11:02:05 AM (11 years ago)
Author:
Christophe Dumez
Message:

[EFL][WK2] Add popup menu support to MiniBrowser
https://bugs.webkit.org/show_bug.cgi?id=108934

Reviewed by Kenneth Rohde Christiansen.

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):
(on_popup_menu_discarded):
(on_popup_menu_item_clicked):
(popup_menu_populate):
(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).

Location:
trunk/Tools
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r145552 r145564  
     12013-03-12  Christophe Dumez  <ch.dumez@sisa.samsung.com>
     2
     3        [EFL][WK2] Add popup menu support to MiniBrowser
     4        https://bugs.webkit.org/show_bug.cgi?id=108934
     5
     6        Reviewed by Kenneth Rohde Christiansen.
     7
     8        Implement popup menu support in MiniBrowser by handling popup_menu_show
     9        and popup_menu_hide smart functions on the view and using the Ewk popup
     10        menu API.
     11
     12        * MiniBrowser/efl/main.c:
     13        (_Browser_Window):
     14        (on_popup_menu_discarded):
     15        (on_popup_menu_item_clicked):
     16        (popup_menu_populate):
     17        (on_popup_menu_show):
     18        (on_popup_menu_hide):
     19        (window_create): Use calloc() instead of malloc() to allocate memory for
     20        Browser_Window. This makes sure all the structs members are initialized
     21        to 0 (such as the new elm_popup_menu pointer).
     22
    1232013-03-12  Zan Dobersek  <zdobersek@igalia.com>
    224
  • trunk/Tools/MiniBrowser/efl/main.c

    r143190 r145564  
    9292    Evas_Object *back_button;
    9393    Evas_Object *forward_button;
     94    struct {
     95        Evas_Object *elm_menu;
     96        Ewk_Popup_Menu *ewk_menu;
     97    } popup;
    9498    int current_zoom_level;
    9599    Tooltip_Information tooltip;
     
    782786}
    783787
     788static void
     789on_popup_menu_discarded(void *user_data, Evas_Object *obj, void *event_info)
     790{
     791    // The user clicked outside the menu to discard it.
     792    info("Popup menu was discarded.\n");
     793    Browser_Window *window = (Browser_Window *)user_data;
     794    ewk_popup_menu_close(window->popup.ewk_menu);
     795}
     796
     797static void
     798on_popup_menu_item_clicked(void *user_data, Evas_Object *obj, void *event_info)
     799{
     800    Browser_Window *window = (Browser_Window *)user_data;
     801    Elm_Object_Item *item = (Elm_Object_Item *)event_info;
     802
     803    info("Selected popup menu index: %u\n", elm_menu_item_index_get(item));
     804    ewk_popup_menu_selected_index_set(window->popup.ewk_menu, elm_menu_item_index_get(item));
     805
     806    // Close popup menu.
     807    ewk_popup_menu_close(window->popup.ewk_menu);
     808}
     809
     810static void
     811popup_menu_populate(Evas_Object *elm_menu, Ewk_Popup_Menu *ewk_menu, void *user_data)
     812{
     813    const Eina_List* ewk_items = ewk_popup_menu_items_get(ewk_menu);
     814
     815    void *data;
     816    const Eina_List *l;
     817    EINA_LIST_FOREACH(ewk_items, l, data) {
     818        Ewk_Popup_Menu_Item *ewk_item = (Ewk_Popup_Menu_Item *)data;
     819        switch (ewk_popup_menu_item_type_get(ewk_item)) {
     820        case EWK_POPUP_MENU_SEPARATOR:
     821            elm_menu_item_separator_add(elm_menu, NULL);
     822            break;
     823        case EWK_POPUP_MENU_ITEM:
     824            if (ewk_popup_menu_item_is_label_get(ewk_item)) {
     825                Elm_Object_Item *item = elm_menu_item_add(elm_menu, NULL, NULL, ewk_popup_menu_item_text_get(ewk_item), NULL, NULL);
     826                elm_object_item_disabled_set(item, EINA_TRUE);
     827            } else {
     828                Elm_Object_Item *item = elm_menu_item_add(elm_menu, NULL, NULL, ewk_popup_menu_item_text_get(ewk_item), on_popup_menu_item_clicked, user_data);
     829                elm_object_item_tooltip_text_set(item, ewk_popup_menu_item_tooltip_get(ewk_item));
     830                elm_object_item_disabled_set(item, !ewk_popup_menu_item_enabled_get(ewk_item));
     831                elm_menu_item_selected_set(item, ewk_popup_menu_item_selected_get(ewk_item));
     832            }
     833            break;
     834        default:
     835            info("Unrecognized popup menu item type!\n");
     836            break;
     837        }
     838    }
     839}
     840
     841static Eina_Bool
     842on_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)
     843{
     844    Browser_Window *window = window_find_with_ewk_view(smartData->self);
     845
     846    if (window->popup.elm_menu)
     847        evas_object_del(window->popup.elm_menu);
     848
     849    window->popup.elm_menu = elm_menu_add(window->elm_window);
     850    window->popup.ewk_menu = ewk_menu;
     851    evas_object_smart_callback_add(window->popup.elm_menu, "clicked", on_popup_menu_discarded, window);
     852
     853    popup_menu_populate(window->popup.elm_menu, ewk_menu, window);
     854
     855    info("Showing popup menu at (%d, %d)\n", rect.x, rect.y);
     856    elm_menu_move(window->popup.elm_menu, rect.x, rect.y);
     857    evas_object_show(window->popup.elm_menu);
     858
     859    return EINA_TRUE;
     860}
     861
     862static Eina_Bool
     863on_popup_menu_hide(Ewk_View_Smart_Data *smartData)
     864{
     865    Browser_Window *window = window_find_with_ewk_view(smartData->self);
     866
     867    if (!window->popup.elm_menu)
     868        return EINA_FALSE;
     869
     870    elm_menu_close(window->popup.elm_menu);
     871
     872    return EINA_TRUE;
     873}
     874
    784875static Eina_Bool on_window_geometry_get(Ewk_View_Smart_Data *sd, Evas_Coord *x, Evas_Coord *y, Evas_Coord *width, Evas_Coord *height)
    785876{
     
    10831174static Browser_Window *window_create(Evas_Object *opener, const char *url, int width, int height, Eina_Bool view_mode)
    10841175{
    1085     Browser_Window *window = malloc(sizeof(Browser_Window));
     1176    Browser_Window *window = calloc(1, sizeof(Browser_Window));
    10861177    if (!window) {
    10871178        info("ERROR: could not create browser window.\n");
     
    11811272    ewkViewClass->window_create = on_window_create;
    11821273    ewkViewClass->window_close = on_window_close;
     1274    ewkViewClass->popup_menu_show = on_popup_menu_show;
     1275    ewkViewClass->popup_menu_hide = on_popup_menu_hide;
    11831276
    11841277    Evas *evas = evas_object_evas_get(window->elm_window);
Note: See TracChangeset for help on using the changeset viewer.