Add support for HW more/back keys
authorTaeyun An <ty.an@samsung.com>
Sat, 29 Jun 2013 09:13:51 +0000 (18:13 +0900)
committerTaeyun An <ty.an@samsung.com>
Sat, 29 Jun 2013 11:24:29 +0000 (20:24 +0900)
[Title] Add support for HW more/back keys
[Issue#] N_SE-43128
[Problem] HW keys are not handled
[Cause] Not handled.
[Solution] Add support for HW more/back keys

Change-Id: I4a5f7c3109dd3304399dd620df711c485c6d2faa

Source/WTF/wtf/Platform.h
Source/WebKit2/PlatformTizen.cmake
Source/WebKit2/UIProcess/API/efl/ewk_context.cpp
Source/WebKit2/UIProcess/API/efl/tizen/InputPicker.cpp
Source/WebKit2/UIProcess/API/efl/tizen/InputPicker.h
Source/WebKit2/UIProcess/API/efl/tizen/JavaScriptPopup.cpp
Source/WebKit2/UIProcess/API/efl/tizen/LinkMagnifierProxy.cpp
Source/WebKit2/UIProcess/tizen/WebContextMenuProxyTizen.cpp
Source/cmake/FindEFL_ASSIST.cmake [new file with mode: 0644]
Source/cmake/OptionsTizen.cmake
packaging/webkit2-efl.spec

index 10db9d4..4588963 100755 (executable)
@@ -817,6 +817,9 @@ com) : Patch to do not adjust cover rect as fixed pixel size*/
 #if ENABLE(WORKERS)
 #define ENABLE_TIZEN_WORKERS 1 /* Jihye Kang(jye.kang@samsung.com) : Use allowUniversalAccessFromFileURLs setting for workers */
 #endif
+
+#define ENABLE_TIZEN_HW_MORE_BACK_KEY 1 /* Jongseok Yang(js45.yang@samsung.com), Kwangyong Choi (ky0.choi@samsung.net) : Add support for HW more/back keys */
+
 #endif /* OS(TIZEN) */
 
 /* ==== OS() - underlying operating system; only to be used for mandated low-level services like 
index 35daa64..b876450 100755 (executable)
@@ -31,6 +31,7 @@ LIST(APPEND WebKit2StaticForDebug_INCLUDE_DIRECTORIES
     ${TTS_INCLUDE_DIRS}
     ${Tizen-Location-Manager_INCLUDE_DIRS}
     ${UIGadget_INCLUDE_DIRS}
+    ${EFL_ASSIST_INCLUDE_DIRS}
 )
 
 LIST(APPEND WebKit2_LIBRARIES
index 0432972..ab51c9f 100755 (executable)
 #include <EGL/egl.h>
 #endif
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+#include <dlfcn.h>
+void* EflAssistHandle = 0;
+#endif
+
 using namespace WebCore;
 using namespace WebKit;
 
@@ -147,6 +152,11 @@ Ewk_Context::Ewk_Context(WKContextRef context)
     m_formDatabase->open(FormDatabase::defaultDatabaseDirectoryPath(), FormDatabase::defaultDatabaseFilename());
 #endif
 #endif
+
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+    if (!EflAssistHandle)
+        EflAssistHandle = dlopen("/usr/lib/libefl-assist.so.0", RTLD_LAZY);
+#endif
 }
 
 Ewk_Context::~Ewk_Context()
index a848788..7e960e6 100755 (executable)
 #include <stdlib.h>
 #include <string.h>
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+#include <dlfcn.h>
+#include <efl_assist.h>
+extern void* EflAssistHandle;
+#endif
 
 #if OS(TIZEN) && ENABLE(TIZEN_INPUT_TAG_EXTENSION)
 
@@ -40,6 +45,11 @@ Input_Picker_Layout::Input_Picker_Layout(Evas_Object* ewkView)
     , colorRect(0)
     , okButton(0)
     , dataListEditField(0)
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+    , initial_r(0)
+    , initial_g(0)
+    , initial_b(0)
+#endif
     , datetimeLocal(false)
 {
     evas_object_focus_set(m_ewkView, false);
@@ -219,6 +229,14 @@ void InputPicker::showDataList(Ewk_Input_Type inputType, Eina_List* optionList)
     m_pickerLayout->popup = elm_popup_add(win);
     elm_object_part_text_set(m_pickerLayout->popup, "title,text", "Select data list");
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+    if (EflAssistHandle) {
+        void (*webkit_ea_object_event_callback_add)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *);
+        webkit_ea_object_event_callback_add = (void (*)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *))dlsym(EflAssistHandle, "ea_object_event_callback_add");
+        (*webkit_ea_object_event_callback_add)(m_pickerLayout->popup, EA_CALLBACK_BACK, _data_list_popup_response_cancel_cb, this);
+    }
+#endif
+
     m_pickerLayout->layout = elm_layout_add(m_pickerLayout->popup);
     elm_layout_file_set(m_pickerLayout->layout, EDJE_DIR"/control.edj","data_list_picker");
     evas_object_size_hint_weight_set(m_pickerLayout->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -358,6 +376,17 @@ void InputPicker::ewk_color_popup(int r, int g, int b)
     m_pickerLayout->popup = elm_popup_add(win);
     elm_object_part_text_set(m_pickerLayout->popup, "title,text", "Select color");
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+    m_pickerLayout->initial_r = r;
+    m_pickerLayout->initial_g = g;
+    m_pickerLayout->initial_b = b;
+    if (EflAssistHandle) {
+        void (*webkit_ea_object_event_callback_add)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *);
+        webkit_ea_object_event_callback_add = (void (*)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *))dlsym(EflAssistHandle, "ea_object_event_callback_add");
+        (*webkit_ea_object_event_callback_add)(m_pickerLayout->popup, EA_CALLBACK_BACK, _color_back_cb, this);
+    }
+#endif
+
     m_pickerLayout->layout = elm_layout_add(m_pickerLayout->popup);
     elm_layout_file_set(m_pickerLayout->layout, EDJE_DIR"/control.edj","color_picker");
     evas_object_size_hint_weight_set(m_pickerLayout->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -368,8 +397,6 @@ void InputPicker::ewk_color_popup(int r, int g, int b)
     evas_object_size_hint_weight_set(m_pickerLayout->colorRect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     evas_object_show(m_pickerLayout->colorRect);
 
-    printf("\n<<<<<<<< r = [%d], g = [%d], b = [%d] >>>>>>>>>>\n", r, g, b);
-
     evas_object_color_set(m_pickerLayout->colorRect, r, g, b, 255);
     elm_object_part_content_set(m_pickerLayout->layout, "elm.swallow.color_rect", m_pickerLayout->colorRect);
 #if ENABLE(ELM_COLORPALLETE)
@@ -519,6 +546,21 @@ void InputPicker::_color_popup_response_cb(void* data,  Evas_Object* obj, void*
     inputPicker->hideColorPicker();
 }
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+void InputPicker::_color_back_cb(void* data,  Evas_Object* obj, void* event_info)
+{
+    InputPicker* inputPicker = static_cast<InputPicker*>(data);
+
+    int r = inputPicker->m_pickerLayout->initial_r;
+    int g = inputPicker->m_pickerLayout->initial_g;
+    int b = inputPicker->m_pickerLayout->initial_b;
+    int a = 255;
+    ewk_view_color_picker_color_set(inputPicker->m_ewkView, r, g, b, a);
+
+    inputPicker->hideColorPicker();
+}
+#endif
+
 void InputPicker::ewk_date_popup(const char* inputValue)
 {
     struct tm* currentTime;
@@ -573,6 +615,14 @@ void InputPicker::ewk_date_popup(const char* inputValue)
     m_pickerLayout->popup = elm_popup_add(win);
     elm_object_part_text_set(m_pickerLayout->popup, "title,text", "Select date");
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+    if (EflAssistHandle) {
+        void (*webkit_ea_object_event_callback_add)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *);
+        webkit_ea_object_event_callback_add = (void (*)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *))dlsym(EflAssistHandle, "ea_object_event_callback_add");
+        (*webkit_ea_object_event_callback_add)(m_pickerLayout->popup, EA_CALLBACK_BACK, _popup_back_cb, this);
+    }
+#endif
+
     m_pickerLayout->layout = elm_layout_add(m_pickerLayout->popup);
     elm_layout_file_set(m_pickerLayout->layout, EDJE_DIR"/control.edj","elm/datepicker");
     evas_object_size_hint_weight_set(m_pickerLayout->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -764,6 +814,14 @@ void InputPicker::ewk_week_popup(const char* inputValue)
     m_pickerLayout->popup = elm_popup_add(win);
     elm_object_part_text_set(m_pickerLayout->popup, "title,text", "Select date");
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+    if (EflAssistHandle) {
+        void (*webkit_ea_object_event_callback_add)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *);
+        webkit_ea_object_event_callback_add = (void (*)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *))dlsym(EflAssistHandle, "ea_object_event_callback_add");
+        (*webkit_ea_object_event_callback_add)(m_pickerLayout->popup, EA_CALLBACK_BACK, _popup_back_cb, this);
+    }
+#endif
+
     m_pickerLayout->layout = elm_layout_add(m_pickerLayout->popup);
     elm_layout_file_set(m_pickerLayout->layout, EDJE_DIR"/control.edj","elm/datepicker");
     evas_object_size_hint_weight_set(m_pickerLayout->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -838,6 +896,14 @@ void InputPicker::ewk_time_popup(const char* inputValue)
     m_pickerLayout->popup = elm_popup_add(win);
     elm_object_part_text_set(m_pickerLayout->popup, "title,text", "Select time");
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+    if (EflAssistHandle) {
+        void (*webkit_ea_object_event_callback_add)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *);
+        webkit_ea_object_event_callback_add = (void (*)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *))dlsym(EflAssistHandle, "ea_object_event_callback_add");
+        (*webkit_ea_object_event_callback_add)(m_pickerLayout->popup, EA_CALLBACK_BACK, _popup_back_cb, this);
+    }
+#endif
+
     m_pickerLayout->layout = elm_layout_add(m_pickerLayout->popup);
     elm_layout_file_set(m_pickerLayout->layout, EDJE_DIR"/control.edj","elm/datepicker");
     evas_object_size_hint_weight_set(m_pickerLayout->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -911,9 +977,16 @@ void InputPicker::ewk_month_popup(const char* inputValue)
         win = m_ewkView;
 
     m_pickerLayout->popup = elm_popup_add(win);
-
     elm_object_part_text_set(m_pickerLayout->popup, "title,text", "Select month");
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+    if (EflAssistHandle) {
+        void (*webkit_ea_object_event_callback_add)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *);
+        webkit_ea_object_event_callback_add = (void (*)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *))dlsym(EflAssistHandle, "ea_object_event_callback_add");
+        (*webkit_ea_object_event_callback_add)(m_pickerLayout->popup, EA_CALLBACK_BACK, _popup_back_cb, this);
+    }
+#endif
+
     m_pickerLayout->layout = elm_layout_add(m_pickerLayout->popup);
     elm_layout_file_set(m_pickerLayout->layout, EDJE_DIR"/control.edj","elm/datepicker");
 
@@ -1005,6 +1078,14 @@ void InputPicker::ewk_datetime_popup(const char* inputValue, bool local)
     m_pickerLayout->popup = elm_popup_add(win);
     elm_object_part_text_set(m_pickerLayout->popup, "title,text", "Select datetime");
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+    if (EflAssistHandle) {
+        void (*webkit_ea_object_event_callback_add)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *);
+        webkit_ea_object_event_callback_add = (void (*)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *))dlsym(EflAssistHandle, "ea_object_event_callback_add");
+        (*webkit_ea_object_event_callback_add)(m_pickerLayout->popup, EA_CALLBACK_BACK, _popup_back_cb, this);
+    }
+#endif
+
     m_pickerLayout->layout = elm_layout_add(m_pickerLayout->popup);
     elm_layout_file_set(m_pickerLayout->layout, EDJE_DIR"/control.edj","datepicker_popup");
     evas_object_size_hint_weight_set(m_pickerLayout->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -1207,6 +1288,24 @@ void InputPicker::_datetime_popup_response_cb(void* data,  Evas_Object* obj, voi
     inputPicker->m_pickerLayout = 0;
 }
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+void InputPicker::_popup_back_cb(void* data,  Evas_Object* obj, void* event_info)
+{
+    InputPicker* inputPicker = static_cast<InputPicker*>(data);
+
+    if (!inputPicker->m_pickerLayout)
+        return;
+
+    if (inputPicker->m_pickerLayout->popup) {
+        evas_object_del(inputPicker->m_pickerLayout->popup);
+        inputPicker->m_pickerLayout->popup = 0;
+    }
+
+    delete inputPicker->m_pickerLayout;
+    inputPicker->m_pickerLayout = 0;
+}
+#endif
+
 } // namespace WebKit
 
 #endif // OS(TIZEN) && ENABLE(TIZEN_INPUT_TAG_EXTENSION)
index ec4cb06..b9d0580 100644 (file)
@@ -58,56 +58,67 @@ public:
     Evas_Object* colorRect;
     Evas_Object* okButton;
     Evas_Object* dataListEditField;
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+    int initial_r;
+    int initial_g;
+    int initial_b;
+#endif
     bool datetimeLocal;
 };
 
 namespace WebKit {
 
-    class InputPicker {
-    public:
-        InputPicker(Evas_Object*);
-        ~InputPicker();
+class InputPicker {
+public:
+    InputPicker(Evas_Object*);
+    ~InputPicker();
 
-        void show(Ewk_Input_Type, const char*);
+    void show(Ewk_Input_Type, const char*);
 
 #if ENABLE(TIZEN_DATALIST_ELEMENT)
-        void showDataList(Ewk_Input_Type inputType, Eina_List* optionList);
-        void hideDataList(Ewk_Input_Type inputType);
+    void showDataList(Ewk_Input_Type inputType, Eina_List* optionList);
+    void hideDataList(Ewk_Input_Type inputType);
 #endif
 
 #if ENABLE(TIZEN_INPUT_COLOR_PICKER)
-        void showColorPicker(int, int, int, int);
-        void hideColorPicker();
-        bool isColorPickerShown() { return m_isColorPickerShown; }
+    void showColorPicker(int, int, int, int);
+    void hideColorPicker();
 #endif
 
-        void ewk_date_popup(const char*);
-        void ewk_time_popup(const char*);
-        void ewk_month_popup(const char*);
-        void ewk_week_popup(const char*);
-        void ewk_datetime_popup(const char*, bool);
-        void ewk_color_popup(int, int, int);
-    private:
-        static void _date_popup_response_cb(void*, Evas_Object*, void*);
-        static void _time_popup_response_cb(void*, Evas_Object*, void*);
-        static void _month_popup_response_cb(void*, Evas_Object*, void*);
-        static void _week_popup_response_cb(void*, Evas_Object*, void*);
-        static void _datetime_popup_response_cb(void*, Evas_Object*, void*);
-        static void _color_popup_response_cb(void*, Evas_Object*, void*);
-        static void _data_list_popup_response_cb(void*, Evas_Object*, void*);
-        static void _data_list_popup_response_cancel_cb(void*, Evas_Object*, void*);
-        static void _data_list_selected_cb(void*, Evas_Object*, void*);
-        static void _color_selected_cb(void*, Evas*, Evas_Object*, void*);
-
-        Evas_Object* m_ewkView;
-        Input_Picker_Layout* m_pickerLayout;
-        Eina_List* m_dataList;
+    void ewk_date_popup(const char*);
+    void ewk_time_popup(const char*);
+    void ewk_month_popup(const char*);
+    void ewk_week_popup(const char*);
+    void ewk_datetime_popup(const char*, bool);
+    void ewk_color_popup(int, int, int);
+
+private:
+    static void _date_popup_response_cb(void*, Evas_Object*, void*);
+    static void _time_popup_response_cb(void*, Evas_Object*, void*);
+    static void _month_popup_response_cb(void*, Evas_Object*, void*);
+    static void _week_popup_response_cb(void*, Evas_Object*, void*);
+    static void _datetime_popup_response_cb(void*, Evas_Object*, void*);
+    static void _color_popup_response_cb(void*, Evas_Object*, void*);
+    static void _data_list_popup_response_cb(void*, Evas_Object*, void*);
+    static void _data_list_popup_response_cancel_cb(void*, Evas_Object*, void*);
+    static void _data_list_selected_cb(void*, Evas_Object*, void*);
+    static void _color_selected_cb(void*, Evas*, Evas_Object*, void*);
+
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+    static void _color_back_cb(void*, Evas_Object*, void*);
+    static void _popup_back_cb(void*, Evas_Object*, void*);
+#endif
+
+    Evas_Object* m_ewkView;
+    Input_Picker_Layout* m_pickerLayout;
+    Eina_List* m_dataList;
 #if ENABLE(TIZEN_INPUT_COLOR_PICKER)
-        bool m_isColorPickerShown;
+    bool m_isColorPickerShown;
 #endif
-    };
-} // namespace WebKit
 
+};
+
+} // namespace WebKit
 
 #endif // OS(TIZEN) && ENABLE(TIZEN_INPUT_TAG_EXTENSION)
 
index dab0c59..bbf779b 100755 (executable)
 #include <wtf/text/CString.h>
 #include <wtf/text/WTFString.h>
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+#include <dlfcn.h>
+#include <efl_assist.h>
+extern void* EflAssistHandle;
+#endif
 
 #if OS(TIZEN)
 
@@ -54,6 +59,17 @@ static void alertResponseCallback(void* data, Evas_Object* obj, void* eventInfo)
     ewk_view_javascript_alert_reply(popup->ewkView());
 }
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+static void alertHwBackKeyCallback(void* data, Evas_Object* obj, void* eventInfo)
+{
+    JavaScriptPopup* popup = static_cast<JavaScriptPopup*>(data);
+    if (!popup)
+        return;
+    popup->close();
+    ewk_view_javascript_alert_reply(popup->ewkView());
+}
+#endif
+
 bool JavaScriptPopup::setLabelText(const char* message)
 {
     if (!message)
@@ -77,7 +93,7 @@ bool JavaScriptPopup::setLabelText(const char* message)
 
     // Get layout width to set a dynamic label wrap width
     int layoutWidth;
-    evas_object_geometry_get(layout, NULL, NULL, &layoutWidth, NULL);
+    evas_object_geometry_get(layout, 0, 0, &layoutWidth, 0);
 
     Evas_Object* label = elm_label_add(layout);
     elm_label_line_wrap_set(label, ELM_WRAP_MIXED);
@@ -89,13 +105,13 @@ bool JavaScriptPopup::setLabelText(const char* message)
 
     // Get label height for check the length of the character
     int labelHeight;
-    evas_object_geometry_get(label, NULL, NULL, NULL, &labelHeight);
+    evas_object_geometry_get(label, 0, 0, 0, &labelHeight);
 
     // Use the general popup instead of scroll layout when message is a short sentences
     if (labelHeight < 400) {
         evas_object_del(m_popup);
 
-        Evas_Object *parent = getParentWindow();
+        Evas_Objectparent = getParentWindow();
 
         m_popup = elm_popup_add(parent);
         if (!m_popup)
@@ -114,7 +130,7 @@ bool JavaScriptPopup::setLabelText(const char* message)
 
 bool JavaScriptPopup::alert(const char* message)
 {
-    Evas_Object *parent = getParentWindow();
+    Evas_Objectparent = getParentWindow();
 
     if (m_popup)
         return false;
@@ -126,8 +142,16 @@ bool JavaScriptPopup::alert(const char* message)
     if (!setLabelText(message))
         return false;
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+    if (EflAssistHandle) {
+        void (*webkit_ea_object_event_callback_add)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *);
+        webkit_ea_object_event_callback_add = (void (*)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *))dlsym(EflAssistHandle, "ea_object_event_callback_add");
+        (*webkit_ea_object_event_callback_add)(m_popup, EA_CALLBACK_BACK, alertHwBackKeyCallback, this);
+    }
+#endif
+
     Evas_Object* okButton = elm_button_add(m_popup);
-    //FIXME: Need to apply i18n for the button label
+    // FIXME: Need to apply i18n for the button label
     elm_object_text_set(okButton, "OK");
     elm_object_part_content_set(m_popup, "button1", okButton);
     evas_object_smart_callback_add(okButton, "clicked", alertResponseCallback, this);
@@ -155,9 +179,20 @@ static void confirmCancelCallback(void* data, Evas_Object* obj, void* eventInfo)
     ewk_view_javascript_confirm_reply(popup->ewkView(), false);
 }
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+static void confirmHwBackKeyCallback(void* data, Evas_Object* obj, void* eventInfo)
+{
+    JavaScriptPopup* popup = static_cast<JavaScriptPopup*>(data);
+    if (!popup)
+        return;
+    popup->close();
+    ewk_view_javascript_confirm_reply(popup->ewkView(), false);
+}
+#endif
+
 bool JavaScriptPopup::confirm(const char* message)
 {
-    Evas_Object *parent = getParentWindow();
+    Evas_Objectparent = getParentWindow();
 
     if (m_popup)
         return false;
@@ -169,14 +204,22 @@ bool JavaScriptPopup::confirm(const char* message)
     if (!setLabelText(message))
         return false;
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+    if (EflAssistHandle) {
+        void (*webkit_ea_object_event_callback_add)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *);
+        webkit_ea_object_event_callback_add = (void (*)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *))dlsym(EflAssistHandle, "ea_object_event_callback_add");
+        (*webkit_ea_object_event_callback_add)(m_popup, EA_CALLBACK_BACK, confirmHwBackKeyCallback, this);
+    }
+#endif
+
     Evas_Object* okButton = elm_button_add(m_popup);
-    //FIXME: Need to apply i18n for the button label
+    // FIXME: Need to apply i18n for the button label
     elm_object_text_set(okButton, "OK");
     elm_object_part_content_set(m_popup, "button1", okButton);
     evas_object_smart_callback_add(okButton, "clicked", confirmOkCallback, this);
 
     Evas_Object* cancelButton = elm_button_add(m_popup);
-    //FIXME: Need to apply i18n for the button label
+    // FIXME: Need to apply i18n for the button label
     elm_object_text_set(cancelButton, "Cancel");
     elm_object_part_content_set(m_popup, "button2", cancelButton);
     evas_object_smart_callback_add(cancelButton, "clicked", confirmCancelCallback, this);
@@ -215,9 +258,20 @@ static void promptOkCallback(void* data, Evas_Object* obj, void* eventInfo)
         free(result);
 }
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+static void promptHwBackKeyCallback(void* data, Evas_Object* obj, void* eventInfo)
+{
+    JavaScriptPopup* popup = static_cast<JavaScriptPopup*>(data);
+    if (!popup)
+        return;
+    popup->close();
+    ewk_view_javascript_prompt_reply(popup->ewkView(), 0);
+}
+#endif
+
 bool JavaScriptPopup::prompt(const char* message, const char* defaultValue)
 {
-    Evas_Object *parent = getParentWindow();
+    Evas_Objectparent = getParentWindow();
 
     if (m_popup)
         return false;
@@ -246,7 +300,7 @@ bool JavaScriptPopup::prompt(const char* message, const char* defaultValue)
 
     m_entry = elm_entry_add(m_popup);
     Ecore_IMF_Context* imfContext = static_cast<Ecore_IMF_Context*>(elm_entry_imf_context_get(m_entry));
-    ecore_imf_context_input_panel_event_callback_add(imfContext, ECORE_IMF_INPUT_PANEL_STATE_EVENT, promptEntryChanged, NULL);
+    ecore_imf_context_input_panel_event_callback_add(imfContext, ECORE_IMF_INPUT_PANEL_STATE_EVENT, promptEntryChanged, 0);
     elm_entry_scrollable_set(m_entry, EINA_TRUE);
     elm_object_text_set(m_entry, defaultValue);
     elm_entry_cursor_end_set(m_entry);
@@ -254,14 +308,22 @@ bool JavaScriptPopup::prompt(const char* message, const char* defaultValue)
     elm_object_part_content_set(layout, "prompt_container", m_entry);
     elm_object_content_set(m_popup, layout);
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+    if (EflAssistHandle) {
+        void (*webkit_ea_object_event_callback_add)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *);
+        webkit_ea_object_event_callback_add = (void (*)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *))dlsym(EflAssistHandle, "ea_object_event_callback_add");
+        (*webkit_ea_object_event_callback_add)(m_popup, EA_CALLBACK_BACK, promptHwBackKeyCallback, this);
+    }
+#endif
+
     Evas_Object* okButton = elm_button_add(m_popup);
-    //FIXME: Need to apply i18n for the button label
+    // FIXME: Need to apply i18n for the button label
     elm_object_text_set(okButton, "OK");
     elm_object_part_content_set(m_popup, "button1", okButton);
     evas_object_smart_callback_add(okButton, "clicked", promptOkCallback, this);
 
     Evas_Object* cancelButton = elm_button_add(m_popup);
-    //FIXME: Need to apply i18n for the button label
+    // FIXME: Need to apply i18n for the button label
     elm_object_text_set(cancelButton, "Cancel");
     elm_object_part_content_set(m_popup, "button2", cancelButton);
     evas_object_smart_callback_add(cancelButton, "clicked", promptCancelCallback, this);
@@ -306,13 +368,13 @@ bool JavaScriptPopup::beforeUnloadConfirmPanel(const char* message)
         return false;
 
     Evas_Object* leaveButton = elm_button_add(m_popup);
-    //FIXME: Need to apply i18n for the button label
+    // FIXME: Need to apply i18n for the button label
     elm_object_text_set(leaveButton, "Leave");
     elm_object_part_content_set(m_popup, "button1", leaveButton);
     evas_object_smart_callback_add(leaveButton, "clicked", beforeUnloadConfirmPanelLeaveCallback, this);
 
     Evas_Object* stayButton = elm_button_add(m_popup);
-    //FIXME: Need to apply i18n for the button label
+    // FIXME: Need to apply i18n for the button label
     elm_object_text_set(stayButton, "Stay");
     elm_object_part_content_set(m_popup, "button2", stayButton);
     evas_object_smart_callback_add(stayButton, "clicked", beforeUnloadConfirmPanelStayCallback, this);
index 3d7a2e3..0b48a22 100755 (executable)
@@ -56,6 +56,13 @@ LinkMagnifierProxy::~LinkMagnifierProxy()
         evas_object_del(m_popup);
 }
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+static void linkMagnifierHwBackKeyCallback(void* data, Evas_Object* obj, void* eventInfo)
+{
+    elm_ctxpopup_dismiss(obj);
+}
+#endif
+
 void LinkMagnifierProxy::show(EwkViewImpl* viewImpl, const IntPoint& position, const IntRect& rect)
 {
     Evas_Object* viewWidget = viewImpl->view();
@@ -66,6 +73,13 @@ void LinkMagnifierProxy::show(EwkViewImpl* viewImpl, const IntPoint& position, c
             return;
 
         m_popup = elm_ctxpopup_add(topWidget);
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+        if (EflAssistHandle) {
+            void (*webkit_ea_object_event_callback_add)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *);
+            webkit_ea_object_event_callback_add = (void (*)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *))dlsym(EflAssistHandle, "ea_object_event_callback_add");
+            (*webkit_ea_object_event_callback_add)(m_popup, EA_CALLBACK_BACK, linkMagnifierHwBackKeyCallback, 0);
+        }
+#endif
         elm_ctxpopup_direction_priority_set(m_popup, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_DOWN);
         evas_object_smart_callback_add(m_popup, "dismissed", dismissed, 0);
     }
index 3c90bab..5cf3d61 100755 (executable)
 
 #include <stdio.h>
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+#include <dlfcn.h>
+#include <efl_assist.h>
+extern void* EflAssistHandle;
+#endif
+
 using namespace WebCore;
 
 namespace WebKit {
@@ -93,6 +99,13 @@ void WebContextMenuProxyTizen::contextMenuItemSelectedCallback(void* data, Evas_
     menuProxy->m_popup = 0;
 }
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+static void contextMenuHwBackKeyCallback(void* data, Evas_Object* obj, void* eventInfo)
+{
+    elm_ctxpopup_dismiss(obj);
+}
+#endif
+
 void WebContextMenuProxyTizen::createEflMenu(const Vector<WebContextMenuItemData>& items)
 {
     if (m_popup)
@@ -106,6 +119,14 @@ void WebContextMenuProxyTizen::createEflMenu(const Vector<WebContextMenuItemData
     if (!m_popup)
         return;
 
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+    if (EflAssistHandle) {
+        void (*webkit_ea_object_event_callback_add)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *);
+        webkit_ea_object_event_callback_add = (void (*)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *))dlsym(EflAssistHandle, "ea_object_event_callback_add");
+        (*webkit_ea_object_event_callback_add)(m_popup, EA_CALLBACK_BACK, contextMenuHwBackKeyCallback, 0);
+    }
+#endif
+
     m_items = items;
     evas_object_data_set(m_popup, "WebContextMenuProxyTizen", this);
     elm_object_tree_focus_allow_set(m_popup, false);
diff --git a/Source/cmake/FindEFL_ASSIST.cmake b/Source/cmake/FindEFL_ASSIST.cmake
new file mode 100644 (file)
index 0000000..1c86598
--- /dev/null
@@ -0,0 +1,21 @@
+# - Try to find efl-assist
+# Once done, this will define
+#
+#  EFL_ASSIST_FOUND - system has efl-assist
+#  EFL_ASSIST_INCLUDE_DIRS - the efl-assist include directories
+#  EFL_ASSIST_LIBRARIES - link these to use efl-assist
+
+INCLUDE(FindPkgConfig)
+
+PKG_CHECK_MODULES(PC_EFL_ASSIST efl-assist)
+
+FIND_PATH(EFL_ASSIST_INCLUDE_DIRS NAMES efl_assist.h
+  HINTS ${PC_EFL_ASSIST_INCLUDE_DIRS} ${PC_EFL_ASSIST_INCLUDEDIR}
+)
+
+FIND_LIBRARY(EFL_ASSIST_LIBRARIES NAMES efl-assist
+  HINTS ${PC_EFL_ASSIST_LIBRARY_DIRS} ${PC_EFL_ASSIST_LIBDIR}
+)
+
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(EFL_ASSIST DEFAULT_MSG EFL_ASSIST_INCLUDE_DIRS EFL_ASSIST_LIBRARIES)
index 13cd68a..0672255 100644 (file)
@@ -232,6 +232,7 @@ FIND_PACKAGE(Media-Utils 0.1.35 REQUIRED)
 FIND_PACKAGE(UIGadget REQUIRED)
 FIND_PACKAGE(VConf REQUIRED)
 FIND_PACKAGE(feedback REQUIRED)
+FIND_PACKAGE(EFL_ASSIST REQUIRED)
 
 ADD_DEFINITIONS(-DENABLE_GESTURE_EVENTS=1)
 
index 1e86569..40b2921 100644 (file)
@@ -21,6 +21,7 @@ BuildRequires: pkgconfig(ecore-file)
 BuildRequires: pkgconfig(edbus)
 BuildRequires: pkgconfig(edje)
 BuildRequires: pkgconfig(eeze)
+BuildRequires: pkgconfig(efl-assist)
 BuildRequires: pkgconfig(eina)
 BuildRequires: pkgconfig(elementary)
 BuildRequires: pkgconfig(enchant)