blob: 317533ef8f74194130a8fb87b9394acad5f96752 [file] [log] [blame]
/*
* Copyright © 2016 Giulio Camuffo
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice (including the
* next paragraph) shall be included in all copies or substantial
* portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef XWAYLAND_API_H
#define XWAYLAND_API_H
#ifdef __cplusplus
extern "C" {
#endif
#include <unistd.h>
#include "plugin-registry.h"
struct weston_compositor;
struct weston_xwayland;
#define WESTON_XWAYLAND_API_NAME "weston_xwayland_v1"
#define WESTON_XWAYLAND_SURFACE_API_NAME "weston_xwayland_surface_v1"
typedef pid_t
(*weston_xwayland_spawn_xserver_func_t)(
void *user_data, const char *display, int abstract_fd, int unix_fd);
/** The libweston Xwayland API
*
* This API allows control of the Xwayland libweston module.
* The module must be loaded at runtime with \a weston_compositor_load_xwayland,
* after which the API can be retrieved by using \a weston_xwayland_get_api.
*/
struct weston_xwayland_api {
/** Retrieve the Xwayland context object.
*
* Note that this function does not create a new object, but always
* returns the same object per compositor instance.
* This function cannot fail while this API object is valid.
*
* \param compositor The compositor instance.
*/
struct weston_xwayland *
(*get)(struct weston_compositor *compositor);
/** Listen for X connections.
*
* This function tells the Xwayland module to begin creating an X socket
* and start listening for client connections. When one such connection is
* detected the given \a spawn_func callback will be called to start
* the Xwayland process.
*
* \param xwayland The Xwayland context object.
* \param user_data The user data pointer to be passed to \a spawn_func.
* \param spawn_func The callback function called to start the Xwayland
* server process.
*
* \return 0 on success, a negative number otherwise.
*/
int
(*listen)(struct weston_xwayland *xwayland, void *user_data,
weston_xwayland_spawn_xserver_func_t spawn_func);
/** Notify the Xwayland module that the Xwayland server is loaded.
*
* After the Xwayland server process has been spawned it will notify
* the parent that is has finished the initialization by sending a
* SIGUSR1 signal.
* The caller should listen for that signal and call this function
* when it is received.
*
* \param xwayland The Xwayland context object.
* \param client The wl_client object representing the connection of
* the Xwayland server process.
* \param wm_fd The file descriptor for the wm.
*/
void
(*xserver_loaded)(struct weston_xwayland *xwayland,
struct wl_client *client, int wm_fd);
/** Notify the Xwayland module that the Xwayland server has exited.
*
* Whenever the Xwayland server process quits this function should be
* called.
* The Xwayland module will keep listening for X connections on the
* socket, and may call the spawn function again.
*
* \param xwayland The Xwayland context object.
* \param exit_status The exit status of the Xwayland server process.
*/
void
(*xserver_exited)(struct weston_xwayland *xwayland, int exit_status);
};
/** Retrieve the API object for the libweston Xwayland module.
*
* The module must have been previously loaded by calling
* \a weston_compositor_load_xwayland.
*
* \param compositor The compositor instance.
*/
static inline const struct weston_xwayland_api *
weston_xwayland_get_api(struct weston_compositor *compositor)
{
const void *api;
api = weston_plugin_api_get(compositor, WESTON_XWAYLAND_API_NAME,
sizeof(struct weston_xwayland_api));
/* The cast is necessary to use this function in C++ code */
return (const struct weston_xwayland_api *)api;
}
/** The libweston Xwayland surface API
*
* This API allows control of the Xwayland libweston module surfaces.
* The module must be loaded at runtime with \a weston_compositor_load_xwayland,
* after which the API can be retrieved by using
* \a weston_xwayland_surface_get_api.
*/
struct weston_xwayland_surface_api {
/** Check if the surface is an Xwayland surface
*
* \param surface The surface.
*/
bool
(*is_xwayland_surface)(struct weston_surface *surface);
/** Notify the Xwayland surface that its position changed.
*
* \param surface The Xwayland surface.
* \param x The x-axis position.
* \param y The y-axis position.
*/
void
(*send_position)(struct weston_surface *surface, int32_t x, int32_t y);
};
/** Retrieve the API object for the libweston Xwayland surface.
*
* The module must have been previously loaded by calling
* \a weston_compositor_load_xwayland.
*
* \param compositor The compositor instance.
*/
static inline const struct weston_xwayland_surface_api *
weston_xwayland_surface_get_api(struct weston_compositor *compositor)
{
const void *api;
api = weston_plugin_api_get(compositor, WESTON_XWAYLAND_SURFACE_API_NAME,
sizeof(struct weston_xwayland_surface_api));
/* The cast is necessary to use this function in C++ code */
return (const struct weston_xwayland_surface_api *)api;
}
#ifdef __cplusplus
}
#endif
#endif