Program Listing for File wayland_extensions.h

Return to documentation for file (include/miral/miral/wayland_extensions.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_WAYLAND_EXTENSIONS_H
#define MIRAL_WAYLAND_EXTENSIONS_H

#include "application.h"

#include <functional>
#include <memory>
#include <string>
#include <optional>
#include <set>

struct wl_display;
struct wl_client;
struct wl_resource;

namespace mir { class Server; }

namespace miral
{
class Window;

class WaylandExtensions
{
public:
    WaylandExtensions();

    void operator()(mir::Server& server) const;

    ~WaylandExtensions();
    WaylandExtensions(WaylandExtensions const&);
    auto operator=(WaylandExtensions const&) -> WaylandExtensions&;

    auto all_supported() const -> std::set<std::string>;

    class Context
    {
    public:
        virtual auto display() const -> wl_display* = 0;
        virtual void run_on_wayland_mainloop(std::function<void()>&& work) const = 0;

    protected:
        Context() = default;
        virtual ~Context() = default;
        Context(Context const&) = delete;
        Context& operator=(Context const&) = delete;
    };

    struct Builder
    {
        std::string name;

        std::function<std::shared_ptr<void>(Context const* context)> build;
    };

    class EnableInfo
    {
    public:
        auto app() const -> Application const&;
        auto name() const -> const char*;
        auto user_preference() const -> std::optional<bool>;

    private:
        friend WaylandExtensions;
        EnableInfo(Application const& app, const char* name, std::optional<bool> user_preference);
        struct Self;
        std::unique_ptr<Self> const self;
    };

    using Filter = std::function<bool(Application const& app, char const* protocol)>;

    using EnableCallback = std::function<bool(EnableInfo const& info)>;

    static char const* const zwlr_layer_shell_v1;

    static char const* const zxdg_output_manager_v1;

    static char const* const zwlr_foreign_toplevel_manager_v1;

    static char const* const zwp_virtual_keyboard_manager_v1;

    static const char* const zwp_input_method_v1;

    static const char* const zwp_input_panel_v1;

    static char const* const zwp_input_method_manager_v2;

    static char const* const zwlr_screencopy_manager_v1;

    static char const* const zwlr_virtual_pointer_manager_v1;

    static char const* const ext_session_lock_manager_v1;

    void add_extension(Builder const& builder);

    void add_extension_disabled_by_default(Builder const& builder);

    static auto recommended() -> std::set<std::string>;

    static auto supported() -> std::set<std::string>;

    auto enable(std::string name) -> WaylandExtensions&;

    auto disable(std::string name) -> WaylandExtensions&;

    auto conditionally_enable(std::string name, EnableCallback const& callback) -> WaylandExtensions&;

private:
    struct Self;
    std::shared_ptr<Self> self;
};

auto application_for(wl_client* client) -> Application;

auto application_for(wl_resource* resource) -> Application;

auto window_for(wl_resource* surface) -> Window;
}

#endif //MIRAL_WAYLAND_EXTENSIONS_H