From ea1f1ac6505b6ee6ef84cf61434791449f2b7c2e Mon Sep 17 00:00:00 2001 From: "fr.fang" Date: Wed, 2 Dec 2020 13:58:43 +0800 Subject: [PATCH] [M94 Migration] Add event handler for EVAS_CALLBACK_MOUSE_OUT Currently, webview can not detect whether the mouse is moved out of webview. The problem is when moving mouse to the edge of webview, the node under the cursor will stay in hover state event when the mouse moved out. The hover state will not be invalidated until the mouse move into webview. Reference: https://review.tizen.org/gerrit/248765 Change-Id: Iea67174faf8c3f5dcc0706bd05fad2ec2025e741 Signed-off-by: fr.fang Signed-off-by: Gajendra N --- .../renderer_host/render_widget_host_view_efl.cc | 14 ++++++++ .../renderer_host/render_widget_host_view_efl.h | 1 + .../browser/renderer_host/web_event_factory_efl.cc | 42 ++++++++++++++++++++++ .../browser/renderer_host/web_event_factory_efl.h | 2 ++ 4 files changed, 59 insertions(+) diff --git a/tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.cc b/tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.cc index b5e9076..3ff61a0 100644 --- a/tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.cc +++ b/tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.cc @@ -212,6 +212,8 @@ void RenderWidgetHostViewEfl::InitAsChild(gfx::NativeView /* parent_view */) { OnMouseUp, this); evas_object_event_callback_add(content_image_, EVAS_CALLBACK_MOUSE_MOVE, OnMouseMove, this); + evas_object_event_callback_add(content_image_, EVAS_CALLBACK_MOUSE_OUT, + OnMouseOut, this); evas_object_event_callback_add(content_image_, EVAS_CALLBACK_MOUSE_WHEEL, OnMouseWheel, this); evas_object_event_callback_add(content_image_, EVAS_CALLBACK_KEY_DOWN, @@ -277,6 +279,8 @@ RenderWidgetHostViewEfl::~RenderWidgetHostViewEfl() { OnMouseUp); evas_object_event_callback_del(content_image_, EVAS_CALLBACK_MOUSE_MOVE, OnMouseMove); + evas_object_event_callback_del(content_image_, EVAS_CALLBACK_MOUSE_OUT, + OnMouseOut); evas_object_event_callback_del(content_image_, EVAS_CALLBACK_MOUSE_WHEEL, OnMouseWheel); evas_object_event_callback_del(content_image_, EVAS_CALLBACK_KEY_DOWN, @@ -1137,6 +1141,16 @@ void RenderWidgetHostViewEfl::OnMouseMove(void* data, } } +void RenderWidgetHostViewEfl::OnMouseOut(void* data, + Evas* evas, + Evas_Object* obj, + void* event_info) { + RenderWidgetHostViewEfl* rwhv = static_cast(data); + blink::WebMouseEvent event = + MakeWebMouseEvent(obj, static_cast(event_info)); + rwhv->host_->ForwardMouseEvent(event); +} + void RenderWidgetHostViewEfl::OnMultiTouchDownEvent(void* data, Evas* evas, Evas_Object* obj, diff --git a/tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.h b/tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.h index ecefb02..71d8fd1 100644 --- a/tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.h +++ b/tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.h @@ -278,6 +278,7 @@ class CONTENT_EXPORT RenderWidgetHostViewEfl static void OnMouseDown(void* data, Evas*, Evas_Object*, void*); static void OnMouseUp(void* data, Evas*, Evas_Object*, void*); static void OnMouseMove(void* data, Evas*, Evas_Object*, void*); + static void OnMouseOut(void* data, Evas*, Evas_Object*, void*); static void OnMouseWheel(void* data, Evas*, Evas_Object*, void*); static void OnKeyDown(void*, Evas*, Evas_Object*, void*); static void OnKeyUp(void*, Evas*, Evas_Object*, void*); diff --git a/tizen_src/chromium_impl/content/browser/renderer_host/web_event_factory_efl.cc b/tizen_src/chromium_impl/content/browser/renderer_host/web_event_factory_efl.cc index 83ba6b9..859d27d 100644 --- a/tizen_src/chromium_impl/content/browser/renderer_host/web_event_factory_efl.cc +++ b/tizen_src/chromium_impl/content/browser/renderer_host/web_event_factory_efl.cc @@ -361,6 +361,21 @@ static WebMouseEvent::Button EvasToWebMouseButton(int button) { return WebMouseEvent::Button::kNoButton; } +enum { LeftButtonPressed = 1, MiddleButtonPressed = 2, RightButtonPressed = 4 }; + +static WebInputEvent::Modifiers EvasToWebMouseButtonsPressed(int buttons) { + unsigned result = 0; + + if (buttons & LeftButtonPressed) + result |= WebInputEvent::kLeftButtonDown; + if (buttons & MiddleButtonPressed) + result |= WebInputEvent::kMiddleButtonDown; + if (buttons & RightButtonPressed) + result |= WebInputEvent::kRightButtonDown; + + return static_cast(result); +} + static WebInputEvent::Modifiers EvasToWebModifiers( const Evas_Modifier* modifiers) { unsigned result = 0; @@ -407,11 +422,38 @@ template blink::WebMouseEvent MakeWebMouseEvent( const Evas_Event_Mouse_Up*); blink::WebMouseEvent MakeWebMouseEvent(Evas_Object* view, + const Evas_Event_Mouse_Out* ev) { + WebMouseEvent event(WebInputEvent::Type::kMouseLeave, + EvasToWebModifiers(ev->modifiers), + ui::EventTimeStampFromSeconds(ev->timestamp / 1000)); + + event.button = EvasToWebMouseButton(ev->buttons); + event.SetModifiers(event.GetModifiers() | + EvasToWebMouseButtonsPressed(ev->buttons)); + + const float sf = GetDeviceScaleFactor(); + gfx::PointF point(ev->canvas.x / sf, ev->canvas.y / sf); + TranslateEvasCoordToWebKitCoord(view, &point); + + Evas* evas = evas_object_evas_get(view); + event.SetPositionInScreen( + evas_coord_world_x_to_screen(evas, ev->canvas.x) / sf, + evas_coord_world_y_to_screen(evas, ev->canvas.y) / sf); + event.SetPositionInWidget(point); + + return event; +} + +blink::WebMouseEvent MakeWebMouseEvent(Evas_Object* view, const Evas_Event_Mouse_Move* ev) { WebMouseEvent event(WebInputEvent::Type::kMouseMove, EvasToWebModifiers(ev->modifiers), ui::EventTimeStampFromSeconds(ev->timestamp / 1000)); + event.button = EvasToWebMouseButton(ev->buttons); + event.SetModifiers(event.GetModifiers() | + EvasToWebMouseButtonsPressed(ev->buttons)); + const float sf = GetDeviceScaleFactor(); gfx::PointF point(ev->cur.canvas.x / sf, ev->cur.canvas.y / sf); TranslateEvasCoordToWebKitCoord(view, &point); diff --git a/tizen_src/chromium_impl/content/browser/renderer_host/web_event_factory_efl.h b/tizen_src/chromium_impl/content/browser/renderer_host/web_event_factory_efl.h index 0de1187..1d43037 100644 --- a/tizen_src/chromium_impl/content/browser/renderer_host/web_event_factory_efl.h +++ b/tizen_src/chromium_impl/content/browser/renderer_host/web_event_factory_efl.h @@ -20,6 +20,8 @@ template blink::WebMouseEvent MakeWebMouseEvent( blink::WebInputEvent::Type type, Evas_Object* view, const EVT*); blink::WebMouseEvent MakeWebMouseEvent(Evas_Object* view, + const Evas_Event_Mouse_Out* ev); +blink::WebMouseEvent MakeWebMouseEvent(Evas_Object* view, const Evas_Event_Mouse_Move* ev); blink::WebMouseWheelEvent MakeWebMouseEvent(Evas_Object*, const Evas_Event_Mouse_Wheel* ev); -- 2.7.4