Skip to content

Commit

Permalink
feat(server): provide output state getter and setter
Browse files Browse the repository at this point in the history
Replace the individual property getters and setters with a single pair to get
and set the current, that is the pending, state.

This also removes the output metadata field from the state struct. Instead
these structs are fully separate now.
  • Loading branch information
romangg committed Mar 31, 2023
1 parent 63e4934 commit 514c8ff
Show file tree
Hide file tree
Showing 18 changed files with 235 additions and 249 deletions.
5 changes: 4 additions & 1 deletion autotests/client/layer_shell.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,10 @@ void layer_shell_test::init()
server.globals.xdg_shell = std::make_unique<Wrapland::Server::XdgShell>(server.display.get());

server.output = std::make_unique<Wrapland::Server::output>(*server.globals.output_manager);
server.output->set_enabled(true);
server.output->add_mode({.size = QSize{1920, 1080}, .id = 0});
auto state = server.output->get_state();
state.enabled = true;
server.output->set_state(state);
server.output->done();

// setup connection
Expand Down
117 changes: 75 additions & 42 deletions autotests/client/output.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,24 +91,31 @@ void TestOutput::init()
Srv::output_metadata meta{.name = "HDMI-A", .make = "Foocorp", .model = "Barmodel"};
server.output = std::make_unique<Wrapland::Server::output>(meta, *server.output_manager);

QCOMPARE(server.output->mode_size(), QSize());
QCOMPARE(server.output->refresh_rate(), 60000);
QCOMPARE(server.output->get_state().mode.size, QSize());
QCOMPARE(server.output->get_state().mode.refresh_rate, 60000);
server.output->add_mode(Srv::output_mode{QSize(800, 600), 50000, true});
QCOMPARE(server.output->mode_size(), QSize(800, 600));
QCOMPARE(server.output->get_state().mode.size, QSize(800, 600));
QCOMPARE(server.output->get_state().mode.refresh_rate, 50000);

auto mode = Srv::output_mode{QSize(1024, 768)};
server.output->add_mode(mode);

server.output->add_mode(Srv::output_mode{QSize(1280, 1024), 90000});
QCOMPARE(server.output->mode_size(), QSize(1280, 1024));
QCOMPARE(server.output->get_state().mode.size, QSize(1280, 1024));
QCOMPARE(server.output->get_state().mode.refresh_rate, 90000);

server.output->set_mode(mode);
QCOMPARE(server.output->mode_size(), QSize(1024, 768));
QCOMPARE(server.output->refresh_rate(), 60000);
auto state = server.output->get_state();
state.mode = mode;
server.output->set_state(state);
QCOMPARE(server.output->get_state().mode.size, QSize(1024, 768));
QCOMPARE(server.output->get_state().mode.refresh_rate, 60000);

QCOMPARE(server.output->dpms_supported(), false);
QCOMPARE(server.output->dpms_mode(), Srv::output_dpms_mode::off);
server.output->set_enabled(true);

state = server.output->get_state();
state.enabled = true;
server.output->set_state(state);
server.output->done();

// setup connection
Expand Down Expand Up @@ -151,9 +158,12 @@ void TestOutput::cleanup()

void TestOutput::testRegistry()
{
QCOMPARE(server.output->geometry().topLeft(), QPoint(0, 0));
server.output->set_geometry(QRectF(QPoint(100, 50), QSize()));
QCOMPARE(server.output->geometry().topLeft(), QPoint(100, 50));
QCOMPARE(server.output->get_state().geometry.topLeft(), QPoint(0, 0));

auto state = server.output->get_state();
state.geometry = QRectF(QPoint(100, 50), QSize());
server.output->set_state(state);
QCOMPARE(server.output->get_state().geometry.topLeft(), QPoint(100, 50));

auto metadata = server.output->get_metadata();
QCOMPARE(metadata.physical_size, QSize());
Expand Down Expand Up @@ -221,7 +231,7 @@ void TestOutput::testModeChanges()
QCOMPARE(serverModes.at(1).refresh_rate, 60000);
QCOMPARE(serverModes.at(2).refresh_rate, 90000);
QVERIFY(serverModes.at(0).preferred);
QCOMPARE(serverModes.at(1).id, server.output->mode_id());
QCOMPARE(serverModes.at(1).id, server.output->get_state().mode.id);
QVERIFY(!serverModes.at(2).preferred);

using namespace Clt;
Expand Down Expand Up @@ -274,14 +284,18 @@ void TestOutput::testModeChanges()
QSignalSpy modeChangedSpy(&output, &Clt::Output::modeChanged);
QVERIFY(modeChangedSpy.isValid());

QCOMPARE(server.output->mode_size(), QSize(1024, 768));
QCOMPARE(server.output->get_state().mode.size, QSize(1024, 768));

// Setting a non-existing mode.
QVERIFY(!server.output->set_mode(Srv::output_mode{QSize(800, 600)}));
QCOMPARE(server.output->mode_size(), QSize(1024, 768));

QVERIFY(server.output->set_mode(Srv::output_mode{QSize(800, 600), 50000}));
QCOMPARE(server.output->mode_size(), QSize(800, 600));
auto state = server.output->get_state();
state.mode = Srv::output_mode{QSize(800, 600)};
server.output->set_state(state);
QCOMPARE(server.output->get_state().mode.size, QSize(1024, 768));

state = server.output->get_state();
state.mode = serverModes.at(0);
server.output->set_state(state);
QCOMPARE(server.output->get_state().mode.size, QSize(800, 600));
server.output->done();

QVERIFY(modeChangedSpy.wait());
Expand Down Expand Up @@ -314,8 +328,10 @@ void TestOutput::testModeChanges()
// change once more
outputChanged.clear();
modeChangedSpy.clear();
server.output->set_mode(Srv::output_mode{QSize(1280, 1024), 90000});
QCOMPARE(server.output->refresh_rate(), 90000);
state = server.output->get_state();
state.mode = Srv::output_mode{QSize(1280, 1024), 90000};
server.output->set_state(state);
QCOMPARE(server.output->get_state().mode.refresh_rate, 90000);
server.output->done();

QVERIFY(modeChangedSpy.wait());
Expand Down Expand Up @@ -358,41 +374,49 @@ void TestOutput::testScaleChange()

// change the scale
outputChanged.clear();
server.output->set_mode(Srv::output_mode{QSize(1280, 1024), 90000});
server.output->set_geometry(QRectF(QPoint(0, 0), QSize(1280, 1024)));
QCOMPARE(server.output->client_scale(), 1);
server.output->set_geometry(QRectF(QPoint(0, 0), QSize(640, 512)));
QCOMPARE(server.output->client_scale(), 2);
auto state = server.output->get_state();
state.mode = Srv::output_mode{QSize(1280, 1024), 90000};
state.geometry = QRectF(QPoint(0, 0), QSize(1280, 1024));
server.output->set_state(state);
QCOMPARE(server.output->get_state().client_scale, 1);

state.geometry = QRectF(QPoint(0, 0), QSize(640, 512));
server.output->set_state(state);
QCOMPARE(server.output->get_state().client_scale, 2);
server.output->done();

QVERIFY(outputChanged.wait());
QCOMPARE(output.scale(), 2);

// changing to same value should not trigger
server.output->set_geometry(QRectF(QPoint(0, 0), QSize(640, 512)));
QCOMPARE(server.output->client_scale(), 2);
state.geometry = QRectF(QPoint(0, 0), QSize(640, 512));
server.output->set_state(state);
QCOMPARE(server.output->get_state().client_scale, 2);
server.output->done();
QVERIFY(!outputChanged.wait(500));
QCOMPARE(output.scale(), 2);

// changing to a different value with same scale should not trigger
server.output->set_geometry(QRectF(QPoint(0, 0), QSize(800, 600)));
QCOMPARE(server.output->client_scale(), 2);
state.geometry = QRectF(QPoint(0, 0), QSize(800, 600));
server.output->set_state(state);
QCOMPARE(server.output->get_state().client_scale, 2);
server.output->done();
QVERIFY(!outputChanged.wait(500));
QCOMPARE(output.scale(), 2);

// change once more
outputChanged.clear();
QVERIFY(server.output->set_mode(Srv::output_mode{QSize(800, 600), 50000}));
state.mode = Srv::output_mode{QSize(800, 600), 50000};
server.output->set_state(state);
server.output->done();
QVERIFY(outputChanged.wait());
QCOMPARE(output.scale(), 1);

// change once more
outputChanged.clear();
QVERIFY(server.output->set_mode(Srv::output_mode{QSize(1280, 1024), 90000}));
server.output->set_geometry(QRectF(QPoint(100, 200), QSize(1280, 1025)));
state.mode = Srv::output_mode{QSize(1280, 1024), 90000};
state.geometry = QRectF(QPoint(100, 200), QSize(1280, 1025));
server.output->set_state(state);
server.output->done();
QVERIFY(outputChanged.wait());
QCOMPARE(output.scale(), 1);
Expand All @@ -418,9 +442,12 @@ void TestOutput::testSubpixel()
{
QFETCH(Srv::output_subpixel, actual);

QCOMPARE(server.output->subpixel(), Srv::output_subpixel::unknown);
server.output->set_subpixel(actual);
QCOMPARE(server.output->subpixel(), actual);
auto state = server.output->get_state();
QCOMPARE(state.subpixel, Srv::output_subpixel::unknown);

state.subpixel = actual;
server.output->set_state(state);
QCOMPARE(server.output->get_state().subpixel, actual);
server.output->done();

Clt::Registry registry;
Expand All @@ -445,8 +472,9 @@ void TestOutput::testSubpixel()

// change back to unknown
outputChanged.clear();
server.output->set_subpixel(Srv::output_subpixel::unknown);
QCOMPARE(server.output->subpixel(), Srv::output_subpixel::unknown);
state.subpixel = Srv::output_subpixel::unknown;
server.output->set_state(state);
QCOMPARE(server.output->get_state().subpixel, Srv::output_subpixel::unknown);
server.output->done();

if (outputChanged.isEmpty()) {
Expand Down Expand Up @@ -477,9 +505,13 @@ void TestOutput::testTransform_data()
void TestOutput::testTransform()
{
QFETCH(Srv::output_transform, actual);
QCOMPARE(server.output->transform(), Srv::output_transform::normal);
server.output->set_transform(actual);
QCOMPARE(server.output->transform(), actual);

auto state = server.output->get_state();
QCOMPARE(state.transform, Srv::output_transform::normal);

state.transform = actual;
server.output->set_state(state);
QCOMPARE(server.output->get_state().transform, actual);
server.output->done();

Clt::Registry registry;
Expand All @@ -504,8 +536,9 @@ void TestOutput::testTransform()

// change back to normal
outputChanged.clear();
server.output->set_transform(Srv::output_transform::normal);
QCOMPARE(server.output->transform(), Srv::output_transform::normal);
state.transform = Srv::output_transform::normal;
server.output->set_state(state);
QCOMPARE(server.output->get_state().transform, Srv::output_transform::normal);
server.output->done();

if (outputChanged.isEmpty()) {
Expand Down
5 changes: 4 additions & 1 deletion autotests/client/plasma_window_management.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -862,7 +862,10 @@ void TestWindowManagement::testSendToOutput()
QVERIFY(outputAnnouncedSpy.isValid());

auto srv_output = std::make_unique<Srv::output>(*server.globals.output_manager);
srv_output->set_enabled(true);
srv_output->add_mode({.size = QSize{1920, 1080}, .id = 0});
auto state = srv_output->get_state();
state.enabled = true;
srv_output->set_state(state);
srv_output->done();

QVERIFY(outputAnnouncedSpy.wait());
Expand Down
5 changes: 4 additions & 1 deletion autotests/client/presentation_time.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,10 @@ void TestPresentationTime::init()
= std::make_unique<Wrapland::Server::PresentationManager>(server.display.get());

server.output = std::make_unique<Wrapland::Server::output>(*server.globals.output_manager);
server.output->set_enabled(true);
server.output->add_mode({.size = QSize{1920, 1080}, .id = 0});
auto state = server.output->get_state();
state.enabled = true;
server.output->set_state(state);
server.output->done();

// Setup connection.
Expand Down
18 changes: 14 additions & 4 deletions autotests/client/registry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -223,8 +223,12 @@ void TestWaylandRegistry::init()
server.globals.virtual_keyboard_manager_v1
= std::make_unique<Wrapland::Server::virtual_keyboard_manager_v1>(server.display.get());

server.globals.outputs.back()->set_enabled(true);
server.globals.outputs.back()->done();
auto& output = server.globals.outputs.back();
output->add_mode({.size = QSize{1920, 1080}, .id = 0});
auto state = output->get_state();
state.enabled = true;
output->set_state(state);
output->done();
}

void TestWaylandRegistry::cleanup()
Expand Down Expand Up @@ -1007,7 +1011,10 @@ void TestWaylandRegistry::testAnnounceMultiple()
QVERIFY(outputAnnouncedSpy.isValid());

auto output1 = std::make_unique<Wrapland::Server::output>(*server.globals.output_manager);
output1->set_enabled(true);
output1->add_mode({.size = QSize{1920, 1080}, .id = 0});
auto state = output1->get_state();
state.enabled = true;
output1->set_state(state);
output1->done();
QVERIFY(outputAnnouncedSpy.wait());
QCOMPARE(registry.interfaces(Registry::Interface::Output).count(), 2);
Expand All @@ -1021,7 +1028,10 @@ void TestWaylandRegistry::testAnnounceMultiple()
outputAnnouncedSpy.first().last().value<quint32>());

auto output2 = std::make_unique<Wrapland::Server::output>(*server.globals.output_manager);
output2->set_enabled(true);
output2->add_mode({.size = QSize{1920, 1080}, .id = 0});
state = output2->get_state();
state.enabled = true;
output2->set_state(state);
output2->done();
QVERIFY(outputAnnouncedSpy.wait());
QCOMPARE(registry.interfaces(Registry::Interface::Output).count(), 3);
Expand Down
5 changes: 4 additions & 1 deletion autotests/client/surface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1128,7 +1128,10 @@ void TestSurface::testOutput()
QVERIFY(outputAnnouncedSpy.isValid());

auto serverOutput = new Wrapland::Server::output(*server.globals.output_manager);
serverOutput->set_enabled(true);
serverOutput->add_mode({.size = QSize{1920, 1080}, .id = 0});
auto state = serverOutput->get_state();
state.enabled = true;
serverOutput->set_state(state);
serverOutput->done();

QVERIFY(outputAnnouncedSpy.wait());
Expand Down
Loading

0 comments on commit 514c8ff

Please sign in to comment.