~brandontschaefer/+junk/trunk-mir

« back to all changes in this revision

Viewing changes to src/server/frontend/session_mediator.cpp

frontend: Support requests to set the base display configuration

Show diffs side-by-side

added added

removed removed

Lines of Context:
606
606
 
607
607
    report->session_configure_display_called(session->name());
608
608
 
609
 
    auto config = display_changer->base_configuration();
610
 
 
611
 
    config->for_each_output([&](mg::UserDisplayConfigurationOutput& dest){
612
 
        unsigned id = dest.id.as_value();
613
 
        int n = 0;
614
 
        for (; n < request->display_output_size(); ++n)
615
 
        {
616
 
            if (request->display_output(n).output_id() == id)
617
 
                break;
618
 
        }
619
 
        if (n >= request->display_output_size())
620
 
            return;
621
 
 
622
 
        auto& src = request->display_output(n);
623
 
        dest.used = src.used();
624
 
        dest.top_left = geom::Point{src.position_x(),
625
 
                src.position_y()};
626
 
        dest.current_mode_index = src.current_mode();
627
 
        dest.current_format =
628
 
                static_cast<MirPixelFormat>(src.current_format());
629
 
        dest.power_mode = static_cast<MirPowerMode>(src.power_mode());
630
 
        dest.orientation = static_cast<MirOrientation>(src.orientation());
631
 
    });
632
 
 
 
609
    auto const config = unpack_and_sanitize_display_configuration(request);
633
610
    display_changer->configure(session, config);
 
611
 
634
612
    auto display_config = display_changer->base_configuration();
635
613
    mfd::pack_protobuf_display_configuration(*response, *display_config);
636
614
 
637
615
    done->Run();
638
616
}
639
617
 
 
618
void mf::SessionMediator::set_base_display_configuration(
 
619
    mir::protobuf::DisplayConfiguration const* request,
 
620
    mir::protobuf::Void* /*response*/,
 
621
    google::protobuf::Closure* done)
 
622
{
 
623
    auto session = weak_session.lock();
 
624
 
 
625
    if (session.get() == nullptr)
 
626
        BOOST_THROW_EXCEPTION(std::logic_error("Invalid application session"));
 
627
 
 
628
    report->session_set_base_display_configuration_called(session->name());
 
629
 
 
630
    auto const config = unpack_and_sanitize_display_configuration(request);
 
631
    display_changer->set_base_configuration(config);
 
632
 
 
633
    done->Run();
 
634
}
 
635
 
640
636
void mf::SessionMediator::create_screencast(
641
637
    const mir::protobuf::ScreencastParameters* parameters,
642
638
    mir::protobuf::Screencast* protobuf_screencast,
1006
1002
 
1007
1003
    done->Run();
1008
1004
}
 
1005
 
 
1006
std::shared_ptr<mg::DisplayConfiguration>
 
1007
mf::SessionMediator::unpack_and_sanitize_display_configuration(
 
1008
    mir::protobuf::DisplayConfiguration const* protobuf_config)
 
1009
{
 
1010
    auto config = display_changer->base_configuration();
 
1011
 
 
1012
    config->for_each_output([&](mg::UserDisplayConfigurationOutput& dest){
 
1013
        unsigned id = dest.id.as_value();
 
1014
        int n = 0;
 
1015
        for (; n < protobuf_config->display_output_size(); ++n)
 
1016
        {
 
1017
            if (protobuf_config->display_output(n).output_id() == id)
 
1018
                break;
 
1019
        }
 
1020
        if (n >= protobuf_config->display_output_size())
 
1021
            return;
 
1022
 
 
1023
        auto& src = protobuf_config->display_output(n);
 
1024
        dest.used = src.used();
 
1025
        dest.top_left = geom::Point{src.position_x(),
 
1026
                src.position_y()};
 
1027
        dest.current_mode_index = src.current_mode();
 
1028
        dest.current_format =
 
1029
                static_cast<MirPixelFormat>(src.current_format());
 
1030
        dest.power_mode = static_cast<MirPowerMode>(src.power_mode());
 
1031
        dest.orientation = static_cast<MirOrientation>(src.orientation());
 
1032
    });
 
1033
 
 
1034
    return config;
 
1035
}