Program Listing for File window_specification.h

↰ Return to documentation for file (/home/docs/checkouts/readthedocs.org/user_builds/canonical-mir-documentation/checkouts/2.30/include/miral/miral/window_specification.h)

/*
 * Copyright © Canonical Ltd.
 *
 * This program is free software: you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 or 3 as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef MIRAL_WINDOW_SPECIFICATION_H
#define MIRAL_WINDOW_SPECIFICATION_H

#include <mir_toolkit/common.h>

#include <mir/geometry/displacement.h>
#include <mir/geometry/rectangles.h>
#include <mir/int_wrapper.h>
#include <mir/flags.h>

#include <memory>
#include <optional>

namespace mir
{
namespace scene { class Surface; }
namespace shell { struct SurfaceSpecification; }
}

namespace miral
{
using namespace mir::geometry;
namespace detail { struct SessionsBufferStreamIdTag; }
using BufferStreamId = mir::IntWrapper<detail::SessionsBufferStreamIdTag>;

class WindowSpecification
{
public:
    enum class InputReceptionMode
    {
        normal,
        receives_all_input
    };

    struct AspectRatio
    {
        unsigned width;
        unsigned height;
        bool operator==(AspectRatio const&) const = default;
    };

    WindowSpecification();

    WindowSpecification(WindowSpecification const& that);
    auto operator=(WindowSpecification const& that) -> WindowSpecification&;

    WindowSpecification(mir::shell::SurfaceSpecification const& spec);

    ~WindowSpecification();

    auto top_left() const& -> std::optional<Point> const&;

    auto size() const& -> std::optional<Size> const&;

    auto name() const& -> std::optional<std::string> const&;

    auto output_id() const& -> std::optional<int> const&;

    auto type() const& -> std::optional<MirWindowType> const&;

    auto state() const& -> std::optional<MirWindowState> const&;

    auto preferred_orientation() const& -> std::optional<MirOrientationMode> const&;

    auto aux_rect() const& -> std::optional<Rectangle> const&;

    auto placement_hints() const& -> std::optional<MirPlacementHints> const&;

    auto window_placement_gravity() const& -> std::optional<MirPlacementGravity> const&;

    auto aux_rect_placement_gravity() const& -> std::optional<MirPlacementGravity> const&;

    auto aux_rect_placement_offset() const& -> std::optional<Displacement> const&;

    auto min_width() const& -> std::optional<Width> const&;

    auto min_height() const& -> std::optional<Height> const&;

    auto max_width() const& -> std::optional<Width> const&;

    auto max_height() const& -> std::optional<Height> const&;

    auto width_inc() const& -> std::optional<DeltaX> const&;

    auto height_inc() const& -> std::optional<DeltaY> const&;

    auto min_aspect() const& -> std::optional<AspectRatio> const&;

    auto max_aspect() const& -> std::optional<AspectRatio> const&;

    auto parent() const& -> std::optional<std::weak_ptr<mir::scene::Surface>> const&;

    auto input_shape() const& -> std::optional<std::vector<Rectangle>> const&;

    auto input_mode() const& -> std::optional<InputReceptionMode> const&;

    auto shell_chrome() const& -> std::optional<MirShellChrome> const&;

    auto confine_pointer() const& -> std::optional<MirPointerConfinementState> const&;

    auto userdata() const& -> std::optional<std::shared_ptr<void>> const&;

    auto top_left() & -> std::optional<Point>&;

    auto size() & -> std::optional<Size>&;

    auto name() & -> std::optional<std::string>&;

    auto output_id() & -> std::optional<int>&;

    auto type() & -> std::optional<MirWindowType>&;

    auto state() & -> std::optional<MirWindowState>&;

    auto preferred_orientation() & -> std::optional<MirOrientationMode>&;

    auto aux_rect() & -> std::optional<Rectangle>&;

    auto placement_hints() & -> std::optional<MirPlacementHints>&;

    auto window_placement_gravity() & -> std::optional<MirPlacementGravity>&;

    auto aux_rect_placement_gravity() & -> std::optional<MirPlacementGravity>&;

    auto aux_rect_placement_offset() & -> std::optional<Displacement>&;

    auto min_width() & -> std::optional<Width>&;

    auto min_height() & -> std::optional<Height>&;

    auto max_width() & -> std::optional<Width>&;

    auto max_height() & -> std::optional<Height>&;

    auto width_inc() & -> std::optional<DeltaX>&;

    auto height_inc() & -> std::optional<DeltaY>&;

    auto min_aspect() & -> std::optional<AspectRatio>&;

    auto max_aspect() & -> std::optional<AspectRatio>&;

    auto parent() & -> std::optional<std::weak_ptr<mir::scene::Surface>>&;

    auto input_shape() & -> std::optional<std::vector<Rectangle>>&;

    auto input_mode() & -> std::optional<InputReceptionMode>&;

    auto shell_chrome() & -> std::optional<MirShellChrome>&;

    auto confine_pointer() & -> std::optional<MirPointerConfinementState>&;

    auto userdata() & -> std::optional<std::shared_ptr<void>>&;

    auto depth_layer() const& -> std::optional<MirDepthLayer> const&;

    auto depth_layer() & -> std::optional<MirDepthLayer>&;

    auto attached_edges() const& -> std::optional<MirPlacementGravity> const&;

    auto attached_edges() & -> std::optional<MirPlacementGravity>&;

    auto exclusive_rect() const& -> std::optional<std::optional<mir::geometry::Rectangle>> const&;

    auto exclusive_rect() & -> std::optional<std::optional<mir::geometry::Rectangle>>&;

    auto ignore_exclusion_zones() const& -> std::optional<bool> const&;

    auto ignore_exclusion_zones() & -> std::optional<bool>&;

    auto application_id() const& -> std::optional<std::string> const&;

    auto application_id() & -> std::optional<std::string>&;

    auto server_side_decorated() const& -> std::optional<bool> const&;

    auto server_side_decorated() & -> std::optional<bool>&;

    auto focus_mode() const& -> std::optional<MirFocusMode> const&;

    auto focus_mode() & -> std::optional<MirFocusMode>&;

    auto visible_on_lock_screen() const& -> std::optional<bool> const&;

    auto visible_on_lock_screen() & -> std::optional<bool>&;

    auto tiled_edges() const& -> std::optional<mir::Flags<MirTiledEdge>> const&;

    auto tiled_edges() & -> std::optional<mir::Flags<MirTiledEdge>>&;

    auto alpha() & -> std::optional<float>&;

    auto alpha() const& -> std::optional<float> const&;

    auto parent_size() & -> std::optional<Size>&;

    auto parent_size() const& -> std::optional<Size> const&;

    auto to_surface_specification() const -> mir::shell::SurfaceSpecification;

private:
    friend auto make_surface_spec(WindowSpecification const& miral_spec) -> mir::shell::SurfaceSpecification;
    struct Self;
    std::unique_ptr<Self> self;
};
}

#endif //MIRAL_WINDOW_SPECIFICATION_H