}
};
+struct mouse_wheel_event : public position_event
+{
+ typedef spl::shared_ptr<mouse_wheel_event> ptr;
+
+ const int ticks_delta;
+
+ mouse_wheel_event(int source_id, double x, double y, int ticks_delta)
+ : position_event(source_id, x, y)
+ , ticks_delta(ticks_delta)
+ {
+ }
+protected:
+ virtual interaction_event::ptr clone(
+ double new_x, double new_y) const override
+ {
+ return spl::make_shared<mouse_wheel_event>(source_id, new_x, new_y, ticks_delta);
+ }
+};
+
struct mouse_button_event : public position_event
{
typedef spl::shared_ptr<mouse_button_event> ptr;
class draw_frame last_frame() {return producer_->last_frame();}
draw_frame create_thumbnail_frame() {return producer_->create_thumbnail_frame();}
monitor::subject& monitor_output() override {return producer_->monitor_output();}
- bool collides(double x, double y) {return producer_->collides(x, y);}
- void on_interaction(const interaction_event::ptr& event) {return producer_->on_interaction(event);}
+ bool collides(double x, double y) const override {return producer_->collides(x, y);}
+ void on_interaction(const interaction_event::ptr& event) override {return producer_->on_interaction(event);}
constraints& pixel_constraints() override {return producer_->pixel_constraints();}
};
#include <core/frame/draw_frame.h>
#include <core/frame/frame_factory.h>
#include <core/producer/frame_producer.h>
+#include <core/interaction/interaction_event.h>
#include <core/frame/frame.h>
#include <core/frame/pixel_format.h>
#include <core/frame/geometry.h>
}
}
+ CefRefPtr<CefBrowserHost> get_browser_host()
+ {
+ return browser_->GetHost();
+ }
+
void close()
{
if (!animation_frame_requested_)
return L"html";
}
+ void on_interaction(const core::interaction_event::ptr& event) override
+ {
+ if (core::is<core::mouse_move_event>(event))
+ {
+ auto move = core::as<core::mouse_move_event>(event);
+ int x = static_cast<int>(move->x * constraints_.width.get());
+ int y = static_cast<int>(move->y * constraints_.height.get());
+
+ CefMouseEvent e;
+ e.x = x;
+ e.y = y;
+ client_->get_browser_host()->SendMouseMoveEvent(e, false);
+ }
+ else if (core::is<core::mouse_button_event>(event))
+ {
+ auto button = core::as<core::mouse_button_event>(event);
+ int x = static_cast<int>(button->x * constraints_.width.get());
+ int y = static_cast<int>(button->y * constraints_.height.get());
+
+ CefMouseEvent e;
+ e.x = x;
+ e.y = y;
+ client_->get_browser_host()->SendMouseClickEvent(
+ e,
+ static_cast<CefBrowserHost::MouseButtonType>(button->button),
+ !button->pressed,
+ 1);
+ }
+ else if (core::is<core::mouse_wheel_event>(event))
+ {
+ auto wheel = core::as<core::mouse_wheel_event>(event);
+ int x = static_cast<int>(wheel->x * constraints_.width.get());
+ int y = static_cast<int>(wheel->y * constraints_.height.get());
+
+ CefMouseEvent e;
+ e.x = x;
+ e.y = y;
+ static const int WHEEL_TICKS_AMPLIFICATION = 40;
+ client_->get_browser_host()->SendMouseWheelEvent(
+ e,
+ 0, // delta_x
+ wheel->ticks_delta * WHEEL_TICKS_AMPLIFICATION); // delta_y
+ }
+ }
+
+ bool collides(double x, double y) const override
+ {
+ return true;
+ }
+
core::draw_frame receive_impl() override
{
if (client_)
e.type == sf::Event::MouseButtonPressed));
}
break;
+ case sf::Event::MouseWheelMoved:
+ {
+ auto& wheel_moved = e.mouseWheel;
+ sink_->on_interaction(spl::make_shared<core::mouse_wheel_event>(
+ 1,
+ static_cast<double>(wheel_moved.x) / screen_width_,
+ static_cast<double>(wheel_moved.y) / screen_height_,
+ wheel_moved.delta));
+ }
+ break;
}
}
}