16
16
* Authored by: Nick Dedekind <nick.dedekind@canonical.com>
19
#define MIR_INCLUDE_DEPRECATED_EVENT_HEADER
21
19
#include "mir_toolkit/mir_client_library.h"
22
#include "mir_toolkit/debug/surface.h"
24
21
#include "mir/shell/shell_wrapper.h"
26
22
#include "mir/scene/session.h"
27
23
#include "mir/scene/surface.h"
28
24
#include "mir/scene/surface_creation_parameters.h"
26
#include "mir_test/event_matchers.h"
30
27
#include "mir_test_framework/connected_client_with_a_surface.h"
31
28
#include "mir_test_framework/any_surface.h"
40
37
namespace mf = mir::frontend;
41
namespace mtf = mir_test_framework;
42
38
namespace ms = mir::scene;
43
39
namespace msh = mir::shell;
40
namespace mt = mir::test;
41
namespace mtf = mir_test_framework;
45
43
using namespace testing;
69
67
std::mutex last_event_mutex;
70
68
MirEventType event_filter{mir_event_type_surface};
71
69
std::condition_variable last_event_cv;
72
MirEvent last_event{};
70
MirEvent const* last_event = nullptr;
73
71
MirSurface* last_event_surface = nullptr;
75
73
std::shared_ptr<ms::Surface> scene_surface;
75
~ClientSurfaceEvents()
78
mir_event_unref(last_event);
77
81
static void event_callback(MirSurface* surface, MirEvent const* event, void* ctx)
79
83
ClientSurfaceEvents* self = static_cast<ClientSurfaceEvents*>(ctx);
80
84
std::lock_guard<decltype(self->last_event_mutex)> last_event_lock{self->last_event_mutex};
81
85
// Don't overwrite an interesting event with an uninteresting one!
82
if (event->type != self->event_filter) return;
83
self->last_event = *event;
86
if (mir_event_get_type(event) != self->event_filter) return;
89
mir_event_unref(self->last_event);
91
self->last_event = mir_event_ref(event);
84
92
self->last_event_surface = surface;
85
93
self->last_event_cv.notify_one();
90
98
std::unique_lock<decltype(last_event_mutex)> last_event_lock{last_event_mutex};
91
99
return last_event_cv.wait_for(last_event_lock, delay,
92
[&] { return last_event_surface == surface && last_event.type == event_filter; });
100
[&] { return last_event_surface == surface && mir_event_get_type(last_event) == event_filter; });
95
103
void set_event_filter(MirEventType type)
101
109
void reset_last_event()
103
111
std::lock_guard<decltype(last_event_mutex)> last_event_lock{last_event_mutex};
104
memset(&last_event, 0, sizeof last_event);
112
if (last_event != nullptr)
113
mir_event_unref(last_event);
114
last_event = nullptr;
105
115
last_event_surface = nullptr;
152
162
TEST_F(ClientSurfaceEvents, surface_receives_state_events)
154
int surface_id = mir_debug_surface_id(surface);
157
165
mir_wait_for(mir_surface_set_state(surface, mir_surface_state_fullscreen));
158
166
mir_wait_for(mir_surface_set_state(other_surface, mir_surface_state_vertmaximized));
160
168
std::lock_guard<decltype(last_event_mutex)> last_event_lock{last_event_mutex};
162
EXPECT_THAT(last_event_surface, Eq(surface));
163
EXPECT_THAT(last_event.type, Eq(mir_event_type_surface));
164
EXPECT_THAT(last_event.surface.id, Eq(surface_id));
165
EXPECT_THAT(last_event.surface.attrib, Eq(mir_surface_attrib_state));
166
EXPECT_THAT(last_event.surface.value, Eq(mir_surface_state_fullscreen));
170
EXPECT_THAT(last_event, mt::SurfaceEvent(mir_surface_attrib_state, mir_surface_state_fullscreen));
170
174
mir_wait_for(mir_surface_set_state(surface, static_cast<MirSurfaceState>(999)));
172
176
std::lock_guard<decltype(last_event_mutex)> last_event_lock{last_event_mutex};
174
EXPECT_THAT(last_event_surface, Eq(surface));
175
EXPECT_THAT(last_event.type, Eq(mir_event_type_surface));
176
EXPECT_THAT(last_event.surface.id, Eq(surface_id));
177
EXPECT_THAT(last_event.surface.attrib, Eq(mir_surface_attrib_state));
178
EXPECT_THAT(last_event.surface.value, Eq(mir_surface_state_fullscreen));
177
EXPECT_THAT(last_event, mt::SurfaceEvent(mir_surface_attrib_state, mir_surface_state_fullscreen));
181
180
reset_last_event();
186
185
std::lock_guard<decltype(last_event_mutex)> last_event_lock{last_event_mutex};
188
EXPECT_THAT(last_event_surface, Eq(surface));
189
EXPECT_THAT(last_event.type, Eq(mir_event_type_surface));
190
EXPECT_THAT(last_event.surface.id, Eq(surface_id));
191
EXPECT_THAT(last_event.surface.attrib, Eq(mir_surface_attrib_state));
192
EXPECT_THAT(last_event.surface.value, Eq(mir_surface_state_vertmaximized));
187
EXPECT_THAT(last_event, mt::SurfaceEvent(mir_surface_attrib_state, mir_surface_state_vertmaximized));
195
190
reset_last_event();
201
196
std::lock_guard<decltype(last_event_mutex)> last_event_lock{last_event_mutex};
203
EXPECT_THAT(last_event_surface, IsNull());
204
EXPECT_THAT(last_event.type, Eq(0));
205
EXPECT_THAT(last_event.surface.id, Eq(0));
206
EXPECT_THAT(last_event.surface.attrib, Eq(0));
207
EXPECT_THAT(last_event.surface.value, Eq(0));
198
EXPECT_EQ(nullptr, last_event);
223
214
std::lock_guard<decltype(last_event_mutex)> last_event_lock{last_event_mutex};
225
EXPECT_THAT(last_event_surface, Eq(surface));
226
EXPECT_THAT(last_event.type, Eq(mir_event_type_orientation));
227
EXPECT_THAT(last_event.orientation.direction, Eq(direction));
216
EXPECT_THAT(last_event, mt::OrientationEvent(direction));
230
219
INSTANTIATE_TEST_CASE_P(ClientSurfaceEvents,
261
250
std::lock_guard<decltype(last_event_mutex)> last_event_lock{last_event_mutex};
263
252
EXPECT_THAT(last_event_surface, Eq(surface));
264
EXPECT_THAT(last_event.type, Eq(mir_event_type_close_surface));
253
EXPECT_THAT(mir_event_get_type(last_event), Eq(mir_event_type_close_surface));
267
256
TEST_F(ClientSurfaceEvents, client_can_query_preferred_orientation)