[EFL][WK2] Restore cursor when moving mouse into webview
authorryuan.choi@samsung.com <ryuan.choi@samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 17 Mar 2014 12:40:43 +0000 (12:40 +0000)
committerryuan.choi@samsung.com <ryuan.choi@samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 17 Mar 2014 12:40:43 +0000 (12:40 +0000)
https://bugs.webkit.org/show_bug.cgi?id=130182

Reviewed by Gyuyoung Kim.

We changed mouse cursor when the type of cursor is changed.
But once mouse is moved out of webview, ewebkit will not know whether cursor
is changed or not.

So, this patch added a logic to restore the last applied type of cursor when
mouse is moved into webview again.

* UIProcess/API/efl/EwkView.cpp:
(EwkViewEventHandler<EVAS_CALLBACK_MOUSE_IN>::handleEvent):
Call updateCursor to restore the last applied type of cursor.
(EwkView::EwkView):
(EwkView::updateCursor): Extracted from setCursor.
(EwkView::setCursor):
(EwkView::handleEvasObjectAdd):
* UIProcess/API/efl/EwkView.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@165730 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/UIProcess/API/efl/EwkView.cpp
Source/WebKit2/UIProcess/API/efl/EwkView.h

index 7f3201e..0b631d2 100644 (file)
@@ -1,3 +1,26 @@
+2014-03-17  Ryuan Choi  <ryuan.choi@samsung.com>
+
+        [EFL][WK2] Restore cursor when moving mouse into webview
+        https://bugs.webkit.org/show_bug.cgi?id=130182
+
+        Reviewed by Gyuyoung Kim.
+
+        We changed mouse cursor when the type of cursor is changed.
+        But once mouse is moved out of webview, ewebkit will not know whether cursor
+        is changed or not.
+
+        So, this patch added a logic to restore the last applied type of cursor when
+        mouse is moved into webview again.
+
+        * UIProcess/API/efl/EwkView.cpp:
+        (EwkViewEventHandler<EVAS_CALLBACK_MOUSE_IN>::handleEvent):
+        Call updateCursor to restore the last applied type of cursor.
+        (EwkView::EwkView):
+        (EwkView::updateCursor): Extracted from setCursor.
+        (EwkView::setCursor):
+        (EwkView::handleEvasObjectAdd):
+        * UIProcess/API/efl/EwkView.h:
+
 2014-03-16  Ryuan Choi  <ryuan.choi@samsung.com>
 
         [EFL][WK2] Add ewk_application_cache_manager APIs
index 277f6aa..49220b4 100644 (file)
@@ -218,6 +218,15 @@ void EwkViewEventHandler<EVAS_CALLBACK_MOUSE_WHEEL>::handleEvent(void* data, Eva
 }
 
 template <>
+void EwkViewEventHandler<EVAS_CALLBACK_MOUSE_IN>::handleEvent(void* data, Evas*, Evas_Object*, void*)
+{
+    Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data);
+    EwkView* self = toEwkView(smartData);
+
+    self->updateCursor();
+}
+
+template <>
 void EwkViewEventHandler<EVAS_CALLBACK_KEY_DOWN>::handleEvent(void* data, Evas*, Evas_Object*, void* eventInfo)
 {
     Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data);
@@ -274,7 +283,7 @@ EwkView::EwkView(WKViewRef view, Evas_Object* evasObject)
 #endif
     , m_backForwardList(std::make_unique<EwkBackForwardList>(WKPageGetBackForwardList(wkPage())))
     , m_settings(std::make_unique<EwkSettings>(this))
-    , m_cursorIdentifier(0)
+    , m_useCustomCursor(false)
     , m_userAgent(WKEinaSharedString(AdoptWK, WKPageCopyUserAgent(wkPage())))
     , m_mouseEventsEnabled(false)
 #if ENABLE(TOUCH_EVENTS)
@@ -408,41 +417,37 @@ WKPageRef EwkView::wkPage() const
     return WKViewGetPage(wkView());
 }
 
-void EwkView::setCursor(const Cursor& cursor)
+void EwkView::updateCursor()
 {
-    if (cursor.image()) {
-        // Custom cursor.
-        if (cursor.image() == m_cursorIdentifier)
-            return;
+    Ewk_View_Smart_Data* sd = smartData();
 
-        m_cursorIdentifier = cursor.image();
+    if (m_useCustomCursor) {
+        Image* cursorImage = static_cast<Image*>(m_cursorIdentifier.image);
+        if (!cursorImage)
+            return;
 
-        Ewk_View_Smart_Data* sd = smartData();
-        RefPtr<Evas_Object> cursorObject = adoptRef(cursor.image()->getEvasObject(sd->base.evas));
+        RefPtr<Evas_Object> cursorObject = adoptRef(cursorImage->getEvasObject(sd->base.evas));
         if (!cursorObject)
             return;
 
+        IntSize cursorSize = cursorImage->size();
         // Resize cursor.
-        evas_object_resize(cursorObject.get(), cursor.image()->size().width(), cursor.image()->size().height());
+        evas_object_resize(cursorObject.get(), cursorSize.width(), cursorSize.height());
 
         // Get cursor hot spot.
         IntPoint hotSpot;
-        cursor.image()->getHotSpot(hotSpot);
+        cursorImage->getHotSpot(hotSpot);
 
         Ecore_Evas* ecoreEvas = ecore_evas_ecore_evas_get(sd->base.evas);
         // ecore_evas takes care of freeing the cursor object.
         ecore_evas_object_cursor_set(ecoreEvas, cursorObject.release().leakRef(), EVAS_LAYER_MAX, hotSpot.x(), hotSpot.y());
-
         return;
     }
 
-    // Standard cursor.
-    const char* group = cursor.platformCursor();
-    if (!group || group == m_cursorIdentifier)
+    const char* group = static_cast<const char*>(m_cursorIdentifier.group);
+    if (!group)
         return;
 
-    m_cursorIdentifier = group;
-    Ewk_View_Smart_Data* sd = smartData();
     RefPtr<Evas_Object> cursorObject = adoptRef(edje_object_add(sd->base.evas));
 
     Ecore_Evas* ecoreEvas = ecore_evas_ecore_evas_get(sd->base.evas);
@@ -482,6 +487,28 @@ void EwkView::setCursor(const Cursor& cursor)
     ecore_evas_object_cursor_set(ecoreEvas, cursorObject.release().leakRef(), EVAS_LAYER_MAX, hotspotX, hotspotY);
 }
 
+void EwkView::setCursor(const Cursor& cursor)
+{
+    if (cursor.image()) {
+        // Custom cursor.
+        if (cursor.image() == m_cursorIdentifier.image)
+            return;
+
+        m_cursorIdentifier.image = cursor.image();
+        m_useCustomCursor = true;
+    } else {
+        // Standard cursor.
+        const char* group = cursor.platformCursor();
+        if (!group || group == m_cursorIdentifier.group)
+            return;
+
+        m_cursorIdentifier.group = group;
+        m_useCustomCursor = false;
+    }
+
+    updateCursor();
+}
+
 void EwkView::setDeviceScaleFactor(float scale)
 {
     const WKSize& deviceSize = WKViewGetSize(wkView());
@@ -1134,6 +1161,7 @@ void EwkView::handleEvasObjectAdd(Evas_Object* evasObject)
 
     EwkViewEventHandler<EVAS_CALLBACK_FOCUS_IN>::subscribe(evasObject);
     EwkViewEventHandler<EVAS_CALLBACK_FOCUS_OUT>::subscribe(evasObject);
+    EwkViewEventHandler<EVAS_CALLBACK_MOUSE_IN>::subscribe(evasObject);
     EwkViewEventHandler<EVAS_CALLBACK_MOUSE_WHEEL>::subscribe(evasObject);
     EwkViewEventHandler<EVAS_CALLBACK_KEY_DOWN>::subscribe(evasObject);
     EwkViewEventHandler<EVAS_CALLBACK_KEY_UP>::subscribe(evasObject);
index 837e69e..091dcf6 100644 (file)
@@ -76,6 +76,7 @@ class AffineTransform;
 class Color;
 class CoordinatedGraphicsScene;
 class Cursor;
+class Image;
 class IntSize;
 class TransformationMatrix;
 }
@@ -143,6 +144,7 @@ public:
     void doneWithTouchEvent(WKTouchEventRef, bool);
 #endif
 
+    void updateCursor();
     void setCursor(const WebCore::Cursor& cursor);
 
     void scheduleUpdateDisplay();
@@ -268,7 +270,16 @@ private:
     std::unique_ptr<EwkBackForwardList> m_backForwardList;
     std::unique_ptr<EwkSettings> m_settings;
     RefPtr<EwkWindowFeatures> m_windowFeatures;
-    const void* m_cursorIdentifier; // This is an address, do not free it.
+    union CursorIdentifier {
+        CursorIdentifier()
+            : image(nullptr)
+        {
+        }
+        WebCore::Image* image;
+        const char* group;
+    } m_cursorIdentifier;
+    bool m_useCustomCursor;
+
     WKEinaSharedString m_url;
     mutable WKEinaSharedString m_title;
     WKEinaSharedString m_theme;