[EFL] Move cursor related code from WidgetEfl to ewk_view and EflScreenUtilities.
authorryuan.choi@samsung.com <ryuan.choi@samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 14 Jun 2012 23:09:44 +0000 (23:09 +0000)
committerryuan.choi@samsung.com <ryuan.choi@samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 14 Jun 2012 23:09:44 +0000 (23:09 +0000)
https://bugs.webkit.org/show_bug.cgi?id=88803

Reviewed by Chang Shu.

Because WebProcess can not control cursor,
setCursor should be passed to ChromeClient like other ports.

Source/WebCore:

* platform/Widget.h:
(Widget):
* platform/efl/EflScreenUtilities.cpp:
(WebCore::applyFallbackCursor): Moved from WidgetEfl.cpp.
(WebCore):
(WebCore::isUsingEcoreX): Moved from WidgetEfl.cpp.
* platform/efl/EflScreenUtilities.h:
(WebCore):
* platform/efl/WidgetEfl.cpp: Removes cursor related codes.
(WebCore::WidgetPrivate::WidgetPrivate):
(WebCore::Widget::~Widget):
(WebCore::Widget::setCursor): Redirect to HostWindow.
(WebCore::Widget::setEvasObject):

Source/WebKit/efl:

* WebCoreSupport/ChromeClientEfl.cpp:
(WebCore::ChromeClientEfl::setCursor):
* ewk/ewk_view.cpp:
(_Ewk_View_Private_Data):
(_ewk_view_priv_new): Check whether ecore_x can be used.
(_ewk_view_priv_del):
(_ewk_view_smart_add):
Change order of initialization to use base structure in _ewk_view_priv_new.
(ewk_view_cursor_set): Moved from Widget::applyCursor.
* ewk/ewk_view_private.h:
(WebCore):

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

Source/WebCore/ChangeLog
Source/WebCore/platform/Widget.h
Source/WebCore/platform/efl/EflScreenUtilities.cpp
Source/WebCore/platform/efl/EflScreenUtilities.h
Source/WebCore/platform/efl/WidgetEfl.cpp
Source/WebKit/efl/ChangeLog
Source/WebKit/efl/WebCoreSupport/ChromeClientEfl.cpp
Source/WebKit/efl/ewk/ewk_view.cpp
Source/WebKit/efl/ewk/ewk_view_private.h

index c7c4e5e..b2498d5 100644 (file)
@@ -1,3 +1,27 @@
+2012-06-14  Ryuan Choi  <ryuan.choi@samsung.com>
+
+        [EFL] Move cursor related code from WidgetEfl to ewk_view and EflScreenUtilities.
+        https://bugs.webkit.org/show_bug.cgi?id=88803
+
+        Reviewed by Chang Shu.
+
+        Because WebProcess can not control cursor,
+        setCursor should be passed to ChromeClient like other ports.
+
+        * platform/Widget.h:
+        (Widget):
+        * platform/efl/EflScreenUtilities.cpp:
+        (WebCore::applyFallbackCursor): Moved from WidgetEfl.cpp.
+        (WebCore):
+        (WebCore::isUsingEcoreX): Moved from WidgetEfl.cpp.
+        * platform/efl/EflScreenUtilities.h:
+        (WebCore):
+        * platform/efl/WidgetEfl.cpp: Removes cursor related codes.
+        (WebCore::WidgetPrivate::WidgetPrivate):
+        (WebCore::Widget::~Widget):
+        (WebCore::Widget::setCursor): Redirect to HostWindow.
+        (WebCore::Widget::setEvasObject):
+
 2012-06-14  Ryosuke Niwa  <rniwa@webkit.org>
 
         Radio node lists do not get updated when inserted back into a document
index ffa1cc0..8f3ef57 100644 (file)
@@ -271,14 +271,6 @@ private:
 
     IntRect m_frame; // Not used when a native widget exists.
 
-#if PLATFORM(EFL)
-    // FIXME: Please see the previous #if PLATFORM(EFL) block.
-    Ecore_Evas* ecoreEvas() const;
-
-    void applyFallbackCursor();
-    void applyCursor();
-#endif
-
 #if PLATFORM(MAC) || PLATFORM(EFL)
     WidgetPrivate* m_data;
 #endif
index 7ea7b7e..e4a7277 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Samsung Electronics
+ * Copyright (C) 2012 Samsung Electronics
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
@@ -20,6 +20,7 @@
 #include "EflScreenUtilities.h"
 
 #ifdef HAVE_ECORE_X
+#include <Ecore_Evas.h>
 #include <Ecore_X.h>
 #include <wtf/HashMap.h>
 #include <wtf/text/StringHash.h>
@@ -102,6 +103,21 @@ int getEcoreCursor(const String& cursorString)
 }
 #endif
 
+void applyFallbackCursor(Ecore_Evas* ecoreEvas, const char* cursorString)
+{
+#ifdef HAVE_ECORE_X
+    int shape = getEcoreCursor(cursorString);
+    if (shape < ECORE_X_CURSOR_X || shape > ECORE_X_CURSOR_XTERM) {
+        LOG_ERROR("cannot map an equivalent X cursor for"
+                  " c ursor group %s", cursorString);
+        shape = ECORE_X_CURSOR_LEFT_PTR;
+    }
+    Ecore_X_Window window = ecore_evas_software_x11_window_get(ecoreEvas);
+    Ecore_X_Cursor cursor = ecore_x_cursor_shape_get(shape);
+    ecore_x_window_cursor_set(window, cursor);
+#endif
+}
+
 int getDPI()
 {
 #ifdef HAVE_ECORE_X
@@ -111,4 +127,18 @@ int getDPI()
 #endif
 }
 
+bool isUsingEcoreX(const Evas* evas)
+{
+#ifdef HAVE_ECORE_X
+    Ecore_Evas* ecoreEvas = ecore_evas_ecore_evas_get(evas);
+    const char* engine = ecore_evas_engine_name_get(ecoreEvas);
+    return !strcmp(engine, "software_x11")
+        || !strcmp(engine, "software_xcb")
+        || !strcmp(engine, "software_16_x11")
+        || !strncmp(engine, "xrender", sizeof("xrender") - 1);
+#else
+    return false;
+#endif
+}
+
 } // namespace WebCore
index 1445c22..6ec60ef 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Samsung Electronics
+ * Copyright (C) 2012 Samsung Electronics
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
 
 #include <wtf/text/WTFString.h>
 
-namespace WebCore {
+typedef struct _Evas Evas;
 
-#ifdef HAVE_ECORE_X
-int getEcoreCursor(const String& cursorString);
-#endif
+namespace WebCore {
 
+void applyFallbackCursor(Ecore_Evas*, const char*);
 int getDPI();
+bool isUsingEcoreX(const Evas*);
 
 } // namespace WebCore
 
index 7140d69..138bdfa 100644 (file)
@@ -3,7 +3,7 @@
  * Copyright (C) 2007 Holger Hans Peter Freyther
  * Copyright (C) 2008 Kenneth Rohde Christiansen
  * Copyright (C) 2009-2010 ProFUSION embedded systems
- * Copyright (C) 2009-2010 Samsung Electronics
+ * Copyright (C) 2009-2012 Samsung Electronics
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #include "Page.h"
 
 #include <Ecore.h>
-#include <Ecore_Evas.h>
-#include <Edje.h>
 #include <Evas.h>
 
-#ifdef HAVE_ECORE_X
-#include <Ecore_X.h>
-#endif
-
 namespace WebCore {
 
 class WidgetPrivate {
@@ -62,19 +56,7 @@ public:
     WidgetPrivate()
         : m_evas(0)
         , m_evasObject(0)
-        , m_cursorObject(0)
-#ifdef HAVE_ECORE_X
-        , m_isUsingEcoreX(false)
-#endif
     { }
-
-    /* cursor */
-    String m_cursorGroup;
-    Evas_Object* m_cursorObject;
-
-#ifdef HAVE_ECORE_X
-    bool m_isUsingEcoreX;
-#endif
 };
 
 Widget::Widget(PlatformWidget widget)
@@ -92,9 +74,6 @@ Widget::~Widget()
 {
     ASSERT(!parent());
 
-    if (m_data->m_cursorObject)
-        evas_object_del(m_data->m_cursorObject);
-
     delete m_data;
 }
 
@@ -132,70 +111,12 @@ void Widget::setFocus(bool focused)
 {
 }
 
-void Widget::applyFallbackCursor()
-{
-#ifdef HAVE_ECORE_X
-    if (m_data->m_isUsingEcoreX && !m_data->m_cursorGroup.isNull()) {
-        int shape = getEcoreCursor(m_data->m_cursorGroup);
-
-        if (shape < ECORE_X_CURSOR_X || shape > ECORE_X_CURSOR_XTERM) {
-            LOG_ERROR("cannot map an equivalent X cursor for"
-                      " c ursor group %s", m_data->m_cursorGroup.utf8().data());
-            shape = ECORE_X_CURSOR_LEFT_PTR;
-        }
-
-        Ecore_X_Window win = ecore_evas_software_x11_window_get(ecoreEvas());
-        Ecore_X_Cursor cur = ecore_x_cursor_shape_get(shape);
-        ecore_x_window_cursor_set(win, cur);
-        return;
-    }
-#endif
-}
-
-void Widget::applyCursor()
-{
-    CString file = edjeThemeRecursive().utf8();
-
-    m_data->m_cursorObject = edje_object_add(evas());
-    if (!file.isNull() && !edje_object_file_set(m_data->m_cursorObject, file.data(), m_data->m_cursorGroup.utf8().data())) {
-        evas_object_del(m_data->m_cursorObject);
-        m_data->m_cursorObject = 0;
-        ecore_evas_object_cursor_set(ecoreEvas(), 0, 0, 0, 0);
-        applyFallbackCursor();
-    } else {
-        Evas_Coord x, y, w, h;
-        const char *d;
-
-        edje_object_size_min_get(m_data->m_cursorObject, &w, &h);
-        if ((w <= 0) || (h <= 0))
-            edje_object_size_min_calc(m_data->m_cursorObject, &w, &h);
-        if ((w <= 0) || (h <= 0))
-            w = h = 16;
-        evas_object_resize(m_data->m_cursorObject, w, h);
-
-        d = edje_object_data_get(m_data->m_cursorObject, "hot.x");
-        x = d ? atoi(d) : 0;
-
-        d = edje_object_data_get(m_data->m_cursorObject, "hot.y");
-        y = d ? atoi(d) : 0;
-
-        ecore_evas_object_cursor_set(ecoreEvas(), m_data->m_cursorObject,
-                                     EVAS_LAYER_MAX, x, y);
-    }
-}
-
 void Widget::setCursor(const Cursor& cursor)
 {
-    if (!evas())
-         return;
-
-    const char* group = cursor.platformCursor();
-    if (!group || String(group) == m_data->m_cursorGroup)
+    ScrollView* view = root();
+    if (!view)
         return;
-
-    m_data->m_cursorGroup = group;
-
-    applyCursor();
+    view->hostWindow()->setCursor(cursor);
 }
 
 void Widget::show()
@@ -252,12 +173,6 @@ Evas* Widget::evas() const
     return m_data->m_evas;
 }
 
-Ecore_Evas* Widget::ecoreEvas() const
-{
-    // FIXME EFL: XXX assume evas was created by ecore_evas
-    return static_cast<Ecore_Evas*>(evas_data_attach_get(evas()));
-}
-
 void Widget::setEvasObject(Evas_Object *object)
 {
     // FIXME: study platformWidget() and use it
@@ -267,22 +182,11 @@ void Widget::setEvasObject(Evas_Object *object)
     m_data->m_evasObject = object;
     if (!object) {
         m_data->m_evas = 0;
-#ifdef HAVE_ECORE_X
-        m_data->m_isUsingEcoreX = false;
-#endif
         return;
     }
 
     m_data->m_evas = evas_object_evas_get(object);
 
-#ifdef HAVE_ECORE_X
-    const char *engine = ecore_evas_engine_name_get(ecoreEvas());
-    m_data->m_isUsingEcoreX = (!strcmp(engine, "software_x11")
-                               || !strcmp(engine, "software_xcb")
-                               || !strcmp(engine, "software_16_x11")
-                               || !strncmp(engine, "xrender", sizeof("xrender") - 1));
-#endif
-
     Widget::frameRectsChanged();
 }
 
index 90754b0..0fb4ea8 100644 (file)
@@ -1,3 +1,25 @@
+2012-06-14  Ryuan Choi  <ryuan.choi@samsung.com>
+
+        [EFL] Move cursor related code from WidgetEfl to ewk_view and EflScreenUtilities.
+        https://bugs.webkit.org/show_bug.cgi?id=88803
+
+        Reviewed by Chang Shu.
+
+        Because WebProcess can not control cursor,
+        setCursor should be passed to ChromeClient like other ports.
+
+        * WebCoreSupport/ChromeClientEfl.cpp:
+        (WebCore::ChromeClientEfl::setCursor):
+        * ewk/ewk_view.cpp:
+        (_Ewk_View_Private_Data):
+        (_ewk_view_priv_new): Check whether ecore_x can be used.
+        (_ewk_view_priv_del):
+        (_ewk_view_smart_add):
+        Change order of initialization to use base structure in _ewk_view_priv_new.
+        (ewk_view_cursor_set): Moved from Widget::applyCursor.
+        * ewk/ewk_view_private.h:
+        (WebCore):
+
 2012-06-14  Sudarsana Nagineni  <sudarsana.nagineni@linux.intel.com>
 
         [EFL] [DRT] Implement setDomainRelaxationForbiddenForURLScheme in EFL DRT
index 60d13e5..a234bf9 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) 2008 Kenneth Rohde Christiansen
  * Copyright (C) 2008 Diego Gonzalez
  * Copyright (C) 2009-2010 ProFUSION embedded systems
- * Copyright (C) 2009-2010 Samsung Electronics
+ * Copyright (C) 2009-2012 Samsung Electronics
  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
  *
  * All rights reserved.
@@ -499,9 +499,9 @@ void ChromeClientEfl::formStateDidChange(const Node*)
     notImplemented();
 }
 
-void ChromeClientEfl::setCursor(const Cursor&)
+void ChromeClientEfl::setCursor(const Cursor& cursor)
 {
-    notImplemented();
+    ewk_view_cursor_set(m_view, cursor);
 }
 
 void ChromeClientEfl::setCursorHiddenUntilMouseMoves(bool)
index 9798e94..403dab1 100644 (file)
@@ -66,6 +66,8 @@
 #include "ewk_view_private.h"
 #include "ewk_window_features_private.h"
 #include <Ecore.h>
+#include <Ecore_Evas.h>
+#include <Edje.h>
 #include <Eina.h>
 #include <Evas.h>
 #include <eina_safety_checks.h>
@@ -340,6 +342,11 @@ struct _Ewk_View_Private_Data {
         Ecore_Animator* animator;
     } animatedZoom;
     SoupSession* soupSession;
+    const char* cursorGroup;
+    Evas_Object* cursorObject;
+#ifdef HAVE_ECORE_X
+    bool isUsingEcoreX;
+#endif
 };
 
 #ifndef EWK_TYPE_CHECK
@@ -857,6 +864,10 @@ static Ewk_View_Private_Data* _ewk_view_priv_new(Ewk_View_Smart_Data* smartData)
 
     priv->pageClient = adoptPtr(new PageClientEfl(smartData->self));
 
+#ifdef HAVE_ECORE_X
+    priv->isUsingEcoreX = WebCore::isUsingEcoreX(smartData->base.evas);
+#endif
+
     return priv;
 }
 
@@ -887,6 +898,9 @@ static void _ewk_view_priv_del(Ewk_View_Private_Data* priv)
 
     ewk_history_free(priv->history);
 
+    if (priv->cursorObject)
+        evas_object_del(priv->cursorObject);
+
     delete priv;
 }
 
@@ -913,11 +927,11 @@ static void _ewk_view_smart_add(Evas_Object* ewkView)
     smartData->bg_color.a = 255;
 
     smartData->self = ewkView;
-    smartData->_priv = _ewk_view_priv_new(smartData);
     smartData->api = api;
 
     _parent_sc.add(ewkView);
 
+    smartData->_priv = _ewk_view_priv_new(smartData);
     if (!smartData->_priv)
         return;
 
@@ -4368,6 +4382,57 @@ Eina_Bool ewk_view_setting_web_audio_set(Evas_Object* ewkView, Eina_Bool enable)
 #endif
 }
 
+void ewk_view_cursor_set(Evas_Object* ewkView, const WebCore::Cursor& cursor)
+{
+    EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData);
+    EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv);
+
+    const char* group = cursor.platformCursor();
+    if (!group || group == priv->cursorGroup)
+        return;
+
+    priv->cursorGroup = group;
+
+    if (priv->cursorObject)
+        evas_object_del(priv->cursorObject);
+    priv->cursorObject = edje_object_add(smartData->base.evas);
+
+    Ecore_Evas* ecoreEvas = ecore_evas_ecore_evas_get(smartData->base.evas);
+    if (!priv->settings.theme || !edje_object_file_set(priv->cursorObject, priv->settings.theme, group)) {
+        evas_object_del(priv->cursorObject);
+        priv->cursorObject = 0;
+
+        ecore_evas_object_cursor_set(ecoreEvas, 0, 0, 0, 0);
+#ifdef HAVE_ECORE_X
+        if (priv->isUsingEcoreX)
+            WebCore::applyFallbackCursor(ecoreEvas, group);
+#endif
+    } else {
+        Evas_Coord width, height;
+        edje_object_size_min_get(priv->cursorObject, &width, &height);
+        if (width <= 0 || height <= 0)
+            edje_object_size_min_calc(priv->cursorObject, &width, &height);
+        if (width <= 0 || height <= 0) {
+            width = 16;
+            height = 16;
+        }
+        evas_object_resize(priv->cursorObject, width, height);
+
+        const char* data;
+        int hotspotX = 0;
+        data = edje_object_data_get(priv->cursorObject, "hot.x");
+        if (data)
+            hotspotX = atoi(data);
+
+        int hotspotY = 0;
+        data = edje_object_data_get(priv->cursorObject, "hot.y");
+        if (data)
+            hotspotY = atoi(data);
+
+        ecore_evas_object_cursor_set(ecoreEvas, priv->cursorObject, EVAS_LAYER_MAX, hotspotX, hotspotY);
+    }
+}
+
 namespace EWKPrivate {
 
 WebCore::Page* corePage(const Evas_Object* ewkView)
index b744e15..b70e755 100644 (file)
@@ -34,6 +34,7 @@ class Color;
 class ColorChooserClient;
 #endif
 
+class Cursor;
 class PopupMenuClient;
 }
 
@@ -48,6 +49,7 @@ const char ewkViewSingleName[] = "Ewk_View_Single";
         return __VA_ARGS__; \
     }
 
+void ewk_view_cursor_set(Evas_Object* ewkView, const WebCore::Cursor& cursor);
 void ewk_view_ready(Evas_Object* ewkView);
 void ewk_view_input_method_state_set(Evas_Object* ewkView, bool active);
 void ewk_view_title_set(Evas_Object* ewkView, const Ewk_Text_With_Direction* title);