/* * 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 #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