19
19
#include "display_buffer.h"
21
21
#include "host_connection.h"
22
#include "mir/input/input_dispatcher.h"
23
22
#include "mir/graphics/pixel_format_utils.h"
24
#include "mir/input/cursor_listener.h"
25
23
#include "mir/graphics/egl_error.h"
26
24
#include "mir/events/event_private.h"
28
26
#include <boost/throw_exception.hpp>
29
27
#include <stdexcept>
31
namespace mi = mir::input;
32
29
namespace mg = mir::graphics;
33
30
namespace mgn = mir::graphics::nested;
34
31
namespace geom = mir::geometry;
37
34
EGLDisplayHandle const& egl_display,
38
35
std::shared_ptr<HostSurface> const& host_surface,
39
36
geometry::Rectangle const& area,
40
std::shared_ptr<input::InputDispatcher> const& dispatcher,
41
std::shared_ptr<mi::CursorListener> const& cursor_listener,
42
MirPixelFormat preferred_format) :
37
MirPixelFormat preferred_format,
38
std::shared_ptr<HostConnection> const& host_connection) :
43
39
egl_display(egl_display),
44
40
host_surface{host_surface},
45
egl_config{egl_display.choose_windowed_es_config(preferred_format)},
41
host_connection{host_connection},
42
egl_config{egl_display.choose_windowed_config(preferred_format)},
46
43
egl_context{egl_display, eglCreateContext(egl_display, egl_config, egl_display.egl_context(), nested_egl_context_attribs)},
47
44
area{area.top_left, area.size},
48
dispatcher{dispatcher},
49
cursor_listener{cursor_listener},
50
45
egl_surface{egl_display, host_surface->egl_native_window(), egl_config}
52
47
host_surface->set_event_handler(event_thunk, this);
116
111
void mgn::detail::DisplayBuffer::mir_event(MirEvent const& event)
118
if (mir_event_get_type(&event) != mir_event_type_input)
121
if (event.type() == mir_event_type_motion)
123
MirMotionEvent my_event = *event.to_input()->to_motion();
124
auto iev = mir_event_get_input_event(&my_event);
126
if (mir_input_event_get_type(iev) == mir_input_event_type_pointer)
128
auto motion = my_event.to_input()->to_motion();
130
for (size_t i = 0; i != motion->pointer_count(); ++i)
132
auto x = motion->x(i);
133
auto y = motion->y(i);
134
motion->set_x(i, x + area.top_left.x.as_float());
135
motion->set_y(i, y + area.top_left.y.as_float());
138
auto pev = mir_input_event_get_pointer_event(iev);
139
auto x = mir_pointer_event_axis_value(pev, mir_pointer_axis_x);
140
auto y = mir_pointer_event_axis_value(pev, mir_pointer_axis_y);
141
cursor_listener->cursor_moved_to(x, y);
144
dispatcher->dispatch(my_event);
148
dispatcher->dispatch(event);
113
if (mir_event_get_type(&event) == mir_event_type_input ||
114
mir_event_get_type(&event) == mir_event_type_input_device_state)
115
host_connection->emit_input_event(event, area);
152
118
mg::NativeDisplayBuffer* mgn::detail::DisplayBuffer::native_display_buffer()