Skip to content

Commit a1e5584

Browse files
authored
Fix scorll issue (#6)
1. Implement handle mouse wheel event. 2. The timestamp should be specified in microseconds when sent to engine.
1 parent 104b591 commit a1e5584

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

shell/platform/tizen/touch_event_handler.cc

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,17 @@
77
#include "flutter/shell/platform/tizen/logger.h"
88
#include "flutter/shell/platform/tizen/tizen_embedder_engine.h"
99

10+
static const int DIRECTION_VERTICAL = 0;
11+
static const int DIRECTION_HORIZONTAL = 1;
12+
1013
TouchEventHandler::TouchEventHandler(TizenEmbedderEngine *engine)
1114
: engine_(engine) {
1215
touch_event_handlers_.push_back(
1316
ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, OnTouch, this));
1417
touch_event_handlers_.push_back(
1518
ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, OnTouch, this));
19+
touch_event_handlers_.push_back(
20+
ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL, OnTouch, this));
1621
touch_event_handlers_.push_back(
1722
ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, OnTouch, this));
1823
touch_event_handlers_.push_back(ecore_event_handler_add(
@@ -28,6 +33,8 @@ TouchEventHandler::~TouchEventHandler() {
2833

2934
void TouchEventHandler::SendFlutterPointerEvent(FlutterPointerPhase phase,
3035
double x, double y,
36+
double scroll_delta_x,
37+
double scroll_delta_y,
3138
size_t timestamp) {
3239
if (!engine_->flutter_engine) {
3340
return;
@@ -53,7 +60,12 @@ void TouchEventHandler::SendFlutterPointerEvent(FlutterPointerPhase phase,
5360
event.phase = phase;
5461
event.x = new_x;
5562
event.y = new_y;
56-
event.timestamp = timestamp;
63+
if (scroll_delta_x != 0 || scroll_delta_y != 0) {
64+
event.signal_kind = kFlutterPointerSignalKindScroll;
65+
}
66+
event.scroll_delta_x = scroll_delta_x;
67+
event.scroll_delta_y = scroll_delta_y;
68+
event.timestamp = timestamp / 1000;
5769
FlutterEngineSendPointerEvent(engine_->flutter_engine, &event, 1);
5870
}
5971

@@ -63,25 +75,38 @@ Eina_Bool TouchEventHandler::OnTouch(void *data, int type, void *event) {
6375
if (type == ECORE_EVENT_MOUSE_BUTTON_DOWN) {
6476
self->pointer_state_ = true;
6577
auto *button_event = reinterpret_cast<Ecore_Event_Mouse_Button *>(event);
66-
self->SendFlutterPointerEvent(kDown, button_event->x, button_event->y,
78+
self->SendFlutterPointerEvent(kDown, button_event->x, button_event->y, 0, 0,
6779
button_event->timestamp);
6880
} else if (type == ECORE_EVENT_MOUSE_BUTTON_UP) {
6981
self->pointer_state_ = false;
7082
auto *button_event = reinterpret_cast<Ecore_Event_Mouse_Button *>(event);
71-
self->SendFlutterPointerEvent(kUp, button_event->x, button_event->y,
83+
self->SendFlutterPointerEvent(kUp, button_event->x, button_event->y, 0, 0,
7284
button_event->timestamp);
7385
} else if (type == ECORE_EVENT_MOUSE_MOVE) {
7486
if (self->pointer_state_) {
7587
auto *move_event = reinterpret_cast<Ecore_Event_Mouse_Move *>(event);
76-
self->SendFlutterPointerEvent(kMove, move_event->x, move_event->y,
88+
self->SendFlutterPointerEvent(kMove, move_event->x, move_event->y, 0, 0,
7789
move_event->timestamp);
7890
}
7991
} else if (type == ECORE_WL2_EVENT_WINDOW_VISIBILITY_CHANGE) {
8092
auto *focus_event =
8193
reinterpret_cast<Ecore_Wl2_Event_Window_Visibility_Change *>(event);
8294
LoggerD("Visibility changed: %u, %d", focus_event->win,
8395
focus_event->fully_obscured);
96+
} else if (type == ECORE_EVENT_MOUSE_WHEEL) {
97+
auto *wheel_event = reinterpret_cast<Ecore_Event_Mouse_Wheel *>(event);
98+
double scroll_delta_x = 0.0, scroll_delta_y = 0.0;
99+
if (wheel_event->direction == DIRECTION_VERTICAL) {
100+
scroll_delta_y += wheel_event->z;
101+
} else if (wheel_event->direction == DIRECTION_HORIZONTAL) {
102+
scroll_delta_x += wheel_event->z;
103+
}
104+
const int kScrollOffsetMultiplier = 20;
105+
scroll_delta_x *= kScrollOffsetMultiplier;
106+
scroll_delta_y *= kScrollOffsetMultiplier;
107+
self->SendFlutterPointerEvent(
108+
self->pointer_state_ ? kMove : kHover, wheel_event->x, wheel_event->y,
109+
scroll_delta_x, scroll_delta_y, wheel_event->timestamp);
84110
}
85-
86111
return ECORE_CALLBACK_PASS_ON;
87112
}

shell/platform/tizen/touch_event_handler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class TouchEventHandler {
2828
bool pointer_state_ = false;
2929

3030
void SendFlutterPointerEvent(FlutterPointerPhase phase, double x, double y,
31+
double scroll_delta_x, double scroll_delta_y,
3132
size_t timestamp);
3233

3334
static Eina_Bool OnTouch(void* data, int type, void* event);

0 commit comments

Comments
 (0)