// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_EXO_SERVER_WAYLAND_SERVER_CONTROLLER_H_
#define COMPONENTS_EXO_SERVER_WAYLAND_SERVER_CONTROLLER_H_
#include <memory>
#include "base/containers/flat_map.h"
#include "base/files/scoped_temp_dir.h"
#include "base/memory/weak_ptr.h"
#include "components/exo/display.h"
#include "components/exo/security_delegate.h"
#include "components/exo/wayland/server.h"
struct wl_display;
namespace exo {
namespace wayland {
class Server;
} // namespace wayland
class DataExchangeDelegate;
class InputMethodSurfaceManager;
class NotificationSurfaceManager;
class ToastSurfaceManager;
class WMHelper;
class WaylandServerHandle;
class WaylandServerController {
public:
static std::unique_ptr<WaylandServerController> CreateForArcIfNecessary(
std::unique_ptr<DataExchangeDelegate> data_exchange_delegate,
std::unique_ptr<SecurityDelegate> security_delegate);
// Creates WaylandServerController. Returns null if controller should not be
// created.
static std::unique_ptr<WaylandServerController> CreateIfNecessary(
std::unique_ptr<DataExchangeDelegate> data_exchange_delegate,
std::unique_ptr<SecurityDelegate> security_delegate,
std::unique_ptr<NotificationSurfaceManager> notification_surface_manager,
std::unique_ptr<InputMethodSurfaceManager> input_method_surface_manager,
std::unique_ptr<ToastSurfaceManager> toast_surface_manager);
// Returns a handle to the global-singletone instance of the server
// controller.
static WaylandServerController* Get();
WaylandServerController(const WaylandServerController&) = delete;
WaylandServerController& operator=(const WaylandServerController&) = delete;
~WaylandServerController();
// Gets the Server instance for the `display` if it exists.
wayland::Server* GetServerForDisplay(wl_display* display);
InputMethodSurfaceManager* input_method_surface_manager() {
return display_->input_method_surface_manager();
}
WaylandServerController(
std::unique_ptr<DataExchangeDelegate> data_exchange_delegate,
std::unique_ptr<SecurityDelegate> security_delegate,
std::unique_ptr<NotificationSurfaceManager> notification_surface_manager,
std::unique_ptr<InputMethodSurfaceManager> input_method_surface_manager,
std::unique_ptr<ToastSurfaceManager> toast_surface_manager);
// Creates a wayland server from the given |socket|, with the privileges of
// the |security_delegate|. Invokes |callback| with a handle to a wayland
// server on success, nullptr on failure.
void ListenOnSocket(
std::unique_ptr<SecurityDelegate> security_delegate,
base::ScopedFD socket,
base::OnceCallback<void(std::unique_ptr<WaylandServerHandle>)> callback);
private:
void OnSocketAdded(
std::unique_ptr<wayland::Server> server,
base::OnceCallback<void(std::unique_ptr<WaylandServerHandle>)> callback,
bool success);
// Removes the wayland server that was created by ListenOnSocket() which
// returned the given |handle|.
friend class WaylandServerHandle;
void CloseSocket(WaylandServerHandle* handle);
std::unique_ptr<WMHelper> wm_helper_;
std::unique_ptr<Display> display_;
std::unique_ptr<wayland::Server> default_server_;
base::flat_map<WaylandServerHandle*, std::unique_ptr<wayland::Server>>
on_demand_servers_;
base::WeakPtrFactory<WaylandServerController> weak_factory_{this};
};
} // namespace exo
#endif // COMPONENTS_EXO_SERVER_WAYLAND_SERVER_CONTROLLER_H_