83
auto create_tip(Connection const& connection, char const* name, Surface const& parent, FocusChangeSync& sync) -> Surface
85
MirRectangle aux_rect{10, 10, 10, 10};
86
auto const spec = SurfaceSpec::for_tip(connection, 50, 50, mir_pixel_format_argb_8888, parent, &aux_rect, mir_edge_attachment_any)
87
.set_buffer_usage(mir_buffer_usage_software)
88
.set_event_handler(&FocusChangeSync::raise_signal_on_focus_change, &sync)
91
Surface const surface{spec.create_surface()};
93
// Expect this to timeout: A tip should not receive focus
94
sync.exec([&]{ mir_buffer_stream_swap_buffers_sync(mir_surface_get_buffer_stream(surface)); });
95
EXPECT_FALSE(sync.signal_raised());
100
auto create_dialog(Connection const& connection, char const* name, Surface const& parent, FocusChangeSync& sync) -> Surface
102
auto const spec = SurfaceSpec::for_dialog(connection, 50, 50, mir_pixel_format_argb_8888, parent)
103
.set_buffer_usage(mir_buffer_usage_software)
104
.set_event_handler(&FocusChangeSync::raise_signal_on_focus_change, &sync)
107
Surface const surface{spec.create_surface()};
109
sync.exec([&]{ mir_buffer_stream_swap_buffers_sync(mir_surface_get_buffer_stream(surface)); });
110
EXPECT_TRUE(sync.signal_raised());
82
115
void assert_no_active_window()
84
invoke_tools([&](miral::WindowManagerTools& tools)
117
invoke_tools([&](WindowManagerTools& tools)
86
119
auto const window = tools.active_window();
87
120
ASSERT_FALSE(window);
177
210
EXPECT_THAT(sync2.signal_raised(), Eq(false));
178
211
assert_active_window_is(test_name);
214
TEST_F(ActiveWindow, switching_from_a_second_window_makes_first_active)
216
char const* const test_name = __PRETTY_FUNCTION__;
217
auto const connection = connect_client(test_name);
219
auto const first_surface = create_surface(connection, test_name, sync1);
220
auto const surface = create_surface(connection, "second", sync2);
222
sync1.exec([&]{ invoke_tools([](WindowManagerTools& tools){ tools.focus_next_within_application(); }); });
224
EXPECT_TRUE(sync1.signal_raised());
225
assert_active_window_is(test_name);
228
TEST_F(ActiveWindow, switching_from_a_second_application_makes_first_active)
230
char const* const test_name = __PRETTY_FUNCTION__;
231
auto const connection = connect_client(test_name);
232
auto const second_connection = connect_client("second");
234
auto const first_surface = create_surface(connection, test_name, sync1);
235
auto const surface = create_surface(second_connection, "second", sync2);
237
sync1.exec([&]{ invoke_tools([](WindowManagerTools& tools){ tools.focus_next_application(); }); });
239
EXPECT_TRUE(sync1.signal_raised());
240
assert_active_window_is(test_name);
243
TEST_F(ActiveWindow, closing_a_second_application_makes_first_active)
245
char const* const test_name = __PRETTY_FUNCTION__;
246
auto const connection = connect_client(test_name);
247
auto second_connection = connect_client("second");
249
auto const first_surface = create_surface(connection, test_name, sync1);
250
auto surface = create_surface(second_connection, "second", sync2);
252
sync1.exec([&]{ surface.reset(); second_connection.reset(); });
254
EXPECT_TRUE(sync1.signal_raised());
255
assert_active_window_is(test_name);
258
TEST_F(ActiveWindow, selecting_a_tip_makes_parent_active)
260
char const* const test_name = __PRETTY_FUNCTION__;
261
auto const connection = connect_client(test_name);
263
auto const parent = create_surface(connection, test_name, sync1);
265
Window parent_window;
266
invoke_tools([&](WindowManagerTools& tools){ parent_window = tools.active_window(); });
269
auto second_connection = connect_client("second");
270
auto second_surface = create_surface(second_connection, "second", sync2);
272
auto const tip = create_tip(connection, "tip", parent, sync2);
276
invoke_tools([&](WindowManagerTools& tools)
277
{ tools.select_active_window(*tools.info_for(parent_window).children().begin()); });
279
EXPECT_TRUE(sync1.signal_raised());
281
assert_active_window_is(test_name);
284
TEST_F(ActiveWindow, selecting_a_parent_makes_dialog_active)
286
char const* const test_name = __PRETTY_FUNCTION__;
287
auto const connection = connect_client(test_name);
289
auto const parent = create_surface(connection, test_name, sync1);
291
Window parent_window;
292
invoke_tools([&](WindowManagerTools& tools){ parent_window = tools.active_window(); });
294
auto const dialog = create_dialog(connection, "dialog", parent, sync2);
297
auto second_connection = connect_client("second");
298
auto second_surface = create_surface(second_connection, "second", sync1);
300
sync2.exec([&]{ invoke_tools([&](WindowManagerTools& tools){ tools.select_active_window(parent_window); }); });
302
EXPECT_TRUE(sync2.signal_raised());
303
assert_active_window_is("dialog");